From 0ea4b0932126a577e9ce9af8d800d9031d47c604 Mon Sep 17 00:00:00 2001 From: Deepthi Sigireddi Date: Fri, 3 Nov 2023 09:37:44 -0700 Subject: [PATCH 01/39] tx_throttler: delete topo watcher metric instead of deprecating (#14445) Signed-off-by: deepthi --- changelog/19.0/19.0.0/summary.md | 1 - go/vt/vttablet/tabletserver/txthrottler/tx_throttler.go | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/changelog/19.0/19.0.0/summary.md b/changelog/19.0/19.0.0/summary.md index d9f655ecbc2..5d413c25cae 100644 --- a/changelog/19.0/19.0.0/summary.md +++ b/changelog/19.0/19.0.0/summary.md @@ -12,7 +12,6 @@ ### Deprecations and Deletions - The `MYSQL_FLAVOR` environment variable is now removed from all Docker Images. -- VTTablet metrics for TxThrottler's topology watchers have been deprecated. They will be deleted in the next release. ### Docker diff --git a/go/vt/vttablet/tabletserver/txthrottler/tx_throttler.go b/go/vt/vttablet/tabletserver/txthrottler/tx_throttler.go index f78c65a4587..92976bbedf2 100644 --- a/go/vt/vttablet/tabletserver/txthrottler/tx_throttler.go +++ b/go/vt/vttablet/tabletserver/txthrottler/tx_throttler.go @@ -144,9 +144,7 @@ type txThrottler struct { topoServer *topo.Server // stats - throttlerRunning *stats.Gauge - // TODO(deepthi): deprecated, should be deleted in v20 - topoWatchers *stats.GaugesWithSingleLabel + throttlerRunning *stats.Gauge healthChecksReadTotal *stats.CountersWithMultiLabels healthChecksRecordedTotal *stats.CountersWithMultiLabels requestsTotal *stats.CountersWithSingleLabel @@ -199,7 +197,6 @@ func NewTxThrottler(env tabletenv.Env, topoServer *topo.Server) TxThrottler { config: config, topoServer: topoServer, throttlerRunning: env.Exporter().NewGauge(TxThrottlerName+"Running", "transaction throttler running state"), - topoWatchers: env.Exporter().NewGaugesWithSingleLabel(TxThrottlerName+"TopoWatchers", "DEPRECATED: transaction throttler topology watchers", "cell"), healthChecksReadTotal: env.Exporter().NewCountersWithMultiLabels(TxThrottlerName+"HealthchecksRead", "transaction throttler healthchecks read", []string{"cell", "DbType"}), healthChecksRecordedTotal: env.Exporter().NewCountersWithMultiLabels(TxThrottlerName+"HealthchecksRecorded", "transaction throttler healthchecks recorded", From 24110e809c9d599fddaaf2f8cdebe14cdf84b2f1 Mon Sep 17 00:00:00 2001 From: Deepthi Sigireddi Date: Fri, 3 Nov 2023 09:52:09 -0700 Subject: [PATCH 02/39] viper: register dynamic config with both disk and live (#14453) Signed-off-by: deepthi --- go/viperutil/internal/sync/sync.go | 27 +++++++++++++++++++++---- go/viperutil/internal/sync/sync_test.go | 5 ++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/go/viperutil/internal/sync/sync.go b/go/viperutil/internal/sync/sync.go index a5d35c504cb..6608569d86c 100644 --- a/go/viperutil/internal/sync/sync.go +++ b/go/viperutil/internal/sync/sync.go @@ -289,10 +289,29 @@ func (v *Viper) loadFromDisk() { // begin implementation of registry.Bindable for sync.Viper -func (v *Viper) BindEnv(vars ...string) error { return v.disk.BindEnv(vars...) } -func (v *Viper) BindPFlag(key string, flag *pflag.Flag) error { return v.disk.BindPFlag(key, flag) } -func (v *Viper) RegisterAlias(alias string, key string) { v.disk.RegisterAlias(alias, key) } -func (v *Viper) SetDefault(key string, value any) { v.disk.SetDefault(key, value) } +func (v *Viper) BindEnv(vars ...string) error { + if err := v.disk.BindEnv(vars...); err != nil { + return err + } + return v.live.BindEnv(vars...) +} + +func (v *Viper) BindPFlag(key string, flag *pflag.Flag) error { + if err := v.disk.BindPFlag(key, flag); err != nil { + return err + } + return v.live.BindPFlag(key, flag) +} + +func (v *Viper) RegisterAlias(alias string, key string) { + v.disk.RegisterAlias(alias, key) + v.live.RegisterAlias(alias, key) +} + +func (v *Viper) SetDefault(key string, value any) { + v.disk.SetDefault(key, value) + v.live.SetDefault(key, value) +} // end implementation of registry.Bindable for sync.Viper diff --git a/go/viperutil/internal/sync/sync_test.go b/go/viperutil/internal/sync/sync_test.go index 5b1c5541896..6b8efa1b105 100644 --- a/go/viperutil/internal/sync/sync_test.go +++ b/go/viperutil/internal/sync/sync_test.go @@ -93,7 +93,10 @@ func TestWatchConfig(t *testing.T) { sv := vipersync.New() A := viperutil.Configure("a", viperutil.Options[int]{Dynamic: true}) - B := viperutil.Configure("b", viperutil.Options[int]{Dynamic: true}) + B := viperutil.Configure("b", viperutil.Options[int]{FlagName: "b", Dynamic: true, Default: 5}) + + // Check that default values are actually used + require.Equal(t, B.Get(), B.Default()) A.(*value.Dynamic[int]).Base.BoundGetFunc = vipersync.AdaptGetter("a", func(v *viper.Viper) func(key string) int { return v.GetInt From 366f7d2583497d1c71e687c337ee767c1daee3b8 Mon Sep 17 00:00:00 2001 From: Austen Lacy Date: Fri, 3 Nov 2023 14:41:38 -0400 Subject: [PATCH 03/39] Bug fix: Use target tablet from health stats cache when checking replication status (#14436) Signed-off-by: Austen Lacy Co-authored-by: Austen Lacy --- go/test/endtoend/cluster/cluster_process.go | 5 ++++ go/test/endtoend/tabletgateway/vtgate_test.go | 29 +++++++++++++++++++ go/vt/vtgate/executor.go | 4 +-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/go/test/endtoend/cluster/cluster_process.go b/go/test/endtoend/cluster/cluster_process.go index f74a031f4d8..28a8807cf08 100644 --- a/go/test/endtoend/cluster/cluster_process.go +++ b/go/test/endtoend/cluster/cluster_process.go @@ -985,6 +985,11 @@ func (cluster *LocalProcessCluster) VtctlclientGetTablet(tablet *Vttablet) (*top return &ti, nil } +func (cluster *LocalProcessCluster) VtctlclientChangeTabletType(tablet *Vttablet, tabletType topodatapb.TabletType) error { + _, err := cluster.VtctlclientProcess.ExecuteCommandWithOutput("ChangeTabletType", "--", tablet.Alias, tabletType.String()) + return err +} + // Teardown brings down the cluster by invoking teardown for individual processes func (cluster *LocalProcessCluster) Teardown() { PanicHandler(nil) diff --git a/go/test/endtoend/tabletgateway/vtgate_test.go b/go/test/endtoend/tabletgateway/vtgate_test.go index a3876b259f3..be227927981 100644 --- a/go/test/endtoend/tabletgateway/vtgate_test.go +++ b/go/test/endtoend/tabletgateway/vtgate_test.go @@ -29,6 +29,7 @@ import ( "time" "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/vt/proto/topodata" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -69,6 +70,34 @@ func TestVtgateReplicationStatusCheck(t *testing.T) { assert.Equal(t, expectNumRows, numRows, fmt.Sprintf("wrong number of results from show vitess_replication_status. Expected %d, got %d", expectNumRows, numRows)) } +func TestVtgateReplicationStatusCheckWithTabletTypeChange(t *testing.T) { + defer cluster.PanicHandler(t) + // Healthcheck interval on tablet is set to 1s, so sleep for 2s + time.Sleep(2 * time.Second) + verifyVtgateVariables(t, clusterInstance.VtgateProcess.VerifyURL) + ctx := context.Background() + conn, err := mysql.Connect(ctx, &vtParams) + require.NoError(t, err) + defer conn.Close() + + // Only returns rows for REPLICA and RDONLY tablets -- so should be 2 of them + qr := utils.Exec(t, conn, "show vitess_replication_status like '%'") + expectNumRows := 2 + numRows := len(qr.Rows) + assert.Equal(t, expectNumRows, numRows, fmt.Sprintf("wrong number of results from show vitess_replication_status. Expected %d, got %d", expectNumRows, numRows)) + + // change the RDONLY tablet to SPARE + rdOnlyTablet := clusterInstance.Keyspaces[0].Shards[0].Rdonly() + err = clusterInstance.VtctlclientChangeTabletType(rdOnlyTablet, topodata.TabletType_SPARE) + require.NoError(t, err) + + // Only returns rows for REPLICA and RDONLY tablets -- so should be 1 of them since we updated 1 to spare + qr = utils.Exec(t, conn, "show vitess_replication_status like '%'") + expectNumRows = 1 + numRows = len(qr.Rows) + assert.Equal(t, expectNumRows, numRows, fmt.Sprintf("wrong number of results from show vitess_replication_status. Expected %d, got %d", expectNumRows, numRows)) +} + func verifyVtgateVariables(t *testing.T, url string) { resp, err := http.Get(url) require.NoError(t, err) diff --git a/go/vt/vtgate/executor.go b/go/vt/vtgate/executor.go index c7843e26bbf..152533f2c0d 100644 --- a/go/vt/vtgate/executor.go +++ b/go/vt/vtgate/executor.go @@ -901,14 +901,14 @@ func (e *Executor) showVitessReplicationStatus(ctx context.Context, filter *sqlp for _, s := range status { for _, ts := range s.TabletsStats { // We only want to show REPLICA and RDONLY tablets - if ts.Tablet.Type != topodatapb.TabletType_REPLICA && ts.Tablet.Type != topodatapb.TabletType_RDONLY { + if ts.Target.TabletType != topodatapb.TabletType_REPLICA && ts.Target.TabletType != topodatapb.TabletType_RDONLY { continue } // Allow people to filter by Keyspace and Shard using a LIKE clause if filter != nil { ksFilterRegex := sqlparser.LikeToRegexp(filter.Like) - keyspaceShardStr := fmt.Sprintf("%s/%s", ts.Tablet.Keyspace, ts.Tablet.Shard) + keyspaceShardStr := fmt.Sprintf("%s/%s", ts.Target.Keyspace, ts.Target.Shard) if !ksFilterRegex.MatchString(keyspaceShardStr) { continue } From 9e8013855585b8a0efd847aafa1106b237ffe169 Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Sat, 4 Nov 2023 01:58:31 +0100 Subject: [PATCH 04/39] servenv: Remove double close() logic (#14457) Signed-off-by: Dirkjan Bussink Signed-off-by: deepthi Co-authored-by: deepthi --- go/cmd/mysqlctld/cli/mysqlctld.go | 2 -- go/cmd/vtaclcheck/cli/vtactlcheck.go | 1 - go/cmd/vtbackup/cli/vtbackup.go | 1 - go/cmd/vtbench/cli/vtbench.go | 1 - go/cmd/vtctld/cli/cli.go | 1 - go/cmd/vtgate/cli/cli.go | 1 - go/cmd/vttablet/cli/cli.go | 1 - go/vt/servenv/run.go | 5 ----- 8 files changed, 13 deletions(-) diff --git a/go/cmd/mysqlctld/cli/mysqlctld.go b/go/cmd/mysqlctld/cli/mysqlctld.go index 4afbf510951..6ebaa5dc422 100644 --- a/go/cmd/mysqlctld/cli/mysqlctld.go +++ b/go/cmd/mysqlctld/cli/mysqlctld.go @@ -54,7 +54,6 @@ var ( Long: "`mysqlctld` is a gRPC server that can be used instead of the `mysqlctl` client tool.\n" + "If the target directories are empty when it is invoked, it automatically performs initialization operations to bootstrap the `mysqld` instance before starting it.\n" + "The `mysqlctld` process can subsequently receive gRPC commands from a `vttablet` to perform housekeeping operations like shutting down and restarting the `mysqld` instance as needed.\n\n" + - "{{< warning >}}\n" + "`mysqld_safe` is not used so the `mysqld` process will not be automatically restarted in case of a failure.\n" + "{{}}\n\n" + @@ -151,7 +150,6 @@ func run(cmd *cobra.Command, args []string) error { cancel() servenv.Init() - defer servenv.Close() // Take mysqld down with us on SIGTERM before entering lame duck. servenv.OnTermSync(func() { diff --git a/go/cmd/vtaclcheck/cli/vtactlcheck.go b/go/cmd/vtaclcheck/cli/vtactlcheck.go index d6a71a23252..ebac94131e8 100644 --- a/go/cmd/vtaclcheck/cli/vtactlcheck.go +++ b/go/cmd/vtaclcheck/cli/vtactlcheck.go @@ -44,7 +44,6 @@ var ( func run(cmd *cobra.Command, args []string) error { servenv.Init() - defer servenv.Close() opts := &vtaclcheck.Options{ ACLFile: aclFile, diff --git a/go/cmd/vtbackup/cli/vtbackup.go b/go/cmd/vtbackup/cli/vtbackup.go index 3e48b75df4d..121ba39b8c5 100644 --- a/go/cmd/vtbackup/cli/vtbackup.go +++ b/go/cmd/vtbackup/cli/vtbackup.go @@ -217,7 +217,6 @@ func init() { func run(_ *cobra.Command, args []string) error { servenv.Init() - defer servenv.Close() ctx, cancel := context.WithCancel(context.Background()) servenv.OnClose(func() { diff --git a/go/cmd/vtbench/cli/vtbench.go b/go/cmd/vtbench/cli/vtbench.go index 3c197dfc905..69b866bb60d 100644 --- a/go/cmd/vtbench/cli/vtbench.go +++ b/go/cmd/vtbench/cli/vtbench.go @@ -162,7 +162,6 @@ func run(cmd *cobra.Command, args []string) error { _ = cmd.Flags().Set("logtostderr", "true") servenv.Init() - defer servenv.Close() var clientProto vtbench.ClientProtocol switch protocol { diff --git a/go/cmd/vtctld/cli/cli.go b/go/cmd/vtctld/cli/cli.go index 42ab1cfde1e..e5124133adb 100644 --- a/go/cmd/vtctld/cli/cli.go +++ b/go/cmd/vtctld/cli/cli.go @@ -55,7 +55,6 @@ This is demonstrated in the example usage below.`, func run(cmd *cobra.Command, args []string) error { servenv.Init() - defer servenv.Close() ts = topo.Open() defer ts.Close() diff --git a/go/cmd/vtgate/cli/cli.go b/go/cmd/vtgate/cli/cli.go index 0ba24162f41..9182bfcf9a4 100644 --- a/go/cmd/vtgate/cli/cli.go +++ b/go/cmd/vtgate/cli/cli.go @@ -134,7 +134,6 @@ func run(cmd *cobra.Command, args []string) error { defer exit.Recover() servenv.Init() - defer servenv.Close() ts := topo.Open() defer ts.Close() diff --git a/go/cmd/vttablet/cli/cli.go b/go/cmd/vttablet/cli/cli.go index e967aafc164..1efa35613d7 100644 --- a/go/cmd/vttablet/cli/cli.go +++ b/go/cmd/vttablet/cli/cli.go @@ -104,7 +104,6 @@ vttablet \ func run(cmd *cobra.Command, args []string) error { servenv.Init() - defer servenv.Close() tabletAlias, err := topoproto.ParseTabletAlias(tabletPath) if err != nil { diff --git a/go/vt/servenv/run.go b/go/vt/servenv/run.go index ec0d8971e56..6f028786eaf 100644 --- a/go/vt/servenv/run.go +++ b/go/vt/servenv/run.go @@ -74,11 +74,6 @@ func Run(bindAddress string, port int) { log.Info("Shutting down gracefully") fireOnCloseHooks(onCloseTimeout) -} - -// Close runs any registered exit hooks in parallel. -func Close() { - onCloseHooks.Fire() ListeningURL = url.URL{} } From 8072a3880a9787812c2cd3c83016c15aa4ec6b3b Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Sat, 4 Nov 2023 15:45:03 +0100 Subject: [PATCH 05/39] vtgate: Allow additional errors in warnings test (#14461) Signed-off-by: Dirkjan Bussink --- .../endtoend/vtgate/errors_as_warnings/main_test.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/go/test/endtoend/vtgate/errors_as_warnings/main_test.go b/go/test/endtoend/vtgate/errors_as_warnings/main_test.go index 20861d354a0..24cade5b550 100644 --- a/go/test/endtoend/vtgate/errors_as_warnings/main_test.go +++ b/go/test/endtoend/vtgate/errors_as_warnings/main_test.go @@ -140,10 +140,17 @@ func TestScatterErrsAsWarns(t *testing.T) { utils.Exec(t, mode.conn, "use @replica") utils.Exec(t, mode.conn, fmt.Sprintf("set workload = %s", mode.m)) + expectedWarnings := []string{ + "operation not allowed in state NOT_SERVING", + "operation not allowed in state SHUTTING_DOWN", + "no valid tablet", + "no healthy tablet", + "mysql.sock: connect: no such file or directory", + } utils.AssertMatches(t, mode.conn, query1, `[[INT64(4)]]`) - assertContainsOneOf(t, mode.conn, showQ, "operation not allowed in state SHUTTING_DOWN", "no valid tablet", "no healthy tablet", "mysql.sock: connect: no such file or directory") + assertContainsOneOf(t, mode.conn, showQ, expectedWarnings...) utils.AssertMatches(t, mode.conn, query2, `[[INT64(4)]]`) - assertContainsOneOf(t, mode.conn, showQ, "operation not allowed in state SHUTTING_DOWN", "no valid tablet", "no healthy tablet", "mysql.sock: connect: no such file or directory") + assertContainsOneOf(t, mode.conn, showQ, expectedWarnings...) // invalid_field should throw error and not warning _, err = mode.conn.ExecuteFetch("SELECT /*vt+ PLANNER=Gen4 SCATTER_ERRORS_AS_WARNINGS */ invalid_field from t1;", 1, false) From 6912eb7bbdf68bba463232e506dfa55d98d54e8e Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Sat, 4 Nov 2023 16:01:37 +0100 Subject: [PATCH 06/39] VDiff: "show all" should only report vdiffs for the specified keyspace and workflow (#14442) Signed-off-by: Rohit Nayak Signed-off-by: Matt Lord Signed-off-by: deepthi Co-authored-by: Matt Lord Co-authored-by: deepthi --- .../vdiff_multiple_movetables_test.go | 135 ++++++++++++++++++ go/vt/vtctl/workflow/server.go | 1 - go/vt/vttablet/tabletmanager/vdiff/action.go | 16 ++- .../tabletmanager/vdiff/action_test.go | 32 +++++ go/vt/vttablet/tabletmanager/vdiff/schema.go | 9 +- test/config.json | 9 ++ 6 files changed, 193 insertions(+), 9 deletions(-) create mode 100644 go/test/endtoend/vreplication/vdiff_multiple_movetables_test.go diff --git a/go/test/endtoend/vreplication/vdiff_multiple_movetables_test.go b/go/test/endtoend/vreplication/vdiff_multiple_movetables_test.go new file mode 100644 index 00000000000..0f6a9f668d0 --- /dev/null +++ b/go/test/endtoend/vreplication/vdiff_multiple_movetables_test.go @@ -0,0 +1,135 @@ +/* +Copyright 2023 The Vitess Authors. + +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 vreplication + +import ( + "context" + "fmt" + "sync" + "testing" + "time" + + "github.com/tidwall/gjson" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/test/endtoend/cluster" + "vitess.io/vitess/go/vt/log" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" +) + +func TestMultipleConcurrentVDiffs(t *testing.T) { + cellName := "zone" + cells := []string{cellName} + vc = NewVitessCluster(t, t.Name(), cells, mainClusterConfig) + + require.NotNil(t, vc) + allCellNames = cellName + defaultCellName := cellName + defaultCell = vc.Cells[defaultCellName] + sourceKeyspace := "product" + shardName := "0" + + defer vc.TearDown(t) + + cell := vc.Cells[cellName] + vc.AddKeyspace(t, []*Cell{cell}, sourceKeyspace, shardName, initialProductVSchema, initialProductSchema, 0, 0, 100, sourceKsOpts) + + vtgate = cell.Vtgates[0] + require.NotNil(t, vtgate) + err := cluster.WaitForHealthyShard(vc.VtctldClient, sourceKeyspace, shardName) + require.NoError(t, err) + vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", sourceKeyspace, shardName), 1, 30*time.Second) + + vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) + defer vtgateConn.Close() + verifyClusterHealth(t, vc) + + insertInitialData(t) + targetTabletId := 200 + targetKeyspace := "customer" + vc.AddKeyspace(t, []*Cell{cell}, targetKeyspace, shardName, initialProductVSchema, initialProductSchema, 0, 0, targetTabletId, sourceKsOpts) + vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", targetKeyspace, shardName), 1, 30*time.Second) + + index := 1000 + var loadCtx context.Context + var loadCancel context.CancelFunc + loadCtx, loadCancel = context.WithCancel(context.Background()) + load := func(tableName string) { + query := "insert into %s(cid, name) values(%d, 'customer-%d')" + for { + select { + case <-loadCtx.Done(): + log.Infof("load cancelled") + return + default: + index += 1 + vtgateConn := getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) + q := fmt.Sprintf(query, tableName, index, index) + vtgateConn.ExecuteFetch(q, 1000, false) + vtgateConn.Close() + } + time.Sleep(10 * time.Millisecond) + } + } + targetKs := vc.Cells[cellName].Keyspaces[targetKeyspace] + targetTab := targetKs.Shards["0"].Tablets[fmt.Sprintf("%s-%d", cellName, targetTabletId)].Vttablet + require.NotNil(t, targetTab) + + time.Sleep(15 * time.Second) // wait for some rows to be inserted. + + createWorkflow := func(workflowName, tables string) { + mt := newMoveTables(vc, &moveTables{ + workflowName: workflowName, + targetKeyspace: targetKeyspace, + sourceKeyspace: sourceKeyspace, + tables: tables, + }, moveTablesFlavorVtctld) + mt.Create() + waitForWorkflowState(t, vc, fmt.Sprintf("%s.%s", targetKeyspace, workflowName), binlogdatapb.VReplicationWorkflowState_Running.String()) + catchup(t, targetTab, workflowName, "MoveTables") + } + + createWorkflow("wf1", "customer") + createWorkflow("wf2", "customer2") + + go load("customer") + go load("customer2") + + var wg sync.WaitGroup + wg.Add(2) + + doVdiff := func(workflowName, table string) { + defer wg.Done() + vdiff(t, targetKeyspace, workflowName, cellName, true, false, nil) + } + go doVdiff("wf1", "customer") + go doVdiff("wf2", "customer2") + wg.Wait() + loadCancel() + + // confirm that show all shows the correct workflow and only that workflow. + output, err := vc.VtctldClient.ExecuteCommandWithOutput("VDiff", "--format", "json", "--workflow", "wf1", "--target-keyspace", "customer", "show", "all") + require.NoError(t, err) + log.Infof("VDiff output: %s", output) + count := gjson.Get(output, "..#").Int() + wf := gjson.Get(output, "0.Workflow").String() + ksName := gjson.Get(output, "0.Keyspace").String() + require.Equal(t, int64(1), count) + require.Equal(t, "wf1", wf) + require.Equal(t, "customer", ksName) +} diff --git a/go/vt/vtctl/workflow/server.go b/go/vt/vtctl/workflow/server.go index c26a38c4811..6927b56b89d 100644 --- a/go/vt/vtctl/workflow/server.go +++ b/go/vt/vtctl/workflow/server.go @@ -1781,7 +1781,6 @@ func (s *Server) VDiffShow(ctx context.Context, req *vtctldatapb.VDiffShowReques log.Errorf("Error executing vdiff show action: %v", output.err) return nil, output.err } - return &vtctldatapb.VDiffShowResponse{ TabletResponses: output.responses, }, nil diff --git a/go/vt/vttablet/tabletmanager/vdiff/action.go b/go/vt/vttablet/tabletmanager/vdiff/action.go index ac9bec86990..59ee79077f7 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/action.go +++ b/go/vt/vttablet/tabletmanager/vdiff/action.go @@ -47,6 +47,8 @@ const ( DeleteAction VDiffAction = "delete" AllActionArg = "all" LastActionArg = "last" + + maxVDiffsToReport = 100 ) var ( @@ -267,13 +269,13 @@ func (vde *Engine) handleCreateResumeAction(ctx context.Context, dbClient binlog func (vde *Engine) handleShowAction(ctx context.Context, dbClient binlogplayer.DBClient, action VDiffAction, req *tabletmanagerdatapb.VDiffRequest, resp *tabletmanagerdatapb.VDiffResponse) error { var qr *sqltypes.Result - var err error vdiffUUID := "" if req.ActionArg == LastActionArg { - query, err := sqlparser.ParseAndBind(sqlGetMostRecentVDiff, + query, err := sqlparser.ParseAndBind(sqlGetMostRecentVDiffByKeyspaceWorkflow, sqltypes.StringBindVariable(req.Keyspace), sqltypes.StringBindVariable(req.Workflow), + sqltypes.Int64BindVariable(1), ) if err != nil { return err @@ -322,7 +324,15 @@ func (vde *Engine) handleShowAction(ctx context.Context, dbClient binlogplayer.D } switch req.ActionArg { case AllActionArg: - if qr, err = dbClient.ExecuteFetch(sqlGetAllVDiffs, -1); err != nil { + query, err := sqlparser.ParseAndBind(sqlGetMostRecentVDiffByKeyspaceWorkflow, + sqltypes.StringBindVariable(req.Keyspace), + sqltypes.StringBindVariable(req.Workflow), + sqltypes.Int64BindVariable(maxVDiffsToReport), + ) + if err != nil { + return err + } + if qr, err = dbClient.ExecuteFetch(query, -1); err != nil { return err } resp.Output = sqltypes.ResultToProto3(qr) diff --git a/go/vt/vttablet/tabletmanager/vdiff/action_test.go b/go/vt/vttablet/tabletmanager/vdiff/action_test.go index 9bbfbaa4d68..1049bc8607d 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/action_test.go +++ b/go/vt/vttablet/tabletmanager/vdiff/action_test.go @@ -175,6 +175,38 @@ func TestPerformVDiffAction(t *testing.T) { }, }, }, + { + name: "show last", + req: &tabletmanagerdatapb.VDiffRequest{ + Action: string(ShowAction), + ActionArg: "last", + Keyspace: keyspace, + Workflow: workflow, + }, + expectQueries: []queryAndResult{ + { + query: fmt.Sprintf("select * from _vt.vdiff where keyspace = %s and workflow = %s order by id desc limit %d", + encodeString(keyspace), encodeString(workflow), 1), + result: noResults, + }, + }, + }, + { + name: "show all", + req: &tabletmanagerdatapb.VDiffRequest{ + Action: string(ShowAction), + ActionArg: "all", + Keyspace: keyspace, + Workflow: workflow, + }, + expectQueries: []queryAndResult{ + { + query: fmt.Sprintf("select * from _vt.vdiff where keyspace = %s and workflow = %s order by id desc limit %d", + encodeString(keyspace), encodeString(workflow), maxVDiffsToReport), + result: noResults, + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/go/vt/vttablet/tabletmanager/vdiff/schema.go b/go/vt/vttablet/tabletmanager/vdiff/schema.go index 72da9f15ada..a63e60d9434 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/schema.go +++ b/go/vt/vttablet/tabletmanager/vdiff/schema.go @@ -24,10 +24,10 @@ const ( and vdt.state in ('completed', 'stopped')` sqlRetryVDiff = `update _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) set vd.state = 'pending', vd.last_error = '', vdt.state = 'pending' where vd.id = %a and (vd.state = 'error' or vdt.state = 'error')` - sqlGetVDiffByKeyspaceWorkflowUUID = "select * from _vt.vdiff where keyspace = %a and workflow = %a and vdiff_uuid = %a" - sqlGetMostRecentVDiff = "select * from _vt.vdiff where keyspace = %a and workflow = %a order by id desc limit 1" - sqlGetVDiffByID = "select * from _vt.vdiff where id = %a" - sqlDeleteVDiffs = `delete from vd, vdt, vdl using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) + sqlGetVDiffByKeyspaceWorkflowUUID = "select * from _vt.vdiff where keyspace = %a and workflow = %a and vdiff_uuid = %a" + sqlGetMostRecentVDiffByKeyspaceWorkflow = "select * from _vt.vdiff where keyspace = %a and workflow = %a order by id desc limit %a" + sqlGetVDiffByID = "select * from _vt.vdiff where id = %a" + sqlDeleteVDiffs = `delete from vd, vdt, vdl using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) left join _vt.vdiff_log as vdl on (vd.id = vdl.vdiff_id) where vd.keyspace = %a and vd.workflow = %a` sqlDeleteVDiffByUUID = `delete from vd, vdt using _vt.vdiff as vd left join _vt.vdiff_table as vdt on (vd.id = vdt.vdiff_id) @@ -48,7 +48,6 @@ const ( sqlGetVDiffsToRetry = "select * from _vt.vdiff where state = 'error' and json_unquote(json_extract(options, '$.core_options.auto_retry')) = 'true'" sqlGetVDiffID = "select id as id from _vt.vdiff where vdiff_uuid = %a" sqlGetVDiffIDsByKeyspaceWorkflow = "select id as id from _vt.vdiff where keyspace = %a and workflow = %a" - sqlGetAllVDiffs = "select * from _vt.vdiff order by id desc" sqlGetTableRows = "select table_rows as table_rows from INFORMATION_SCHEMA.TABLES where table_schema = %a and table_name = %a" sqlGetAllTableRows = "select table_name as table_name, table_rows as table_rows from INFORMATION_SCHEMA.TABLES where table_schema = %s and table_name in (%s)" diff --git a/test/config.json b/test/config.json index 2894f54060a..66657b4f37e 100644 --- a/test/config.json +++ b/test/config.json @@ -1049,6 +1049,15 @@ "RetryMax": 0, "Tags": [] }, + "vdiff_multiple_movetables_test.go": { + "File": "unused.go", + "Args": ["vitess.io/vitess/go/test/endtoend/vreplication", "-run", "TestMultipleConcurrentVDiffs"], + "Command": [], + "Manual": false, + "Shard": "vreplication_partial_movetables_basic", + "RetryMax": 0, + "Tags": [] + }, "vreplication_movetables_buffering": { "File": "unused.go", "Args": ["vitess.io/vitess/go/test/endtoend/vreplication", "-run", "TestMoveTablesBuffering"], From 3ad017178fd0943b7b7b07e781a35e62e2142e41 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Sat, 4 Nov 2023 14:38:07 -0400 Subject: [PATCH 07/39] VReplication: Handle multiple streams in UpdateVReplicationWorkflow RPC (#14447) Signed-off-by: Matt Lord --- .../vreplication/vreplication_test.go | 14 ++ go/textutil/strings.go | 6 +- .../tabletmanager/rpc_vreplication.go | 133 +++++++++--------- .../tabletmanager/rpc_vreplication_test.go | 38 +++-- 4 files changed, 114 insertions(+), 77 deletions(-) diff --git a/go/test/endtoend/vreplication/vreplication_test.go b/go/test/endtoend/vreplication/vreplication_test.go index c73a9234240..62d174df067 100644 --- a/go/test/endtoend/vreplication/vreplication_test.go +++ b/go/test/endtoend/vreplication/vreplication_test.go @@ -1077,6 +1077,7 @@ func reshard(t *testing.T, ksName string, tableName string, workflow string, sou continue } } + restartWorkflow(t, ksWorkflow) vdiffSideBySide(t, ksWorkflow, "") if dryRunResultSwitchReads != nil { reshardAction(t, "SwitchTraffic", workflow, ksName, "", "", allCellNames, "rdonly,replica", "--dry-run") @@ -1578,6 +1579,19 @@ func switchWritesDryRun(t *testing.T, workflowType, ksWorkflow string, dryRunRes validateDryRunResults(t, output, dryRunResults) } +// restartWorkflow confirms that a workflow can be successfully +// stopped and started. +func restartWorkflow(t *testing.T, ksWorkflow string) { + keyspace, workflow, found := strings.Cut(ksWorkflow, ".") + require.True(t, found, "unexpected ksWorkflow value: %s", ksWorkflow) + err := vc.VtctldClient.ExecuteCommand("workflow", "--keyspace", keyspace, "stop", "--workflow", workflow) + require.NoError(t, err, "failed to stop workflow: %v", err) + waitForWorkflowState(t, vc, ksWorkflow, binlogdatapb.VReplicationWorkflowState_Stopped.String()) + err = vc.VtctldClient.ExecuteCommand("workflow", "--keyspace", keyspace, "start", "--workflow", workflow) + require.NoError(t, err, "failed to start workflow: %v", err) + waitForWorkflowState(t, vc, ksWorkflow, binlogdatapb.VReplicationWorkflowState_Running.String()) +} + func printSwitchWritesExtraDebug(t *testing.T, ksWorkflow, msg string) { // Temporary code: print lots of info for debugging occasional flaky failures in customer reshard in CI for multicell test debug := true diff --git a/go/textutil/strings.go b/go/textutil/strings.go index bb2e24ba477..ac35541f52f 100644 --- a/go/textutil/strings.go +++ b/go/textutil/strings.go @@ -23,8 +23,8 @@ import ( "unicode" "vitess.io/vitess/go/sqltypes" - "vitess.io/vitess/go/vt/proto/binlogdata" + binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" ) @@ -94,7 +94,7 @@ func ValueIsSimulatedNull(val any) bool { return cval == SimulatedNullString case []string: return len(cval) == 1 && cval[0] == sqltypes.NULL.String() - case binlogdata.OnDDLAction: + case binlogdatapb.OnDDLAction: return int32(cval) == int32(SimulatedNullInt) case int: return cval == SimulatedNullInt @@ -104,6 +104,8 @@ func ValueIsSimulatedNull(val any) bool { return int64(cval) == int64(SimulatedNullInt) case []topodatapb.TabletType: return len(cval) == 1 && cval[0] == topodatapb.TabletType(SimulatedNullInt) + case binlogdatapb.VReplicationWorkflowState: + return int32(cval) == int32(SimulatedNullInt) default: return false } diff --git a/go/vt/vttablet/tabletmanager/rpc_vreplication.go b/go/vt/vttablet/tabletmanager/rpc_vreplication.go index bbcea8bd0d6..b18caa1063f 100644 --- a/go/vt/vttablet/tabletmanager/rpc_vreplication.go +++ b/go/vt/vttablet/tabletmanager/rpc_vreplication.go @@ -45,10 +45,10 @@ const ( sqlReadVReplicationWorkflow = "select id, source, pos, stop_pos, max_tps, max_replication_lag, cell, tablet_types, time_updated, transaction_timestamp, state, message, db_name, rows_copied, tags, time_heartbeat, workflow_type, time_throttled, component_throttled, workflow_sub_type, defer_secondary_keys from %s.vreplication where workflow = %a and db_name = %a" // Delete VReplication records for the given workflow. sqlDeleteVReplicationWorkflow = "delete from %s.vreplication where workflow = %a and db_name = %a" - // Retrieve the current configuration values for a workflow's vreplication stream. + // Retrieve the current configuration values for a workflow's vreplication stream(s). sqlSelectVReplicationWorkflowConfig = "select id, source, cell, tablet_types, state, message from %s.vreplication where workflow = %a" // Update the configuration values for a workflow's vreplication stream. - sqlUpdateVReplicationWorkflowConfig = "update %s.vreplication set state = %a, source = %a, cell = %a, tablet_types = %a where id = %a" + sqlUpdateVReplicationWorkflowStreamConfig = "update %s.vreplication set state = %a, source = %a, cell = %a, tablet_types = %a where id = %a" ) func (tm *TabletManager) CreateVReplicationWorkflow(ctx context.Context, req *tabletmanagerdatapb.CreateVReplicationWorkflowRequest) (*tabletmanagerdatapb.CreateVReplicationWorkflowResponse, error) { @@ -228,8 +228,8 @@ func (tm *TabletManager) ReadVReplicationWorkflow(ctx context.Context, req *tabl } // UpdateVReplicationWorkflow updates the sidecar databases's vreplication -// record for this tablet's vreplication workflow stream(s). If there -// is no stream for the given workflow on the tablet then a nil result +// record(s) for this tablet's vreplication workflow stream(s). If there +// are no streams for the given workflow on the tablet then a nil result // is returned as this is expected e.g. on source tablets of a // Reshard workflow (source and target are the same keyspace). The // caller can consider this case an error if they choose to. @@ -257,68 +257,73 @@ func (tm *TabletManager) UpdateVReplicationWorkflow(ctx context.Context, req *ta return &tabletmanagerdatapb.UpdateVReplicationWorkflowResponse{Result: nil}, nil } - row := res.Named().Row() - id := row.AsInt64("id", 0) - cells := strings.Split(row.AsString("cell", ""), ",") - tabletTypes, inorder, err := discovery.ParseTabletTypesAndOrder(row.AsString("tablet_types", "")) - if err != nil { - return nil, err - } - bls := &binlogdatapb.BinlogSource{} - source := row.AsBytes("source", []byte{}) - state := row.AsString("state", "") - message := row.AsString("message", "") - if req.State == binlogdatapb.VReplicationWorkflowState_Running && strings.ToUpper(message) == workflow.Frozen { - return &tabletmanagerdatapb.UpdateVReplicationWorkflowResponse{Result: nil}, - vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "cannot start a workflow when it is frozen") - } - // For the string based values, we use NULL to differentiate - // from an empty string. The NULL value indicates that we - // should keep the existing value. - if !textutil.ValueIsSimulatedNull(req.Cells) { - cells = req.Cells - } - if !textutil.ValueIsSimulatedNull(req.TabletTypes) { - tabletTypes = req.TabletTypes - } - tabletTypesStr := topoproto.MakeStringTypeCSV(tabletTypes) - if inorder && req.TabletSelectionPreference == tabletmanagerdatapb.TabletSelectionPreference_UNKNOWN || - req.TabletSelectionPreference == tabletmanagerdatapb.TabletSelectionPreference_INORDER { - tabletTypesStr = discovery.InOrderHint + tabletTypesStr - } - if err = prototext.Unmarshal(source, bls); err != nil { - return nil, err - } - // If we don't want to update the existing value then pass - // the simulated NULL value of -1. - if !textutil.ValueIsSimulatedNull(req.OnDdl) { - bls.OnDdl = req.OnDdl - } - source, err = prototext.Marshal(bls) - if err != nil { - return nil, err - } - if !textutil.ValueIsSimulatedNull(req.State) { - state = binlogdatapb.VReplicationWorkflowState_name[int32(req.State)] - } - bindVars = map[string]*querypb.BindVariable{ - "st": sqltypes.StringBindVariable(state), - "sc": sqltypes.StringBindVariable(string(source)), - "cl": sqltypes.StringBindVariable(strings.Join(cells, ",")), - "tt": sqltypes.StringBindVariable(tabletTypesStr), - "id": sqltypes.Int64BindVariable(id), - } - parsed = sqlparser.BuildParsedQuery(sqlUpdateVReplicationWorkflowConfig, sidecar.GetIdentifier(), ":st", ":sc", ":cl", ":tt", ":id") - stmt, err = parsed.GenerateQuery(bindVars, nil) - if err != nil { - return nil, err + for _, row := range res.Named().Rows { + id := row.AsInt64("id", 0) + cells := strings.Split(row.AsString("cell", ""), ",") + tabletTypes, inorder, err := discovery.ParseTabletTypesAndOrder(row.AsString("tablet_types", "")) + if err != nil { + return nil, err + } + bls := &binlogdatapb.BinlogSource{} + source := row.AsBytes("source", []byte{}) + state := row.AsString("state", "") + message := row.AsString("message", "") + if req.State == binlogdatapb.VReplicationWorkflowState_Running && strings.ToUpper(message) == workflow.Frozen { + return &tabletmanagerdatapb.UpdateVReplicationWorkflowResponse{Result: nil}, + vterrors.New(vtrpcpb.Code_FAILED_PRECONDITION, "cannot start a workflow when it is frozen") + } + // For the string based values, we use NULL to differentiate + // from an empty string. The NULL value indicates that we + // should keep the existing value. + if !textutil.ValueIsSimulatedNull(req.Cells) { + cells = req.Cells + } + if !textutil.ValueIsSimulatedNull(req.TabletTypes) { + tabletTypes = req.TabletTypes + } + tabletTypesStr := topoproto.MakeStringTypeCSV(tabletTypes) + if inorder && req.TabletSelectionPreference == tabletmanagerdatapb.TabletSelectionPreference_UNKNOWN || + req.TabletSelectionPreference == tabletmanagerdatapb.TabletSelectionPreference_INORDER { + tabletTypesStr = discovery.InOrderHint + tabletTypesStr + } + if err = prototext.Unmarshal(source, bls); err != nil { + return nil, err + } + // If we don't want to update the existing value then pass + // the simulated NULL value of -1. + if !textutil.ValueIsSimulatedNull(req.OnDdl) { + bls.OnDdl = req.OnDdl + } + source, err = prototext.Marshal(bls) + if err != nil { + return nil, err + } + if !textutil.ValueIsSimulatedNull(req.State) { + state = binlogdatapb.VReplicationWorkflowState_name[int32(req.State)] + } + bindVars = map[string]*querypb.BindVariable{ + "st": sqltypes.StringBindVariable(state), + "sc": sqltypes.StringBindVariable(string(source)), + "cl": sqltypes.StringBindVariable(strings.Join(cells, ",")), + "tt": sqltypes.StringBindVariable(tabletTypesStr), + "id": sqltypes.Int64BindVariable(id), + } + parsed = sqlparser.BuildParsedQuery(sqlUpdateVReplicationWorkflowStreamConfig, sidecar.GetIdentifier(), ":st", ":sc", ":cl", ":tt", ":id") + stmt, err = parsed.GenerateQuery(bindVars, nil) + if err != nil { + return nil, err + } + res, err = tm.VREngine.Exec(stmt) + if err != nil { + return nil, err + } } - res, err = tm.VREngine.Exec(stmt) - if err != nil { - return nil, err - } - return &tabletmanagerdatapb.UpdateVReplicationWorkflowResponse{Result: sqltypes.ResultToProto3(res)}, nil + return &tabletmanagerdatapb.UpdateVReplicationWorkflowResponse{ + Result: &querypb.QueryResult{ + RowsAffected: uint64(len(res.Rows)), + }, + }, nil } // VReplicationExec executes a vreplication command. diff --git a/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go b/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go index 1f985733371..a471750da19 100644 --- a/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go +++ b/go/vt/vttablet/tabletmanager/rpc_vreplication_test.go @@ -479,10 +479,10 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { keyspace, shard) selectRes := sqltypes.MakeTestResult( sqltypes.MakeTestFields( - "id|source|cell|tablet_types", - "int64|varchar|varchar|varchar", + "id|source|cell|tablet_types|state|message", + "int64|varchar|varchar|varchar|varchar|varbinary", ), - fmt.Sprintf("%d|%s|%s|%s", vreplID, blsStr, cells[0], tabletTypes[0]), + fmt.Sprintf("%d|%s|%s|%s|Running|", vreplID, blsStr, cells[0], tabletTypes[0]), ) idQuery, err := sqlparser.ParseAndBind("select id from _vt.vreplication where id = %a", sqltypes.Int64BindVariable(int64(vreplID))) @@ -504,62 +504,80 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { name: "update cells", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, + State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), Cells: []string{"zone2"}, // TabletTypes is an empty value, so the current value should be cleared }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Stopped', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}}', cell = '%s', tablet_types = '' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}}', cell = '%s', tablet_types = '' where id in (%d)`, keyspace, shard, "zone2", vreplID), }, { name: "update cells, NULL tablet_types", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, + State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), Cells: []string{"zone3"}, TabletTypes: []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)}, // So keep the current value of replica }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Stopped', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, keyspace, shard, "zone3", tabletTypes[0], vreplID), }, { name: "update tablet_types", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, + State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), TabletSelectionPreference: tabletmanagerdatapb.TabletSelectionPreference_INORDER, TabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY, topodatapb.TabletType_REPLICA}, }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Stopped', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}}', cell = '', tablet_types = '%s' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}}', cell = '', tablet_types = '%s' where id in (%d)`, keyspace, shard, "in_order:rdonly,replica", vreplID), }, { name: "update tablet_types, NULL cells", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, + State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), Cells: textutil.SimulatedNullStringSlice, // So keep the current value of zone1 TabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY}, }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Stopped', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, keyspace, shard, cells[0], "rdonly", vreplID), }, { name: "update on_ddl", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, + State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), OnDdl: binlogdatapb.OnDDLAction_EXEC, }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Stopped', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}} on_ddl:%s', cell = '', tablet_types = '' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}} on_ddl:%s', cell = '', tablet_types = '' where id in (%d)`, keyspace, shard, binlogdatapb.OnDDLAction_EXEC.String(), vreplID), }, { name: "update cell,tablet_types,on_ddl", request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ Workflow: workflow, + State: binlogdatapb.VReplicationWorkflowState(textutil.SimulatedNullInt), Cells: []string{"zone1", "zone2", "zone3"}, TabletTypes: []topodatapb.TabletType{topodatapb.TabletType_RDONLY, topodatapb.TabletType_REPLICA, topodatapb.TabletType_PRIMARY}, OnDdl: binlogdatapb.OnDDLAction_EXEC_IGNORE, }, - query: fmt.Sprintf(`update _vt.vreplication set state = 'Stopped', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}} on_ddl:%s', cell = '%s', tablet_types = '%s' where id in (%d)`, + query: fmt.Sprintf(`update _vt.vreplication set state = 'Running', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}} on_ddl:%s', cell = '%s', tablet_types = '%s' where id in (%d)`, keyspace, shard, binlogdatapb.OnDDLAction_EXEC_IGNORE.String(), "zone1,zone2,zone3", "rdonly,replica,primary", vreplID), }, + { + name: "update state", + request: &tabletmanagerdatapb.UpdateVReplicationWorkflowRequest{ + Workflow: workflow, + State: binlogdatapb.VReplicationWorkflowState_Stopped, + Cells: textutil.SimulatedNullStringSlice, + TabletTypes: []topodatapb.TabletType{topodatapb.TabletType(textutil.SimulatedNullInt)}, + OnDdl: binlogdatapb.OnDDLAction(textutil.SimulatedNullInt), + }, + query: fmt.Sprintf(`update _vt.vreplication set state = '%s', source = 'keyspace:\"%s\" shard:\"%s\" filter:{rules:{match:\"customer\" filter:\"select * from customer\"} rules:{match:\"corder\" filter:\"select * from corder\"}}', cell = '%s', tablet_types = '%s' where id in (%d)`, + binlogdatapb.VReplicationWorkflowState_Stopped.String(), keyspace, shard, cells[0], tabletTypes[0], vreplID), + }, } for _, tt := range tests { @@ -575,8 +593,6 @@ func TestUpdateVReplicationWorkflow(t *testing.T) { require.NotNil(t, tt.request, "No request provided") require.NotEqual(t, "", tt.query, "No expected query provided") - tt.request.State = binlogdatapb.VReplicationWorkflowState_Stopped - // These are the same for each RPC call. tenv.tmc.tablets[tabletUID].vrdbClient.ExpectRequest(fmt.Sprintf("use %s", sidecar.DefaultName), &sqltypes.Result{}, nil) tenv.tmc.tablets[tabletUID].vrdbClient.ExpectRequest(selectQuery, selectRes, nil) From cfe88e6920e08e1430d5b57e2f9a09737ab65e3c Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Sun, 5 Nov 2023 15:39:27 -0500 Subject: [PATCH 08/39] vtctldclient: Apply tablet type filtering for keyspace+shard in GetTablets (#14467) Signed-off-by: Matt Lord --- go/vt/vtctl/grpcvtctldserver/server.go | 7 +- go/vt/vtctl/grpcvtctldserver/server_test.go | 145 +++++++++++++++++++- 2 files changed, 150 insertions(+), 2 deletions(-) diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index cc3378172e9..25b711e1019 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -1945,6 +1945,9 @@ func (s *VtctldServer) GetTablets(ctx context.Context, req *vtctldatapb.GetTable defer panicHandler(&err) span.Annotate("cells", strings.Join(req.Cells, ",")) + if req.Keyspace != "" { + span.Annotate("keyspace", req.Keyspace) + } if req.TabletType != topodatapb.TabletType_UNKNOWN { span.Annotate("tablet_type", topodatapb.TabletType_name[int32(req.TabletType)]) } @@ -1978,7 +1981,6 @@ func (s *VtctldServer) GetTablets(ctx context.Context, req *vtctldatapb.GetTable err = fmt.Errorf("GetTabletMap(%v) failed: %w", req.TabletAliases, err) } case req.Keyspace != "" && req.Shard != "": - span.Annotate("keyspace", req.Keyspace) span.Annotate("shard", req.Shard) tabletMap, err = s.ts.GetTabletMapForShard(ctx, req.Keyspace, req.Shard) @@ -2016,6 +2018,9 @@ func (s *VtctldServer) GetTablets(ctx context.Context, req *vtctldatapb.GetTable tablets := make([]*topodatapb.Tablet, 0, len(tabletMap)) for _, ti := range tabletMap { + if req.TabletType != 0 && ti.Type != req.TabletType { + continue + } adjustTypeForStalePrimary(ti, truePrimaryTimestamp) tablets = append(tablets, ti.Tablet) } diff --git a/go/vt/vtctl/grpcvtctldserver/server_test.go b/go/vt/vtctl/grpcvtctldserver/server_test.go index 9999cbdc5bd..38029f0e799 100644 --- a/go/vt/vtctl/grpcvtctldserver/server_test.go +++ b/go/vt/vtctl/grpcvtctldserver/server_test.go @@ -39,6 +39,7 @@ import ( "vitess.io/vitess/go/test/utils" hk "vitess.io/vitess/go/vt/hook" "vitess.io/vitess/go/vt/mysqlctl/backupstorage" + "vitess.io/vitess/go/vt/proto/vttime" "vitess.io/vitess/go/vt/topo" "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/topo/topoproto" @@ -57,7 +58,6 @@ import ( vschemapb "vitess.io/vitess/go/vt/proto/vschema" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" vtctlservicepb "vitess.io/vitess/go/vt/proto/vtctlservice" - "vitess.io/vitess/go/vt/proto/vttime" ) func init() { @@ -6822,6 +6822,149 @@ func TestGetTablets(t *testing.T) { expected: []*topodatapb.Tablet{}, shouldErr: false, }, + { + name: "tablet type filter", + cells: []string{"cell1"}, + tablets: []*topodatapb.Tablet{ + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 100, + }, + Keyspace: "ks1", + Shard: "-80", + Type: topodatapb.TabletType_PRIMARY, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 101, + }, + Keyspace: "ks1", + Shard: "-80", + Type: topodatapb.TabletType_REPLICA, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 200, + }, + Keyspace: "ks1", + Shard: "80-", + Type: topodatapb.TabletType_PRIMARY, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 201, + }, + Keyspace: "ks1", + Shard: "80-", + Type: topodatapb.TabletType_REPLICA, + }, + }, + req: &vtctldatapb.GetTabletsRequest{ + TabletType: topodatapb.TabletType_PRIMARY, + }, + expected: []*topodatapb.Tablet{ + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 100, + }, + Keyspace: "ks1", + Shard: "-80", + Type: topodatapb.TabletType_PRIMARY, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 200, + }, + Keyspace: "ks1", + Shard: "80-", + Type: topodatapb.TabletType_PRIMARY, + }, + }, + shouldErr: false, + }, + { + name: "keyspace, shard, and tablet type filter", + cells: []string{"cell1"}, + tablets: []*topodatapb.Tablet{ + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 100, + }, + Keyspace: "ks1", + Shard: "-80", + Type: topodatapb.TabletType_PRIMARY, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 101, + }, + Keyspace: "ks1", + Shard: "-80", + Type: topodatapb.TabletType_REPLICA, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 200, + }, + Keyspace: "ks1", + Shard: "80-", + Type: topodatapb.TabletType_PRIMARY, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 201, + }, + Keyspace: "ks1", + Shard: "80-", + Type: topodatapb.TabletType_REPLICA, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 300, + }, + Keyspace: "ks2", + Shard: "-", + Type: topodatapb.TabletType_PRIMARY, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 301, + }, + Keyspace: "ks2", + Shard: "-", + Type: topodatapb.TabletType_REPLICA, + }, + }, + req: &vtctldatapb.GetTabletsRequest{ + Keyspace: "ks1", + Shard: "-80", + TabletType: topodatapb.TabletType_PRIMARY, + }, + expected: []*topodatapb.Tablet{ + { + Alias: &topodatapb.TabletAlias{ + Cell: "cell1", + Uid: 100, + }, + Keyspace: "ks1", + Shard: "-80", + Type: topodatapb.TabletType_PRIMARY, + }, + }, + shouldErr: false, + }, } for _, tt := range tests { From aec657b26eea307132dd23766a61f0575777011e Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 6 Nov 2023 17:38:39 +0530 Subject: [PATCH 09/39] move release notes of 18 to main (#14474) Signed-off-by: Harshit Gangal --- changelog/18.0/18.0.0/changelog.md | 811 +++++++++++++------------ changelog/18.0/18.0.0/release_notes.md | 198 +++--- changelog/18.0/18.0.0/summary.md | 14 +- 3 files changed, 556 insertions(+), 467 deletions(-) diff --git a/changelog/18.0/18.0.0/changelog.md b/changelog/18.0/18.0.0/changelog.md index 8648ced0d02..acf45ad7b37 100644 --- a/changelog/18.0/18.0.0/changelog.md +++ b/changelog/18.0/18.0.0/changelog.md @@ -1,464 +1,529 @@ -# Changelog of Vitess v18.0.0-rc1 +# Changelog of Vitess v18.0.0 -### Bug fixes +### Bug fixes #### Backup and Restore -* vtctldclient: Add missing new backup option [#13543](https://github.com/vitessio/vitess/pull/13543) -* Backup: safe compressor/decompressor closure [#13668](https://github.com/vitessio/vitess/pull/13668) -* Address vttablet memory usage with backups to Azure Blob Service [#13770](https://github.com/vitessio/vitess/pull/13770) -* Do not drain tablet in incremental backup [#13773](https://github.com/vitessio/vitess/pull/13773) -* go/cmd/vtbackup: wait for plugins to finish initializing [#14113](https://github.com/vitessio/vitess/pull/14113) + * vtctldclient: Add missing new backup option [#13543](https://github.com/vitessio/vitess/pull/13543) + * Backup: safe compressor/decompressor closure [#13668](https://github.com/vitessio/vitess/pull/13668) + * Address vttablet memory usage with backups to Azure Blob Service [#13770](https://github.com/vitessio/vitess/pull/13770) + * Do not drain tablet in incremental backup [#13773](https://github.com/vitessio/vitess/pull/13773) + * go/cmd/vtbackup: wait for plugins to finish initializing [#14113](https://github.com/vitessio/vitess/pull/14113) #### Build/CI -* Remove `os.Exit` in release-notes generation [#13310](https://github.com/vitessio/vitess/pull/13310) -* CI: Fix make build related issues [#13583](https://github.com/vitessio/vitess/pull/13583) -* Enable failures in `tools/e2e_test_race.sh` and fix races [#13654](https://github.com/vitessio/vitess/pull/13654) -* Fix regular expression issue in Golang Upgrade and remove `release-14.0` from target branch [#13846](https://github.com/vitessio/vitess/pull/13846) -* Make `Static Code Checks Etc` fail if the `./changelog` folder is out-of-date [#14003](https://github.com/vitessio/vitess/pull/14003) + * Remove `os.Exit` in release-notes generation [#13310](https://github.com/vitessio/vitess/pull/13310) + * CI: Fix make build related issues [#13583](https://github.com/vitessio/vitess/pull/13583) + * Enable failures in `tools/e2e_test_race.sh` and fix races [#13654](https://github.com/vitessio/vitess/pull/13654) + * Fix regular expression issue in Golang Upgrade and remove `release-14.0` from target branch [#13846](https://github.com/vitessio/vitess/pull/13846) + * Make `Static Code Checks Etc` fail if the `./changelog` folder is out-of-date [#14003](https://github.com/vitessio/vitess/pull/14003) #### CLI -* viperutil: Remove potential cross site reflecting issue [#13483](https://github.com/vitessio/vitess/pull/13483) -* [vtctldclient] flags need to be defined to be deprecated [#13681](https://github.com/vitessio/vitess/pull/13681) -* Fix missing deprecated flags in `vttablet` and `vtgate` [#13975](https://github.com/vitessio/vitess/pull/13975) + * viperutil: Remove potential cross site reflecting issue [#13483](https://github.com/vitessio/vitess/pull/13483) + * [vtctldclient] flags need to be defined to be deprecated [#13681](https://github.com/vitessio/vitess/pull/13681) + * Fix missing deprecated flags in `vttablet` and `vtgate` [#13975](https://github.com/vitessio/vitess/pull/13975) + * [release-18.0] Fix anonymous paths in cobra code-gen (#14185) [#14238](https://github.com/vitessio/vitess/pull/14238) + * servenv: Remove double close() logic [#14457](https://github.com/vitessio/vitess/pull/14457) + * [release-18.0] servenv: Remove double close() logic (#14457) [#14459](https://github.com/vitessio/vitess/pull/14459) #### Cluster management -* Prevent resetting replication every time we set replication source [#13377](https://github.com/vitessio/vitess/pull/13377) -* Don't run any reparent commands if the host is empty [#13396](https://github.com/vitessio/vitess/pull/13396) -* [main] Upgrade-Downgrade Fix: Schema-initialization stuck on semi-sync ACKs while upgrading (#13411) [#13440](https://github.com/vitessio/vitess/pull/13440) -* fix: error.as method usage to send pointer to the reference type expected [#13496](https://github.com/vitessio/vitess/pull/13496) -* check keyspace snapshot time if none specified for backup restores [#13557](https://github.com/vitessio/vitess/pull/13557) -* Flaky tests: Fix race in memory topo [#13559](https://github.com/vitessio/vitess/pull/13559) -* ignore all error for views in engine reload [#13590](https://github.com/vitessio/vitess/pull/13590) -* Fix `BackupShard` to get its options from its own flags [#13813](https://github.com/vitessio/vitess/pull/13813) + * Prevent resetting replication every time we set replication source [#13377](https://github.com/vitessio/vitess/pull/13377) + * Don't run any reparent commands if the host is empty [#13396](https://github.com/vitessio/vitess/pull/13396) + * [main] Upgrade-Downgrade Fix: Schema-initialization stuck on semi-sync ACKs while upgrading (#13411) [#13440](https://github.com/vitessio/vitess/pull/13440) + * fix: error.as method usage to send pointer to the reference type expected [#13496](https://github.com/vitessio/vitess/pull/13496) + * check keyspace snapshot time if none specified for backup restores [#13557](https://github.com/vitessio/vitess/pull/13557) + * Flaky tests: Fix race in memory topo [#13559](https://github.com/vitessio/vitess/pull/13559) + * ignore all error for views in engine reload [#13590](https://github.com/vitessio/vitess/pull/13590) + * Fix `BackupShard` to get its options from its own flags [#13813](https://github.com/vitessio/vitess/pull/13813) #### Docker -* Fix ubi8.arm64.mysql80 build package mirrorserver error [#13431](https://github.com/vitessio/vitess/pull/13431) -* Fix dependencies in docker build script [#13520](https://github.com/vitessio/vitess/pull/13520) -* Use NodeJS v18 in VTAdmin Dockerfile [#13751](https://github.com/vitessio/vitess/pull/13751) + * Fix ubi8.arm64.mysql80 build package mirrorserver error [#13431](https://github.com/vitessio/vitess/pull/13431) + * Fix dependencies in docker build script [#13520](https://github.com/vitessio/vitess/pull/13520) + * Use NodeJS v18 in VTAdmin Dockerfile [#13751](https://github.com/vitessio/vitess/pull/13751) + * [release-18.0] [Docker] Fix VTadmin build (#14363) [#14378](https://github.com/vitessio/vitess/pull/14378) #### Evalengine -* Fix a number of encoding issues when evaluating expressions with the evalengine [#13509](https://github.com/vitessio/vitess/pull/13509) -* Fix type comparisons for Nullsafe* functions [#13605](https://github.com/vitessio/vitess/pull/13605) -* fastparse: Fix bug in overflow detection [#13702](https://github.com/vitessio/vitess/pull/13702) -* evalengine: Mark UUID() function as non-constant [#14051](https://github.com/vitessio/vitess/pull/14051) + * Fix a number of encoding issues when evaluating expressions with the evalengine [#13509](https://github.com/vitessio/vitess/pull/13509) + * Fix type comparisons for Nullsafe* functions [#13605](https://github.com/vitessio/vitess/pull/13605) + * fastparse: Fix bug in overflow detection [#13702](https://github.com/vitessio/vitess/pull/13702) + * evalengine: Mark UUID() function as non-constant [#14051](https://github.com/vitessio/vitess/pull/14051) + * [release-18.0] evalengine: Misc bugs (#14351) [#14354](https://github.com/vitessio/vitess/pull/14354) #### Examples -* Use $hostname in vtadmin script as all other scripts do [#13231](https://github.com/vitessio/vitess/pull/13231) -* Local example 101: idempotent on existing clusters [#13373](https://github.com/vitessio/vitess/pull/13373) -* Examples: only terminate vtadmin if it was started [#13433](https://github.com/vitessio/vitess/pull/13433) -* `examples/compose`: fix `consul:latest` error w/`docker-compose up -d` [#13468](https://github.com/vitessio/vitess/pull/13468) + * Use $hostname in vtadmin script as all other scripts do [#13231](https://github.com/vitessio/vitess/pull/13231) + * Local example 101: idempotent on existing clusters [#13373](https://github.com/vitessio/vitess/pull/13373) + * Examples: only terminate vtadmin if it was started [#13433](https://github.com/vitessio/vitess/pull/13433) + * `examples/compose`: fix `consul:latest` error w/`docker-compose up -d` [#13468](https://github.com/vitessio/vitess/pull/13468) #### General -* Flakes: Synchronize access to logErrStacks in vterrors [#13827](https://github.com/vitessio/vitess/pull/13827) + * Flakes: Synchronize access to logErrStacks in vterrors [#13827](https://github.com/vitessio/vitess/pull/13827) + * [release-18.0] viper: register dynamic config with both disk and live (#14453) [#14455](https://github.com/vitessio/vitess/pull/14455) #### Online DDL -* Solve RevertMigration.Comment read/write concurrency issue [#13700](https://github.com/vitessio/vitess/pull/13700) -* Fix closed channel `panic` in Online DDL cutover [#13729](https://github.com/vitessio/vitess/pull/13729) -* OnlineDDL: fix nil 'completed_timestamp' for cancelled migrations [#13928](https://github.com/vitessio/vitess/pull/13928) -* Fix `ApplySchema --batch-size` with ` --allow-zero-in-date` [#13951](https://github.com/vitessio/vitess/pull/13951) -* TableGC: support DROP VIEW [#14020](https://github.com/vitessio/vitess/pull/14020) -* OnlineDDL: cleanup cancelled migration artifacts; support `--retain-artifacts=` DDL strategy flag [#14029](https://github.com/vitessio/vitess/pull/14029) -* bugfix: change column name and type to json [#14093](https://github.com/vitessio/vitess/pull/14093) + * Solve RevertMigration.Comment read/write concurrency issue [#13700](https://github.com/vitessio/vitess/pull/13700) + * Fix closed channel `panic` in Online DDL cutover [#13729](https://github.com/vitessio/vitess/pull/13729) + * OnlineDDL: fix nil 'completed_timestamp' for cancelled migrations [#13928](https://github.com/vitessio/vitess/pull/13928) + * Fix `ApplySchema --batch-size` with ` --allow-zero-in-date` [#13951](https://github.com/vitessio/vitess/pull/13951) + * TableGC: support DROP VIEW [#14020](https://github.com/vitessio/vitess/pull/14020) + * OnlineDDL: cleanup cancelled migration artifacts; support `--retain-artifacts=` DDL strategy flag [#14029](https://github.com/vitessio/vitess/pull/14029) + * bugfix: change column name and type to json [#14093](https://github.com/vitessio/vitess/pull/14093) + * [Release 18.0]: Online DDL: timeouts for all gRPC calls (#14182) [#14189](https://github.com/vitessio/vitess/pull/14189) #### Query Serving -* fix: GetField to use existing session for query [#13219](https://github.com/vitessio/vitess/pull/13219) -* VReplication Workflows: make sequence tables follow routing rules [#13238](https://github.com/vitessio/vitess/pull/13238) -* Adding random query generation for endtoend testing of the Gen4 planner [#13260](https://github.com/vitessio/vitess/pull/13260) -* Bug fix: SQL queries erroring with message `unknown aggregation random` [#13330](https://github.com/vitessio/vitess/pull/13330) -* bugfixes: collection of fixes to bugs found while fuzzing [#13332](https://github.com/vitessio/vitess/pull/13332) -* bug: don't always wrap aggregation in coalesce [#13348](https://github.com/vitessio/vitess/pull/13348) -* Random selection of keyspace based on available tablet [#13359](https://github.com/vitessio/vitess/pull/13359) -* Enable Tcp keep alive and provide keep alive period setting [#13434](https://github.com/vitessio/vitess/pull/13434) -* Improving random query generation for endtoend testing [#13460](https://github.com/vitessio/vitess/pull/13460) -* ignore ongoing backfill vindex from routing selection [#13505](https://github.com/vitessio/vitess/pull/13505) -* [release-17.0] ignore ongoing backfill vindex from routing selection [#13523](https://github.com/vitessio/vitess/pull/13523) -* Fix flaky vtgate test TestInconsistentStateDetectedBuffering [#13560](https://github.com/vitessio/vitess/pull/13560) -* Fix show character set [#13565](https://github.com/vitessio/vitess/pull/13565) -* vtgate: fix race condition iterating tables and views from schema tracker [#13673](https://github.com/vitessio/vitess/pull/13673) -* sqlparser: Track if original default value is a literal [#13730](https://github.com/vitessio/vitess/pull/13730) -* Fix for "text type with an unknown/unsupported collation cannot be hashed" error [#13852](https://github.com/vitessio/vitess/pull/13852) -* VTGate Buffering: Use a more accurate heuristic for determining if we're doing a reshard [#13856](https://github.com/vitessio/vitess/pull/13856) -* sqlparser: Tablespace option is case sensitive [#13884](https://github.com/vitessio/vitess/pull/13884) -* Rewrite `USING` to `ON` condition for joins [#13931](https://github.com/vitessio/vitess/pull/13931) -* handle large number of predicates without timing out [#13979](https://github.com/vitessio/vitess/pull/13979) -* Fix `NOT IN` expression used in the SET NULL for a child table on an update [#13988](https://github.com/vitessio/vitess/pull/13988) -* Fix the `SELECT` query we run on the child table to verify that update is allowed on a RESTRICT constraint [#13991](https://github.com/vitessio/vitess/pull/13991) -* fix data race in join engine primitive olap streaming mode execution [#14012](https://github.com/vitessio/vitess/pull/14012) -* fix: cost to include subshard opcode [#14023](https://github.com/vitessio/vitess/pull/14023) -* Add session flag for stream execute grpc api [#14046](https://github.com/vitessio/vitess/pull/14046) -* Fix cascading Delete failure while using Prepared statements [#14048](https://github.com/vitessio/vitess/pull/14048) -* Fix Fk verification and update queries to accommodate for bindVariables being NULL [#14061](https://github.com/vitessio/vitess/pull/14061) -* DDL execution to commit open transaction [#14110](https://github.com/vitessio/vitess/pull/14110) + * fix: GetField to use existing session for query [#13219](https://github.com/vitessio/vitess/pull/13219) + * VReplication Workflows: make sequence tables follow routing rules [#13238](https://github.com/vitessio/vitess/pull/13238) + * Adding random query generation for endtoend testing of the Gen4 planner [#13260](https://github.com/vitessio/vitess/pull/13260) + * Bug fix: SQL queries erroring with message `unknown aggregation random` [#13330](https://github.com/vitessio/vitess/pull/13330) + * bugfixes: collection of fixes to bugs found while fuzzing [#13332](https://github.com/vitessio/vitess/pull/13332) + * bug: don't always wrap aggregation in coalesce [#13348](https://github.com/vitessio/vitess/pull/13348) + * Random selection of keyspace based on available tablet [#13359](https://github.com/vitessio/vitess/pull/13359) + * Enable Tcp keep alive and provide keep alive period setting [#13434](https://github.com/vitessio/vitess/pull/13434) + * Improving random query generation for endtoend testing [#13460](https://github.com/vitessio/vitess/pull/13460) + * ignore ongoing backfill vindex from routing selection [#13505](https://github.com/vitessio/vitess/pull/13505) + * [release-17.0] ignore ongoing backfill vindex from routing selection [#13523](https://github.com/vitessio/vitess/pull/13523) + * Fix flaky vtgate test TestInconsistentStateDetectedBuffering [#13560](https://github.com/vitessio/vitess/pull/13560) + * Fix show character set [#13565](https://github.com/vitessio/vitess/pull/13565) + * vtgate: fix race condition iterating tables and views from schema tracker [#13673](https://github.com/vitessio/vitess/pull/13673) + * sqlparser: Track if original default value is a literal [#13730](https://github.com/vitessio/vitess/pull/13730) + * Fix for "text type with an unknown/unsupported collation cannot be hashed" error [#13852](https://github.com/vitessio/vitess/pull/13852) + * VTGate Buffering: Use a more accurate heuristic for determining if we're doing a reshard [#13856](https://github.com/vitessio/vitess/pull/13856) + * sqlparser: Tablespace option is case sensitive [#13884](https://github.com/vitessio/vitess/pull/13884) + * Rewrite `USING` to `ON` condition for joins [#13931](https://github.com/vitessio/vitess/pull/13931) + * handle large number of predicates without timing out [#13979](https://github.com/vitessio/vitess/pull/13979) + * Fix `NOT IN` expression used in the SET NULL for a child table on an update [#13988](https://github.com/vitessio/vitess/pull/13988) + * Fix the `SELECT` query we run on the child table to verify that update is allowed on a RESTRICT constraint [#13991](https://github.com/vitessio/vitess/pull/13991) + * fix data race in join engine primitive olap streaming mode execution [#14012](https://github.com/vitessio/vitess/pull/14012) + * fix: cost to include subshard opcode [#14023](https://github.com/vitessio/vitess/pull/14023) + * Add session flag for stream execute grpc api [#14046](https://github.com/vitessio/vitess/pull/14046) + * Fix cascading Delete failure while using Prepared statements [#14048](https://github.com/vitessio/vitess/pull/14048) + * Fix Fk verification and update queries to accommodate for bindVariables being NULL [#14061](https://github.com/vitessio/vitess/pull/14061) + * DDL execution to commit open transaction [#14110](https://github.com/vitessio/vitess/pull/14110) + * fix: analyze statement parsing and planning [#14268](https://github.com/vitessio/vitess/pull/14268) + * [release-18.0] fix: analyze statement parsing and planning (#14268) [#14275](https://github.com/vitessio/vitess/pull/14275) + * [release-18.0] schemadiff: fix missing `DROP CONSTRAINT` in duplicate/redundant constraints scenario. (#14387) [#14391](https://github.com/vitessio/vitess/pull/14391) + * [release-18.0] vtgate/engine: Fix race condition in join logic (#14435) [#14441](https://github.com/vitessio/vitess/pull/14441) #### Schema Tracker -* Vttablet schema tracking: Fix _vt.schema_version corruption [#13045](https://github.com/vitessio/vitess/pull/13045) -* Ignore error while reading table data in Schema.Engine reload [#13421](https://github.com/vitessio/vitess/pull/13421) -* schema.Reload(): ignore column reading errors for views only, error for tables [#13442](https://github.com/vitessio/vitess/pull/13442) + * Vttablet schema tracking: Fix _vt.schema_version corruption [#13045](https://github.com/vitessio/vitess/pull/13045) + * Ignore error while reading table data in Schema.Engine reload [#13421](https://github.com/vitessio/vitess/pull/13421) + * schema.Reload(): ignore column reading errors for views only, error for tables [#13442](https://github.com/vitessio/vitess/pull/13442) #### TabletManager -* mysqlctl: Correctly encode database and table names [#13312](https://github.com/vitessio/vitess/pull/13312) -* Fix remote VersionString API [#13484](https://github.com/vitessio/vitess/pull/13484) -* mysqlctl: Remove noisy log line [#13599](https://github.com/vitessio/vitess/pull/13599) -* GetSchema: limit concurrent operations [#13617](https://github.com/vitessio/vitess/pull/13617) -* mysqlctl: Reduce logging for running commands [#13659](https://github.com/vitessio/vitess/pull/13659) + * mysqlctl: Correctly encode database and table names [#13312](https://github.com/vitessio/vitess/pull/13312) + * Fix remote VersionString API [#13484](https://github.com/vitessio/vitess/pull/13484) + * mysqlctl: Remove noisy log line [#13599](https://github.com/vitessio/vitess/pull/13599) + * GetSchema: limit concurrent operations [#13617](https://github.com/vitessio/vitess/pull/13617) + * mysqlctl: Reduce logging for running commands [#13659](https://github.com/vitessio/vitess/pull/13659) #### Throttler -* Tablet throttler: only start watching SrvKeyspace once it's confirmed to exist [#13384](https://github.com/vitessio/vitess/pull/13384) -* Throttler: reintroduce deprecated flags so that deprecation actually works [#13597](https://github.com/vitessio/vitess/pull/13597) -* Silence 'CheckThrottler' gRPC calls [#13925](https://github.com/vitessio/vitess/pull/13925) -* Tablet throttler: empty list of probes on non-leader [#13926](https://github.com/vitessio/vitess/pull/13926) + * Tablet throttler: only start watching SrvKeyspace once it's confirmed to exist [#13384](https://github.com/vitessio/vitess/pull/13384) + * Throttler: reintroduce deprecated flags so that deprecation actually works [#13597](https://github.com/vitessio/vitess/pull/13597) + * Silence 'CheckThrottler' gRPC calls [#13925](https://github.com/vitessio/vitess/pull/13925) + * Tablet throttler: empty list of probes on non-leader [#13926](https://github.com/vitessio/vitess/pull/13926) + * [release-18.0] Throttler: set timeouts on gRPC communication and on topo communication (#14165) [#14167](https://github.com/vitessio/vitess/pull/14167) + * Tablet throttler: fix race condition by removing goroutine call [#14179](https://github.com/vitessio/vitess/pull/14179) + * [release-18.0] Tablet throttler: fix race condition by removing goroutine call (#14179) [#14198](https://github.com/vitessio/vitess/pull/14198) #### VReplication -* VReplication: Fix VDiff2 DeleteByUUID Query [#13255](https://github.com/vitessio/vitess/pull/13255) -* Better handling of vreplication setState() failure [#13488](https://github.com/vitessio/vitess/pull/13488) -* VReplication: Ignore unrelated shards in partial MoveTables traffic state [#13515](https://github.com/vitessio/vitess/pull/13515) -* VReplication: Ensure ROW events are sent within a transaction [#13547](https://github.com/vitessio/vitess/pull/13547) -* VReplication: Make Source Tablet Selection More Robust [#13582](https://github.com/vitessio/vitess/pull/13582) -* vtgate tablet gateway buffering: don't shutdown if not initialized [#13695](https://github.com/vitessio/vitess/pull/13695) -* VReplication: Improve MoveTables Create Error Handling [#13737](https://github.com/vitessio/vitess/pull/13737) -* Minor --initialize-target-sequences followups [#13758](https://github.com/vitessio/vitess/pull/13758) -* Flakes: skip flaky check that ETA for a VReplication VDiff2 Progress command is in the future. [#13804](https://github.com/vitessio/vitess/pull/13804) -* Flakes: VReplication unit tests: reduce goroutine leakage [#13824](https://github.com/vitessio/vitess/pull/13824) -* Properly support ignore_nulls in CreateLookupVindex [#13913](https://github.com/vitessio/vitess/pull/13913) -* VReplication: Handle SQL NULL and JSON 'null' correctly for JSON columns [#13944](https://github.com/vitessio/vitess/pull/13944) -* copy over existing vreplication rows copied to local counter if resuming from another tablet [#13949](https://github.com/vitessio/vitess/pull/13949) -* VDiff: correct handling of default source and target cells [#13969](https://github.com/vitessio/vitess/pull/13969) -* MoveTables Cancel: drop denied tables on target when dropping source/target tables [#14008](https://github.com/vitessio/vitess/pull/14008) -* VReplication VPlayer: set foreign_key_checks on initialization [#14013](https://github.com/vitessio/vitess/pull/14013) -* json: Fix quoting JSON keys [#14066](https://github.com/vitessio/vitess/pull/14066) -* VDiff: properly split cell values in record when using TabletPicker [#14099](https://github.com/vitessio/vitess/pull/14099) -* VDiff: Cleanup the controller for a VDiff before deleting it [#14107](https://github.com/vitessio/vitess/pull/14107) + * VReplication: Fix VDiff2 DeleteByUUID Query [#13255](https://github.com/vitessio/vitess/pull/13255) + * Better handling of vreplication setState() failure [#13488](https://github.com/vitessio/vitess/pull/13488) + * VReplication: Ignore unrelated shards in partial MoveTables traffic state [#13515](https://github.com/vitessio/vitess/pull/13515) + * VReplication: Ensure ROW events are sent within a transaction [#13547](https://github.com/vitessio/vitess/pull/13547) + * VReplication: Make Source Tablet Selection More Robust [#13582](https://github.com/vitessio/vitess/pull/13582) + * vtgate tablet gateway buffering: don't shutdown if not initialized [#13695](https://github.com/vitessio/vitess/pull/13695) + * VReplication: Improve MoveTables Create Error Handling [#13737](https://github.com/vitessio/vitess/pull/13737) + * Minor --initialize-target-sequences followups [#13758](https://github.com/vitessio/vitess/pull/13758) + * Flakes: skip flaky check that ETA for a VReplication VDiff2 Progress command is in the future. [#13804](https://github.com/vitessio/vitess/pull/13804) + * Flakes: VReplication unit tests: reduce goroutine leakage [#13824](https://github.com/vitessio/vitess/pull/13824) + * Properly support ignore_nulls in CreateLookupVindex [#13913](https://github.com/vitessio/vitess/pull/13913) + * VReplication: Handle SQL NULL and JSON 'null' correctly for JSON columns [#13944](https://github.com/vitessio/vitess/pull/13944) + * copy over existing vreplication rows copied to local counter if resuming from another tablet [#13949](https://github.com/vitessio/vitess/pull/13949) + * VDiff: correct handling of default source and target cells [#13969](https://github.com/vitessio/vitess/pull/13969) + * MoveTables Cancel: drop denied tables on target when dropping source/target tables [#14008](https://github.com/vitessio/vitess/pull/14008) + * VReplication VPlayer: set foreign_key_checks on initialization [#14013](https://github.com/vitessio/vitess/pull/14013) + * json: Fix quoting JSON keys [#14066](https://github.com/vitessio/vitess/pull/14066) + * VDiff: properly split cell values in record when using TabletPicker [#14099](https://github.com/vitessio/vitess/pull/14099) + * VDiff: Cleanup the controller for a VDiff before deleting it [#14107](https://github.com/vitessio/vitess/pull/14107) + * [release-18.0] VReplication: error on vtctldclient commands w/o tablet types (#14294) [#14298](https://github.com/vitessio/vitess/pull/14298) + * [release-18.0] Vtctld SwitchReads: fix bug where writes were also being switched as part of switching reads when all traffic was switched using SwitchTraffic (#14360) [#14379](https://github.com/vitessio/vitess/pull/14379) + * [release-18.0] VDiff: wait for shard streams of one table diff to complete for before starting that of the next table (#14345) [#14382](https://github.com/vitessio/vitess/pull/14382) + * [release-18.0] VDiff tablet selection: pick non-serving tablets in Reshard workflows (#14413) [#14418](https://github.com/vitessio/vitess/pull/14418) + * VReplication: Handle multiple streams in UpdateVReplicationWorkflow RPC [#14447](https://github.com/vitessio/vitess/pull/14447) + * [release-18.0] VDiff: "show all" should only report vdiffs for the specified keyspace and workflow (#14442) [#14466](https://github.com/vitessio/vitess/pull/14466) + * [release-18.0] VReplication: Handle multiple streams in UpdateVReplicationWorkflow RPC (#14447) [#14468](https://github.com/vitessio/vitess/pull/14468) #### VTAdmin -* Unset the PREFIX environment variable when building VTAdmin [#13554](https://github.com/vitessio/vitess/pull/13554) + * Unset the PREFIX environment variable when building VTAdmin [#13554](https://github.com/vitessio/vitess/pull/13554) #### VTCombo -* Fix vtcombo DBDDL plugin race condition [#13117](https://github.com/vitessio/vitess/pull/13117) + * Fix vtcombo DBDDL plugin race condition [#13117](https://github.com/vitessio/vitess/pull/13117) #### VTorc -* Ensure to call `servenv.Init` when needed [#13638](https://github.com/vitessio/vitess/pull/13638) -### CI/Build + * Ensure to call `servenv.Init` when needed [#13638](https://github.com/vitessio/vitess/pull/13638) +#### vtctl + * [release-18.0] VReplication: Add missing info to vtctldclient workflow SHOW output (#14225) [#14240](https://github.com/vitessio/vitess/pull/14240) +### CI/Build #### Backup and Restore -* Refactor `backup_pitr` into two distinct CI tests: builtin vs Xtrabackup [#13395](https://github.com/vitessio/vitess/pull/13395) -* Fixing `backup_pitr` flaky tests via wait-for loop on topo reads [#13781](https://github.com/vitessio/vitess/pull/13781) + * Refactor `backup_pitr` into two distinct CI tests: builtin vs Xtrabackup [#13395](https://github.com/vitessio/vitess/pull/13395) + * Fixing `backup_pitr` flaky tests via wait-for loop on topo reads [#13781](https://github.com/vitessio/vitess/pull/13781) + * [release-18.0] Incremental backup: fix race condition in reading 'mysqlbinlog' output (#14330) [#14335](https://github.com/vitessio/vitess/pull/14335) #### Build/CI -* Update a number of dependencies [#13031](https://github.com/vitessio/vitess/pull/13031) -* Cleanup unused Dockerfile entries [#13327](https://github.com/vitessio/vitess/pull/13327) -* flags: Remove hardcoded runner paths [#13482](https://github.com/vitessio/vitess/pull/13482) -* added no-commit-collection option to launchable record build command [#13490](https://github.com/vitessio/vitess/pull/13490) -* Replace deprecated `github.com/golang/mock` with `go.uber.org/mock` [#13512](https://github.com/vitessio/vitess/pull/13512) -* [viper WatchConfig] platform-specific write to ensure callback fires exactly once [#13627](https://github.com/vitessio/vitess/pull/13627) -* build: Allow passing in custom -ldflags [#13748](https://github.com/vitessio/vitess/pull/13748) -* Run auto golang upgrade only on vitessio/vitess [#13766](https://github.com/vitessio/vitess/pull/13766) -* collations: implement collation dumping as a docker image [#13879](https://github.com/vitessio/vitess/pull/13879) + * Update a number of dependencies [#13031](https://github.com/vitessio/vitess/pull/13031) + * Cleanup unused Dockerfile entries [#13327](https://github.com/vitessio/vitess/pull/13327) + * flags: Remove hardcoded runner paths [#13482](https://github.com/vitessio/vitess/pull/13482) + * added no-commit-collection option to launchable record build command [#13490](https://github.com/vitessio/vitess/pull/13490) + * Replace deprecated `github.com/golang/mock` with `go.uber.org/mock` [#13512](https://github.com/vitessio/vitess/pull/13512) + * [viper WatchConfig] platform-specific write to ensure callback fires exactly once [#13627](https://github.com/vitessio/vitess/pull/13627) + * build: Allow passing in custom -ldflags [#13748](https://github.com/vitessio/vitess/pull/13748) + * Run auto golang upgrade only on vitessio/vitess [#13766](https://github.com/vitessio/vitess/pull/13766) + * collations: implement collation dumping as a docker image [#13879](https://github.com/vitessio/vitess/pull/13879) #### Docker -* docker/k8s: add bookworm builds [#13436](https://github.com/vitessio/vitess/pull/13436) -* Bump docker images to `bullseye` [#13664](https://github.com/vitessio/vitess/pull/13664) + * docker/k8s: add bookworm builds [#13436](https://github.com/vitessio/vitess/pull/13436) + * Bump docker images to `bullseye` [#13664](https://github.com/vitessio/vitess/pull/13664) #### Documentation -* fix docgen for subcommands [#13518](https://github.com/vitessio/vitess/pull/13518) -* update docgen to embed commit ID in autogenerated doc frontmatter [#14056](https://github.com/vitessio/vitess/pull/14056) + * fix docgen for subcommands [#13518](https://github.com/vitessio/vitess/pull/13518) + * update docgen to embed commit ID in autogenerated doc frontmatter [#14056](https://github.com/vitessio/vitess/pull/14056) #### General -* go/mysql: switch to new API for x/exp/slices.SortFunc [#13644](https://github.com/vitessio/vitess/pull/13644) -* [main] Upgrade the Golang version to `go1.21.1` [#13933](https://github.com/vitessio/vitess/pull/13933) + * go/mysql: switch to new API for x/exp/slices.SortFunc [#13644](https://github.com/vitessio/vitess/pull/13644) + * [main] Upgrade the Golang version to `go1.21.1` [#13933](https://github.com/vitessio/vitess/pull/13933) + * [release-18.0] Upgrade the Golang version to `go1.21.2` [#14195](https://github.com/vitessio/vitess/pull/14195) + * [release-18.0] Upgrade the Golang version to `go1.21.3` [#14230](https://github.com/vitessio/vitess/pull/14230) #### Online DDL -* CI: fix onlineddl_scheduler flakiness [#13754](https://github.com/vitessio/vitess/pull/13754) + * CI: fix onlineddl_scheduler flakiness [#13754](https://github.com/vitessio/vitess/pull/13754) + * [release-18.0] OnlineDDL: reduce vrepl_stress workload in forks (#14302) [#14349](https://github.com/vitessio/vitess/pull/14349) #### Query Serving -* Endtoend: stress tests for VTGate FOREIGN KEY support [#13799](https://github.com/vitessio/vitess/pull/13799) -* ci: pool-related test flakyness [#14076](https://github.com/vitessio/vitess/pull/14076) + * Endtoend: stress tests for VTGate FOREIGN KEY support [#13799](https://github.com/vitessio/vitess/pull/13799) + * ci: pool-related test flakyness [#14076](https://github.com/vitessio/vitess/pull/14076) #### Throttler -* Deprecating and removing tablet throttler CLI flags and tests [#13246](https://github.com/vitessio/vitess/pull/13246) -* Throttler: verify deprecated flags are still allowed [#13615](https://github.com/vitessio/vitess/pull/13615) + * Deprecating and removing tablet throttler CLI flags and tests [#13246](https://github.com/vitessio/vitess/pull/13246) + * Throttler: verify deprecated flags are still allowed [#13615](https://github.com/vitessio/vitess/pull/13615) #### VReplication -* Flakes: Remove CI endtoend test for VReplication Copy Phase Throttling [#13343](https://github.com/vitessio/vitess/pull/13343) -* Flakes: Improve reliability of vreplication_copy_parallel test [#13857](https://github.com/vitessio/vitess/pull/13857) + * Flakes: Remove CI endtoend test for VReplication Copy Phase Throttling [#13343](https://github.com/vitessio/vitess/pull/13343) + * Flakes: Improve reliability of vreplication_copy_parallel test [#13857](https://github.com/vitessio/vitess/pull/13857) #### VTAdmin -* Improve time taken to run the examples by optimizing `vtadmin` build [#13262](https://github.com/vitessio/vitess/pull/13262) + * Improve time taken to run the examples by optimizing `vtadmin` build [#13262](https://github.com/vitessio/vitess/pull/13262) #### VTorc -* [release-18.0] docker: add dedicated vtorc container (#14126) [#14148](https://github.com/vitessio/vitess/pull/14148) -### Dependabot + * [release-18.0] docker: add dedicated vtorc container (#14126) [#14148](https://github.com/vitessio/vitess/pull/14148) +### Dependabot #### General -* Bump word-wrap from 1.2.3 to 1.2.4 in /web/vtadmin [#13569](https://github.com/vitessio/vitess/pull/13569) -* Bump tough-cookie from 4.1.2 to 4.1.3 in /web/vtadmin [#13767](https://github.com/vitessio/vitess/pull/13767) + * Bump word-wrap from 1.2.3 to 1.2.4 in /web/vtadmin [#13569](https://github.com/vitessio/vitess/pull/13569) + * Bump tough-cookie from 4.1.2 to 4.1.3 in /web/vtadmin [#13767](https://github.com/vitessio/vitess/pull/13767) + * [release-18.0] Bump github.com/cyphar/filepath-securejoin from 0.2.3 to 0.2.4 (#14239) [#14253](https://github.com/vitessio/vitess/pull/14253) + * [release-18.0] Bump golang.org/x/net from 0.14.0 to 0.17.0 (#14260) [#14264](https://github.com/vitessio/vitess/pull/14264) #### Java -* java: update to latest dependencies for grpc and protobuf [#13996](https://github.com/vitessio/vitess/pull/13996) + * java: update to latest dependencies for grpc and protobuf [#13996](https://github.com/vitessio/vitess/pull/13996) #### Observability -* Bump tough-cookie and @cypress/request in /vitess-mixin/e2e [#13768](https://github.com/vitessio/vitess/pull/13768) + * Bump tough-cookie and @cypress/request in /vitess-mixin/e2e [#13768](https://github.com/vitessio/vitess/pull/13768) #### VTAdmin -* build(deps-dev): bump vite from 4.2.1 to 4.2.3 in /web/vtadmin [#13240](https://github.com/vitessio/vitess/pull/13240) -* Bump protobufjs from 7.2.3 to 7.2.5 in /web/vtadmin [#13833](https://github.com/vitessio/vitess/pull/13833) -### Documentation + * build(deps-dev): bump vite from 4.2.1 to 4.2.3 in /web/vtadmin [#13240](https://github.com/vitessio/vitess/pull/13240) + * Bump protobufjs from 7.2.3 to 7.2.5 in /web/vtadmin [#13833](https://github.com/vitessio/vitess/pull/13833) + * [release-18.0] Bump postcss from 8.4.21 to 8.4.31 in /web/vtadmin (#14173) [#14258](https://github.com/vitessio/vitess/pull/14258) + * [release-18.0] Bump @babel/traverse from 7.21.4 to 7.23.2 in /web/vtadmin (#14304) [#14308](https://github.com/vitessio/vitess/pull/14308) +### Documentation #### CLI -* gentler warning message on config-not-found [#13215](https://github.com/vitessio/vitess/pull/13215) -* switch casing in onlineddl subcommand help text [#14091](https://github.com/vitessio/vitess/pull/14091) + * gentler warning message on config-not-found [#13215](https://github.com/vitessio/vitess/pull/13215) + * switch casing in onlineddl subcommand help text [#14091](https://github.com/vitessio/vitess/pull/14091) + * [release-18.0] Bypass cobra completion commands so they still function (#14217) [#14234](https://github.com/vitessio/vitess/pull/14234) #### Documentation -* Add security audit report [#13221](https://github.com/vitessio/vitess/pull/13221) -* update link for reparenting guide [#13350](https://github.com/vitessio/vitess/pull/13350) -* anonymize homedirs in generated docs [#14101](https://github.com/vitessio/vitess/pull/14101) -* Summary changes for foreign keys [#14112](https://github.com/vitessio/vitess/pull/14112) -* fix bad copy-paste in zkctld docgen [#14123](https://github.com/vitessio/vitess/pull/14123) + * Add security audit report [#13221](https://github.com/vitessio/vitess/pull/13221) + * update link for reparenting guide [#13350](https://github.com/vitessio/vitess/pull/13350) + * anonymize homedirs in generated docs [#14101](https://github.com/vitessio/vitess/pull/14101) + * Summary changes for foreign keys [#14112](https://github.com/vitessio/vitess/pull/14112) + * fix bad copy-paste in zkctld docgen [#14123](https://github.com/vitessio/vitess/pull/14123) + * [release-18.0] release notes: edit summary for consistency (#14319) [#14320](https://github.com/vitessio/vitess/pull/14320) #### General -* Improve release process documentation [#14000](https://github.com/vitessio/vitess/pull/14000) + * Improve release process documentation [#14000](https://github.com/vitessio/vitess/pull/14000) #### Governance -* governance doc clean up [#13337](https://github.com/vitessio/vitess/pull/13337) -### Enhancement + * governance doc clean up [#13337](https://github.com/vitessio/vitess/pull/13337) +### Enhancement #### Backup and Restore -* go/vt/mysqlctl: instrument s3 upload time [#12500](https://github.com/vitessio/vitess/pull/12500) -* metrics: change vtbackup_duration_by_phase to binary-valued vtbackup_phase [#12973](https://github.com/vitessio/vitess/pull/12973) -* Incremental backup & recovery: restore-to-timestamp [#13270](https://github.com/vitessio/vitess/pull/13270) -* backup: Allow for upgrade safe backups [#13449](https://github.com/vitessio/vitess/pull/13449) -* Incremental backup: accept GTID position without 'MySQL56/' flavor prefix [#13474](https://github.com/vitessio/vitess/pull/13474) -* Backup & Restore: vtctldclient to support PITR flags [#13513](https://github.com/vitessio/vitess/pull/13513) -* BackupShard: support incremental backup [#13522](https://github.com/vitessio/vitess/pull/13522) -* Point in time recovery: fix cross-tablet GTID evaluation [#13555](https://github.com/vitessio/vitess/pull/13555) -* Backup/restore: provision and restore a tablet with point-in-time recovery flags [#13964](https://github.com/vitessio/vitess/pull/13964) -* go/cmd/vtbackup: report replication status metrics during catch-up phase [#13995](https://github.com/vitessio/vitess/pull/13995) + * go/vt/mysqlctl: instrument s3 upload time [#12500](https://github.com/vitessio/vitess/pull/12500) + * metrics: change vtbackup_duration_by_phase to binary-valued vtbackup_phase [#12973](https://github.com/vitessio/vitess/pull/12973) + * Incremental backup & recovery: restore-to-timestamp [#13270](https://github.com/vitessio/vitess/pull/13270) + * backup: Allow for upgrade safe backups [#13449](https://github.com/vitessio/vitess/pull/13449) + * Incremental backup: accept GTID position without 'MySQL56/' flavor prefix [#13474](https://github.com/vitessio/vitess/pull/13474) + * Backup & Restore: vtctldclient to support PITR flags [#13513](https://github.com/vitessio/vitess/pull/13513) + * BackupShard: support incremental backup [#13522](https://github.com/vitessio/vitess/pull/13522) + * Point in time recovery: fix cross-tablet GTID evaluation [#13555](https://github.com/vitessio/vitess/pull/13555) + * Backup/restore: provision and restore a tablet with point-in-time recovery flags [#13964](https://github.com/vitessio/vitess/pull/13964) + * go/cmd/vtbackup: report replication status metrics during catch-up phase [#13995](https://github.com/vitessio/vitess/pull/13995) #### Build/CI -* Set the number of threads for release notes generation with a flag [#13273](https://github.com/vitessio/vitess/pull/13273) -* Optimize `make build` in `test.go` and in CI [#13567](https://github.com/vitessio/vitess/pull/13567) -* Skip VTAdmin build in more places [#13588](https://github.com/vitessio/vitess/pull/13588) -* Skip VTAdmin build in Docker tests [#13836](https://github.com/vitessio/vitess/pull/13836) -* Migrates most workflows to 4 and 16 cores Large GitHub-Hosted-Runners [#13845](https://github.com/vitessio/vitess/pull/13845) -* Skip launchable if the Pull Request is marked as a Draft [#13886](https://github.com/vitessio/vitess/pull/13886) + * Set the number of threads for release notes generation with a flag [#13273](https://github.com/vitessio/vitess/pull/13273) + * Optimize `make build` in `test.go` and in CI [#13567](https://github.com/vitessio/vitess/pull/13567) + * Skip VTAdmin build in more places [#13588](https://github.com/vitessio/vitess/pull/13588) + * Skip VTAdmin build in Docker tests [#13836](https://github.com/vitessio/vitess/pull/13836) + * Migrates most workflows to 4 and 16 cores Large GitHub-Hosted-Runners [#13845](https://github.com/vitessio/vitess/pull/13845) + * Skip launchable if the Pull Request is marked as a Draft [#13886](https://github.com/vitessio/vitess/pull/13886) + * [release-18.0] Automatic approval of `vitess-bot` clean backports (#14352) [#14357](https://github.com/vitessio/vitess/pull/14357) #### CLI -* Vtctldclient MoveTables [#13015](https://github.com/vitessio/vitess/pull/13015) -* migrate vtorc to use cobra commands [#13917](https://github.com/vitessio/vitess/pull/13917) + * Vtctldclient MoveTables [#13015](https://github.com/vitessio/vitess/pull/13015) + * migrate vtorc to use cobra commands [#13917](https://github.com/vitessio/vitess/pull/13917) #### Cluster management -* increase length of reparent_journal columns [#13287](https://github.com/vitessio/vitess/pull/13287) -* Improvements to PRS [#13623](https://github.com/vitessio/vitess/pull/13623) -* Add 2 more durability policies that allow RDONLY tablets to send semi-sync ACKs [#13698](https://github.com/vitessio/vitess/pull/13698) -* `vtctld`/`vtorc`: improve reparenting stats [#13723](https://github.com/vitessio/vitess/pull/13723) + * increase length of reparent_journal columns [#13287](https://github.com/vitessio/vitess/pull/13287) + * Improvements to PRS [#13623](https://github.com/vitessio/vitess/pull/13623) + * Add 2 more durability policies that allow RDONLY tablets to send semi-sync ACKs [#13698](https://github.com/vitessio/vitess/pull/13698) + * `vtctld`/`vtorc`: improve reparenting stats [#13723](https://github.com/vitessio/vitess/pull/13723) #### Documentation -* consolidate docs [#13959](https://github.com/vitessio/vitess/pull/13959) + * consolidate docs [#13959](https://github.com/vitessio/vitess/pull/13959) #### Evalengine -* evalengine: implement date/time math [#13274](https://github.com/vitessio/vitess/pull/13274) -* sqlparser: Add support for TIMESTAMPADD [#13314](https://github.com/vitessio/vitess/pull/13314) -* mysql: introduce icuregex package [#13391](https://github.com/vitessio/vitess/pull/13391) -* icuregex: Lazy load ICU data into memory [#13640](https://github.com/vitessio/vitess/pull/13640) -* evalengine: Improve weight string support [#13658](https://github.com/vitessio/vitess/pull/13658) -* evalengine: Fix JSON weight string computation [#13669](https://github.com/vitessio/vitess/pull/13669) + * evalengine: implement date/time math [#13274](https://github.com/vitessio/vitess/pull/13274) + * sqlparser: Add support for TIMESTAMPADD [#13314](https://github.com/vitessio/vitess/pull/13314) + * mysql: introduce icuregex package [#13391](https://github.com/vitessio/vitess/pull/13391) + * icuregex: Lazy load ICU data into memory [#13640](https://github.com/vitessio/vitess/pull/13640) + * evalengine: Improve weight string support [#13658](https://github.com/vitessio/vitess/pull/13658) + * evalengine: Fix JSON weight string computation [#13669](https://github.com/vitessio/vitess/pull/13669) #### Examples -* Misc Local Install improvements. [#13446](https://github.com/vitessio/vitess/pull/13446) + * Misc Local Install improvements. [#13446](https://github.com/vitessio/vitess/pull/13446) #### General -* Refactor code to remove `evalengine` as a dependency of `VTOrc` [#13642](https://github.com/vitessio/vitess/pull/13642) + * Refactor code to remove `evalengine` as a dependency of `VTOrc` [#13642](https://github.com/vitessio/vitess/pull/13642) #### Observability -* vtorc: add detected_problems counter [#13967](https://github.com/vitessio/vitess/pull/13967) + * vtorc: add detected_problems counter [#13967](https://github.com/vitessio/vitess/pull/13967) #### Online DDL -* `vtctl OnlineDDL`: complete command set [#12963](https://github.com/vitessio/vitess/pull/12963) -* Online DDL: improved row estimation via ANALYE TABLE with --analyze-table strategy flag [#13352](https://github.com/vitessio/vitess/pull/13352) -* OnlineDDL: support @@migration_context in vtgate session. Use if non-empty [#13675](https://github.com/vitessio/vitess/pull/13675) -* Vtgate: pass 'SHOW VITESS_MIGRATIONS' to tablet's query executor [#13726](https://github.com/vitessio/vitess/pull/13726) -* vtctldclient OnlineDDL CANCEL [#13860](https://github.com/vitessio/vitess/pull/13860) -* vtctldclient: support OnlineDDL `complete`, `launch` commands [#13896](https://github.com/vitessio/vitess/pull/13896) + * `vtctl OnlineDDL`: complete command set [#12963](https://github.com/vitessio/vitess/pull/12963) + * Online DDL: improved row estimation via ANALYE TABLE with --analyze-table strategy flag [#13352](https://github.com/vitessio/vitess/pull/13352) + * OnlineDDL: support @@migration_context in vtgate session. Use if non-empty [#13675](https://github.com/vitessio/vitess/pull/13675) + * Vtgate: pass 'SHOW VITESS_MIGRATIONS' to tablet's query executor [#13726](https://github.com/vitessio/vitess/pull/13726) + * vtctldclient OnlineDDL CANCEL [#13860](https://github.com/vitessio/vitess/pull/13860) + * vtctldclient: support OnlineDDL `complete`, `launch` commands [#13896](https://github.com/vitessio/vitess/pull/13896) + * [release-18.0] Online DDL: lint DDL strategy flags (#14373) [#14399](https://github.com/vitessio/vitess/pull/14399) #### Query Serving -* vindexes: return unknown params [#12951](https://github.com/vitessio/vitess/pull/12951) -* Fix and Make aggregation planner handle aggregation functions better [#13228](https://github.com/vitessio/vitess/pull/13228) -* vtgate planner: HAVING in the new operator horizon planner [#13289](https://github.com/vitessio/vitess/pull/13289) -* Support complex aggregation in Gen4's Operators [#13326](https://github.com/vitessio/vitess/pull/13326) -* Adds support for ANY_VALUE [#13342](https://github.com/vitessio/vitess/pull/13342) -* Aggregation engine refactor [#13378](https://github.com/vitessio/vitess/pull/13378) -* Move more horizon planning to the operators [#13412](https://github.com/vitessio/vitess/pull/13412) -* Move UNION planning to the operators [#13450](https://github.com/vitessio/vitess/pull/13450) -* Improve and Fix Distinct Aggregation planner [#13466](https://github.com/vitessio/vitess/pull/13466) -* Enhancing VTGate buffering for MoveTables and Shard by Shard Migration [#13507](https://github.com/vitessio/vitess/pull/13507) -* Add 2 new metrics with tablet type labels [#13521](https://github.com/vitessio/vitess/pull/13521) -* vtgate table schema tracking to use GetSchema rpc [#13544](https://github.com/vitessio/vitess/pull/13544) -* Add a `keyspace` configuration in the `vschema` for foreign key mode [#13553](https://github.com/vitessio/vitess/pull/13553) -* Reduce usages of old horizon planning fallback [#13595](https://github.com/vitessio/vitess/pull/13595) -* Add dry-run/monitoring-only mode for TxThrottler [#13604](https://github.com/vitessio/vitess/pull/13604) -* go/vt/vitessdriver: implement driver.{Connector,DriverContext} [#13704](https://github.com/vitessio/vitess/pull/13704) -* More union merging [#13743](https://github.com/vitessio/vitess/pull/13743) -* Move subqueries to use the operator model [#13750](https://github.com/vitessio/vitess/pull/13750) -* Add support for tuple as value type [#13800](https://github.com/vitessio/vitess/pull/13800) -* icuregex: Update to ICU 73 [#13912](https://github.com/vitessio/vitess/pull/13912) -* Change internal vindex type recommendation for integrals to xxhash [#13956](https://github.com/vitessio/vitess/pull/13956) -* Foreign key cascade: retain "for update" lock on select query plans [#13985](https://github.com/vitessio/vitess/pull/13985) -* Improve the rewriter to simplify more queries [#14059](https://github.com/vitessio/vitess/pull/14059) -* [release-18.0] gen4: Support explicit column aliases on derived tables (#14129) [#14156](https://github.com/vitessio/vitess/pull/14156) + * vindexes: return unknown params [#12951](https://github.com/vitessio/vitess/pull/12951) + * Fix and Make aggregation planner handle aggregation functions better [#13228](https://github.com/vitessio/vitess/pull/13228) + * vtgate planner: HAVING in the new operator horizon planner [#13289](https://github.com/vitessio/vitess/pull/13289) + * Support complex aggregation in Gen4's Operators [#13326](https://github.com/vitessio/vitess/pull/13326) + * Adds support for ANY_VALUE [#13342](https://github.com/vitessio/vitess/pull/13342) + * Aggregation engine refactor [#13378](https://github.com/vitessio/vitess/pull/13378) + * Move more horizon planning to the operators [#13412](https://github.com/vitessio/vitess/pull/13412) + * Move UNION planning to the operators [#13450](https://github.com/vitessio/vitess/pull/13450) + * Improve and Fix Distinct Aggregation planner [#13466](https://github.com/vitessio/vitess/pull/13466) + * Enhancing VTGate buffering for MoveTables and Shard by Shard Migration [#13507](https://github.com/vitessio/vitess/pull/13507) + * Add 2 new metrics with tablet type labels [#13521](https://github.com/vitessio/vitess/pull/13521) + * vtgate table schema tracking to use GetSchema rpc [#13544](https://github.com/vitessio/vitess/pull/13544) + * Add a `keyspace` configuration in the `vschema` for foreign key mode [#13553](https://github.com/vitessio/vitess/pull/13553) + * Reduce usages of old horizon planning fallback [#13595](https://github.com/vitessio/vitess/pull/13595) + * Add dry-run/monitoring-only mode for TxThrottler [#13604](https://github.com/vitessio/vitess/pull/13604) + * go/vt/vitessdriver: implement driver.{Connector,DriverContext} [#13704](https://github.com/vitessio/vitess/pull/13704) + * More union merging [#13743](https://github.com/vitessio/vitess/pull/13743) + * Move subqueries to use the operator model [#13750](https://github.com/vitessio/vitess/pull/13750) + * Add support for tuple as value type [#13800](https://github.com/vitessio/vitess/pull/13800) + * icuregex: Update to ICU 73 [#13912](https://github.com/vitessio/vitess/pull/13912) + * Change internal vindex type recommendation for integrals to xxhash [#13956](https://github.com/vitessio/vitess/pull/13956) + * Foreign key cascade: retain "for update" lock on select query plans [#13985](https://github.com/vitessio/vitess/pull/13985) + * Improve the rewriter to simplify more queries [#14059](https://github.com/vitessio/vitess/pull/14059) + * [release-18.0] gen4: Support explicit column aliases on derived tables (#14129) [#14156](https://github.com/vitessio/vitess/pull/14156) #### Schema Tracker -* vttablet: do not notify `vtgate` about internal tables [#13897](https://github.com/vitessio/vitess/pull/13897) + * vttablet: do not notify `vtgate` about internal tables [#13897](https://github.com/vitessio/vitess/pull/13897) #### TabletManager -* Tablet throttler: throttled app configuration via `vtctl UpdateThrottlerConfig` [#13351](https://github.com/vitessio/vitess/pull/13351) + * Tablet throttler: throttled app configuration via `vtctl UpdateThrottlerConfig` [#13351](https://github.com/vitessio/vitess/pull/13351) #### Throttler -* txthrottler: verify config at vttablet startup, consolidate funcs [#13115](https://github.com/vitessio/vitess/pull/13115) -* txthrottler: add metrics for topoWatcher and healthCheckStreamer [#13153](https://github.com/vitessio/vitess/pull/13153) -* `UpdateThrottlerConfig --unthrottle-app ...` [#13494](https://github.com/vitessio/vitess/pull/13494) -* Reroute 'ALTER VITESS_MIGRATION ... THROTTLE ...' through topo [#13511](https://github.com/vitessio/vitess/pull/13511) -* Tablet throttler: inter-checks via gRPC [#13514](https://github.com/vitessio/vitess/pull/13514) -* Per workload TxThrottler metrics [#13526](https://github.com/vitessio/vitess/pull/13526) -* Throttler: exempt apps via `UpdateThrottlerConfig --throttle-app-exempt` [#13666](https://github.com/vitessio/vitess/pull/13666) + * txthrottler: verify config at vttablet startup, consolidate funcs [#13115](https://github.com/vitessio/vitess/pull/13115) + * txthrottler: add metrics for topoWatcher and healthCheckStreamer [#13153](https://github.com/vitessio/vitess/pull/13153) + * `UpdateThrottlerConfig --unthrottle-app ...` [#13494](https://github.com/vitessio/vitess/pull/13494) + * Reroute 'ALTER VITESS_MIGRATION ... THROTTLE ...' through topo [#13511](https://github.com/vitessio/vitess/pull/13511) + * Tablet throttler: inter-checks via gRPC [#13514](https://github.com/vitessio/vitess/pull/13514) + * Per workload TxThrottler metrics [#13526](https://github.com/vitessio/vitess/pull/13526) + * Throttler: exempt apps via `UpdateThrottlerConfig --throttle-app-exempt` [#13666](https://github.com/vitessio/vitess/pull/13666) #### Topology -* Support arbitrary ZooKeeper config lines [#13829](https://github.com/vitessio/vitess/pull/13829) + * Support arbitrary ZooKeeper config lines [#13829](https://github.com/vitessio/vitess/pull/13829) #### VReplication -* MoveTables: allow copying all tables in a single atomic copy phase cycle [#13137](https://github.com/vitessio/vitess/pull/13137) -* VReplication: More intelligently manage vschema table entries on unsharded targets [#13220](https://github.com/vitessio/vitess/pull/13220) -* MoveTables sequence e2e tests: change terminology to use basic vs simple everywhere for partial movetables workflows [#13435](https://github.com/vitessio/vitess/pull/13435) -* wrangler,workflow/workflow: materialize from intersecting source shards based on primary vindexes [#13782](https://github.com/vitessio/vitess/pull/13782) -* Implement Reshard in vtctldclient [#13792](https://github.com/vitessio/vitess/pull/13792) -* VDiff: Migrate client command to vtctldclient [#13976](https://github.com/vitessio/vitess/pull/13976) + * MoveTables: allow copying all tables in a single atomic copy phase cycle [#13137](https://github.com/vitessio/vitess/pull/13137) + * VReplication: More intelligently manage vschema table entries on unsharded targets [#13220](https://github.com/vitessio/vitess/pull/13220) + * MoveTables sequence e2e tests: change terminology to use basic vs simple everywhere for partial movetables workflows [#13435](https://github.com/vitessio/vitess/pull/13435) + * wrangler,workflow/workflow: materialize from intersecting source shards based on primary vindexes [#13782](https://github.com/vitessio/vitess/pull/13782) + * Implement Reshard in vtctldclient [#13792](https://github.com/vitessio/vitess/pull/13792) + * VDiff: Migrate client command to vtctldclient [#13976](https://github.com/vitessio/vitess/pull/13976) + * Migrate vreplication commands to vtctldclient: Mount and Migrate [#14174](https://github.com/vitessio/vitess/pull/14174) + * [release-18.0] Migrate CreateLookupVindex and ExternalizeVindex to vtctldclient (#14086) [#14183](https://github.com/vitessio/vitess/pull/14183) + * Migrate Materialize command to vtctldclient [#14184](https://github.com/vitessio/vitess/pull/14184) + * [Release 18.0] Backport of #17174 [#14210](https://github.com/vitessio/vitess/pull/14210) + * [release-18.0] Migrate Materialize command to vtctldclient (#14184) [#14214](https://github.com/vitessio/vitess/pull/14214) + * [release-18.0] VReplication: Add traffic state to vtctldclient workflow status output (#14280) [#14282](https://github.com/vitessio/vitess/pull/14282) + * [release-18.0] VReplication: Add --all-cells flag to create sub-commands (#14341) [#14343](https://github.com/vitessio/vitess/pull/14343) +#### VTAdmin + * [release-18.0] Optimize the GetWorkflows RPC (#14212) [#14233](https://github.com/vitessio/vitess/pull/14233) #### VTCombo -* `vttestserver`: persist vschema changes in `--persistent_mode` [#13065](https://github.com/vitessio/vitess/pull/13065) + * `vttestserver`: persist vschema changes in `--persistent_mode` [#13065](https://github.com/vitessio/vitess/pull/13065) #### VTorc -* Improve VTOrc failure detection to be able to better handle dead primary failures [#13190](https://github.com/vitessio/vitess/pull/13190) -* Add flag to VTOrc to enable/disable its ability to run ERS [#13259](https://github.com/vitessio/vitess/pull/13259) -* Add metric for showing the errant GTIDs in VTOrc [#13281](https://github.com/vitessio/vitess/pull/13281) -* Add timestamp to vtorc debug page [#13379](https://github.com/vitessio/vitess/pull/13379) -* Augment VTOrc to also store the shard records and use it to better judge Primary recoveries [#13587](https://github.com/vitessio/vitess/pull/13587) -* Fix a couple of logs in VTOrc [#13667](https://github.com/vitessio/vitess/pull/13667) -* Errant GTID Metrics Refactor [#13670](https://github.com/vitessio/vitess/pull/13670) -* VTOrc converts a tablet to DRAINED type if it detects errant GTIDs on it [#13873](https://github.com/vitessio/vitess/pull/13873) + * Improve VTOrc failure detection to be able to better handle dead primary failures [#13190](https://github.com/vitessio/vitess/pull/13190) + * Add flag to VTOrc to enable/disable its ability to run ERS [#13259](https://github.com/vitessio/vitess/pull/13259) + * Add metric for showing the errant GTIDs in VTOrc [#13281](https://github.com/vitessio/vitess/pull/13281) + * Add timestamp to vtorc debug page [#13379](https://github.com/vitessio/vitess/pull/13379) + * Augment VTOrc to also store the shard records and use it to better judge Primary recoveries [#13587](https://github.com/vitessio/vitess/pull/13587) + * Fix a couple of logs in VTOrc [#13667](https://github.com/vitessio/vitess/pull/13667) + * Errant GTID Metrics Refactor [#13670](https://github.com/vitessio/vitess/pull/13670) + * VTOrc converts a tablet to DRAINED type if it detects errant GTIDs on it [#13873](https://github.com/vitessio/vitess/pull/13873) #### vtctl -* vtctl,vindexes: logs warnings and export stat for unknown vindex params [#13322](https://github.com/vitessio/vitess/pull/13322) -* vtctldclient OnlineDDL: support `throttle`, `unthrottle` [#13916](https://github.com/vitessio/vitess/pull/13916) + * vtctl,vindexes: logs warnings and export stat for unknown vindex params [#13322](https://github.com/vitessio/vitess/pull/13322) + * vtctldclient OnlineDDL: support `throttle`, `unthrottle` [#13916](https://github.com/vitessio/vitess/pull/13916) #### web UI -* Add vtsql flags to vtadmin [#13674](https://github.com/vitessio/vitess/pull/13674) -### Feature Request + * Add vtsql flags to vtadmin [#13674](https://github.com/vitessio/vitess/pull/13674) +### Feature Request #### CLI -* [vtctld] more cobra binaries [#13930](https://github.com/vitessio/vitess/pull/13930) -* [cobra] vtgate and vttablet [#13943](https://github.com/vitessio/vitess/pull/13943) -* [cli] migrate mysqlctl and mysqlctld to cobra [#13946](https://github.com/vitessio/vitess/pull/13946) -* [CLI] cobra lots of things [#14007](https://github.com/vitessio/vitess/pull/14007) -* miscellaneous cobras [#14069](https://github.com/vitessio/vitess/pull/14069) -* [cli] cobra zookeeper [#14094](https://github.com/vitessio/vitess/pull/14094) + * [vtctld] more cobra binaries [#13930](https://github.com/vitessio/vitess/pull/13930) + * [cobra] vtgate and vttablet [#13943](https://github.com/vitessio/vitess/pull/13943) + * [cli] migrate mysqlctl and mysqlctld to cobra [#13946](https://github.com/vitessio/vitess/pull/13946) + * [CLI] cobra lots of things [#14007](https://github.com/vitessio/vitess/pull/14007) + * miscellaneous cobras [#14069](https://github.com/vitessio/vitess/pull/14069) + * [cli] cobra zookeeper [#14094](https://github.com/vitessio/vitess/pull/14094) #### Online DDL -* Add OnlineDDL show support [#13738](https://github.com/vitessio/vitess/pull/13738) -* [onlineddl] retry and cleanup [#13830](https://github.com/vitessio/vitess/pull/13830) + * Add OnlineDDL show support [#13738](https://github.com/vitessio/vitess/pull/13738) + * [onlineddl] retry and cleanup [#13830](https://github.com/vitessio/vitess/pull/13830) #### Query Serving -* Add group_concat aggregation support [#13331](https://github.com/vitessio/vitess/pull/13331) -* Add support for kill statement [#13371](https://github.com/vitessio/vitess/pull/13371) -* Build foreign key definition in schema tracker [#13657](https://github.com/vitessio/vitess/pull/13657) -* Foreign Keys: `INSERT` planning [#13676](https://github.com/vitessio/vitess/pull/13676) -* Foreign Keys: `DELETE` planning [#13746](https://github.com/vitessio/vitess/pull/13746) -* Foreign Keys: `UPDATE` planning [#13762](https://github.com/vitessio/vitess/pull/13762) -* Add Foreign key Cascade engine primitive [#13802](https://github.com/vitessio/vitess/pull/13802) -* Foreign key cascade planning for DELETE and UPDATE queries [#13823](https://github.com/vitessio/vitess/pull/13823) -* Add Foreign key verify constraint engine primitive [#13848](https://github.com/vitessio/vitess/pull/13848) -* Add VSchema DDL support for dropping sequence and auto increment [#13882](https://github.com/vitessio/vitess/pull/13882) -* Update Cascade Planning leading to Foreign key constraint verification [#13902](https://github.com/vitessio/vitess/pull/13902) -* Disallow Insert with Duplicate key update and Replace Into queries on foreign key column, set locks on fk queries [#13953](https://github.com/vitessio/vitess/pull/13953) + * Add group_concat aggregation support [#13331](https://github.com/vitessio/vitess/pull/13331) + * Add support for kill statement [#13371](https://github.com/vitessio/vitess/pull/13371) + * Build foreign key definition in schema tracker [#13657](https://github.com/vitessio/vitess/pull/13657) + * Foreign Keys: `INSERT` planning [#13676](https://github.com/vitessio/vitess/pull/13676) + * Foreign Keys: `DELETE` planning [#13746](https://github.com/vitessio/vitess/pull/13746) + * Foreign Keys: `UPDATE` planning [#13762](https://github.com/vitessio/vitess/pull/13762) + * Add Foreign key Cascade engine primitive [#13802](https://github.com/vitessio/vitess/pull/13802) + * Foreign key cascade planning for DELETE and UPDATE queries [#13823](https://github.com/vitessio/vitess/pull/13823) + * Add Foreign key verify constraint engine primitive [#13848](https://github.com/vitessio/vitess/pull/13848) + * Add VSchema DDL support for dropping sequence and auto increment [#13882](https://github.com/vitessio/vitess/pull/13882) + * Update Cascade Planning leading to Foreign key constraint verification [#13902](https://github.com/vitessio/vitess/pull/13902) + * Disallow Insert with Duplicate key update and Replace Into queries on foreign key column, set locks on fk queries [#13953](https://github.com/vitessio/vitess/pull/13953) #### VReplication -* VReplication: Initialize Sequence Tables Used By Tables Being Moved [#13656](https://github.com/vitessio/vitess/pull/13656) -* MoveTables: add flag to specify that routing rules should not be created when a movetables workflow is created [#13895](https://github.com/vitessio/vitess/pull/13895) -### Internal Cleanup + * VReplication: Initialize Sequence Tables Used By Tables Being Moved [#13656](https://github.com/vitessio/vitess/pull/13656) + * MoveTables: add flag to specify that routing rules should not be created when a movetables workflow is created [#13895](https://github.com/vitessio/vitess/pull/13895) +### Internal Cleanup #### Build/CI -* docker/k8s: Cleanup done TODO [#13347](https://github.com/vitessio/vitess/pull/13347) -* Remove unused chromedriver [#13573](https://github.com/vitessio/vitess/pull/13573) -* docker/bootstrap: remove --no-cache flag [#13785](https://github.com/vitessio/vitess/pull/13785) + * docker/k8s: Cleanup done TODO [#13347](https://github.com/vitessio/vitess/pull/13347) + * Remove unused chromedriver [#13573](https://github.com/vitessio/vitess/pull/13573) + * docker/bootstrap: remove --no-cache flag [#13785](https://github.com/vitessio/vitess/pull/13785) #### CLI -* remove query_analyzer binary and release [#14055](https://github.com/vitessio/vitess/pull/14055) + * remove query_analyzer binary and release [#14055](https://github.com/vitessio/vitess/pull/14055) + * [release-18.0] Make vtctldclient mount command more standard (#14281) [#14283](https://github.com/vitessio/vitess/pull/14283) #### Cluster management -* Fix logging by omitting the host and port in `SetReadOnly` [#13470](https://github.com/vitessio/vitess/pull/13470) -* Improve logging and renaming PrimaryTermStartTimestamp in vttablets [#13625](https://github.com/vitessio/vitess/pull/13625) + * Fix logging by omitting the host and port in `SetReadOnly` [#13470](https://github.com/vitessio/vitess/pull/13470) + * Improve logging and renaming PrimaryTermStartTimestamp in vttablets [#13625](https://github.com/vitessio/vitess/pull/13625) #### Evalengine -* collations: Refactor to separate basic collation information from data [#13868](https://github.com/vitessio/vitess/pull/13868) + * collations: Refactor to separate basic collation information from data [#13868](https://github.com/vitessio/vitess/pull/13868) #### Examples -* docker/mini: remove refs to orc configs [#13495](https://github.com/vitessio/vitess/pull/13495) + * docker/mini: remove refs to orc configs [#13495](https://github.com/vitessio/vitess/pull/13495) #### General -* servenv: Allow for explicit bind address [#13188](https://github.com/vitessio/vitess/pull/13188) -* Remove `out.txt` and add `release-17.0` to go upgrade automation [#13261](https://github.com/vitessio/vitess/pull/13261) -* Deprecate VTGR [#13301](https://github.com/vitessio/vitess/pull/13301) -* mysql: Refactor dependencies [#13688](https://github.com/vitessio/vitess/pull/13688) -* Remove explicit usage of etcd v2 (api and storage) [#13791](https://github.com/vitessio/vitess/pull/13791) -* Go 1.21 cleanups [#13862](https://github.com/vitessio/vitess/pull/13862) -* [wrangler] cleanup unused functions [#13867](https://github.com/vitessio/vitess/pull/13867) -* [misc] Delete more unused functions, tidy up dupe imports [#13878](https://github.com/vitessio/vitess/pull/13878) -* Clean up deprecated slice header usage and unused code [#13880](https://github.com/vitessio/vitess/pull/13880) -* [misc] tidy imports [#13885](https://github.com/vitessio/vitess/pull/13885) -* [staticcheck] miscellaneous tidying [#13892](https://github.com/vitessio/vitess/pull/13892) -* [staticcheck] Cleanup deprecations [#13898](https://github.com/vitessio/vitess/pull/13898) -* Consolidate helper functions for working with proto3 time messages [#13905](https://github.com/vitessio/vitess/pull/13905) -* [staticcheck] Last few staticchecks! [#13909](https://github.com/vitessio/vitess/pull/13909) -* Remove deprecated flags before `v18.0.0` [#14071](https://github.com/vitessio/vitess/pull/14071) + * servenv: Allow for explicit bind address [#13188](https://github.com/vitessio/vitess/pull/13188) + * Remove `out.txt` and add `release-17.0` to go upgrade automation [#13261](https://github.com/vitessio/vitess/pull/13261) + * Deprecate VTGR [#13301](https://github.com/vitessio/vitess/pull/13301) + * mysql: Refactor dependencies [#13688](https://github.com/vitessio/vitess/pull/13688) + * Remove explicit usage of etcd v2 (api and storage) [#13791](https://github.com/vitessio/vitess/pull/13791) + * Go 1.21 cleanups [#13862](https://github.com/vitessio/vitess/pull/13862) + * [wrangler] cleanup unused functions [#13867](https://github.com/vitessio/vitess/pull/13867) + * [misc] Delete more unused functions, tidy up dupe imports [#13878](https://github.com/vitessio/vitess/pull/13878) + * Clean up deprecated slice header usage and unused code [#13880](https://github.com/vitessio/vitess/pull/13880) + * [misc] tidy imports [#13885](https://github.com/vitessio/vitess/pull/13885) + * [staticcheck] miscellaneous tidying [#13892](https://github.com/vitessio/vitess/pull/13892) + * [staticcheck] Cleanup deprecations [#13898](https://github.com/vitessio/vitess/pull/13898) + * Consolidate helper functions for working with proto3 time messages [#13905](https://github.com/vitessio/vitess/pull/13905) + * [staticcheck] Last few staticchecks! [#13909](https://github.com/vitessio/vitess/pull/13909) + * Remove deprecated flags before `v18.0.0` [#14071](https://github.com/vitessio/vitess/pull/14071) #### Observability -* stats: use *time.Ticker instead of time.After() [#13492](https://github.com/vitessio/vitess/pull/13492) + * stats: use *time.Ticker instead of time.After() [#13492](https://github.com/vitessio/vitess/pull/13492) #### Query Serving -* Operator planner refactor [#13294](https://github.com/vitessio/vitess/pull/13294) -* Refactor and add a comment to schema initialisation code [#13309](https://github.com/vitessio/vitess/pull/13309) -* vtgate v3 planner removal [#13458](https://github.com/vitessio/vitess/pull/13458) -* vtgate buffering logic: remove the deprecated healthcheck based implementation [#13584](https://github.com/vitessio/vitess/pull/13584) -* Refactor Expression and Statement Simplifier [#13636](https://github.com/vitessio/vitess/pull/13636) -* Remove duplicate ACL check in tabletserver handleHTTPConsolidations [#13876](https://github.com/vitessio/vitess/pull/13876) -* inputs method to return additional information about the input primitive [#13883](https://github.com/vitessio/vitess/pull/13883) -* refactor: move DML logic to sql_builder.go [#13920](https://github.com/vitessio/vitess/pull/13920) -* Fix `TestLeftJoinUsingUnsharded` and remove instability when running E2E locally [#13973](https://github.com/vitessio/vitess/pull/13973) -* Remove excessive logging in transactions [#14021](https://github.com/vitessio/vitess/pull/14021) -* moved timeout test to different package [#14028](https://github.com/vitessio/vitess/pull/14028) + * Operator planner refactor [#13294](https://github.com/vitessio/vitess/pull/13294) + * Refactor and add a comment to schema initialisation code [#13309](https://github.com/vitessio/vitess/pull/13309) + * vtgate v3 planner removal [#13458](https://github.com/vitessio/vitess/pull/13458) + * vtgate buffering logic: remove the deprecated healthcheck based implementation [#13584](https://github.com/vitessio/vitess/pull/13584) + * Refactor Expression and Statement Simplifier [#13636](https://github.com/vitessio/vitess/pull/13636) + * Remove duplicate ACL check in tabletserver handleHTTPConsolidations [#13876](https://github.com/vitessio/vitess/pull/13876) + * inputs method to return additional information about the input primitive [#13883](https://github.com/vitessio/vitess/pull/13883) + * refactor: move DML logic to sql_builder.go [#13920](https://github.com/vitessio/vitess/pull/13920) + * Fix `TestLeftJoinUsingUnsharded` and remove instability when running E2E locally [#13973](https://github.com/vitessio/vitess/pull/13973) + * Remove excessive logging in transactions [#14021](https://github.com/vitessio/vitess/pull/14021) + * moved timeout test to different package [#14028](https://github.com/vitessio/vitess/pull/14028) + * [release-18.0] Rename Foreign Key enum values in VSchema and drop `FK_` prefix (#14274) [#14299](https://github.com/vitessio/vitess/pull/14299) + * tx_throttler: remove topo watchers metric [#14444](https://github.com/vitessio/vitess/pull/14444) #### TabletManager -* mysqlctl: Use DBA connection for schema operations [#13178](https://github.com/vitessio/vitess/pull/13178) -* k8stopo: Include deprecation warning [#13299](https://github.com/vitessio/vitess/pull/13299) -* k8stopo: Remove the deprecated Kubernetes topo [#13303](https://github.com/vitessio/vitess/pull/13303) -* vtgr: Remove deprecated vtgr [#13308](https://github.com/vitessio/vitess/pull/13308) -* mysqlctl: Move more to use built in MySQL client [#13338](https://github.com/vitessio/vitess/pull/13338) + * mysqlctl: Use DBA connection for schema operations [#13178](https://github.com/vitessio/vitess/pull/13178) + * k8stopo: Include deprecation warning [#13299](https://github.com/vitessio/vitess/pull/13299) + * k8stopo: Remove the deprecated Kubernetes topo [#13303](https://github.com/vitessio/vitess/pull/13303) + * vtgr: Remove deprecated vtgr [#13308](https://github.com/vitessio/vitess/pull/13308) + * mysqlctl: Move more to use built in MySQL client [#13338](https://github.com/vitessio/vitess/pull/13338) #### Throttler -* `txthrottler`: remove `txThrottlerConfig` struct, rely on `tabletenv` [#13624](https://github.com/vitessio/vitess/pull/13624) + * `txthrottler`: remove `txThrottlerConfig` struct, rely on `tabletenv` [#13624](https://github.com/vitessio/vitess/pull/13624) #### VReplication -* Use sqlparser for all dynamic query building in VDiff2 [#13319](https://github.com/vitessio/vitess/pull/13319) -* vreplication: Move to use collations package [#13566](https://github.com/vitessio/vitess/pull/13566) + * Use sqlparser for all dynamic query building in VDiff2 [#13319](https://github.com/vitessio/vitess/pull/13319) + * vreplication: Move to use collations package [#13566](https://github.com/vitessio/vitess/pull/13566) #### VTAdmin -* [VTAdmin] Upgrade to use node 18.16.0 [#13288](https://github.com/vitessio/vitess/pull/13288) + * [VTAdmin] Upgrade to use node 18.16.0 [#13288](https://github.com/vitessio/vitess/pull/13288) #### VTorc -* VTOrc: Update the primary key for all the tables from `hostname, port` to `alias` [#13243](https://github.com/vitessio/vitess/pull/13243) -* vtorc: Cleanup more unused code [#13354](https://github.com/vitessio/vitess/pull/13354) -* Improve lock action string [#13355](https://github.com/vitessio/vitess/pull/13355) -* Improve VTOrc logging statements, now that we have alias as a field [#13428](https://github.com/vitessio/vitess/pull/13428) -* Remove excessive logging in VTOrc APIs [#13459](https://github.com/vitessio/vitess/pull/13459) -* [release-16.0] Remove excessive logging in VTOrc APIs (#13459) [#13462](https://github.com/vitessio/vitess/pull/13462) + * VTOrc: Update the primary key for all the tables from `hostname, port` to `alias` [#13243](https://github.com/vitessio/vitess/pull/13243) + * vtorc: Cleanup more unused code [#13354](https://github.com/vitessio/vitess/pull/13354) + * Improve lock action string [#13355](https://github.com/vitessio/vitess/pull/13355) + * Improve VTOrc logging statements, now that we have alias as a field [#13428](https://github.com/vitessio/vitess/pull/13428) + * Remove excessive logging in VTOrc APIs [#13459](https://github.com/vitessio/vitess/pull/13459) + * [release-16.0] Remove excessive logging in VTOrc APIs (#13459) [#13462](https://github.com/vitessio/vitess/pull/13462) +#### vtctl + * [release-18.0] Move all examples to vtctldclient (#14226) [#14241](https://github.com/vitessio/vitess/pull/14241) #### vtexplain -* vtexplain: Fix passing through context for cleanup [#13900](https://github.com/vitessio/vitess/pull/13900) -### Performance + * vtexplain: Fix passing through context for cleanup [#13900](https://github.com/vitessio/vitess/pull/13900) +### Performance #### General -* proto: Faster clone [#13914](https://github.com/vitessio/vitess/pull/13914) + * proto: Faster clone [#13914](https://github.com/vitessio/vitess/pull/13914) #### Query Serving -* Cache info schema table info [#13724](https://github.com/vitessio/vitess/pull/13724) -* gen4: Fast aggregations [#13904](https://github.com/vitessio/vitess/pull/13904) -* Cache v3 [#13939](https://github.com/vitessio/vitess/pull/13939) -* Reduce network pressure on multi row insert [#14064](https://github.com/vitessio/vitess/pull/14064) -* VTGate FK stress tests suite: improvements [#14098](https://github.com/vitessio/vitess/pull/14098) + * Cache info schema table info [#13724](https://github.com/vitessio/vitess/pull/13724) + * gen4: Fast aggregations [#13904](https://github.com/vitessio/vitess/pull/13904) + * Cache v3 [#13939](https://github.com/vitessio/vitess/pull/13939) + * Reduce network pressure on multi row insert [#14064](https://github.com/vitessio/vitess/pull/14064) + * VTGate FK stress tests suite: improvements [#14098](https://github.com/vitessio/vitess/pull/14098) #### TabletManager -* BaseShowTablesWithSizes: optimize MySQL 8.0 query [#13375](https://github.com/vitessio/vitess/pull/13375) -* Support views in BaseShowTablesWithSizes for MySQL 8.0 [#13394](https://github.com/vitessio/vitess/pull/13394) + * BaseShowTablesWithSizes: optimize MySQL 8.0 query [#13375](https://github.com/vitessio/vitess/pull/13375) + * Support views in BaseShowTablesWithSizes for MySQL 8.0 [#13394](https://github.com/vitessio/vitess/pull/13394) #### vtctl -* `ApplySchema`: support `--batch-size` flag in 'direct' strategy [#13693](https://github.com/vitessio/vitess/pull/13693) -### Regression + * `ApplySchema`: support `--batch-size` flag in 'direct' strategy [#13693](https://github.com/vitessio/vitess/pull/13693) +### Regression +#### Backup and Restore + * Fix backup on s3 like storage [#14311](https://github.com/vitessio/vitess/pull/14311) + * [release-18.0] Fix backup on s3 like storage (#14311) [#14362](https://github.com/vitessio/vitess/pull/14362) #### Query Serving -* fix: ShardedRouting clone to clone slice of reference correctly [#13265](https://github.com/vitessio/vitess/pull/13265) -* Handle inconsistent state error in query buffering [#13333](https://github.com/vitessio/vitess/pull/13333) -### Release + * fix: ShardedRouting clone to clone slice of reference correctly [#13265](https://github.com/vitessio/vitess/pull/13265) + * Handle inconsistent state error in query buffering [#13333](https://github.com/vitessio/vitess/pull/13333) + * fix: insert with negative value [#14244](https://github.com/vitessio/vitess/pull/14244) + * [release-18.0] fix: insert with negative value (#14244) [#14247](https://github.com/vitessio/vitess/pull/14247) + * [release-18.0] use aggregation engine over distinct engine when overlapping order by (#14359) [#14361](https://github.com/vitessio/vitess/pull/14361) + * [release-18.0] Performance Fixes for Vitess 18 (#14383) [#14393](https://github.com/vitessio/vitess/pull/14393) + * [release-18.0] tuple: serialized form (#14392) [#14394](https://github.com/vitessio/vitess/pull/14394) +### Release #### Build/CI -* Fix incorrect output in release scripts [#13385](https://github.com/vitessio/vitess/pull/13385) -* Optimize release notes generation to use GitHub Milestones [#13398](https://github.com/vitessio/vitess/pull/13398) + * Fix incorrect output in release scripts [#13385](https://github.com/vitessio/vitess/pull/13385) + * Optimize release notes generation to use GitHub Milestones [#13398](https://github.com/vitessio/vitess/pull/13398) +#### CLI + * Add vtctldclient info to the 18.0 summary [#14259](https://github.com/vitessio/vitess/pull/14259) #### Documentation -* Add end-of-life documentation + re-organize internal documentation [#13401](https://github.com/vitessio/vitess/pull/13401) -* Update known issues in `v16.x` and `v17.0.0` [#13618](https://github.com/vitessio/vitess/pull/13618) + * Add end-of-life documentation + re-organize internal documentation [#13401](https://github.com/vitessio/vitess/pull/13401) + * Update known issues in `v16.x` and `v17.0.0` [#13618](https://github.com/vitessio/vitess/pull/13618) #### General -* Copy v17.0.0-rc changelog to main [#13248](https://github.com/vitessio/vitess/pull/13248) -* Update release notes for 17.0.0-rc2 [#13306](https://github.com/vitessio/vitess/pull/13306) -* Forward port of release notes changes from v17.0.0 GA [#13370](https://github.com/vitessio/vitess/pull/13370) -* Add v15.0.4, v16.0.3, and v17.0.1 changelogs [#13661](https://github.com/vitessio/vitess/pull/13661) -* Copy release notes for v17.0.2 and v16.0.4 [#13811](https://github.com/vitessio/vitess/pull/13811) -* Code freeze of release-18.0 [#14131](https://github.com/vitessio/vitess/pull/14131) -### Testing + * Copy v17.0.0-rc changelog to main [#13248](https://github.com/vitessio/vitess/pull/13248) + * Update release notes for 17.0.0-rc2 [#13306](https://github.com/vitessio/vitess/pull/13306) + * Forward port of release notes changes from v17.0.0 GA [#13370](https://github.com/vitessio/vitess/pull/13370) + * Add v15.0.4, v16.0.3, and v17.0.1 changelogs [#13661](https://github.com/vitessio/vitess/pull/13661) + * Copy release notes for v17.0.2 and v16.0.4 [#13811](https://github.com/vitessio/vitess/pull/13811) + * Code freeze of release-18.0 [#14131](https://github.com/vitessio/vitess/pull/14131) + * Release of v18.0.0-rc1 [#14136](https://github.com/vitessio/vitess/pull/14136) + * Back to dev mode after `v18.0.0-rc1` release [#14169](https://github.com/vitessio/vitess/pull/14169) + * Code freeze of release-18.0 [#14405](https://github.com/vitessio/vitess/pull/14405) +### Testing #### Build/CI -* Flakes: Address TestMigrate Failures [#12866](https://github.com/vitessio/vitess/pull/12866) -* [vipersync] skip flaky test [#13501](https://github.com/vitessio/vitess/pull/13501) -* [vipersync] deflake TestWatchConfig [#13545](https://github.com/vitessio/vitess/pull/13545) -* Fix bug in `fileNameFromPosition` test helper [#13778](https://github.com/vitessio/vitess/pull/13778) -* Flakes: Delete VTDATAROOT files in reparent test teardown within CI [#13793](https://github.com/vitessio/vitess/pull/13793) -* CI: Misc test improvements to limit failures with various runners [#13825](https://github.com/vitessio/vitess/pull/13825) -* actually test vtcombo [#14095](https://github.com/vitessio/vitess/pull/14095) -* Remove FOSSA Test from CI until we can do it in a secure way [#14119](https://github.com/vitessio/vitess/pull/14119) + * Flakes: Address TestMigrate Failures [#12866](https://github.com/vitessio/vitess/pull/12866) + * [vipersync] skip flaky test [#13501](https://github.com/vitessio/vitess/pull/13501) + * [vipersync] deflake TestWatchConfig [#13545](https://github.com/vitessio/vitess/pull/13545) + * Fix bug in `fileNameFromPosition` test helper [#13778](https://github.com/vitessio/vitess/pull/13778) + * Flakes: Delete VTDATAROOT files in reparent test teardown within CI [#13793](https://github.com/vitessio/vitess/pull/13793) + * CI: Misc test improvements to limit failures with various runners [#13825](https://github.com/vitessio/vitess/pull/13825) + * actually test vtcombo [#14095](https://github.com/vitessio/vitess/pull/14095) + * Remove FOSSA Test from CI until we can do it in a secure way [#14119](https://github.com/vitessio/vitess/pull/14119) #### Cluster management -* Fix `Fakemysqldaemon` to store the host and port after `SetReplicationSource` call [#13439](https://github.com/vitessio/vitess/pull/13439) -* Deflake `TestPlannedReparentShardPromoteReplicaFail` [#13548](https://github.com/vitessio/vitess/pull/13548) -* Flaky tests: Fix wrangler tests [#13568](https://github.com/vitessio/vitess/pull/13568) + * Fix `Fakemysqldaemon` to store the host and port after `SetReplicationSource` call [#13439](https://github.com/vitessio/vitess/pull/13439) + * Deflake `TestPlannedReparentShardPromoteReplicaFail` [#13548](https://github.com/vitessio/vitess/pull/13548) + * Flaky tests: Fix wrangler tests [#13568](https://github.com/vitessio/vitess/pull/13568) #### General -* [CI] deflake viper sync tests [#13185](https://github.com/vitessio/vitess/pull/13185) -* Remove `--disable_active_reparents` flag in vttablet-up.sh [#13504](https://github.com/vitessio/vitess/pull/13504) -* Add leak checking for vtgate tests [#13835](https://github.com/vitessio/vitess/pull/13835) + * [CI] deflake viper sync tests [#13185](https://github.com/vitessio/vitess/pull/13185) + * Remove `--disable_active_reparents` flag in vttablet-up.sh [#13504](https://github.com/vitessio/vitess/pull/13504) + * Add leak checking for vtgate tests [#13835](https://github.com/vitessio/vitess/pull/13835) #### Online DDL -* Fix potential panics due to "Fail in goroutine after test completed" [#13596](https://github.com/vitessio/vitess/pull/13596) -* [OnlineDDL] add label so break works as intended [#13691](https://github.com/vitessio/vitess/pull/13691) + * Fix potential panics due to "Fail in goroutine after test completed" [#13596](https://github.com/vitessio/vitess/pull/13596) + * [OnlineDDL] add label so break works as intended [#13691](https://github.com/vitessio/vitess/pull/13691) #### Query Serving -* Deflake `TestQueryTimeoutWithDual` test [#13405](https://github.com/vitessio/vitess/pull/13405) -* Fix `TestGatewayBufferingWhileReparenting` flakiness [#13469](https://github.com/vitessio/vitess/pull/13469) -* fix TestQueryTimeoutWithTables flaky test [#13579](https://github.com/vitessio/vitess/pull/13579) -* schemadiff: add time measure test for massive schema load and diff [#13697](https://github.com/vitessio/vitess/pull/13697) -* End to end testing suite for foreign keys [#13870](https://github.com/vitessio/vitess/pull/13870) -* Fix setup order to avoid races [#13871](https://github.com/vitessio/vitess/pull/13871) -* Use correct syntax in test [#13907](https://github.com/vitessio/vitess/pull/13907) -* test: added test to check binlogs to contain the cascade events [#13970](https://github.com/vitessio/vitess/pull/13970) -* E2E Fuzzing testing for foreign keys [#13980](https://github.com/vitessio/vitess/pull/13980) -* Fix foreign key plan tests expectation [#13997](https://github.com/vitessio/vitess/pull/13997) + * Deflake `TestQueryTimeoutWithDual` test [#13405](https://github.com/vitessio/vitess/pull/13405) + * Fix `TestGatewayBufferingWhileReparenting` flakiness [#13469](https://github.com/vitessio/vitess/pull/13469) + * fix TestQueryTimeoutWithTables flaky test [#13579](https://github.com/vitessio/vitess/pull/13579) + * schemadiff: add time measure test for massive schema load and diff [#13697](https://github.com/vitessio/vitess/pull/13697) + * End to end testing suite for foreign keys [#13870](https://github.com/vitessio/vitess/pull/13870) + * Fix setup order to avoid races [#13871](https://github.com/vitessio/vitess/pull/13871) + * Use correct syntax in test [#13907](https://github.com/vitessio/vitess/pull/13907) + * test: added test to check binlogs to contain the cascade events [#13970](https://github.com/vitessio/vitess/pull/13970) + * E2E Fuzzing testing for foreign keys [#13980](https://github.com/vitessio/vitess/pull/13980) + * Fix foreign key plan tests expectation [#13997](https://github.com/vitessio/vitess/pull/13997) + * [release-18.0] vtgate: Allow more errors for the warning check (#14421) [#14423](https://github.com/vitessio/vitess/pull/14423) #### VReplication -* Flakes: remove non-determinism from vtctldclient MoveTables unit test [#13765](https://github.com/vitessio/vitess/pull/13765) -* Flakes: empty vtdataroot before starting a new vreplication e2e test [#13803](https://github.com/vitessio/vitess/pull/13803) -* Flakes: Add recently added 'select rows_copied' query to ignore list [#13993](https://github.com/vitessio/vitess/pull/13993) + * Flakes: remove non-determinism from vtctldclient MoveTables unit test [#13765](https://github.com/vitessio/vitess/pull/13765) + * Flakes: empty vtdataroot before starting a new vreplication e2e test [#13803](https://github.com/vitessio/vitess/pull/13803) + * Flakes: Add recently added 'select rows_copied' query to ignore list [#13993](https://github.com/vitessio/vitess/pull/13993) + * [release-18.0] TestStreamMigrateMainflow: fix panic in test [#14425](https://github.com/vitessio/vitess/pull/14425) #### VTorc -* Fix flakiness in `TestDeadPrimaryRecoversImmediately` [#13232](https://github.com/vitessio/vitess/pull/13232) -* Fix flakiness in VTOrc tests [#13489](https://github.com/vitessio/vitess/pull/13489) -* Skip flaky test `TestReadOutdatedInstanceKeys` [#13561](https://github.com/vitessio/vitess/pull/13561) -* Reintroduce `TestReadOutdatedInstanceKeys` with debugging information [#13562](https://github.com/vitessio/vitess/pull/13562) + * Fix flakiness in `TestDeadPrimaryRecoversImmediately` [#13232](https://github.com/vitessio/vitess/pull/13232) + * Fix flakiness in VTOrc tests [#13489](https://github.com/vitessio/vitess/pull/13489) + * Skip flaky test `TestReadOutdatedInstanceKeys` [#13561](https://github.com/vitessio/vitess/pull/13561) + * Reintroduce `TestReadOutdatedInstanceKeys` with debugging information [#13562](https://github.com/vitessio/vitess/pull/13562) #### vtctl -* Fix merge conflict with new tests [#13869](https://github.com/vitessio/vitess/pull/13869) + * Fix merge conflict with new tests [#13869](https://github.com/vitessio/vitess/pull/13869) + diff --git a/changelog/18.0/18.0.0/release_notes.md b/changelog/18.0/18.0.0/release_notes.md index 88fa877bdc2..9851245a648 100644 --- a/changelog/18.0/18.0.0/release_notes.md +++ b/changelog/18.0/18.0.0/release_notes.md @@ -1,40 +1,41 @@ -# Release of Vitess v18.0.0-rc1 +# Release of Vitess v18.0.0 ## Summary ### Table of Contents - **[Major Changes](#major-changes)** - - **[Breaking Changes](#breaking-changes)** - - [Local examples now use etcd v3 storage and API](#local-examples-etcd-v3) - - **[New command line flags and behavior](#new-flag)** - - [VTOrc flag `--allow-emergency-reparent`](#new-flag-toggle-ers) - - [VTOrc flag `--change-tablets-with-errant-gtid-to-drained`](#new-flag-errant-gtid-convert) - - [ERS sub flag `--wait-for-all-tablets`](#new-ers-subflag) - - [VTGate flag `--grpc-send-session-in-streaming`](#new-vtgate-streaming-sesion) - - **[Experimental Foreign Key Support](#foreign-keys)** - - **[VTAdmin](#vtadmin)** - - [Updated to node v18.16.0](#update-node) - - **[Deprecations and Deletions](#deprecations-and-deletions)** - - [Deprecated Flags](#deprecated-flags) - - [Deprecated Stats](#deprecated-stats) - - [Deleted Flags](#deleted-flags) - - [Deleted `V3` planner](#deleted-v3) - - [Deleted `k8stopo`](#deleted-k8stopo) - - [Deleted `vtgr`](#deleted-vtgr) - - [Deleted `query_analyzer`](#deleted-query_analyzer) - - **[New Stats](#new-stats)** - - [VTGate Vindex unknown parameters](#vtgate-vindex-unknown-parameters) - - [VTBackup stat `Phase`](#vtbackup-stat-phase) - - [VTBackup stat `PhaseStatus`](#vtbackup-stat-phase-status) - - [Backup and restore metrics for AWS S3](#backup-restore-metrics-aws-s3) - - [VTCtld and VTOrc reparenting stats](#vtctld-and-vtorc-reparenting-stats) - - **[VTTablet](#vttablet)** - - [VTTablet: New ResetSequences RPC](#vttablet-new-rpc-reset-sequences) - - **[Docker](#docker)** - - [Debian: Bookworm added and made default](#debian-bookworm) - - [Debian: Buster removed](#debian-buster) - - **[Durability Policies](#durability-policies)** - - [New Durability Policies](#new-durability-policies) + - **[Breaking Changes](#breaking-changes)** + - [Local examples now use etcd v3 storage and API](#local-examples-etcd-v3) + - **[New command line flags and behavior](#new-flag)** + - [VTOrc flag `--allow-emergency-reparent`](#new-flag-toggle-ers) + - [VTOrc flag `--change-tablets-with-errant-gtid-to-drained`](#new-flag-errant-gtid-convert) + - [ERS sub flag `--wait-for-all-tablets`](#new-ers-subflag) + - [VTGate flag `--grpc-send-session-in-streaming`](#new-vtgate-streaming-sesion) + - **[Experimental Foreign Key Support](#foreign-keys)** + - **[VTAdmin](#vtadmin)** + - [Updated to node v18.16.0](#update-node) + - **[Deprecations and Deletions](#deprecations-and-deletions)** + - [Legacy Client Binaries](#legacy-client-binaries) + - [Deprecated Flags](#deprecated-flags) + - [Deprecated Stats](#deprecated-stats) + - [Deleted Flags](#deleted-flags) + - [Deleted `V3` planner](#deleted-v3) + - [Deleted `k8stopo`](#deleted-k8stopo) + - [Deleted `vtgr`](#deleted-vtgr) + - [Deleted `query_analyzer`](#deleted-query_analyzer) + - **[New Stats](#new-stats)** + - [VTGate Vindex unknown parameters](#vtgate-vindex-unknown-parameters) + - [VTBackup stat `Phase`](#vtbackup-stat-phase) + - [VTBackup stat `PhaseStatus`](#vtbackup-stat-phase-status) + - [Backup and restore metrics for AWS S3](#backup-restore-metrics-aws-s3) + - [VTCtld and VTOrc reparenting stats](#vtctld-and-vtorc-reparenting-stats) + - **[VTTablet](#vttablet)** + - [VTTablet: New ResetSequences RPC](#vttablet-new-rpc-reset-sequences) + - **[Docker](#docker)** + - [Debian: Bookworm added and made default](#debian-bookworm) + - [Debian: Buster removed](#debian-buster) + - **[Durability Policies](#durability-policies)** + - [New Durability Policies](#new-durability-policies) ## Major Changes @@ -44,7 +45,7 @@ In previous releases the [local examples](https://github.com/vitessio/vitess/tree/main/examples/local) were explicitly using etcd v2 storage (`etcd --enable-v2=true`) and API (`ETCDCTL_API=2`) mode. We have now removed this legacy etcd usage and instead use the new (default) etcd v3 storage and API. Please see -[PR #13791](https://github.com/vitessio/vitess/pull/13791) for additional info. If you are using the local +[PR #13791](https://github.com/vitessio/vitess/pull/13791) for details. If you are using the local examples in any sort of long-term non-testing capacity, then you will need to explicitly use the v2 storage and API mode or [migrate your existing data from v2 to v3](https://etcd.io/docs/v3.5/tutorials/how-to-migrate/). @@ -52,108 +53,131 @@ and API mode or [migrate your existing data from v2 to v3](https://etcd.io/docs/ #### VTOrc flag `--allow-emergency-reparent` -VTOrc has a new flag `--allow-emergency-reparent` that allows the users to toggle the ability of VTOrc to run emergency -reparent operations. Users that want VTOrc to fix the replication issues, but don't want it to run any reparents -should start using this flag. By default, VTOrc will be able to run `EmergencyReparentShard`. Users must specify the -flag to `false` to change the behaviour. +VTOrc has a new flag `--allow-emergency-reparent` that specifies whether VTOrc is allowed to run emergency +failover operations. Users that want VTOrc to fix replication issues, but don't want it to run any failovers +should use this flag. This flag defaults to `true` which corresponds to the default behavior from prior releases. #### VTOrc flag `--change-tablets-with-errant-gtid-to-drained` VTOrc has a new flag `--change-tablets-with-errant-gtid-to-drained` that allows users to choose whether VTOrc should change the -tablet type of tablets with errant GTIDs to `DRAINED`. By default, it is disabled. +tablet type of tablets with errant GTIDs to `DRAINED`. By default, this flag is disabled. This feature allows users to configure VTOrc such that any tablet that encounters errant GTIDs is automatically taken out of the serving graph. These tablets can then be inspected for what the errant GTIDs are, and once fixed, they can rejoin the cluster. #### ERS sub flag `--wait-for-all-tablets` -Running `EmergencyReparentShard` from the vtctldclient has a new sub-flag `--wait-for-all-tablets` that makes `EmergencyReparentShard` wait +vtctldclient command `EmergencyReparentShard` has a new sub-flag `--wait-for-all-tablets` that makes `EmergencyReparentShard` wait for a response from all the tablets. Originally `EmergencyReparentShard` was meant only to be run when a primary tablet is unreachable. -We have realized now that there are cases when the replication is broken but all the tablets are reachable. In these cases, it is advisable to -call `EmergencyReparentShard` with `--wait-for-all-tablets` so that it does not ignore one of the tablets. +We have realized now that there are cases when replication is broken but all tablets are reachable. In these cases, it is advisable to +call `EmergencyReparentShard` with `--wait-for-all-tablets` so that it does not ignore any of the tablets. #### VTGate GRPC stream execute session flag `--grpc-send-session-in-streaming` -This flag enables transaction support on `StreamExecute` api. -Once enabled, VTGate `StreamExecute` gRPC api will send session as the last packet in the response. -The client should enable it only when they have made the required changes to expect such a packet. +This flag enables transaction support on VTGate's `StreamExecute` gRPC API. +When this is enabled, `StreamExecute` will return the session in the last packet of the response. +Users should enable this flag only after client code has been changed to expect such a packet. It is disabled by default. ### Experimental Foreign Key Support -A new field `foreignKeyMode` has been added to the VSchema. This field can be provided for each keyspace. The VTGate flag `--foreign_key_mode` has been deprecated in favour of this field. +A new optional field `foreignKeyMode` has been added to the VSchema. This field can be provided for each keyspace. The VTGate flag `--foreign_key_mode` has been deprecated in favor of this field. There are 3 foreign key modes now supported in Vitess - 1. `unmanaged` - - This mode represents the default behaviour in Vitess, where it does not manage foreign keys column references. Users are responsible for configuring foreign keys in MySQL in such a way that related rows, as determined by foreign keys, reside within the same shard. + This mode represents the default behavior in Vitess, where it does not manage foreign key column references. Users are responsible for configuring foreign keys in MySQL in such a way that related rows, as determined by foreign keys, reside within the same shard. 2. `managed` [EXPERIMENTAL] - - In this experimental mode, Vitess is fully aware of foreign key relationships and actively tracks foreign key constraints using the schema tracker. Vitess takes charge of handling DML operations with foreign keys cascading updates, deletes and verifying restrict. It will also validate parent row existence. - This ensures that all the operations are logged in binary logs, unlike MySQL implementation of foreign keys. - This enables seamless integration of VReplication with foreign keys. - For more details on what operations Vitess takes please refer to the [design document for foreign keys](https://github.com/vitessio/vitess/issues/12967). + In this experimental mode, Vitess is fully aware of foreign key relationships and actively tracks foreign key constraints using the schema tracker. VTGate will handle DML operations with foreign keys and correctly cascade updates and deletes. + It will also verify `restrict` constraints and validate the existence of parent rows before inserting child rows. + This ensures that all child operations are logged in binary logs, unlike the InnoDB implementation of foreign keys. + This allows the usage of VReplication workflows with foreign keys. + Implementation details are documented in the [RFC for foreign keys](https://github.com/vitessio/vitess/issues/12967). 3. `disallow` - In this mode Vitess explicitly disallows any DDL statements that try to create a foreign key constraint. This mode is equivalent to running VTGate with the flag `--foreign_key_mode=disallow`. #### Upgrade process -After upgrading from v17 to v18, the users should specify the correct foreign key mode for all their keyspaces in the VSchema using the new property. -Once this change has taken effect, the deprecated flag `--foreign_key_mode` can be dropped from all the VTGates. +After upgrading from v17 to v18, users should specify the correct foreign key mode for all their keyspaces in the VSchema using the new property. +Once this change has taken effect, the deprecated flag `--foreign_key_mode` can be dropped from all VTGates. Note that this is only required if running in `disallow` mode. +No action is needed to use `unmanaged` mode. ### VTAdmin #### vtadmin-web updated to node v18.16.0 (LTS) Building `vtadmin-web` now requires node >= v18.16.0 (LTS). Breaking changes from v16 to v18 are listed -in https://nodejs.org/en/blog/release/v18.0.0, but none apply to VTAdmin. Full details on v18.16.0 are listed +in https://nodejs.org/en/blog/release/v18, but none apply to VTAdmin. Full details on node v18.16.0 are listed on https://nodejs.org/en/blog/release/v18.16.0. ### Deprecations and Deletions +#### Legacy Client Binaries + +`vtctldclient` is our new modern *Vitess controller daemon* (`vtctld`) *client* – which you will use to perform commands +and take actions in your Vitess clusters. It is [replacing the legacy `vtctl`/`vtctlclient` binaries](https://vitess.io/docs/18.0/reference/vtctldclient-transition/overview/). +Some of the benefits are: + +- [Dedicated RPCs for each command](https://github.com/vitessio/vitess/blob/release-18.0/proto/vtctlservice.proto#L32-L353) +that are used between `vtctldclient` and `vtctld` – this offers clean separation of commands and makes it easier to +develop new features without impacting other commands. This also presents an [API that other clients (both Vitess and +3rd party) can use to interface with Vitess](https://vitess.io/blog/2023-04-17-vtctldserver-api/). +- Use of modern frameworks: [`pFlag`](https://github.com/spf13/pflag#readme), [`Cobra`](https://cobra.dev), and [`Viper`](https://github.com/spf13/viper#readme). +This makes development easier while also offering a better UX. For example, this offers a way to use +[configuration files](https://vitess.io/docs/18.0/reference/viper/config-files/) with support for +[dynamic configuration](https://vitess.io/docs/18.0/reference/viper/dynamic-values/) ([see also](https://github.com/vitessio/vitess/blob/release-18.0/doc/viper/viper.md)). +- The [reference documentation](https://vitess.io/docs/18.0/reference/programs/vtctldclient/) is now built through code. This +removes a burden from developers while helping users by ensuring the docs are always correct and up-to-date. + +In Vitess 18 we have completed migrating all client commands to `vtctldclient` – the last ones being the [OnlineDDL](https://github.com/vitessio/vitess/issues/13712) +and [VReplication](https://github.com/vitessio/vitess/issues/12152) commands. With this work now completed, the +legacy `vtctl`/`vtctlclient` binaries are now fully deprecated and we plan to remove them in Vitess 19. You should +[begin your transition](https://vitess.io/docs/18.0/reference/vtctldclient-transition/) before upgrading to Vitess 18. + #### Deprecated Command Line Flags Throttler related `vttablet` flags: -- `--throttle_threshold` is deprecated and will be removed in `v19.0` -- `--throttle_metrics_query` is deprecated and will be removed in `v19.0` -- `--throttle_metrics_threshold` is deprecated and will be removed in `v19.0` -- `--throttle_check_as_check_self` is deprecated and will be removed in `v19.0` -- `--throttler-config-via-topo` is deprecated after assumed `true` in `v17.0`. It will be removed in a future version. +- `--throttle_threshold` is deprecated and will be removed in `v19` +- `--throttle_metrics_query` is deprecated and will be removed in `v19` +- `--throttle_metrics_threshold` is deprecated and will be removed in `v19` +- `--throttle_check_as_check_self` is deprecated and will be removed in `v19` +- `--throttler-config-via-topo` is deprecated after assumed `true` in `v17`. It will be removed in a future version. Cache related `vttablet` flags: -- `--queryserver-config-query-cache-lfu` is deprecated and will be removed in `v19.0`. The query cache always uses a LFU implementation now. -- `--queryserver-config-query-cache-size` is deprecated and will be removed in `v19.0`. This option only applied to LRU caches, which are now unsupported. +- `--queryserver-config-query-cache-lfu` is deprecated and will be removed in `v19`. The query cache always uses a LFU implementation now. +- `--queryserver-config-query-cache-size` is deprecated and will be removed in `v19`. This option only applied to LRU caches, which are now unsupported. Buffering related `vtgate` flags: -- `--buffer_implementation` is deprecated and will be removed in `v19.0` +- `--buffer_implementation` is deprecated and will be removed in `v19` Cache related `vtgate` flags: -- `--gate_query_cache_lfu` is deprecated and will be removed in `v19.0`. The query cache always uses a LFU implementation now. -- `--gate_query_cache_size` is deprecated and will be removed in `v19.0`. This option only applied to LRU caches, which are now unsupported. +- `--gate_query_cache_lfu` is deprecated and will be removed in `v19`. The query cache always uses a LFU implementation now. +- `--gate_query_cache_size` is deprecated and will be removed in `v19`. This option only applied to LRU caches, which are now unsupported. VTGate flags: -- `--schema_change_signal_user` is deprecated and will be removed in `v19.0` -- `--foreign_key_mode` is deprecated and will be removed in `v19.0`. For more detail read the [foreign keys](#foreign-keys) section. +- `--schema_change_signal_user` is deprecated and will be removed in `v19` +- `--foreign_key_mode` is deprecated and will be removed in `v19`. For more detail read the [foreign keys](#foreign-keys) section. VDiff v1: -[VDiff v2 was added in Vitess 15.0](https://vitess.io/blog/2022-11-22-vdiff-v2/) and marked as GA in 16.0. -The [legacy v1 client command](https://vitess.io/docs/18.0/reference/vreplication/vdiffv1/) is now deprecated in Vitess 18.0 and will be **removed** in 19.0. +[VDiff v2 was added in Vitess 15](https://vitess.io/blog/2022-11-22-vdiff-v2/) and marked as GA in 16. +The [legacy v1 client command](https://vitess.io/docs/18.0/reference/vreplication/vdiffv1/) is now deprecated in Vitess 18 and will be **removed** in Vitess 19. Please switch all of your usage to the [new VDiff client](https://vitess.io/docs/18.0/reference/vreplication/vdiff/) command ASAP. #### Deprecated Stats -The following `EmergencyReparentShard` stats are deprecated in `v18.0` and will be removed in `v19.0`: +The following `EmergencyReparentShard` stats are deprecated in `v18` and will be removed in `v19`: - `ers_counter` - `ers_success_counter` - `ers_failure_counter` -These metrics are replaced by [new reparenting stats introduced in `v18.0`](#vtctld-and-vtorc-reparenting-stats). +These metrics are replaced by [new reparenting stats introduced in `v18`](#vtctld-and-vtorc-reparenting-stats). VTBackup stat `DurationByPhase` is deprecated. Use the binary-valued `Phase` stat instead. @@ -192,16 +216,15 @@ Flags in `vtorc`: #### Deleted `v3` planner -The `Gen4` planner has been the default planner since Vitess 14. The `v3` planner was deprecated in Vitess 15 and has now been removed in this release. +The `Gen4` planner has been the default planner since Vitess 14. The `v3` planner was deprecated in Vitess 15 and has been removed in Vitess 18. #### Deleted `k8stopo` -The `k8stopo` has been deprecated in Vitess 17, also see https://github.com/vitessio/vitess/issues/13298. With Vitess 18 -the `k8stopo` has been removed. +`k8stopo` was deprecated in Vitess 17, see https://github.com/vitessio/vitess/issues/13298. It has now been removed. #### Deleted `vtgr` -The `vtgr` has been deprecated in Vitess 17, also see https://github.com/vitessio/vitess/issues/13300. With Vitess 18 `vtgr` has been removed. +`vtgr` was deprecated in Vitess 17, see https://github.com/vitessio/vitess/issues/13300. It has now been removed. #### Deleted `query_analyzer` @@ -215,14 +238,14 @@ The VTGate stat `VindexUnknownParameters` gauges unknown Vindex parameters found #### VTBackup `Phase` stat -In v17, the `vtbackup` stat `DurationByPhase` stat was added measuring the time spent by `vtbackup` in each phase. This stat turned out to be awkward to use in production, and has been replaced in v18 by a binary-valued `Phase` stat. +In v17, the `vtbackup` stat `DurationByPhase` stat was added to measure the time spent by `vtbackup` in each phase. This stat turned out to be awkward to use in production, and has been replaced in v18 by a binary-valued `Phase` stat. `Phase` reports a 1 (active) or a 0 (inactive) for each of the following phases: -* `CatchupReplication` -* `InitialBackup` -* `RestoreLastBackup` -* `TakeNewBackup` + * `CatchupReplication` + * `InitialBackup` + * `RestoreLastBackup` + * `TakeNewBackup` To calculate how long `vtbackup` has spent in a given phase, sum the 1-valued data points over time and multiply by the data collection or reporting interval. For example, in Prometheus: @@ -233,7 +256,7 @@ sum_over_time(vtbackup_phase{phase="TakeNewBackup"}) * `PhaseStatus` reports a 1 (active) or a 0 (inactive) for each of the following phases and statuses: -* `CatchupReplication` phase has statuses `Stalled` and `Stopped`. + * `CatchupReplication` phase has statuses `Stalled` and `Stopped`. * `Stalled` is set to `1` when replication stops advancing. * `Stopped` is set to `1` when replication stops before `vtbackup` catches up with the primary. @@ -250,7 +273,7 @@ vtbackup_restore_count{component="BackupStorage",implementation="S3",operation=" #### VTCtld and VTOrc reparenting stats -New VTCtld and VTorc stats were added to measure frequency of reparents by keyspace/shard: +New VTCtld and VTOrc stats were added to measure frequency of reparents by keyspace/shard: - `emergency_reparent_counts` - Number of times `EmergencyReparentShard` has been run. It is further subdivided by the keyspace, shard and the result of the operation. - `planned_reparent_counts` - Number of times `PlannedReparentShard` has been run. It is further subdivided by the keyspace, shard and the result of the operation. @@ -275,7 +298,7 @@ tablet will not actually throttle any transactions; however, it will increase th (`vttablet_transaction_throttler_throttled`). This allows users to deploy the transaction throttler in production and gain observability on how much throttling would take place, without actually throttling any requests. -### Docker +### Docker Builds #### Bookworm added and made default @@ -284,19 +307,20 @@ Bullseye images will still be built and available as long as the OS build is cur #### Buster removed -Buster LTS supports will stop in June 2024, and Vitess v18.0 will be supported through October 2024. +Buster LTS supports will stop in June 2024, and Vitess 18 will be supported through October 2024. To prevent supporting a deprecated buster build for several months after June 2024, we are preemptively -removing Vitess support. +removing Vitess support for Buster. ### Durability Policies #### New Durability Policies -2 new inbuilt durability policies have been added to Vitess in this release namely `semi_sync_with_rdonly_ack` and `cross_cell_with_rdonly_ack`. These policies are exactly like `semi_sync` and `cross_cell` respectively, and differ just in the part where the rdonly tablets can also send semi-sync ACKs. - +Two new built-in durability policies have been added in Vitess 18: `semi_sync_with_rdonly_ack` and `cross_cell_with_rdonly_ack`. +These policies are similar to `semi_sync` and `cross_cell` respectively, the only difference is that `rdonly` tablets can also send semi-sync ACKs. ------------ The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/18.0/18.0.0/changelog.md). -The release includes 361 merged Pull Requests. +The release includes 420 merged Pull Requests. + +Thanks to all our contributors: @GuptaManan100, @Juneezee, @L3o-pold, @adsr, @ajm188, @app/dependabot, @app/github-actions, @app/vitess-bot, @arvind-murty, @austenLacy, @brendar, @davidpiegza, @dbussink, @deepthi, @derekperkins, @ejortegau, @frouioui, @harshit-gangal, @hkdsun, @jfg956, @jspawar, @mattlord, @maxenglander, @mdlayher, @notfelineit, @olyazavr, @pbibra, @peterlyoo, @rafer, @rohit-nayak-ps, @shlomi-noach, @systay, @timvaillancourt, @vmg, @yields -Thanks to all our contributors: @GuptaManan100, @Juneezee, @adsr, @ajm188, @app/dependabot, @app/github-actions, @app/vitess-bot, @arvind-murty, @austenLacy, @brendar, @davidpiegza, @dbussink, @deepthi, @derekperkins, @ejortegau, @frouioui, @harshit-gangal, @hkdsun, @jfg956, @jspawar, @mattlord, @maxenglander, @mdlayher, @notfelineit, @olyazavr, @pbibra, @peterlyoo, @rafer, @rohit-nayak-ps, @shlomi-noach, @systay, @timvaillancourt, @vmg, @yields diff --git a/changelog/18.0/18.0.0/summary.md b/changelog/18.0/18.0.0/summary.md index 5224c0ae801..eb2b6692201 100644 --- a/changelog/18.0/18.0.0/summary.md +++ b/changelog/18.0/18.0.0/summary.md @@ -241,10 +241,10 @@ In v17, the `vtbackup` stat `DurationByPhase` stat was added to measure the time `Phase` reports a 1 (active) or a 0 (inactive) for each of the following phases: -* `CatchupReplication` -* `InitialBackup` -* `RestoreLastBackup` -* `TakeNewBackup` + * `CatchupReplication` + * `InitialBackup` + * `RestoreLastBackup` + * `TakeNewBackup` To calculate how long `vtbackup` has spent in a given phase, sum the 1-valued data points over time and multiply by the data collection or reporting interval. For example, in Prometheus: @@ -255,9 +255,9 @@ sum_over_time(vtbackup_phase{phase="TakeNewBackup"}) * `PhaseStatus` reports a 1 (active) or a 0 (inactive) for each of the following phases and statuses: -* `CatchupReplication` phase has statuses `Stalled` and `Stopped`. - * `Stalled` is set to `1` when replication stops advancing. - * `Stopped` is set to `1` when replication stops before `vtbackup` catches up with the primary. + * `CatchupReplication` phase has statuses `Stalled` and `Stopped`. + * `Stalled` is set to `1` when replication stops advancing. + * `Stopped` is set to `1` when replication stops before `vtbackup` catches up with the primary. #### Backup and restore metrics for AWS S3 From a7f0eadaacfef91c6bad51615571eb490017d677 Mon Sep 17 00:00:00 2001 From: William Martin Date: Mon, 6 Nov 2023 15:35:20 +0100 Subject: [PATCH 10/39] Ensure hexval and int don't share BindVar after Normalization (#14451) Signed-off-by: William Martin --- go/vt/sqlparser/normalizer.go | 29 ++++++++--------------------- go/vt/sqlparser/normalizer_test.go | 8 ++++++++ 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/go/vt/sqlparser/normalizer.go b/go/vt/sqlparser/normalizer.go index f448f8bfe30..3cc5fc4cb60 100644 --- a/go/vt/sqlparser/normalizer.go +++ b/go/vt/sqlparser/normalizer.go @@ -46,7 +46,7 @@ func Normalize(stmt Statement, reserved *ReservedVars, bindVars map[string]*quer type normalizer struct { bindVars map[string]*querypb.BindVariable reserved *ReservedVars - vals map[string]string + vals map[Literal]string err error inDerived bool } @@ -55,7 +55,7 @@ func newNormalizer(reserved *ReservedVars, bindVars map[string]*querypb.BindVari return &normalizer{ bindVars: bindVars, reserved: reserved, - vals: make(map[string]string), + vals: make(map[Literal]string), } } @@ -198,12 +198,11 @@ func (nz *normalizer) convertLiteralDedup(node *Literal, cursor *Cursor) { } // Check if there's a bindvar for that value already. - key := keyFor(bval, node) - bvname, ok := nz.vals[key] + bvname, ok := nz.vals[*node] if !ok { // If there's no such bindvar, make a new one. bvname = nz.reserved.nextUnusedVar() - nz.vals[key] = bvname + nz.vals[*node] = bvname nz.bindVars[bvname] = bval } @@ -211,17 +210,6 @@ func (nz *normalizer) convertLiteralDedup(node *Literal, cursor *Cursor) { cursor.Replace(NewTypedArgument(bvname, node.SQLType())) } -func keyFor(bval *querypb.BindVariable, lit *Literal) string { - if bval.Type != sqltypes.VarBinary && bval.Type != sqltypes.VarChar { - return lit.Val - } - - // Prefixing strings with "'" ensures that a string - // and number that have the same representation don't - // collide. - return "'" + lit.Val -} - // convertLiteral converts an Literal without the dedup. func (nz *normalizer) convertLiteral(node *Literal, cursor *Cursor) { err := validateLiteral(node) @@ -279,15 +267,14 @@ func (nz *normalizer) parameterize(left, right Expr) Expr { if bval == nil { return nil } - key := keyFor(bval, lit) - bvname := nz.decideBindVarName(key, lit, col, bval) + bvname := nz.decideBindVarName(lit, col, bval) return NewTypedArgument(bvname, lit.SQLType()) } -func (nz *normalizer) decideBindVarName(key string, lit *Literal, col *ColName, bval *querypb.BindVariable) string { +func (nz *normalizer) decideBindVarName(lit *Literal, col *ColName, bval *querypb.BindVariable) string { if len(lit.Val) <= 256 { // first we check if we already have a bindvar for this value. if we do, we re-use that bindvar name - bvname, ok := nz.vals[key] + bvname, ok := nz.vals[*lit] if ok { return bvname } @@ -297,7 +284,7 @@ func (nz *normalizer) decideBindVarName(key string, lit *Literal, col *ColName, // Big values are most likely not for vindexes. // We save a lot of CPU because we avoid building bvname := nz.reserved.ReserveColName(col) - nz.vals[key] = bvname + nz.vals[*lit] = bvname nz.bindVars[bvname] = bval return bvname diff --git a/go/vt/sqlparser/normalizer_test.go b/go/vt/sqlparser/normalizer_test.go index f4f5f89d99d..7c8c5e7a963 100644 --- a/go/vt/sqlparser/normalizer_test.go +++ b/go/vt/sqlparser/normalizer_test.go @@ -371,6 +371,14 @@ func TestNormalize(t *testing.T) { in: `select * from (select 12) as t`, outstmt: `select * from (select 12 from dual) as t`, outbv: map[string]*querypb.BindVariable{}, + }, { + // HexVal and Int should not share a bindvar just because they have the same value + in: `select * from t where v1 = x'31' and v2 = 31`, + outstmt: `select * from t where v1 = :v1 /* HEXVAL */ and v2 = :v2 /* INT64 */`, + outbv: map[string]*querypb.BindVariable{ + "v1": sqltypes.HexValBindVariable([]byte("x'31'")), + "v2": sqltypes.Int64BindVariable(31), + }, }} for _, tc := range testcases { t.Run(tc.in, func(t *testing.T) { From a7a44c6108918f99c0c25b1c7d250452bb01cc44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicent=20Mart=C3=AD?= <42793+vmg@users.noreply.github.com> Date: Mon, 6 Nov 2023 17:28:20 +0100 Subject: [PATCH 11/39] evalengine: fix numeric coercibility (#14473) Signed-off-by: Vicent Marti Signed-off-by: Andres Taylor Co-authored-by: Andres Taylor --- go/sqltypes/type.go | 2 +- .../vtgate/queries/random/random_test.go | 1 + go/vt/vtgate/engine/opcode/constants.go | 6 + go/vt/vtgate/evalengine/api_literal.go | 2 +- go/vt/vtgate/evalengine/collation.go | 115 +++++++++++++++++- go/vt/vtgate/evalengine/compiler_asm.go | 4 +- go/vt/vtgate/evalengine/compiler_test.go | 13 ++ go/vt/vtgate/evalengine/eval.go | 20 +-- go/vt/vtgate/evalengine/eval_temporal.go | 10 +- go/vt/vtgate/evalengine/expr_bvar.go | 8 +- go/vt/vtgate/evalengine/expr_collate.go | 91 -------------- go/vt/vtgate/evalengine/expr_column.go | 2 +- go/vt/vtgate/evalengine/fn_base64.go | 6 +- go/vt/vtgate/evalengine/fn_crypto.go | 12 +- go/vt/vtgate/evalengine/fn_hex.go | 6 +- go/vt/vtgate/evalengine/fn_misc.go | 19 +-- go/vt/vtgate/evalengine/fn_numeric.go | 4 +- go/vt/vtgate/evalengine/fn_string.go | 14 +-- go/vt/vtgate/evalengine/fn_time.go | 20 +-- go/vt/vtgate/evalengine/translate.go | 2 +- .../planbuilder/operators/dml_planning.go | 9 +- go/vt/vtgate/planbuilder/operators/insert.go | 18 ++- .../planbuilder/operators/projection.go | 5 +- .../planbuilder/operators/route_planning.go | 3 +- go/vt/vtgate/planbuilder/operators/update.go | 2 +- .../planbuilder/testdata/tpch_cases.json | 8 +- go/vt/vtgate/semantics/dependencies.go | 1 + go/vt/vtgate/semantics/typer.go | 7 +- 28 files changed, 229 insertions(+), 181 deletions(-) diff --git a/go/sqltypes/type.go b/go/sqltypes/type.go index eeaa4e9ddf6..9157db685e9 100644 --- a/go/sqltypes/type.go +++ b/go/sqltypes/type.go @@ -136,7 +136,7 @@ func IsNull(t querypb.Type) bool { // switch statements for those who want to cover types // by their category. const ( - Unknown = -1 + Unknown = querypb.Type(-1) Null = querypb.Type_NULL_TYPE Int8 = querypb.Type_INT8 Uint8 = querypb.Type_UINT8 diff --git a/go/test/endtoend/vtgate/queries/random/random_test.go b/go/test/endtoend/vtgate/queries/random/random_test.go index 31b48b4ee52..aea43c2f929 100644 --- a/go/test/endtoend/vtgate/queries/random/random_test.go +++ b/go/test/endtoend/vtgate/queries/random/random_test.go @@ -339,4 +339,5 @@ func TestBuggyQueries(t *testing.T) { mcmp.Exec("select count(tbl1.dname) as caggr1 from dept as tbl0 left join dept as tbl1 on tbl1.dname > tbl1.loc where tbl1.loc <=> tbl1.dname group by tbl1.dname order by tbl1.dname asc") mcmp.Exec("select count(*) from (select count(*) from dept as tbl0) as tbl0") mcmp.Exec("select count(*), count(*) from (select count(*) from dept as tbl0) as tbl0, dept as tbl1") + mcmp.Exec(`select distinct case max(tbl0.ename) when min(tbl0.job) then 'sole' else count(case when false then -27 when 'gazelle' then tbl0.deptno end) end as caggr0 from emp as tbl0`) } diff --git a/go/vt/vtgate/engine/opcode/constants.go b/go/vt/vtgate/engine/opcode/constants.go index 07a39020f8b..dd73a78974d 100644 --- a/go/vt/vtgate/engine/opcode/constants.go +++ b/go/vt/vtgate/engine/opcode/constants.go @@ -139,6 +139,9 @@ func (code AggregateOpcode) Type(typ querypb.Type) querypb.Type { case AggregateUnassigned: return sqltypes.Null case AggregateGroupConcat: + if typ == sqltypes.Unknown { + return sqltypes.Unknown + } if sqltypes.IsBinary(typ) { return sqltypes.Blob } @@ -146,6 +149,9 @@ func (code AggregateOpcode) Type(typ querypb.Type) querypb.Type { case AggregateMax, AggregateMin, AggregateAnyValue: return typ case AggregateSumDistinct, AggregateSum: + if typ == sqltypes.Unknown { + return sqltypes.Unknown + } if sqltypes.IsIntegral(typ) || sqltypes.IsDecimal(typ) { return sqltypes.Decimal } diff --git a/go/vt/vtgate/evalengine/api_literal.go b/go/vt/vtgate/evalengine/api_literal.go index 5711c325fc6..f12988233e8 100644 --- a/go/vt/vtgate/evalengine/api_literal.go +++ b/go/vt/vtgate/evalengine/api_literal.go @@ -223,7 +223,7 @@ func NewColumn(offset int, typ Type, original sqlparser.Expr) *Column { return &Column{ Offset: offset, Type: typ.Type, - Collation: defaultCoercionCollation(typ.Coll), + Collation: typedCoercionCollation(typ.Type, typ.Coll), Original: original, dynamicTypeOffset: -1, } diff --git a/go/vt/vtgate/evalengine/collation.go b/go/vt/vtgate/evalengine/collation.go index 9d53a9d8ea9..7cb341f52b0 100644 --- a/go/vt/vtgate/evalengine/collation.go +++ b/go/vt/vtgate/evalengine/collation.go @@ -16,12 +16,115 @@ limitations under the License. package evalengine -import "vitess.io/vitess/go/mysql/collations" +import ( + "vitess.io/vitess/go/mysql/collations" + "vitess.io/vitess/go/mysql/collations/colldata" + "vitess.io/vitess/go/sqltypes" +) -func defaultCoercionCollation(id collations.ID) collations.TypedCollation { - return collations.TypedCollation{ - Collation: id, - Coercibility: collations.CoerceCoercible, - Repertoire: collations.RepertoireUnicode, +func typedCoercionCollation(typ sqltypes.Type, id collations.ID) collations.TypedCollation { + switch { + case sqltypes.IsNull(typ): + return collationNull + case sqltypes.IsNumber(typ) || sqltypes.IsDateOrTime(typ): + return collationNumeric + case typ == sqltypes.TypeJSON: + return collationJSON + default: + return collations.TypedCollation{ + Collation: id, + Coercibility: collations.CoerceCoercible, + Repertoire: collations.RepertoireUnicode, + } } } + +func evalCollation(e eval) collations.TypedCollation { + switch e := e.(type) { + case nil: + return collationNull + case evalNumeric, *evalTemporal: + return collationNumeric + case *evalJSON: + return collationJSON + case *evalBytes: + return e.col + default: + return collationBinary + } +} + +func mergeCollations(c1, c2 collations.TypedCollation, t1, t2 sqltypes.Type) (collations.TypedCollation, colldata.Coercion, colldata.Coercion, error) { + if c1.Collation == c2.Collation { + return c1, nil, nil, nil + } + + lt := sqltypes.IsText(t1) || sqltypes.IsBinary(t1) + rt := sqltypes.IsText(t2) || sqltypes.IsBinary(t2) + if !lt || !rt { + if lt { + return c1, nil, nil, nil + } + if rt { + return c2, nil, nil, nil + } + return collationBinary, nil, nil, nil + } + + env := collations.Local() + return colldata.Merge(env, c1, c2, colldata.CoercionOptions{ + ConvertToSuperset: true, + ConvertWithCoercion: true, + }) +} + +func mergeAndCoerceCollations(left, right eval) (eval, eval, collations.TypedCollation, error) { + lt := left.SQLType() + rt := right.SQLType() + + mc, coerceLeft, coerceRight, err := mergeCollations(evalCollation(left), evalCollation(right), lt, rt) + if err != nil { + return nil, nil, collations.TypedCollation{}, err + } + if coerceLeft == nil && coerceRight == nil { + return left, right, mc, nil + } + + left1 := newEvalRaw(lt, left.(*evalBytes).bytes, mc) + right1 := newEvalRaw(rt, right.(*evalBytes).bytes, mc) + + if coerceLeft != nil { + left1.bytes, err = coerceLeft(nil, left1.bytes) + if err != nil { + return nil, nil, collations.TypedCollation{}, err + } + } + if coerceRight != nil { + right1.bytes, err = coerceRight(nil, right1.bytes) + if err != nil { + return nil, nil, collations.TypedCollation{}, err + } + } + return left1, right1, mc, nil +} + +type collationAggregation struct { + cur collations.TypedCollation +} + +func (ca *collationAggregation) add(env *collations.Environment, tc collations.TypedCollation) error { + if ca.cur.Collation == collations.Unknown { + ca.cur = tc + } else { + var err error + ca.cur, _, _, err = colldata.Merge(env, ca.cur, tc, colldata.CoercionOptions{ConvertToSuperset: true, ConvertWithCoercion: true}) + if err != nil { + return err + } + } + return nil +} + +func (ca *collationAggregation) result() collations.TypedCollation { + return ca.cur +} diff --git a/go/vt/vtgate/evalengine/compiler_asm.go b/go/vt/vtgate/evalengine/compiler_asm.go index 58ea99fcbef..6230627c26a 100644 --- a/go/vt/vtgate/evalengine/compiler_asm.go +++ b/go/vt/vtgate/evalengine/compiler_asm.go @@ -4165,13 +4165,13 @@ func (asm *assembler) Fn_DATEADD_D(unit datetime.IntervalType, sub bool) { } tmp := env.vm.stack[env.vm.sp-2].(*evalTemporal) - env.vm.stack[env.vm.sp-2] = tmp.addInterval(interval, collations.TypedCollation{}, env.now) + env.vm.stack[env.vm.sp-2] = tmp.addInterval(interval, collations.Unknown, env.now) env.vm.sp-- return 1 }, "FN DATEADD TEMPORAL(SP-2), INTERVAL(SP-1)") } -func (asm *assembler) Fn_DATEADD_s(unit datetime.IntervalType, sub bool, col collations.TypedCollation) { +func (asm *assembler) Fn_DATEADD_s(unit datetime.IntervalType, sub bool, col collations.ID) { asm.adjustStack(-1) asm.emit(func(env *ExpressionEnv) int { var interval *datetime.Interval diff --git a/go/vt/vtgate/evalengine/compiler_test.go b/go/vt/vtgate/evalengine/compiler_test.go index 9111d1f7090..4fba65aeb75 100644 --- a/go/vt/vtgate/evalengine/compiler_test.go +++ b/go/vt/vtgate/evalengine/compiler_test.go @@ -164,6 +164,7 @@ func TestCompilerSingle(t *testing.T) { expression string values []sqltypes.Value result string + collation collations.ID }{ { expression: "1 + column0", @@ -489,6 +490,12 @@ func TestCompilerSingle(t *testing.T) { expression: `'2020-01-01' + interval month(date_sub(FROM_UNIXTIME(1234), interval 1 month))-1 month`, result: `CHAR("2020-12-01")`, }, + { + expression: `case column0 when 1 then column1 else column2 end`, + values: []sqltypes.Value{sqltypes.NewInt64(42), sqltypes.NewVarChar("sole"), sqltypes.NewInt64(0)}, + result: `VARCHAR("0")`, + collation: collations.CollationUtf8mb4ID, + }, } tz, _ := time.LoadLocation("Europe/Madrid") @@ -524,6 +531,9 @@ func TestCompilerSingle(t *testing.T) { if expected.String() != tc.result { t.Fatalf("bad evaluation from eval engine: got %s, want %s", expected.String(), tc.result) } + if tc.collation != collations.Unknown && tc.collation != expected.Collation() { + t.Fatalf("bad collation evaluation from eval engine: got %d, want %d", expected.Collation(), tc.collation) + } // re-run the same evaluation multiple times to ensure results are always consistent for i := 0; i < 8; i++ { @@ -535,6 +545,9 @@ func TestCompilerSingle(t *testing.T) { if res.String() != tc.result { t.Errorf("bad evaluation from compiler: got %s, want %s (iteration %d)", res, tc.result, i) } + if tc.collation != collations.Unknown && tc.collation != res.Collation() { + t.Fatalf("bad collation evaluation from compiler: got %d, want %d", res.Collation(), tc.collation) + } } }) } diff --git a/go/vt/vtgate/evalengine/eval.go b/go/vt/vtgate/evalengine/eval.go index ee09f96cded..e327b9d5651 100644 --- a/go/vt/vtgate/evalengine/eval.go +++ b/go/vt/vtgate/evalengine/eval.go @@ -238,7 +238,7 @@ func valueToEvalCast(v sqltypes.Value, typ sqltypes.Type, collation collations.I fval, _ := fastparse.ParseFloat64(v.RawStr()) return newEvalFloat(fval), nil default: - e, err := valueToEval(v, defaultCoercionCollation(collation)) + e, err := valueToEval(v, typedCoercionCollation(v.Type(), collation)) if err != nil { return nil, err } @@ -265,7 +265,7 @@ func valueToEvalCast(v sqltypes.Value, typ sqltypes.Type, collation collations.I fval, _ := fastparse.ParseFloat64(v.RawStr()) dec = decimal.NewFromFloat(fval) default: - e, err := valueToEval(v, defaultCoercionCollation(collation)) + e, err := valueToEval(v, typedCoercionCollation(v.Type(), collation)) if err != nil { return nil, err } @@ -285,7 +285,7 @@ func valueToEvalCast(v sqltypes.Value, typ sqltypes.Type, collation collations.I i, err := fastparse.ParseInt64(v.RawStr(), 10) return newEvalInt64(i), err default: - e, err := valueToEval(v, defaultCoercionCollation(collation)) + e, err := valueToEval(v, typedCoercionCollation(v.Type(), collation)) if err != nil { return nil, err } @@ -304,7 +304,7 @@ func valueToEvalCast(v sqltypes.Value, typ sqltypes.Type, collation collations.I u, err := fastparse.ParseUint64(v.RawStr(), 10) return newEvalUint64(u), err default: - e, err := valueToEval(v, defaultCoercionCollation(collation)) + e, err := valueToEval(v, typedCoercionCollation(v.Type(), collation)) if err != nil { return nil, err } @@ -315,15 +315,15 @@ func valueToEvalCast(v sqltypes.Value, typ sqltypes.Type, collation collations.I case sqltypes.IsText(typ) || sqltypes.IsBinary(typ): switch { case v.IsText() || v.IsBinary(): - return newEvalRaw(v.Type(), v.Raw(), defaultCoercionCollation(collation)), nil + return newEvalRaw(v.Type(), v.Raw(), typedCoercionCollation(v.Type(), collation)), nil case sqltypes.IsText(typ): - e, err := valueToEval(v, defaultCoercionCollation(collation)) + e, err := valueToEval(v, typedCoercionCollation(v.Type(), collation)) if err != nil { return nil, err } return evalToVarchar(e, collation, true) default: - e, err := valueToEval(v, defaultCoercionCollation(collation)) + e, err := valueToEval(v, typedCoercionCollation(v.Type(), collation)) if err != nil { return nil, err } @@ -333,7 +333,7 @@ func valueToEvalCast(v sqltypes.Value, typ sqltypes.Type, collation collations.I case typ == sqltypes.TypeJSON: return json.NewFromSQL(v) case typ == sqltypes.Date: - e, err := valueToEval(v, defaultCoercionCollation(collation)) + e, err := valueToEval(v, typedCoercionCollation(v.Type(), collation)) if err != nil { return nil, err } @@ -344,7 +344,7 @@ func valueToEvalCast(v sqltypes.Value, typ sqltypes.Type, collation collations.I } return d, nil case typ == sqltypes.Datetime || typ == sqltypes.Timestamp: - e, err := valueToEval(v, defaultCoercionCollation(collation)) + e, err := valueToEval(v, typedCoercionCollation(v.Type(), collation)) if err != nil { return nil, err } @@ -355,7 +355,7 @@ func valueToEvalCast(v sqltypes.Value, typ sqltypes.Type, collation collations.I } return dt, nil case typ == sqltypes.Time: - e, err := valueToEval(v, defaultCoercionCollation(collation)) + e, err := valueToEval(v, typedCoercionCollation(v.Type(), collation)) if err != nil { return nil, err } diff --git a/go/vt/vtgate/evalengine/eval_temporal.go b/go/vt/vtgate/evalengine/eval_temporal.go index 34d1f17d7f8..d44839a6853 100644 --- a/go/vt/vtgate/evalengine/eval_temporal.go +++ b/go/vt/vtgate/evalengine/eval_temporal.go @@ -140,7 +140,7 @@ func (e *evalTemporal) isZero() bool { return e.dt.IsZero() } -func (e *evalTemporal) addInterval(interval *datetime.Interval, strcoll collations.TypedCollation, now time.Time) eval { +func (e *evalTemporal) addInterval(interval *datetime.Interval, coll collations.ID, now time.Time) eval { var tmp *evalTemporal var ok bool @@ -150,16 +150,16 @@ func (e *evalTemporal) addInterval(interval *datetime.Interval, strcoll collatio tmp.dt.Date, ok = e.dt.Date.AddInterval(interval) case tt == sqltypes.Time && !interval.Unit().HasDateParts(): tmp = &evalTemporal{t: e.t} - tmp.dt.Time, tmp.prec, ok = e.dt.Time.AddInterval(interval, strcoll.Valid()) + tmp.dt.Time, tmp.prec, ok = e.dt.Time.AddInterval(interval, coll != collations.Unknown) case tt == sqltypes.Datetime || tt == sqltypes.Timestamp || (tt == sqltypes.Date && interval.Unit().HasTimeParts()) || (tt == sqltypes.Time && interval.Unit().HasDateParts()): tmp = e.toDateTime(int(e.prec), now) - tmp.dt, tmp.prec, ok = e.dt.AddInterval(interval, strcoll.Valid()) + tmp.dt, tmp.prec, ok = e.dt.AddInterval(interval, coll != collations.Unknown) } if !ok { return nil } - if strcoll.Valid() { - return newEvalRaw(sqltypes.Char, tmp.ToRawBytes(), strcoll) + if coll != collations.Unknown { + return newEvalRaw(sqltypes.Char, tmp.ToRawBytes(), typedCoercionCollation(sqltypes.Char, coll)) } return tmp } diff --git a/go/vt/vtgate/evalengine/expr_bvar.go b/go/vt/vtgate/evalengine/expr_bvar.go index 4b08ee7683c..6bc49caf660 100644 --- a/go/vt/vtgate/evalengine/expr_bvar.go +++ b/go/vt/vtgate/evalengine/expr_bvar.go @@ -70,7 +70,7 @@ func (bv *BindVariable) eval(env *ExpressionEnv) (eval, error) { tuple := make([]eval, 0, len(bvar.Values)) for _, value := range bvar.Values { - e, err := valueToEval(sqltypes.MakeTrusted(value.Type, value.Value), defaultCoercionCollation(collations.CollationForType(value.Type, bv.Collation))) + e, err := valueToEval(sqltypes.MakeTrusted(value.Type, value.Value), typedCoercionCollation(value.Type, collations.CollationForType(value.Type, bv.Collation))) if err != nil { return nil, err } @@ -86,7 +86,7 @@ func (bv *BindVariable) eval(env *ExpressionEnv) (eval, error) { if bv.typed() { typ = bv.Type } - return valueToEval(sqltypes.MakeTrusted(typ, bvar.Value), defaultCoercionCollation(collations.CollationForType(typ, bv.Collation))) + return valueToEval(sqltypes.MakeTrusted(typ, bvar.Value), typedCoercionCollation(typ, collations.CollationForType(typ, bv.Collation))) } } @@ -110,7 +110,7 @@ func (bv *BindVariable) typeof(env *ExpressionEnv) (ctype, error) { case sqltypes.BitNum: return ctype{Type: sqltypes.VarBinary, Flag: flagBit, Col: collationNumeric}, nil default: - return ctype{Type: tt, Flag: 0, Col: defaultCoercionCollation(collations.CollationForType(tt, bv.Collation))}, nil + return ctype{Type: tt, Flag: 0, Col: typedCoercionCollation(tt, collations.CollationForType(tt, bv.Collation))}, nil } } @@ -119,7 +119,7 @@ func (bvar *BindVariable) compile(c *compiler) (ctype, error) { if bvar.typed() { typ.Type = bvar.Type - typ.Col = defaultCoercionCollation(collations.CollationForType(bvar.Type, bvar.Collation)) + typ.Col = typedCoercionCollation(bvar.Type, collations.CollationForType(bvar.Type, bvar.Collation)) } else if c.dynamicTypes != nil { typ = c.dynamicTypes[bvar.dynamicTypeOffset] } else { diff --git a/go/vt/vtgate/evalengine/expr_collate.go b/go/vt/vtgate/evalengine/expr_collate.go index 60791311e28..47e65a0dcc7 100644 --- a/go/vt/vtgate/evalengine/expr_collate.go +++ b/go/vt/vtgate/evalengine/expr_collate.go @@ -18,7 +18,6 @@ package evalengine import ( "vitess.io/vitess/go/mysql/collations" - "vitess.io/vitess/go/mysql/collations/colldata" "vitess.io/vitess/go/sqltypes" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/vterrors" @@ -127,96 +126,6 @@ func (expr *CollateExpr) compile(c *compiler) (ctype, error) { return ct, nil } -func evalCollation(e eval) collations.TypedCollation { - switch e := e.(type) { - case nil: - return collationNull - case evalNumeric, *evalTemporal: - return collationNumeric - case *evalJSON: - return collationJSON - case *evalBytes: - return e.col - default: - return collationBinary - } -} - -func mergeCollations(c1, c2 collations.TypedCollation, t1, t2 sqltypes.Type) (collations.TypedCollation, colldata.Coercion, colldata.Coercion, error) { - if c1.Collation == c2.Collation { - return c1, nil, nil, nil - } - - lt := sqltypes.IsText(t1) || sqltypes.IsBinary(t1) - rt := sqltypes.IsText(t2) || sqltypes.IsBinary(t2) - if !lt || !rt { - if lt { - return c1, nil, nil, nil - } - if rt { - return c2, nil, nil, nil - } - return collationBinary, nil, nil, nil - } - - env := collations.Local() - return colldata.Merge(env, c1, c2, colldata.CoercionOptions{ - ConvertToSuperset: true, - ConvertWithCoercion: true, - }) -} - -func mergeAndCoerceCollations(left, right eval) (eval, eval, collations.TypedCollation, error) { - lt := left.SQLType() - rt := right.SQLType() - - mc, coerceLeft, coerceRight, err := mergeCollations(evalCollation(left), evalCollation(right), lt, rt) - if err != nil { - return nil, nil, collations.TypedCollation{}, err - } - if coerceLeft == nil && coerceRight == nil { - return left, right, mc, nil - } - - left1 := newEvalRaw(lt, left.(*evalBytes).bytes, mc) - right1 := newEvalRaw(rt, right.(*evalBytes).bytes, mc) - - if coerceLeft != nil { - left1.bytes, err = coerceLeft(nil, left1.bytes) - if err != nil { - return nil, nil, collations.TypedCollation{}, err - } - } - if coerceRight != nil { - right1.bytes, err = coerceRight(nil, right1.bytes) - if err != nil { - return nil, nil, collations.TypedCollation{}, err - } - } - return left1, right1, mc, nil -} - -type collationAggregation struct { - cur collations.TypedCollation -} - -func (ca *collationAggregation) add(env *collations.Environment, tc collations.TypedCollation) error { - if ca.cur.Collation == collations.Unknown { - ca.cur = tc - } else { - var err error - ca.cur, _, _, err = colldata.Merge(env, ca.cur, tc, colldata.CoercionOptions{ConvertToSuperset: true, ConvertWithCoercion: true}) - if err != nil { - return err - } - } - return nil -} - -func (ca *collationAggregation) result() collations.TypedCollation { - return ca.cur -} - var _ IR = (*IntroducerExpr)(nil) func (expr *IntroducerExpr) eval(env *ExpressionEnv) (eval, error) { diff --git a/go/vt/vtgate/evalengine/expr_column.go b/go/vt/vtgate/evalengine/expr_column.go index 93670b5ca12..741d04c6a06 100644 --- a/go/vt/vtgate/evalengine/expr_column.go +++ b/go/vt/vtgate/evalengine/expr_column.go @@ -68,7 +68,7 @@ func (c *Column) typeof(env *ExpressionEnv) (ctype, error) { return ctype{ Type: field.Type, - Col: defaultCoercionCollation(collations.ID(field.Charset)), + Col: typedCoercionCollation(field.Type, collations.ID(field.Charset)), Flag: f, }, nil } diff --git a/go/vt/vtgate/evalengine/fn_base64.go b/go/vt/vtgate/evalengine/fn_base64.go index dfc5e037629..d404d391dd6 100644 --- a/go/vt/vtgate/evalengine/fn_base64.go +++ b/go/vt/vtgate/evalengine/fn_base64.go @@ -82,9 +82,9 @@ func (call *builtinToBase64) eval(env *ExpressionEnv) (eval, error) { encoded := mysqlBase64Encode(b.bytes) if arg.SQLType() == sqltypes.Blob || arg.SQLType() == sqltypes.TypeJSON { - return newEvalRaw(sqltypes.Text, encoded, defaultCoercionCollation(call.collate)), nil + return newEvalRaw(sqltypes.Text, encoded, typedCoercionCollation(sqltypes.Text, call.collate)), nil } - return newEvalText(encoded, defaultCoercionCollation(call.collate)), nil + return newEvalText(encoded, typedCoercionCollation(sqltypes.VarChar, call.collate)), nil } func (call *builtinToBase64) compile(c *compiler) (ctype, error) { @@ -106,7 +106,7 @@ func (call *builtinToBase64) compile(c *compiler) (ctype, error) { c.asm.Convert_xb(1, t, 0, false) } - col := defaultCoercionCollation(c.collation) + col := typedCoercionCollation(t, c.collation) c.asm.Fn_TO_BASE64(t, col) c.asm.jumpDestination(skip) diff --git a/go/vt/vtgate/evalengine/fn_crypto.go b/go/vt/vtgate/evalengine/fn_crypto.go index a10183dd12f..31783291ce7 100644 --- a/go/vt/vtgate/evalengine/fn_crypto.go +++ b/go/vt/vtgate/evalengine/fn_crypto.go @@ -48,7 +48,7 @@ func (call *builtinMD5) eval(env *ExpressionEnv) (eval, error) { sum := md5.Sum(b.bytes) buf := make([]byte, hex.EncodedLen(len(sum))) hex.Encode(buf, sum[:]) - return newEvalText(buf, defaultCoercionCollation(call.collate)), nil + return newEvalText(buf, typedCoercionCollation(sqltypes.VarChar, call.collate)), nil } func (call *builtinMD5) compile(c *compiler) (ctype, error) { @@ -65,7 +65,7 @@ func (call *builtinMD5) compile(c *compiler) (ctype, error) { c.asm.Convert_xb(1, sqltypes.Binary, 0, false) } - col := defaultCoercionCollation(c.collation) + col := typedCoercionCollation(sqltypes.VarChar, c.collation) c.asm.Fn_MD5(col) c.asm.jumpDestination(skip) return ctype{Type: sqltypes.VarChar, Col: col, Flag: str.Flag}, nil @@ -91,7 +91,7 @@ func (call *builtinSHA1) eval(env *ExpressionEnv) (eval, error) { sum := sha1.Sum(b.bytes) buf := make([]byte, hex.EncodedLen(len(sum))) hex.Encode(buf, sum[:]) - return newEvalText(buf, defaultCoercionCollation(call.collate)), nil + return newEvalText(buf, typedCoercionCollation(sqltypes.VarChar, call.collate)), nil } func (call *builtinSHA1) compile(c *compiler) (ctype, error) { @@ -107,7 +107,7 @@ func (call *builtinSHA1) compile(c *compiler) (ctype, error) { default: c.asm.Convert_xb(1, sqltypes.Binary, 0, false) } - col := defaultCoercionCollation(c.collation) + col := typedCoercionCollation(sqltypes.VarChar, c.collation) c.asm.Fn_SHA1(col) c.asm.jumpDestination(skip) return ctype{Type: sqltypes.VarChar, Col: col, Flag: str.Flag}, nil @@ -153,7 +153,7 @@ func (call *builtinSHA2) eval(env *ExpressionEnv) (eval, error) { buf := make([]byte, hex.EncodedLen(len(sum))) hex.Encode(buf, sum[:]) - return newEvalText(buf, defaultCoercionCollation(call.collate)), nil + return newEvalText(buf, typedCoercionCollation(sqltypes.VarChar, call.collate)), nil } func (call *builtinSHA2) compile(c *compiler) (ctype, error) { @@ -186,7 +186,7 @@ func (call *builtinSHA2) compile(c *compiler) (ctype, error) { c.asm.Convert_xi(1) } - col := defaultCoercionCollation(c.collation) + col := typedCoercionCollation(sqltypes.VarChar, c.collation) c.asm.Fn_SHA2(col) c.asm.jumpDestination(skip1, skip2) return ctype{Type: sqltypes.VarChar, Col: col, Flag: str.Flag | flagNullable}, nil diff --git a/go/vt/vtgate/evalengine/fn_hex.go b/go/vt/vtgate/evalengine/fn_hex.go index 0641f7dcf90..8552ab888ae 100644 --- a/go/vt/vtgate/evalengine/fn_hex.go +++ b/go/vt/vtgate/evalengine/fn_hex.go @@ -49,9 +49,9 @@ func (call *builtinHex) eval(env *ExpressionEnv) (eval, error) { encoded = hex.EncodeBytes(arg.ToRawBytes()) } if arg.SQLType() == sqltypes.Blob || arg.SQLType() == sqltypes.TypeJSON { - return newEvalRaw(sqltypes.Text, encoded, defaultCoercionCollation(call.collate)), nil + return newEvalRaw(sqltypes.Text, encoded, typedCoercionCollation(sqltypes.Text, call.collate)), nil } - return newEvalText(encoded, defaultCoercionCollation(call.collate)), nil + return newEvalText(encoded, typedCoercionCollation(sqltypes.VarChar, call.collate)), nil } func (call *builtinHex) compile(c *compiler) (ctype, error) { @@ -61,11 +61,11 @@ func (call *builtinHex) compile(c *compiler) (ctype, error) { } skip := c.compileNullCheck1(str) - col := defaultCoercionCollation(c.collation) t := sqltypes.VarChar if str.Type == sqltypes.Blob || str.Type == sqltypes.TypeJSON { t = sqltypes.Text } + col := typedCoercionCollation(t, c.collation) switch { case sqltypes.IsNumber(str.Type): diff --git a/go/vt/vtgate/evalengine/fn_misc.go b/go/vt/vtgate/evalengine/fn_misc.go index 56b49fdfd24..2f228ff55fa 100644 --- a/go/vt/vtgate/evalengine/fn_misc.go +++ b/go/vt/vtgate/evalengine/fn_misc.go @@ -141,7 +141,7 @@ func (call *builtinInetNtoa) eval(env *ExpressionEnv) (eval, error) { } b := binary.BigEndian.AppendUint32(nil, uint32(rawIp)) - return newEvalText(hack.StringBytes(netip.AddrFrom4([4]byte(b)).String()), defaultCoercionCollation(call.collate)), nil + return newEvalText(hack.StringBytes(netip.AddrFrom4([4]byte(b)).String()), typedCoercionCollation(sqltypes.VarChar, call.collate)), nil } func (call *builtinInetNtoa) compile(c *compiler) (ctype, error) { @@ -153,11 +153,11 @@ func (call *builtinInetNtoa) compile(c *compiler) (ctype, error) { skip := c.compileNullCheck1(arg) c.compileToUint64(arg, 1) - col := defaultCoercionCollation(call.collate) + col := typedCoercionCollation(sqltypes.VarChar, call.collate) c.asm.Fn_INET_NTOA(col) c.asm.jumpDestination(skip) - return ctype{Type: sqltypes.VarChar, Flag: flagNullable, Col: defaultCoercionCollation(call.collate)}, nil + return ctype{Type: sqltypes.VarChar, Flag: flagNullable, Col: col}, nil } func (call *builtinInet6Aton) eval(env *ExpressionEnv) (eval, error) { @@ -241,11 +241,12 @@ func (call *builtinInet6Ntoa) eval(env *ExpressionEnv) (eval, error) { return nil, nil } + col := typedCoercionCollation(sqltypes.VarChar, call.collate) if ip, ok := printIPv6AsIPv4(ip); ok { - return newEvalText(hack.StringBytes("::"+ip.String()), defaultCoercionCollation(call.collate)), nil + return newEvalText(hack.StringBytes("::"+ip.String()), col), nil } - return newEvalText(hack.StringBytes(ip.String()), defaultCoercionCollation(call.collate)), nil + return newEvalText(hack.StringBytes(ip.String()), col), nil } func (call *builtinInet6Ntoa) compile(c *compiler) (ctype, error) { @@ -255,16 +256,16 @@ func (call *builtinInet6Ntoa) compile(c *compiler) (ctype, error) { } skip := c.compileNullCheck1(arg) + col := typedCoercionCollation(sqltypes.VarChar, call.collate) switch arg.Type { case sqltypes.VarBinary, sqltypes.Blob, sqltypes.Binary: - col := defaultCoercionCollation(call.collate) c.asm.Fn_INET6_NTOA(col) default: c.asm.SetNull(1) } c.asm.jumpDestination(skip) - return ctype{Type: sqltypes.VarChar, Flag: flagNullable, Col: defaultCoercionCollation(call.collate)}, nil + return ctype{Type: sqltypes.VarChar, Flag: flagNullable, Col: col}, nil } func (call *builtinIsIPV4) eval(env *ExpressionEnv) (eval, error) { @@ -445,7 +446,7 @@ func (call *builtinBinToUUID) eval(env *ExpressionEnv) (eval, error) { if err != nil { return nil, errIncorrectUUID(raw, "bin_to_uuid") } - return newEvalText(hack.StringBytes(parsed.String()), defaultCoercionCollation(call.collate)), nil + return newEvalText(hack.StringBytes(parsed.String()), typedCoercionCollation(sqltypes.VarChar, call.collate)), nil } func (call *builtinBinToUUID) compile(c *compiler) (ctype, error) { @@ -461,7 +462,7 @@ func (call *builtinBinToUUID) compile(c *compiler) (ctype, error) { c.asm.Convert_xb(1, sqltypes.VarBinary, 0, false) } - col := defaultCoercionCollation(call.collate) + col := typedCoercionCollation(sqltypes.VarChar, call.collate) ct := ctype{Type: sqltypes.VarChar, Flag: arg.Flag, Col: col} if len(call.Arguments) == 1 { diff --git a/go/vt/vtgate/evalengine/fn_numeric.go b/go/vt/vtgate/evalengine/fn_numeric.go index 954aceb66c9..7bdd8d8b92e 100644 --- a/go/vt/vtgate/evalengine/fn_numeric.go +++ b/go/vt/vtgate/evalengine/fn_numeric.go @@ -1342,7 +1342,7 @@ func (call *builtinConv) eval(env *ExpressionEnv) (eval, error) { } else { out = strconv.AppendUint(out, u, int(toBase)) } - return newEvalText(upcaseASCII(out), defaultCoercionCollation(call.collate)), nil + return newEvalText(upcaseASCII(out), typedCoercionCollation(sqltypes.VarChar, call.collate)), nil } func (expr *builtinConv) compile(c *compiler) (ctype, error) { @@ -1383,7 +1383,7 @@ func (expr *builtinConv) compile(c *compiler) (ctype, error) { c.asm.Fn_CONV_bu(3, 2) } - col := defaultCoercionCollation(expr.collate) + col := typedCoercionCollation(t, expr.collate) c.asm.Fn_CONV_uc(t, col) c.asm.jumpDestination(skip) diff --git a/go/vt/vtgate/evalengine/fn_string.go b/go/vt/vtgate/evalengine/fn_string.go index 2549572605e..8d61905d237 100644 --- a/go/vt/vtgate/evalengine/fn_string.go +++ b/go/vt/vtgate/evalengine/fn_string.go @@ -587,7 +587,7 @@ func (call *builtinLeftRight) compile(c *compiler) (ctype, error) { skip := c.compileNullCheck2(str, l) - col := defaultCoercionCollation(c.collation) + col := typedCoercionCollation(sqltypes.VarChar, c.collation) switch { case str.isTextual(): col = str.Col @@ -693,7 +693,7 @@ func (call *builtinPad) compile(c *compiler) (ctype, error) { skip := c.compileNullCheck3(str, l, pad) - col := defaultCoercionCollation(c.collation) + col := typedCoercionCollation(sqltypes.VarChar, c.collation) switch { case str.isTextual(): col = str.Col @@ -880,7 +880,7 @@ func (call builtinTrim) compile(c *compiler) (ctype, error) { skip1 := c.compileNullCheck1(str) - col := defaultCoercionCollation(c.collation) + col := typedCoercionCollation(sqltypes.VarChar, c.collation) switch { case str.isTextual(): col = str.Col @@ -989,7 +989,7 @@ func (call *builtinConcat) eval(env *ExpressionEnv) (eval, error) { // If we only had numbers, we instead fall back to the default // collation instead of using the numeric collation. if tc.Coercibility == collations.CoerceNumeric { - tc = defaultCoercionCollation(call.collate) + tc = typedCoercionCollation(tt, call.collate) } var buf []byte @@ -1041,7 +1041,7 @@ func (call *builtinConcat) compile(c *compiler) (ctype, error) { // If we only had numbers, we instead fall back to the default // collation instead of using the numeric collation. if tc.Coercibility == collations.CoerceNumeric { - tc = defaultCoercionCollation(call.collate) + tc = typedCoercionCollation(tt, call.collate) } for i, arg := range args { @@ -1103,7 +1103,7 @@ func (call *builtinConcatWs) eval(env *ExpressionEnv) (eval, error) { // If we only had numbers, we instead fall back to the default // collation instead of using the numeric collation. if tc.Coercibility == collations.CoerceNumeric { - tc = defaultCoercionCollation(call.collate) + tc = typedCoercionCollation(tt, call.collate) } var sep []byte @@ -1173,7 +1173,7 @@ func (call *builtinConcatWs) compile(c *compiler) (ctype, error) { // If we only had numbers, we instead fall back to the default // collation instead of using the numeric collation. if tc.Coercibility == collations.CoerceNumeric { - tc = defaultCoercionCollation(call.collate) + tc = typedCoercionCollation(tt, call.collate) } for i, arg := range args { diff --git a/go/vt/vtgate/evalengine/fn_time.go b/go/vt/vtgate/evalengine/fn_time.go index 1796921b6f6..430b975974b 100644 --- a/go/vt/vtgate/evalengine/fn_time.go +++ b/go/vt/vtgate/evalengine/fn_time.go @@ -275,7 +275,7 @@ func (b *builtinDateFormat) eval(env *ExpressionEnv) (eval, error) { if err != nil { return nil, err } - return newEvalText(d, defaultCoercionCollation(b.collate)), nil + return newEvalText(d, typedCoercionCollation(sqltypes.VarChar, b.collate)), nil } func (call *builtinDateFormat) compile(c *compiler) (ctype, error) { @@ -305,7 +305,7 @@ func (call *builtinDateFormat) compile(c *compiler) (ctype, error) { c.asm.Convert_xb(1, sqltypes.VarBinary, 0, false) } - col := defaultCoercionCollation(c.collation) + col := typedCoercionCollation(sqltypes.VarChar, c.collation) c.asm.Fn_DATE_FORMAT(col) c.asm.jumpDestination(skip1, skip2) return ctype{Type: sqltypes.VarChar, Col: col, Flag: arg.Flag | flagNullable}, nil @@ -623,7 +623,7 @@ func (b *builtinFromUnixtime) eval(env *ExpressionEnv) (eval, error) { if err != nil { return nil, err } - return newEvalText(d, defaultCoercionCollation(b.collate)), nil + return newEvalText(d, typedCoercionCollation(sqltypes.VarChar, b.collate)), nil } func (call *builtinFromUnixtime) compile(c *compiler) (ctype, error) { @@ -676,7 +676,7 @@ func (call *builtinFromUnixtime) compile(c *compiler) (ctype, error) { c.asm.Convert_xb(1, sqltypes.VarBinary, 0, false) } - col := defaultCoercionCollation(c.collation) + col := typedCoercionCollation(sqltypes.VarChar, c.collation) c.asm.Fn_DATE_FORMAT(col) c.asm.jumpDestination(skip1, skip2) return ctype{Type: sqltypes.VarChar, Col: col, Flag: arg.Flag | flagNullable}, nil @@ -1142,7 +1142,7 @@ func (b *builtinMonthName) eval(env *ExpressionEnv) (eval, error) { return nil, nil } - return newEvalText(hack.StringBytes(time.Month(d.dt.Date.Month()).String()), defaultCoercionCollation(b.collate)), nil + return newEvalText(hack.StringBytes(time.Month(d.dt.Date.Month()).String()), typedCoercionCollation(sqltypes.VarChar, b.collate)), nil } func (call *builtinMonthName) compile(c *compiler) (ctype, error) { @@ -1158,7 +1158,7 @@ func (call *builtinMonthName) compile(c *compiler) (ctype, error) { default: c.asm.Convert_xD(1) } - col := defaultCoercionCollation(call.collate) + col := typedCoercionCollation(sqltypes.VarChar, call.collate) c.asm.Fn_MONTHNAME(col) c.asm.jumpDestination(skip) return ctype{Type: sqltypes.VarChar, Col: col, Flag: arg.Flag | flagNullable}, nil @@ -1596,11 +1596,11 @@ func (call *builtinDateMath) eval(env *ExpressionEnv) (eval, error) { } if tmp, ok := date.(*evalTemporal); ok { - return tmp.addInterval(interval, collations.TypedCollation{}, env.now), nil + return tmp.addInterval(interval, collations.Unknown, env.now), nil } if tmp := evalToTemporal(date); tmp != nil { - return tmp.addInterval(interval, defaultCoercionCollation(call.collate), env.now), nil + return tmp.addInterval(interval, call.collate, env.now), nil } return nil, nil @@ -1634,8 +1634,8 @@ func (call *builtinDateMath) compile(c *compiler) (ctype, error) { c.asm.Fn_DATEADD_D(call.unit, call.sub) default: ret.Type = sqltypes.Char - ret.Col = defaultCoercionCollation(c.collation) - c.asm.Fn_DATEADD_s(call.unit, call.sub, ret.Col) + ret.Col = typedCoercionCollation(sqltypes.Char, c.collation) + c.asm.Fn_DATEADD_s(call.unit, call.sub, ret.Col.Collation) } return ret, nil } diff --git a/go/vt/vtgate/evalengine/translate.go b/go/vt/vtgate/evalengine/translate.go index 57393a97bc0..c8f6f7d1337 100644 --- a/go/vt/vtgate/evalengine/translate.go +++ b/go/vt/vtgate/evalengine/translate.go @@ -253,7 +253,7 @@ func translateLiteral(lit *sqlparser.Literal, collation collations.ID) (*Literal case sqlparser.DecimalVal: return NewLiteralDecimalFromBytes(lit.Bytes()) case sqlparser.StrVal: - return NewLiteralString(lit.Bytes(), defaultCoercionCollation(collation)), nil + return NewLiteralString(lit.Bytes(), typedCoercionCollation(sqltypes.VarChar, collation)), nil case sqlparser.HexNum: return NewLiteralBinaryFromHexNum(lit.Bytes()) case sqlparser.HexVal: diff --git a/go/vt/vtgate/planbuilder/operators/dml_planning.go b/go/vt/vtgate/planbuilder/operators/dml_planning.go index 9618c34e21e..8f87a71c95f 100644 --- a/go/vt/vtgate/planbuilder/operators/dml_planning.go +++ b/go/vt/vtgate/planbuilder/operators/dml_planning.go @@ -19,6 +19,8 @@ package operators import ( "fmt" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/engine" @@ -56,7 +58,7 @@ func getVindexInformation(id semantics.TableSet, table *vindexes.Table) ( return primaryVindex, vindexesAndPredicates, nil } -func buildChangedVindexesValues(update *sqlparser.Update, table *vindexes.Table, ksidCols []sqlparser.IdentifierCI, assignments []SetExpr) (vv map[string]*engine.VindexValues, ownedVindexQuery string, subQueriesArgOnChangedVindex []string, err error) { +func buildChangedVindexesValues(ctx *plancontext.PlanningContext, update *sqlparser.Update, table *vindexes.Table, ksidCols []sqlparser.IdentifierCI, assignments []SetExpr) (vv map[string]*engine.VindexValues, ownedVindexQuery string, subQueriesArgOnChangedVindex []string, err error) { changedVindexes := make(map[string]*engine.VindexValues) buf, offset := initialQuery(ksidCols, table) for i, vindex := range table.ColumnVindexes { @@ -73,7 +75,10 @@ func buildChangedVindexesValues(update *sqlparser.Update, table *vindexes.Table, return nil, "", nil, vterrors.VT03015(assignment.Name.Name) } found = true - pv, err := evalengine.Translate(assignment.Expr.EvalExpr, nil) + pv, err := evalengine.Translate(assignment.Expr.EvalExpr, &evalengine.Config{ + ResolveType: ctx.SemTable.TypeForExpr, + Collation: ctx.SemTable.Collation, + }) if err != nil { return nil, "", nil, invalidUpdateExpr(assignment.Name.Name.String(), assignment.Expr.EvalExpr) } diff --git a/go/vt/vtgate/planbuilder/operators/insert.go b/go/vt/vtgate/planbuilder/operators/insert.go index 29000142e57..a48e53c18b1 100644 --- a/go/vt/vtgate/planbuilder/operators/insert.go +++ b/go/vt/vtgate/planbuilder/operators/insert.go @@ -174,7 +174,7 @@ func createInsertOperator(ctx *plancontext.PlanningContext, insStmt *sqlparser.I } // modify column list or values for autoincrement column. - autoIncGen, err := modifyForAutoinc(insStmt, vTbl) + autoIncGen, err := modifyForAutoinc(ctx, insStmt, vTbl) if err != nil { return nil, err } @@ -186,7 +186,7 @@ func createInsertOperator(ctx *plancontext.PlanningContext, insStmt *sqlparser.I insOp.ColVindexes = getColVindexes(insOp) switch rows := insStmt.Rows.(type) { case sqlparser.Values: - route.Source, err = insertRowsPlan(insOp, insStmt, rows) + route.Source, err = insertRowsPlan(ctx, insOp, insStmt, rows) if err != nil { return nil, err } @@ -277,7 +277,7 @@ func columnMismatch(gen *Generate, ins *sqlparser.Insert, sel sqlparser.SelectSt return false } -func insertRowsPlan(insOp *Insert, ins *sqlparser.Insert, rows sqlparser.Values) (*Insert, error) { +func insertRowsPlan(ctx *plancontext.PlanningContext, insOp *Insert, ins *sqlparser.Insert, rows sqlparser.Values) (*Insert, error) { for _, row := range rows { if len(ins.Columns) != len(row) { return nil, vterrors.VT03006() @@ -300,7 +300,10 @@ func insertRowsPlan(insOp *Insert, ins *sqlparser.Insert, rows sqlparser.Values) routeValues[vIdx][colIdx] = make([]evalengine.Expr, len(rows)) colNum, _ := findOrAddColumn(ins, col) for rowNum, row := range rows { - innerpv, err := evalengine.Translate(row[colNum], nil) + innerpv, err := evalengine.Translate(row[colNum], &evalengine.Config{ + ResolveType: ctx.SemTable.TypeForExpr, + Collation: ctx.SemTable.Collation, + }) if err != nil { return nil, err } @@ -401,7 +404,7 @@ func populateInsertColumnlist(ins *sqlparser.Insert, table *vindexes.Table) *sql // modifyForAutoinc modifies the AST and the plan to generate necessary autoinc values. // For row values cases, bind variable names are generated using baseName. -func modifyForAutoinc(ins *sqlparser.Insert, vTable *vindexes.Table) (*Generate, error) { +func modifyForAutoinc(ctx *plancontext.PlanningContext, ins *sqlparser.Insert, vTable *vindexes.Table) (*Generate, error) { if vTable.AutoIncrement == nil { return nil, nil } @@ -425,7 +428,10 @@ func modifyForAutoinc(ins *sqlparser.Insert, vTable *vindexes.Table) (*Generate, row[colNum] = sqlparser.NewArgument(engine.SeqVarName + strconv.Itoa(rowNum)) } var err error - gen.Values, err = evalengine.Translate(autoIncValues, nil) + gen.Values, err = evalengine.Translate(autoIncValues, &evalengine.Config{ + ResolveType: ctx.SemTable.TypeForExpr, + Collation: ctx.SemTable.Collation, + }) if err != nil { return nil, err } diff --git a/go/vt/vtgate/planbuilder/operators/projection.go b/go/vt/vtgate/planbuilder/operators/projection.go index 31be577913d..1c751467890 100644 --- a/go/vt/vtgate/planbuilder/operators/projection.go +++ b/go/vt/vtgate/planbuilder/operators/projection.go @@ -585,7 +585,10 @@ func (p *Projection) planOffsets(ctx *plancontext.PlanningContext) { } // for everything else, we'll turn to the evalengine - eexpr, err := evalengine.Translate(rewritten, nil) + eexpr, err := evalengine.Translate(rewritten, &evalengine.Config{ + ResolveType: ctx.SemTable.TypeForExpr, + Collation: ctx.SemTable.Collation, + }) if err != nil { panic(err) } diff --git a/go/vt/vtgate/planbuilder/operators/route_planning.go b/go/vt/vtgate/planbuilder/operators/route_planning.go index e55789f40da..079813388b3 100644 --- a/go/vt/vtgate/planbuilder/operators/route_planning.go +++ b/go/vt/vtgate/planbuilder/operators/route_planning.go @@ -149,6 +149,7 @@ func generateOwnedVindexQuery(tblExpr sqlparser.TableExpr, del *sqlparser.Delete } func getUpdateVindexInformation( + ctx *plancontext.PlanningContext, updStmt *sqlparser.Update, vindexTable *vindexes.Table, tableID semantics.TableSet, @@ -163,7 +164,7 @@ func getUpdateVindexInformation( return nil, nil, "", nil, err } - changedVindexValues, ownedVindexQuery, subQueriesArgOnChangedVindex, err := buildChangedVindexesValues(updStmt, vindexTable, primaryVindex.Columns, assignments) + changedVindexValues, ownedVindexQuery, subQueriesArgOnChangedVindex, err := buildChangedVindexesValues(ctx, updStmt, vindexTable, primaryVindex.Columns, assignments) if err != nil { return nil, nil, "", nil, err } diff --git a/go/vt/vtgate/planbuilder/operators/update.go b/go/vt/vtgate/planbuilder/operators/update.go index 52dae6bd9b5..743812f9dd7 100644 --- a/go/vt/vtgate/planbuilder/operators/update.go +++ b/go/vt/vtgate/planbuilder/operators/update.go @@ -149,7 +149,7 @@ func createUpdateOperator(ctx *plancontext.PlanningContext, updStmt *sqlparser.U } } - vp, cvv, ovq, subQueriesArgOnChangedVindex, err := getUpdateVindexInformation(updStmt, vindexTable, qt.ID, assignments) + vp, cvv, ovq, subQueriesArgOnChangedVindex, err := getUpdateVindexInformation(ctx, updStmt, vindexTable, qt.ID, assignments) if err != nil { return nil, err } diff --git a/go/vt/vtgate/planbuilder/testdata/tpch_cases.json b/go/vt/vtgate/planbuilder/testdata/tpch_cases.json index 1c3b76c92b1..f40ea961334 100644 --- a/go/vt/vtgate/planbuilder/testdata/tpch_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/tpch_cases.json @@ -22,7 +22,7 @@ { "OperatorType": "Sort", "Variant": "Memory", - "OrderBy": "1 DESC, (2|5) ASC", + "OrderBy": "1 DESC COLLATE utf8mb4_0900_ai_ci, (2|5) ASC", "ResultColumns": 4, "Inputs": [ { @@ -233,7 +233,7 @@ "Instructions": { "OperatorType": "Sort", "Variant": "Memory", - "OrderBy": "1 DESC", + "OrderBy": "1 DESC COLLATE utf8mb4_0900_ai_ci", "ResultColumns": 2, "Inputs": [ { @@ -758,7 +758,7 @@ { "OperatorType": "Sort", "Variant": "Memory", - "OrderBy": "2 DESC", + "OrderBy": "2 DESC COLLATE utf8mb4_0900_ai_ci", "ResultColumns": 8, "Inputs": [ { @@ -1075,7 +1075,7 @@ { "OperatorType": "Sort", "Variant": "Memory", - "OrderBy": "1 DESC", + "OrderBy": "1 DESC COLLATE utf8mb4_0900_ai_ci", "Inputs": [ { "OperatorType": "Aggregate", diff --git a/go/vt/vtgate/semantics/dependencies.go b/go/vt/vtgate/semantics/dependencies.go index d93d895c8e3..89b6da7045d 100644 --- a/go/vt/vtgate/semantics/dependencies.go +++ b/go/vt/vtgate/semantics/dependencies.go @@ -68,6 +68,7 @@ func createUncertain(direct TableSet, recursive TableSet) *uncertain { dependency: dependency{ direct: direct, recursive: recursive, + typ: evalengine.UnknownType(), }, } } diff --git a/go/vt/vtgate/semantics/typer.go b/go/vt/vtgate/semantics/typer.go index b43ea49c4d1..625077f4da1 100644 --- a/go/vt/vtgate/semantics/typer.go +++ b/go/vt/vtgate/semantics/typer.go @@ -58,11 +58,10 @@ func (t *typer) up(cursor *sqlparser.Cursor) error { if !ok { return nil } - var inputType sqltypes.Type + inputType := sqltypes.Unknown if arg := node.GetArg(); arg != nil { - t, ok := t.m[arg] - if ok { - inputType = t.Type + if tt, ok := t.m[arg]; ok { + inputType = tt.Type } } type_ := code.Type(inputType) From 3aead9e087d18ee426f919e51c1e4e96623289e6 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Tue, 7 Nov 2023 06:43:40 +0200 Subject: [PATCH 12/39] Online DDL: revert considerations for migrations with foreign key constraints (#14368) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- .../onlineddl/revert/onlineddl_revert_test.go | 88 +- go/vt/proto/vtctldata/vtctldata.pb.go | 3834 +++++++++-------- go/vt/proto/vtctldata/vtctldata_vtproto.pb.go | 46 + go/vt/schemadiff/table_test.go | 13 + .../schema/onlineddl/schema_migrations.sql | 1 + go/vt/vtctl/grpcvtctldserver/query.go | 1 + go/vt/vttablet/onlineddl/executor.go | 165 +- go/vt/vttablet/onlineddl/executor_test.go | 38 + go/vt/vttablet/onlineddl/schema.go | 1 + go/vt/vttablet/onlineddl/vrepl.go | 53 +- go/vt/vttablet/onlineddl/vrepl/foreign_key.go | 53 + .../onlineddl/vrepl/foreign_key_test.go | 74 + proto/vtctldata.proto | 1 + web/vtadmin/src/proto/vtadmin.d.ts | 6 + web/vtadmin/src/proto/vtadmin.js | 23 + 15 files changed, 2423 insertions(+), 1974 deletions(-) create mode 100644 go/vt/vttablet/onlineddl/vrepl/foreign_key.go create mode 100644 go/vt/vttablet/onlineddl/vrepl/foreign_key_test.go diff --git a/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go b/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go index bd2e34ff3ba..41cd5b5a1be 100644 --- a/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go +++ b/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go @@ -125,9 +125,11 @@ type revertibleTestCase struct { fromSchema string toSchema string // expectProblems bool + removedForeignKeyNames string removedUniqueKeyNames string droppedNoDefaultColumnNames string expandedColumnNames string + onlyIfFKOnlineDDLPossible bool } func TestMain(m *testing.M) { @@ -218,6 +220,25 @@ func TestSchemaChange(t *testing.T) { func testRevertible(t *testing.T) { + fkOnlineDDLPossible := false + t.Run("check 'rename_table_preserve_foreign_key' variable", func(t *testing.T) { + // Online DDL is not possible on vanilla MySQL 8.0 for reasons described in https://vitess.io/blog/2021-06-15-online-ddl-why-no-fk/. + // However, Online DDL is made possible in via these changes: https://github.com/planetscale/mysql-server/commit/bb777e3e86387571c044fb4a2beb4f8c60462ced + // as part of https://github.com/planetscale/mysql-server/releases/tag/8.0.34-ps1. + // Said changes introduce a new global/session boolean variable named 'rename_table_preserve_foreign_key'. It defaults 'false'/0 for backwards compatibility. + // When enabled, a `RENAME TABLE` to a FK parent "pins" the children's foreign keys to the table name rather than the table pointer. Which means after the RENAME, + // the children will point to the newly instated table rather than the original, renamed table. + // (Note: this applies to a particular type of RENAME where we swap tables, see the above blog post). + // For FK children, the MySQL changes simply ignore any Vitess-internal table. + // + // In this stress test, we enable Online DDL if the variable 'rename_table_preserve_foreign_key' is present. The Online DDL mechanism will in turn + // query for this variable, and manipulate it, when starting the migration and when cutting over. + rs, err := shards[0].Vttablets[0].VttabletProcess.QueryTablet("show global variables like 'rename_table_preserve_foreign_key'", keyspaceName, false) + require.NoError(t, err) + fkOnlineDDLPossible = len(rs.Rows) > 0 + t.Logf("MySQL support for 'rename_table_preserve_foreign_key': %v", fkOnlineDDLPossible) + }) + var testCases = []revertibleTestCase{ { name: "identical schemas", @@ -253,6 +274,20 @@ func testRevertible(t *testing.T) { toSchema: `id int primary key, i1 int default null, unique key i1_uidx(i1)`, removedUniqueKeyNames: ``, }, + { + name: "removed foreign key", + fromSchema: "id int primary key, i int, constraint some_fk_1 foreign key (i) references parent (id) on delete cascade", + toSchema: "id int primary key, i int", + removedForeignKeyNames: "some_fk_1", + onlyIfFKOnlineDDLPossible: true, + }, + + { + name: "renamed foreign key", + fromSchema: "id int primary key, i int, constraint f1 foreign key (i) references parent (id) on delete cascade", + toSchema: "id int primary key, i int, constraint f2 foreign key (i) references parent (id) on delete cascade", + onlyIfFKOnlineDDLPossible: true, + }, { name: "remove column without default", fromSchema: `id int primary key, i1 int not null`, @@ -344,16 +379,23 @@ func testRevertible(t *testing.T) { dropTableStatement = ` DROP TABLE onlineddl_test ` - tableName = "onlineddl_test" - ddlStrategy = "online --declarative --allow-zero-in-date" + tableName = "onlineddl_test" + ddlStrategy = "online --declarative --allow-zero-in-date --unsafe-allow-foreign-keys" + createParentTable = "create table parent (id int primary key)" ) + onlineddl.VtgateExecQuery(t, &vtParams, createParentTable, "") + removeBackticks := func(s string) string { return strings.Replace(s, "`", "", -1) } for _, testcase := range testCases { t.Run(testcase.name, func(t *testing.T) { + if testcase.onlyIfFKOnlineDDLPossible && !fkOnlineDDLPossible { + t.Skipf("skipped because backing database does not support 'rename_table_preserve_foreign_key'") + return + } t.Run("ensure table dropped", func(t *testing.T) { // A preparation step, to clean up anything from the previous test case @@ -361,7 +403,6 @@ func testRevertible(t *testing.T) { onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusComplete) checkTable(t, tableName, false) }) - t.Run("create from-table", func(t *testing.T) { // A preparation step, to re-create the base table fromStatement := fmt.Sprintf(createTableWrapper, testcase.fromSchema) @@ -382,10 +423,12 @@ func testRevertible(t *testing.T) { rs := onlineddl.ReadMigrations(t, &vtParams, uuid) require.NotNil(t, rs) for _, row := range rs.Named().Rows { + removedForeignKeyNames := row.AsString("removed_foreign_key_names", "") removedUniqueKeyNames := row.AsString("removed_unique_key_names", "") droppedNoDefaultColumnNames := row.AsString("dropped_no_default_column_names", "") expandedColumnNames := row.AsString("expanded_column_names", "") + assert.Equal(t, testcase.removedForeignKeyNames, removeBackticks(removedForeignKeyNames)) assert.Equal(t, testcase.removedUniqueKeyNames, removeBackticks(removedUniqueKeyNames)) assert.Equal(t, testcase.droppedNoDefaultColumnNames, removeBackticks(droppedNoDefaultColumnNames)) assert.Equal(t, testcase.expandedColumnNames, removeBackticks(expandedColumnNames)) @@ -393,6 +436,43 @@ func testRevertible(t *testing.T) { }) }) } + + t.Run("drop fk child table", func(t *testing.T) { + t.Run("ensure table dropped", func(t *testing.T) { + // A preparation step, to clean up anything from the previous test case + uuid := testOnlineDDLStatement(t, dropTableStatement, ddlStrategy, "vtgate", tableName, "") + onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusComplete) + checkTable(t, tableName, false) + }) + t.Run("create child table", func(t *testing.T) { + fromStatement := fmt.Sprintf(createTableWrapper, "id int primary key, i int, constraint some_fk_2 foreign key (i) references parent (id) on delete cascade") + uuid := testOnlineDDLStatement(t, fromStatement, ddlStrategy, "vtgate", tableName, "") + onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusComplete) + checkTable(t, tableName, true) + }) + var uuid string + t.Run("drop", func(t *testing.T) { + uuid = testOnlineDDLStatement(t, dropTableStatement, ddlStrategy, "vtgate", tableName, "") + onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusComplete) + checkTable(t, tableName, false) + }) + t.Run("check migration", func(t *testing.T) { + // All right, the actual test + rs := onlineddl.ReadMigrations(t, &vtParams, uuid) + require.NotNil(t, rs) + for _, row := range rs.Named().Rows { + removedForeignKeyNames := row.AsString("removed_foreign_key_names", "") + removedUniqueKeyNames := row.AsString("removed_unique_key_names", "") + droppedNoDefaultColumnNames := row.AsString("dropped_no_default_column_names", "") + expandedColumnNames := row.AsString("expanded_column_names", "") + + assert.Equal(t, "some_fk_2", removeBackticks(removedForeignKeyNames)) + assert.Equal(t, "", removeBackticks(removedUniqueKeyNames)) + assert.Equal(t, "", removeBackticks(droppedNoDefaultColumnNames)) + assert.Equal(t, "", removeBackticks(expandedColumnNames)) + } + }) + }) } func testRevert(t *testing.T) { @@ -964,6 +1044,8 @@ func testRevert(t *testing.T) { assert.Empty(t, specialPlan) assert.NotEmpty(t, artifacts) } + removedForeignKeyNames := row.AsString("removed_foreign_key_names", "") + assert.Empty(t, removedForeignKeyNames) }) t.Run("INSTANT DDL: fail revert", func(t *testing.T) { uuid := testRevertMigration(t, uuids[len(uuids)-1], ddlStrategy) diff --git a/go/vt/proto/vtctldata/vtctldata.pb.go b/go/vt/proto/vtctldata/vtctldata.pb.go index 2e7e5065f94..5f70d625ffa 100644 --- a/go/vt/proto/vtctldata/vtctldata.pb.go +++ b/go/vt/proto/vtctldata/vtctldata.pb.go @@ -746,6 +746,7 @@ type SchemaMigration struct { IsImmediateOperation bool `protobuf:"varint,51,opt,name=is_immediate_operation,json=isImmediateOperation,proto3" json:"is_immediate_operation,omitempty"` ReviewedAt *vttime.Time `protobuf:"bytes,52,opt,name=reviewed_at,json=reviewedAt,proto3" json:"reviewed_at,omitempty"` ReadyToCompleteAt *vttime.Time `protobuf:"bytes,53,opt,name=ready_to_complete_at,json=readyToCompleteAt,proto3" json:"ready_to_complete_at,omitempty"` + RemovedForeignKeyNames string `protobuf:"bytes,54,opt,name=removed_foreign_key_names,json=removedForeignKeyNames,proto3" json:"removed_foreign_key_names,omitempty"` } func (x *SchemaMigration) Reset() { @@ -1151,6 +1152,13 @@ func (x *SchemaMigration) GetReadyToCompleteAt() *vttime.Time { return nil } +func (x *SchemaMigration) GetRemovedForeignKeyNames() string { + if x != nil { + return x.RemovedForeignKeyNames + } + return "" +} + type Shard struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -15511,7 +15519,7 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x22, 0x85, 0x13, 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, + 0x70, 0x61, 0x63, 0x65, 0x22, 0xc0, 0x13, 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, @@ -15651,889 +15659,333 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x41, 0x74, 0x22, 0x53, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, - 0x12, 0x0a, 0x0a, 0x06, 0x56, 0x49, 0x54, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x48, 0x4f, 0x53, - 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x54, 0x4f, 0x53, 0x43, 0x10, 0x02, 0x12, 0x0a, - 0x0a, 0x06, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x59, - 0x53, 0x51, 0x4c, 0x10, 0x04, 0x1a, 0x02, 0x10, 0x01, 0x22, 0x71, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, - 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0a, - 0x0a, 0x06, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, - 0x41, 0x44, 0x59, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, - 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x06, - 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x07, 0x22, 0x5e, 0x0a, 0x05, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0xbf, 0x0f, 0x0a, - 0x08, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3f, - 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x74, 0x65, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, + 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x36, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, + 0x53, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x0a, 0x0a, 0x06, 0x56, + 0x49, 0x54, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, + 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, + 0x0a, 0x05, 0x50, 0x54, 0x4f, 0x53, 0x43, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x49, 0x52, + 0x45, 0x43, 0x54, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x10, 0x04, + 0x1a, 0x02, 0x10, 0x01, 0x22, 0x71, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, + 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, + 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, + 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x51, 0x55, 0x45, + 0x55, 0x45, 0x44, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x04, + 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x0c, 0x0a, + 0x08, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x46, + 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x07, 0x22, 0x5e, 0x0a, 0x05, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0xbf, 0x0f, 0x0a, 0x08, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x61, + 0x78, 0x5f, 0x76, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6c, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x56, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x4a, 0x0a, + 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, + 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x75, 0x62, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x48, 0x0a, 0x21, 0x6d, 0x61, + 0x78, 0x5f, 0x76, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1d, 0x6d, 0x61, 0x78, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, + 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x1a, 0xb9, 0x01, 0x0a, 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x46, 0x0a, 0x0f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, + 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x1a, + 0xe7, 0x08, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, + 0x3d, 0x0a, 0x0d, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x0c, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x41, + 0x0a, 0x15, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x14, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x2f, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x45, 0x0a, 0x0b, + 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x43, 0x6f, + 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x4c, 0x6f, + 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x6f, 0x67, 0x5f, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6c, 0x6f, 0x67, 0x46, 0x65, 0x74, 0x63, 0x68, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, + 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, + 0x70, 0x69, 0x65, 0x64, 0x12, 0x55, 0x0a, 0x10, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, - 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, - 0x6d, 0x61, 0x78, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x61, 0x67, 0x12, 0x4a, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x23, - 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, - 0x73, 0x75, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x75, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x48, 0x0a, 0x21, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6c, 0x61, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1d, 0x6d, 0x61, 0x78, 0x56, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, - 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x60, 0x0a, 0x11, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, - 0x13, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x1a, 0xb9, 0x01, 0x0a, 0x0b, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x46, - 0x0a, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x1a, 0xe7, 0x08, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, + 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x74, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x3a, 0x0a, 0x09, 0x43, + 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x17, + 0x0a, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x1a, 0xe6, 0x01, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x0d, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x5f, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x69, - 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x15, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, - 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, - 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x6f, - 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, - 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0f, - 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x6f, 0x67, 0x46, 0x65, 0x74, 0x63, 0x68, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0f, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, - 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, - 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x55, 0x0a, 0x10, 0x74, 0x68, 0x72, - 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x0f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x1a, 0x3a, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6b, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x6b, 0x1a, 0xe6, 0x01, 0x0a, - 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x0a, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2b, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, - 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x77, 0x0a, 0x0f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x0e, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, - 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x22, 0x59, - 0x0a, 0x12, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x15, 0x0a, 0x13, 0x41, 0x64, 0x64, - 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x40, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, - 0x6c, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x18, - 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, - 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, - 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1b, 0x0a, 0x19, - 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb3, 0x01, 0x0a, 0x1d, 0x41, 0x70, + 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x2b, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x1a, 0x77, 0x0a, 0x0f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, + 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x22, 0x59, 0x0a, 0x12, 0x41, 0x64, 0x64, + 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x15, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x0a, 0x14, 0x41, + 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x17, 0x0a, + 0x15, 0x41, 0x64, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x41, 0x70, 0x70, 0x6c, 0x79, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x70, 0x70, 0x6c, 0x79, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb3, 0x01, 0x0a, 0x1d, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x11, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4a, 0x0a, 0x13, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x5f, - 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, - 0x6b, 0x69, 0x70, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0c, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x22, - 0x20, 0x0a, 0x1e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xce, 0x02, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x64, 0x6c, 0x5f, 0x73, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x64, - 0x6c, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x75, 0x69, - 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x75, 0x75, - 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, - 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x08, 0x63, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x61, 0x74, - 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x08, - 0x10, 0x09, 0x22, 0xe8, 0x01, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x75, - 0x69, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x75, - 0x75, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x6c, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, - 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc3, 0x01, - 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x73, 0x71, 0x6c, 0x22, 0x44, 0x0a, 0x14, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x76, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x07, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xe5, 0x01, 0x0a, 0x0d, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x30, 0x0a, 0x14, - 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x72, 0x6f, 0x6d, - 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x73, 0x61, 0x66, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x61, 0x66, - 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, - 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xe2, 0x01, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x5f, 0x73, 0x61, 0x66, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x61, 0x66, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, - 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x6f, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x73, 0x22, 0x4e, 0x0a, 0x1c, 0x43, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdf, 0x01, 0x0a, 0x1d, - 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, - 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, - 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, - 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x64, 0x62, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x18, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0d, 0x62, 0x65, 0x66, 0x6f, - 0x72, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x52, 0x0c, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, - 0x33, 0x0a, 0x0c, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x0b, 0x61, 0x66, 0x74, 0x65, 0x72, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x77, 0x61, 0x73, 0x5f, 0x64, 0x72, 0x79, 0x5f, - 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x77, 0x61, 0x73, 0x44, 0x72, - 0x79, 0x52, 0x75, 0x6e, 0x22, 0x4f, 0x0a, 0x1d, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xe1, 0x01, 0x0a, 0x1e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, - 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, - 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x1e, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xe3, 0x01, 0x0a, 0x1f, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x78, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x43, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, - 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xce, 0x02, 0x0a, + 0x12, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x71, 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, + 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x64, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x64, 0x6c, 0x53, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x75, 0x75, 0x69, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x44, + 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, + 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, + 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0xe8, 0x01, + 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x75, 0x75, 0x69, 0x64, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x6c, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x41, + 0x70, 0x70, 0x6c, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x99, 0x03, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, - 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x40, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x0b, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, 0x73, - 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x0d, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0c, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, - 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x69, 0x64, - 0x65, 0x63, 0x61, 0x72, 0x5f, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x44, 0x62, 0x4e, 0x61, 0x6d, - 0x65, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x49, 0x0a, - 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0xa0, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x5f, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x68, 0x61, 0x72, 0x64, 0x41, 0x6c, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x15, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, - 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x67, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, - 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, - 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, - 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, - 0x73, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, - 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x76, 0x65, 0x6e, 0x5f, 0x69, 0x66, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x65, 0x76, 0x65, 0x6e, 0x49, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, - 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x79, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, - 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x03, 0x0a, 0x1d, 0x45, - 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, - 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3e, 0x0a, 0x0f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0e, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x1c, - 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, - 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x19, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, - 0x43, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, - 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x77, 0x61, 0x69, - 0x74, 0x46, 0x6f, 0x72, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xbc, - 0x01, 0x0a, 0x1e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa0, 0x01, - 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, - 0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, - 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, - 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x6f, - 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x75, 0x73, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x18, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, + 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc3, 0x01, 0x0a, 0x13, 0x41, 0x70, 0x70, + 0x6c, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x2c, + 0x0a, 0x08, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x07, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x71, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x22, 0x44, + 0x0a, 0x14, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x76, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0xe5, 0x01, 0x0a, 0x0d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, - 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, - 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, - 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, - 0x47, 0x0a, 0x19, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, - 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa5, 0x01, 0x0a, 0x12, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x72, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x6f, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x6c, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x5f, 0x73, 0x61, 0x66, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x61, 0x66, 0x65, 0x22, 0xa2, 0x01, 0x0a, + 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x11, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x5e, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0b, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x22, 0x3c, 0x0a, 0x1e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xbe, - 0x01, 0x0a, 0x1f, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, - 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, - 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x73, 0x1a, 0x4b, 0x0a, 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x9e, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0d, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x22, 0x44, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, - 0x74, 0x6c, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, - 0x22, 0x46, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, - 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, - 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, - 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, - 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xb6, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, - 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, - 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x61, - 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x1a, 0x50, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, - 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x4c, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, - 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x30, 0x0a, 0x12, 0x47, 0x65, - 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x46, 0x0a, 0x13, - 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x22, 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, - 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x5a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x22, 0xb0, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, - 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x6c, - 0x79, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, - 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x50, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xb8, 0x02, 0x0a, 0x1a, 0x47, 0x65, - 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x28, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x6f, 0x72, - 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, - 0x73, 0x6b, 0x69, 0x70, 0x22, 0x59, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x4c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x0a, - 0x10, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x26, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x6a, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x52, 0x11, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x22, 0x32, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x1a, 0x69, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x45, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x20, 0x0a, 0x08, - 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x4a, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, + 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x22, 0xe2, 0x01, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x17, 0x47, - 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x1a, 0x56, 0x0a, 0x11, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf8, 0x02, 0x0a, 0x1c, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x53, 0x65, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, - 0x6c, 0x66, 0x12, 0x2f, 0x0a, 0x14, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x12, 0x3f, 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, - 0x5f, 0x61, 0x70, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, - 0x70, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0c, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x64, 0x41, 0x70, 0x70, 0x22, 0x1f, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, - 0x6c, 0x22, 0x4e, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x73, 0x72, - 0x76, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x73, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x22, 0x2d, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, - 0x22, 0xc5, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x73, - 0x72, 0x76, 0x5f, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x73, 0x1a, 0x53, 0x0a, 0x10, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4c, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x06, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, - 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x06, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0xe8, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, - 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x22, 0x40, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x73, 0x22, 0x2c, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, - 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x22, 0x46, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, - 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x63, - 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x43, 0x65, - 0x6c, 0x6c, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x66, 0x0a, 0x0c, 0x54, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, - 0x22, 0x2f, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x22, 0x4d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x42, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x76, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x22, 0xae, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x61, - 0x6d, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x6f, - 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x22, 0xfb, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x52, - 0x0a, 0x1a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x17, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, - 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x42, - 0x0a, 0x18, 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, - 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x4e, 0x0a, 0x1c, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, - 0x69, 0x64, 0x22, 0xdf, 0x01, 0x0a, 0x1d, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x73, 0x61, 0x66, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x53, 0x61, 0x66, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, + 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x73, 0x22, 0x4e, 0x0a, 0x1c, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdf, 0x01, 0x0a, 0x1d, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, + 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, + 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9b, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2d, + 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x64, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, + 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, 0xa6, 0x01, 0x0a, 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0d, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x0c, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x52, 0x0b, 0x61, 0x66, 0x74, 0x65, 0x72, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, + 0x1e, 0x0a, 0x0b, 0x77, 0x61, 0x73, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x77, 0x61, 0x73, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, + 0x4f, 0x0a, 0x1d, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, + 0x22, 0xe1, 0x01, 0x0a, 0x1e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, @@ -16542,99 +15994,774 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xff, 0x02, 0x0a, 0x19, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, - 0x12, 0x29, 0x0a, 0x06, 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x06, 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x42, 0x0a, 0x1e, 0x63, - 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, - 0x70, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, 0x66, 0x74, - 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x57, 0x69, 0x74, 0x68, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, - 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, - 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x77, 0x0a, 0x1e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x1e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x4c, 0x0a, - 0x1f, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x29, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x18, 0x4d, - 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, - 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0xdd, 0x05, 0x0a, 0x14, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, - 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xe3, 0x01, 0x0a, 0x1f, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x16, 0x72, 0x6f, + 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x99, 0x03, 0x0a, + 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, + 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x40, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, + 0x6f, 0x6d, 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x5f, + 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x44, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x04, + 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x49, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x22, 0xa0, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, + 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x6c, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x12, 0x73, 0x68, 0x61, 0x72, 0x64, 0x41, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x45, + 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, + 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x67, 0x0a, + 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, + 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x76, 0x65, 0x6e, 0x5f, 0x69, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x49, + 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x16, + 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, + 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x79, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x17, 0x0a, 0x15, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x03, 0x0a, 0x1d, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, + 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x12, 0x3e, 0x0a, 0x0f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0e, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x73, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x72, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x70, 0x72, + 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x70, + 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x65, 0x6c, 0x6c, 0x50, + 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, + 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x77, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x41, + 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x1e, 0x45, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, + 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, + 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x75, 0x73, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x47, 0x0a, 0x19, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x41, 0x70, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x18, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x27, 0x0a, 0x0f, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x69, + 0x6e, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x47, 0x0a, 0x19, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x46, 0x65, 0x74, 0x63, 0x68, 0x41, 0x73, 0x44, 0x42, 0x41, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0xa5, 0x01, 0x0a, 0x12, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, + 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x12, 0x55, 0x0a, 0x13, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x68, + 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5e, 0x0a, 0x13, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0b, 0x68, 0x6f, 0x6f, 0x6b, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x0a, 0x68, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3c, 0x0a, 0x1e, 0x46, + 0x69, 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x1f, 0x46, 0x69, + 0x6e, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, + 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x41, 0x6c, + 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x1a, 0x4b, 0x0a, + 0x0b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x01, 0x0a, 0x11, 0x47, + 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x44, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x63, 0x74, 0x6c, 0x2e, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x73, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x46, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, + 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, + 0x73, 0x1a, 0x50, 0x0a, 0x0c, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, + 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x4c, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x30, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x46, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, + 0x51, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x22, 0x5a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0b, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x18, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, + 0xb0, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, + 0x77, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x28, 0x0a, 0x10, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x6e, + 0x6c, 0x79, 0x22, 0x50, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0xb8, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, + 0x75, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x21, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x06, 0x72, + 0x65, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x72, + 0x65, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x05, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x6b, 0x69, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x22, + 0x59, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, + 0x0a, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4c, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x6a, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, + 0x32, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, + 0x6c, 0x6c, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x69, 0x0a, 0x0a, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x45, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x20, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x59, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x72, 0x76, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x73, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x11, + 0x53, 0x72, 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x72, + 0x76, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf8, 0x02, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x74, 0x12, 0x2d, + 0x0a, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x2f, 0x0a, + 0x14, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x41, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x3f, + 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x52, 0x75, 0x6c, + 0x65, 0x52, 0x0c, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x41, 0x70, 0x70, 0x22, + 0x1f, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x4e, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x73, 0x72, 0x76, 0x5f, 0x76, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x0a, 0x73, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x2d, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x73, 0x72, 0x76, 0x5f, 0x76, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x72, 0x76, + 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0b, 0x73, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x1a, 0x53, + 0x0a, 0x10, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x72, + 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x4c, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x22, 0x3d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x22, 0xe8, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x40, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x2c, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x46, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x04, 0x63, + 0x65, 0x6c, 0x6c, 0x22, 0x66, 0x0a, 0x0c, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x43, + 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x11, 0x47, + 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x2e, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x42, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x76, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x76, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0xae, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, + 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x4f, 0x6e, 0x6c, + 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x0a, + 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x6f, 0x67, 0x73, + 0x22, 0x49, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x17, + 0x49, 0x6e, 0x69, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x52, 0x0a, 0x1a, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x17, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6c, 0x65, + 0x63, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x42, 0x0a, 0x18, 0x49, 0x6e, 0x69, + 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x4e, 0x0a, + 0x1c, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdf, 0x01, + 0x0a, 0x1d, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x76, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x41, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x75, 0x6e, + 0x63, 0x68, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xff, 0x02, 0x0a, 0x19, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x06, 0x76, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, + 0x76, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x42, 0x0a, 0x1e, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, + 0x75, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, + 0x79, 0x57, 0x69, 0x74, 0x68, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x77, 0x0a, 0x1e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x4c, 0x0a, 0x1f, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x56, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x18, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1b, + 0x0a, 0x19, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x05, 0x0a, 0x14, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, + 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, + 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, + 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, + 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, + 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, + 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, + 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, + 0x79, 0x52, 0x75, 0x6e, 0x22, 0x5b, 0x0a, 0x17, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, + 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x22, 0x85, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, + 0x70, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x6f, 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, + 0x70, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, + 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x4d, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0x0a, 0x10, 0x4d, + 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x11, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, + 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, + 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, + 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, + 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, + 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, + 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x11, + 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0xbb, 0x06, 0x0a, 0x17, 0x4d, 0x6f, 0x76, 0x65, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, + 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, - 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, - 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, - 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, - 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, - 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, - 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, - 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, + 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x15, + 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2a, 0x0a, + 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, + 0x79, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x46, 0x6f, + 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, + 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, + 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x12, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x5f, 0x63, + 0x6f, 0x70, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x74, 0x6f, 0x6d, 0x69, + 0x63, 0x43, 0x6f, 0x70, 0x79, 0x22, 0xd5, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x48, 0x0a, 0x07, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0xe9, 0x01, + 0x0a, 0x19, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, @@ -16648,700 +16775,554 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, 0x5b, 0x0a, 0x17, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, - 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x14, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, - 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x17, - 0x0a, 0x15, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x26, 0x0a, 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x11, 0x4d, 0x6f, 0x75, - 0x6e, 0x74, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x6f, 0x70, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, - 0x74, 0x6f, 0x70, 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x12, 0x0a, - 0x10, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x29, 0x0a, 0x11, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0xbb, 0x06, 0x0a, - 0x17, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x27, 0x0a, - 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, - 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, - 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, - 0x6f, 0x6e, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, - 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, - 0x70, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, - 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, - 0x72, 0x6f, 0x70, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, - 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, - 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, - 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, - 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, - 0x6c, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x74, 0x6f, - 0x6d, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x61, 0x74, 0x6f, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x70, 0x79, 0x22, 0xd5, 0x01, 0x0a, 0x18, 0x4d, - 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, 0x5e, 0x0a, 0x1a, 0x4d, 0x6f, 0x76, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x12, 0x48, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, - 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x22, 0xe9, 0x01, 0x0a, 0x19, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, - 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x22, 0x5e, - 0x0a, 0x1a, 0x4d, 0x6f, 0x76, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, - 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x4d, - 0x0a, 0x11, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x14, 0x0a, - 0x12, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x89, 0x02, 0x0a, 0x1b, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, - 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3a, 0x0a, - 0x0d, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, + 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x4d, 0x0a, 0x11, 0x50, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0c, 0x61, 0x76, 0x6f, - 0x69, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, - 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, - 0xba, 0x01, 0x0a, 0x1c, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x12, 0x40, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x61, 0x73, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x74, 0x0a, 0x1b, - 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x50, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x89, + 0x02, 0x0a, 0x1b, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, + 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x0d, 0x61, 0x76, 0x6f, 0x69, + 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0c, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x50, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x12, 0x44, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x61, 0x69, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xba, 0x01, 0x0a, 0x1c, 0x50, + 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x61, 0x6c, 0x22, 0x1e, 0x0a, 0x1c, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x32, 0x0a, 0x1a, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, - 0x0a, 0x1a, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x69, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, - 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, - 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, - 0x46, 0x0a, 0x1c, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x40, 0x0a, + 0x10, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0f, + 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, - 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, - 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x7f, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, - 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, - 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x9b, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, - 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x19, 0x0a, - 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x22, 0x7b, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x07, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x8f, 0x04, - 0x0a, 0x14, 0x52, 0x65, 0x73, 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, - 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x73, 0x6b, 0x69, 0x70, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x70, 0x79, 0x12, - 0x15, 0x0a, 0x06, 0x6f, 0x6e, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6f, 0x6e, 0x44, 0x64, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, - 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x30, - 0x0a, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, - 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, - 0x66, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x22, - 0x82, 0x02, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, - 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, - 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x74, 0x6f, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x12, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0xad, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, - 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x24, - 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x22, 0x4d, 0x0a, 0x1b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x75, 0x69, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, - 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, - 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x51, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x6d, 0x0a, 0x22, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, - 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x74, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, - 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, - 0x55, 0x0a, 0x23, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, - 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xc8, 0x01, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x22, 0x1e, 0x0a, + 0x1c, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x0a, + 0x1a, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x47, + 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, + 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x0a, 0x1a, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, - 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x22, 0x4f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x22, 0x5e, 0x0a, 0x1e, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, - 0x10, 0x04, 0x22, 0x51, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x72, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x69, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x22, 0x49, 0x0a, 0x20, 0x53, 0x65, 0x74, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x22, 0x8e, 0x02, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x6e, - 0x69, 0x65, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x46, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x6a, 0x0a, - 0x12, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x77, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, - 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x88, 0x01, 0x0a, 0x1a, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, + 0x83, 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x36, 0x0a, + 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x4f, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, + 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, + 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x63, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x46, 0x0a, 0x1c, 0x52, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, + 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x0a, 0x1a, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, - 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, - 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x54, - 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0x54, 0x0a, 0x20, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x22, 0x43, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, + 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x5b, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7f, 0x0a, 0x19, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0xaa, 0x03, 0x0a, 0x21, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x78, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x5a, 0x0a, 0x0a, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, - 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x1a, 0x5f, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4e, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, - 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8b, 0x01, 0x0a, 0x1d, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x0a, 0x12, 0x53, 0x6c, 0x65, 0x65, 0x70, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x1a, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x65, + 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x68, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x63, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, + 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, + 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x43, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0x7b, 0x0a, 0x16, 0x52, + 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x07, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x8f, 0x04, 0x0a, 0x14, 0x52, 0x65, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1a, 0x0a, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, + 0x63, 0x6f, 0x70, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x6b, 0x69, 0x70, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x6e, + 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x6e, 0x44, 0x64, + 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, + 0x63, 0x6f, 0x70, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, + 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x66, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x65, 0x66, 0x65, 0x72, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, + 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x22, 0x82, 0x02, 0x0a, 0x18, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x12, 0x2d, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x70, + 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x54, 0x6f, 0x50, 0x6f, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, + 0x3e, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x12, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x54, 0x6f, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, + 0xad, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x2c, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, - 0x15, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x2f, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x08, 0x6b, - 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, - 0x3f, 0x0a, 0x16, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x22, 0x5e, 0x0a, 0x18, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, - 0x22, 0x42, 0x0a, 0x19, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, - 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x22, 0x53, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x53, 0x74, 0x6f, - 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x21, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, - 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x22, 0xc6, 0x01, 0x0a, 0x22, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x24, 0x0a, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6f, 0x67, 0x75, 0x74, + 0x69, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, + 0x4d, 0x0a, 0x1b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0xdd, + 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x74, 0x72, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x75, 0x0a, 0x16, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x40, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x13, 0x72, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, + 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x51, + 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, + 0x73, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x22, 0x53, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x2b, 0x0a, + 0x11, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x75, 0x72, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x55, 0x0a, 0x23, 0x53, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x75, 0x72, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x22, 0xc8, 0x01, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x35, + 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x4f, 0x0a, 0x1d, + 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, + 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x5e, 0x0a, + 0x1e, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, - 0x65, 0x77, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x36, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, - 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x51, 0x0a, + 0x1f, 0x53, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2e, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x22, 0x72, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x73, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x6e, 0x67, 0x22, 0x49, 0x0a, 0x20, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x49, 0x73, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, + 0x8e, 0x02, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x12, 0x35, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, + 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, + 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x22, 0x46, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x6a, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x57, + 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x72, 0x69, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x77, 0x72, 0x69, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x57, 0x72, 0x69, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x1a, + 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x0c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x0a, 0x1a, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x65, 0x6c, 0x6c, 0x22, 0x54, 0x0a, 0x1b, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x78, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x54, 0x0a, 0x20, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0xaa, 0x03, 0x0a, 0x21, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x14, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x13, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x5a, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x76, 0x74, 0x63, 0x74, + 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, + 0x70, 0x1a, 0x5f, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x4e, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x8b, 0x01, 0x0a, 0x1d, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x22, 0x20, 0x0a, 0x1e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x7c, 0x0a, 0x12, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6f, 0x6c, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x22, 0x5c, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, - 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0x5d, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, - 0x09, 0x63, 0x65, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x64, - 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, - 0x61, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, - 0x0b, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, - 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x22, 0x65, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, - 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, - 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x34, 0x0a, 0x0f, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, - 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, - 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x12, 0x62, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x6b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x11, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x1a, 0x69, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, - 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x58, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, + 0x61, 0x73, 0x12, 0x2c, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x15, 0x0a, 0x13, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf0, 0x01, 0x0a, 0x15, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x12, 0x2f, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4b, 0x65, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x16, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x5e, 0x0a, 0x18, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x42, 0x0a, 0x19, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, + 0x53, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x52, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x52, 0x0a, 0x21, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x22, 0xc6, 0x01, 0x0a, 0x22, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfc, 0x01, 0x0a, 0x18, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x12, 0x61, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x76, 0x74, 0x63, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0b, + 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x12, 0x36, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, + 0x52, 0x0a, 0x6f, 0x6c, 0x64, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x5c, 0x0a, 0x15, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, + 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, + 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, 0x0a, 0x16, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x65, 0x6c, 0x6c, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x64, 0x0a, 0x17, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x0a, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, + 0x65, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, + 0x69, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x35, 0x0a, 0x0b, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x0a, 0x63, 0x65, 0x6c, 0x6c, + 0x73, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x22, 0x34, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfb, 0x01, 0x0a, + 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x13, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x1a, + 0x69, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, - 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, - 0x77, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x6e, 0x6f, 0x5f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x6b, 0x69, - 0x70, 0x4e, 0x6f, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x22, 0x88, 0x02, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x17, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfc, 0x01, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x61, 0x0a, 0x10, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, + 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xd8, 0x01, 0x0a, 0x1d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x12, 0x67, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, - 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, - 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x70, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, - 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x8a, 0x02, 0x0a, - 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x10, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x6e, 0x6f, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x6b, 0x69, 0x70, 0x4e, 0x6f, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x88, + 0x02, 0x0a, 0x1e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, @@ -17351,303 +17332,334 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4f, 0x0a, 0x1b, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x38, 0x0a, 0x1c, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x22, - 0xfa, 0x01, 0x0a, 0x17, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x14, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x3c, 0x0a, 0x1e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x60, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x36, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, 0x06, 0x0a, - 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, - 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, - 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x65, 0x6c, - 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2c, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x55, 0x0a, 0x1e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x77, 0x61, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x1b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x1a, 0x0a, 0x09, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x6f, 0x6e, 0x6c, 0x79, 0x50, 0x4b, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x61, 0x78, - 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6d, 0x61, - 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x52, 0x6f, 0x77, 0x73, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x04, 0x77, 0x61, 0x69, 0x74, 0x12, 0x42, 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x77, 0x61, 0x69, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, - 0x75, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x61, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x74, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x62, 0x6f, 0x73, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x62, 0x6f, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, - 0x55, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x22, - 0x6b, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, - 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0x15, 0x0a, 0x13, - 0x56, 0x44, 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, - 0x69, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x10, 0x56, 0x44, 0x69, - 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x3e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x1a, + 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4f, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x38, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, + 0x98, 0x01, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x76, 0x69, 0x65, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x69, 0x65, 0x77, 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x17, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x12, 0x60, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x1a, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x79, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x74, 0x63, + 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, 0x06, 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, + 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, + 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x6c, 0x0a, 0x1b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x55, 0x0a, 0x1e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1b, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x57, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x09, 0x6f, 0x6e, + 0x6c, 0x79, 0x5f, 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6f, + 0x6e, 0x6c, 0x79, 0x50, 0x4b, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, + 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x74, 0x72, + 0x61, 0x52, 0x6f, 0x77, 0x73, 0x54, 0x6f, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x77, 0x61, + 0x69, 0x74, 0x12, 0x42, 0x0a, 0x14, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x12, 0x77, 0x61, 0x69, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x72, + 0x65, 0x74, 0x72, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x75, 0x74, 0x6f, + 0x52, 0x65, 0x74, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x22, + 0x29, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x22, 0x6b, 0x0a, 0x12, 0x56, 0x44, + 0x69, 0x66, 0x66, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, 0x15, 0x0a, 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6d, + 0x0a, 0x12, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x15, 0x0a, + 0x13, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, + 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x22, + 0xd7, 0x01, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, + 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x14, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x10, 0x56, 0x44, 0x69, + 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x61, 0x72, 0x67, 0x22, 0xd7, 0x01, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, - 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x10, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x14, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x44, 0x69, 0x66, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, - 0x0a, 0x10, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x27, - 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x56, - 0x44, 0x69, 0x66, 0x66, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x9a, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x2c, 0x0a, 0x12, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, - 0x70, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xd1, 0x01, - 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x56, 0x44, 0x69, 0x66, 0x66, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x15, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1b, 0x0a, + 0x09, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x65, + 0x65, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6b, 0x65, 0x65, 0x70, 0x52, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, + 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x4f, 0x0a, 0x15, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xe6, 0x07, + 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x10, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0xe8, 0x01, 0x0a, 0x0e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, + 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x72, 0x6f, 0x77, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x72, + 0x6f, 0x77, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x72, 0x6f, 0x77, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, + 0x70, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x1a, 0xbc, 0x01, 0x0a, 0x10, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, + 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, + 0x1a, 0x73, 0x0a, 0x13, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x46, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6f, 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x74, + 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd7, 0x03, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x6f, + 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x4f, + 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, + 0x3c, 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x07, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, + 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, + 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x22, 0xa7, 0x01, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x72, 0x79, + 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x15, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x5b, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xd1, 0x01, + 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x52, - 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x22, 0x4f, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x22, 0xe6, 0x07, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, - 0x10, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x58, - 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0xe8, 0x01, - 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x6f, 0x77, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x72, 0x6f, 0x77, 0x73, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x29, 0x0a, - 0x10, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x1a, 0xbc, 0x01, 0x0a, 0x10, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2d, 0x0a, - 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x1a, 0x5c, 0x0a, 0x0c, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x07, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x07, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x73, 0x1a, 0x73, 0x0a, 0x13, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, - 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x46, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6f, 0x0a, 0x11, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x44, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd7, 0x03, 0x0a, 0x1c, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x14, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x41, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, - 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2a, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, - 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x1d, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x72, 0x79, 0x5f, 0x72, - 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, - 0x90, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x74, 0x63, 0x74, 0x6c, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x1a, - 0x55, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, - 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x41, - 0x6c, 0x69, 0x61, 0x73, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x2a, 0x4a, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, - 0x4f, 0x56, 0x45, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, - 0x52, 0x45, 0x41, 0x54, 0x45, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x49, 0x4e, 0x44, 0x45, 0x58, - 0x10, 0x02, 0x2a, 0x38, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x69, 0x6e, 0x67, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x41, 0x53, 0x43, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, - 0x44, 0x45, 0x53, 0x43, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x42, 0x28, 0x5a, 0x26, - 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, - 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, - 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x64, 0x2a, 0x4a, 0x0a, 0x15, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, + 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x4f, 0x56, 0x45, 0x54, 0x41, + 0x42, 0x4c, 0x45, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, + 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x10, 0x02, 0x2a, 0x38, 0x0a, + 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x08, + 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x53, 0x43, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x45, 0x53, 0x43, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x42, 0x28, 0x5a, 0x26, 0x76, 0x69, 0x74, 0x65, 0x73, + 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, + 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x74, 0x63, 0x74, 0x6c, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go b/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go index 30f19a15b88..b453eb2a0b2 100644 --- a/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go +++ b/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go @@ -212,6 +212,7 @@ func (m *SchemaMigration) CloneVT() *SchemaMigration { IsImmediateOperation: m.IsImmediateOperation, ReviewedAt: m.ReviewedAt.CloneVT(), ReadyToCompleteAt: m.ReadyToCompleteAt.CloneVT(), + RemovedForeignKeyNames: m.RemovedForeignKeyNames, } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) @@ -5687,6 +5688,15 @@ func (m *SchemaMigration) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.RemovedForeignKeyNames) > 0 { + i -= len(m.RemovedForeignKeyNames) + copy(dAtA[i:], m.RemovedForeignKeyNames) + i = encodeVarint(dAtA, i, uint64(len(m.RemovedForeignKeyNames))) + i-- + dAtA[i] = 0x3 + i-- + dAtA[i] = 0xb2 + } if m.ReadyToCompleteAt != nil { size, err := m.ReadyToCompleteAt.MarshalToSizedBufferVT(dAtA[:i]) if err != nil { @@ -19676,6 +19686,10 @@ func (m *SchemaMigration) SizeVT() (n int) { l = m.ReadyToCompleteAt.SizeVT() n += 2 + l + sov(uint64(l)) } + l = len(m.RemovedForeignKeyNames) + if l > 0 { + n += 2 + l + sov(uint64(l)) + } n += len(m.unknownFields) return n } @@ -27069,6 +27083,38 @@ func (m *SchemaMigration) UnmarshalVT(dAtA []byte) error { return err } iNdEx = postIndex + case 54: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RemovedForeignKeyNames", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RemovedForeignKeyNames = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) diff --git a/go/vt/schemadiff/table_test.go b/go/vt/schemadiff/table_test.go index 4d41d9584c0..e2ef58c1a6f 100644 --- a/go/vt/schemadiff/table_test.go +++ b/go/vt/schemadiff/table_test.go @@ -666,6 +666,19 @@ func TestCreateTableDiff(t *testing.T) { from: "create table t1 (id int primary key, i int, constraint f foreign key (i) references parent(id) on delete cascade)", to: "create table t2 (id int primary key, i int, constraint f foreign key (i) references parent(id) on delete cascade)", }, + { + name: "similar foreign key under different name", + from: "create table t1 (id int primary key, i int, key ix(i), constraint f1 foreign key (i) references parent(id) on delete cascade)", + to: "create table t2 (id int primary key, i int, key ix(i), constraint f2 foreign key (i) references parent(id) on delete cascade)", + diff: "alter table t1 drop foreign key f1, add constraint f2 foreign key (i) references parent (id) on delete cascade", + cdiff: "ALTER TABLE `t1` DROP FOREIGN KEY `f1`, ADD CONSTRAINT `f2` FOREIGN KEY (`i`) REFERENCES `parent` (`id`) ON DELETE CASCADE", + }, + { + name: "similar foreign key under different name, ignore names", + from: "create table t1 (id int primary key, i int, key ix(i), constraint f1 foreign key (i) references parent(id) on delete cascade)", + to: "create table t2 (id int primary key, i int, key ix(i), constraint f2 foreign key (i) references parent(id) on delete cascade)", + constraint: ConstraintNamesIgnoreAll, + }, { name: "two identical foreign keys, dropping one", from: "create table t1 (id int primary key, i int, key i_idex (i), constraint f1 foreign key (i) references parent(id), constraint f2 foreign key (i) references parent(id))", diff --git a/go/vt/sidecardb/schema/onlineddl/schema_migrations.sql b/go/vt/sidecardb/schema/onlineddl/schema_migrations.sql index 60cd4abcefa..40fdeef2683 100644 --- a/go/vt/sidecardb/schema/onlineddl/schema_migrations.sql +++ b/go/vt/sidecardb/schema/onlineddl/schema_migrations.sql @@ -70,6 +70,7 @@ CREATE TABLE IF NOT EXISTS schema_migrations `is_immediate_operation` tinyint unsigned NOT NULL DEFAULT '0', `reviewed_timestamp` timestamp NULL DEFAULT NULL, `ready_to_complete_timestamp` timestamp NULL DEFAULT NULL, + `removed_foreign_key_names` text NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uuid_idx` (`migration_uuid`), KEY `keyspace_shard_idx` (`keyspace`(64), `shard`(64)), diff --git a/go/vt/vtctl/grpcvtctldserver/query.go b/go/vt/vtctl/grpcvtctldserver/query.go index 2fac399bd4f..100e71b92c5 100644 --- a/go/vt/vtctl/grpcvtctldserver/query.go +++ b/go/vt/vtctl/grpcvtctldserver/query.go @@ -138,6 +138,7 @@ func rowToSchemaMigration(row sqltypes.RowNamedValues) (sm *vtctldatapb.SchemaMi } sm.PostponeCompletion = row.AsBool("postpone_completion", false) + sm.RemovedForeignKeyNames = row.AsString("removed_foreign_key_names", "") sm.RemovedUniqueKeyNames = row.AsString("removed_unique_key_names", "") sm.DroppedNoDefaultColumnNames = row.AsString("dropped_no_default_column_names", "") sm.ExpandedColumnNames = row.AsString("expanded_column_names", "") diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index 26e92c73617..8a3cf61348b 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -1270,34 +1270,56 @@ func (e *Executor) validateAndEditAlterTableStatement(ctx context.Context, onlin return alters, nil } -// createTableLike creates the table named by `newTableName` in the likeness of onlineDDL.Table -// This function emulates MySQL's `CREATE TABLE LIKE ...` statement. The difference is that this function takes control over the generated CONSTRAINT names, -// if any, such that they are detrministic across shards, as well as preserve original names where possible. -func (e *Executor) createTableLike(ctx context.Context, newTableName string, onlineDDL *schema.OnlineDDL, conn *dbconnpool.DBConnection) (constraintMap map[string]string, err error) { - existingShowCreateTable, err := e.showCreateTable(ctx, onlineDDL.Table) - if err != nil { - return nil, vterrors.Wrapf(err, "in createTableLike(), newTableName=%s", newTableName) - } - stmt, err := sqlparser.ParseStrictDDL(existingShowCreateTable) +// duplicateCreateTable parses the given `CREATE TABLE` statement, and returns: +// - The format CreateTable AST +// - A new CreateTable AST, with the table renamed as `newTableName`, and with constraints renamed deterministically +// - Map of renamed constraints +func (e *Executor) duplicateCreateTable(ctx context.Context, onlineDDL *schema.OnlineDDL, originalShowCreateTable string, newTableName string) ( + originalCreateTable *sqlparser.CreateTable, + newCreateTable *sqlparser.CreateTable, + constraintMap map[string]string, + err error, +) { + stmt, err := sqlparser.ParseStrictDDL(originalShowCreateTable) if err != nil { - return nil, err + return nil, nil, nil, err } - createTable, ok := stmt.(*sqlparser.CreateTable) + originalCreateTable, ok := stmt.(*sqlparser.CreateTable) if !ok { - return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "expected CreateTable statement, got: %v", sqlparser.CanonicalString(stmt)) + return nil, nil, nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "expected CreateTable statement, got: %v", sqlparser.CanonicalString(stmt)) } - createTable.SetTable(createTable.GetTable().Qualifier.CompliantName(), newTableName) + newCreateTable = sqlparser.CloneRefOfCreateTable(originalCreateTable) + newCreateTable.SetTable(newCreateTable.GetTable().Qualifier.CompliantName(), newTableName) // manipulate CreateTable statement: take care of constraints names which have to be // unique across the schema - constraintMap, err = e.validateAndEditCreateTableStatement(ctx, onlineDDL, createTable) + constraintMap, err = e.validateAndEditCreateTableStatement(ctx, onlineDDL, newCreateTable) if err != nil { - return nil, err + return nil, nil, nil, err } - // Create the table - if _, err := conn.ExecuteFetch(sqlparser.CanonicalString(createTable), 0, false); err != nil { - return nil, err + return originalCreateTable, newCreateTable, constraintMap, nil +} + +// createDuplicateTableLike creates the table named by `newTableName` in the likeness of onlineDDL.Table +// This function emulates MySQL's `CREATE TABLE LIKE ...` statement. The difference is that this function takes control over the generated CONSTRAINT names, +// if any, such that they are detrministic across shards, as well as preserve original names where possible. +func (e *Executor) createDuplicateTableLike(ctx context.Context, newTableName string, onlineDDL *schema.OnlineDDL, conn *dbconnpool.DBConnection) ( + originalShowCreateTable string, + constraintMap map[string]string, + err error, +) { + originalShowCreateTable, err = e.showCreateTable(ctx, onlineDDL.Table) + if err != nil { + return "", nil, err } - return constraintMap, nil + _, vreplCreateTable, constraintMap, err := e.duplicateCreateTable(ctx, onlineDDL, originalShowCreateTable, newTableName) + if err != nil { + return "", nil, err + } + // Create the vrepl (shadow) table: + if _, err := conn.ExecuteFetch(sqlparser.CanonicalString(vreplCreateTable), 0, false); err != nil { + return "", nil, err + } + return originalShowCreateTable, constraintMap, nil } // initVreplicationOriginalMigration performs the first steps towards running a VRepl ALTER migration: @@ -1319,34 +1341,39 @@ func (e *Executor) initVreplicationOriginalMigration(ctx context.Context, online if err := e.updateArtifacts(ctx, onlineDDL.UUID, vreplTableName); err != nil { return v, err } - constraintMap, err := e.createTableLike(ctx, vreplTableName, onlineDDL, conn) + originalShowCreateTable, constraintMap, err := e.createDuplicateTableLike(ctx, vreplTableName, onlineDDL, conn) if err != nil { return nil, err } - { - stmt, err := sqlparser.ParseStrictDDL(onlineDDL.SQL) - if err != nil { - return nil, err - } - alterTable, ok := stmt.(*sqlparser.AlterTable) - if !ok { - return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "expected AlterTable statement, got: %v", sqlparser.CanonicalString(stmt)) - } - // ALTER TABLE should apply to the vrepl table - alterTable.SetTable(alterTable.GetTable().Qualifier.CompliantName(), vreplTableName) - // Also, change any constraint names: - alters, err := e.validateAndEditAlterTableStatement(ctx, onlineDDL, alterTable, constraintMap) - if err != nil { + + stmt, err := sqlparser.ParseStrictDDL(onlineDDL.SQL) + if err != nil { + return nil, err + } + alterTable, ok := stmt.(*sqlparser.AlterTable) + if !ok { + return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "expected AlterTable statement, got: %v", sqlparser.CanonicalString(stmt)) + } + // ALTER TABLE should apply to the vrepl table + alterTable.SetTable(alterTable.GetTable().Qualifier.CompliantName(), vreplTableName) + // Also, change any constraint names: + alters, err := e.validateAndEditAlterTableStatement(ctx, onlineDDL, alterTable, constraintMap) + if err != nil { + return v, err + } + // Apply ALTER TABLE to materialized table + for _, alter := range alters { + if _, err := conn.ExecuteFetch(sqlparser.CanonicalString(alter), 0, false); err != nil { return v, err } - // Apply ALTER TABLE to materialized table - for _, alter := range alters { - if _, err := conn.ExecuteFetch(sqlparser.CanonicalString(alter), 0, false); err != nil { - return v, err - } - } } - v = NewVRepl(onlineDDL.UUID, e.keyspace, e.shard, e.dbName, onlineDDL.Table, vreplTableName, onlineDDL.SQL, onlineDDL.StrategySetting().IsAnalyzeTableFlag()) + + vreplShowCreateTable, err := e.showCreateTable(ctx, vreplTableName) + if err != nil { + return v, err + } + + v = NewVRepl(onlineDDL.UUID, e.keyspace, e.shard, e.dbName, onlineDDL.Table, vreplTableName, originalShowCreateTable, vreplShowCreateTable, onlineDDL.SQL, onlineDDL.StrategySetting().IsAnalyzeTableFlag()) return v, nil } @@ -1400,7 +1427,7 @@ func (e *Executor) initVreplicationRevertMigration(ctx context.Context, onlineDD if err := e.updateArtifacts(ctx, onlineDDL.UUID, vreplTableName); err != nil { return v, err } - v = NewVRepl(onlineDDL.UUID, e.keyspace, e.shard, e.dbName, onlineDDL.Table, vreplTableName, "", false) + v = NewVRepl(onlineDDL.UUID, e.keyspace, e.shard, e.dbName, onlineDDL.Table, vreplTableName, "", "", "", false) v.pos = revertStream.pos return v, nil } @@ -1451,6 +1478,7 @@ func (e *Executor) ExecuteWithVReplication(ctx context.Context, onlineDDL *schem len(v.addedUniqueKeys), len(v.removedUniqueKeys), strings.Join(sqlescape.EscapeIDs(removedUniqueKeyNames), ","), + strings.Join(sqlescape.EscapeIDs(v.removedForeignKeyNames), ","), strings.Join(sqlescape.EscapeIDs(v.droppedNoDefaultColumnNames), ","), strings.Join(sqlescape.EscapeIDs(v.expandedColumnNames), ","), v.revertibleNotes, @@ -2710,6 +2738,47 @@ func (e *Executor) failMigration(ctx context.Context, onlineDDL *schema.OnlineDD return withError } +// analyzeDropDDLActionMigration analyzes a DROP migration. +func (e *Executor) analyzeDropDDLActionMigration(ctx context.Context, onlineDDL *schema.OnlineDDL) error { + // Schema analysis: + originalShowCreateTable, err := e.showCreateTable(ctx, onlineDDL.Table) + if err != nil { + if sqlErr, isSQLErr := sqlerror.NewSQLErrorFromError(err).(*sqlerror.SQLError); isSQLErr { + switch sqlErr.Num { + case sqlerror.ERNoSuchTable: + // The table does not exist. For analysis purposed, that's fine. + return nil + default: + return vterrors.Wrapf(err, "attempting to read definition of %v", onlineDDL.Table) + } + } + } + stmt, err := sqlparser.ParseStrictDDL(originalShowCreateTable) + if err != nil { + return err + } + + var removedForeignKeyNames []string + if createTable, ok := stmt.(*sqlparser.CreateTable); ok { + // This is a table rather than a view. + + // Analyze foreign keys: + + for _, constraint := range createTable.TableSpec.Constraints { + if GetConstraintType(constraint.Details) == ForeignKeyConstraintType { + removedForeignKeyNames = append(removedForeignKeyNames, constraint.Name.String()) + } + } + // Write analysis: + } + if err := e.updateSchemaAnalysis(ctx, onlineDDL.UUID, + 0, 0, "", strings.Join(sqlescape.EscapeIDs(removedForeignKeyNames), ","), "", "", "", + ); err != nil { + return err + } + return nil +} + func (e *Executor) executeDropDDLActionMigration(ctx context.Context, onlineDDL *schema.OnlineDDL) error { failMigration := func(err error) error { return e.failMigration(ctx, onlineDDL, err) @@ -2735,6 +2804,10 @@ func (e *Executor) executeDropDDLActionMigration(ctx context.Context, onlineDDL return failMigration(err) } + if err := e.analyzeDropDDLActionMigration(ctx, onlineDDL); err != nil { + return failMigration(err) + } + var toTableName string onlineDDL.SQL, toTableName, err = schema.GenerateRenameStatementWithUUID(onlineDDL.Table, schema.HoldTableGCState, onlineDDL.GetGCUUID(), newGCTableRetainTime()) if err != nil { @@ -2961,7 +3034,7 @@ func (e *Executor) executeSpecialAlterDDLActionMigrationIfApplicable(ctx context } // Apply CREATE TABLE for artifact table - if _, err := e.createTableLike(ctx, artifactTableName, onlineDDL, conn); err != nil { + if _, _, err := e.createDuplicateTableLike(ctx, artifactTableName, onlineDDL, conn); err != nil { return err } // Remove partitioning @@ -4150,13 +4223,15 @@ func (e *Executor) updateMigrationMessage(ctx context.Context, uuid string, mess } func (e *Executor) updateSchemaAnalysis(ctx context.Context, uuid string, - addedUniqueKeys, removedUnqiueKeys int, removedUniqueKeyNames string, + addedUniqueKeys, removedUniqueKeys int, removedUniqueKeyNames string, + removedForeignKeyNames string, droppedNoDefaultColumnNames string, expandedColumnNames string, revertibleNotes string) error { query, err := sqlparser.ParseAndBind(sqlUpdateSchemaAnalysis, sqltypes.Int64BindVariable(int64(addedUniqueKeys)), - sqltypes.Int64BindVariable(int64(removedUnqiueKeys)), + sqltypes.Int64BindVariable(int64(removedUniqueKeys)), sqltypes.StringBindVariable(removedUniqueKeyNames), + sqltypes.StringBindVariable(removedForeignKeyNames), sqltypes.StringBindVariable(droppedNoDefaultColumnNames), sqltypes.StringBindVariable(expandedColumnNames), sqltypes.StringBindVariable(revertibleNotes), diff --git a/go/vt/vttablet/onlineddl/executor_test.go b/go/vt/vttablet/onlineddl/executor_test.go index 560f2ebe132..4eb0d54a418 100644 --- a/go/vt/vttablet/onlineddl/executor_test.go +++ b/go/vt/vttablet/onlineddl/executor_test.go @@ -318,3 +318,41 @@ func TestAddInstantAlgorithm(t *testing.T) { }) } } + +func TestDuplicateCreateTable(t *testing.T) { + e := Executor{} + ctx := context.Background() + onlineDDL := &schema.OnlineDDL{UUID: "a5a563da_dc1a_11ec_a416_0a43f95f28a3", Table: "something", Strategy: "vitess", Options: "--unsafe-allow-foreign-keys"} + + tcases := []struct { + sql string + newName string + expectSQL string + expectMapSize int + }{ + { + sql: "create table t (id int primary key)", + newName: "mytable", + expectSQL: "create table mytable (\n\tid int primary key\n)", + }, + { + sql: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", + newName: "mytable", + expectSQL: "create table mytable (\n\tid int primary key,\n\ti int,\n\tconstraint f_bjj16562shq086ozik3zf6kjg foreign key (i) references parent (id) on delete cascade\n)", + expectMapSize: 1, + }, + } + for _, tcase := range tcases { + t.Run(tcase.sql, func(t *testing.T) { + originalCreateTable, newCreateTable, constraintMap, err := e.duplicateCreateTable(ctx, onlineDDL, tcase.sql, tcase.newName) + assert.NoError(t, err) + assert.NotNil(t, originalCreateTable) + assert.NotNil(t, newCreateTable) + assert.NotNil(t, constraintMap) + + newSQL := sqlparser.String(newCreateTable) + assert.Equal(t, tcase.expectSQL, newSQL) + assert.Equal(t, tcase.expectMapSize, len(constraintMap)) + }) + } +} diff --git a/go/vt/vttablet/onlineddl/schema.go b/go/vt/vttablet/onlineddl/schema.go index f39feb76d80..1cef44e08d3 100644 --- a/go/vt/vttablet/onlineddl/schema.go +++ b/go/vt/vttablet/onlineddl/schema.go @@ -202,6 +202,7 @@ const ( ` sqlUpdateSchemaAnalysis = `UPDATE _vt.schema_migrations SET added_unique_keys=%a, removed_unique_keys=%a, removed_unique_key_names=%a, + removed_foreign_key_names=%a, dropped_no_default_column_names=%a, expanded_column_names=%a, revertible_notes=%a WHERE diff --git a/go/vt/vttablet/onlineddl/vrepl.go b/go/vt/vttablet/onlineddl/vrepl.go index cc669e11c11..8432f79b506 100644 --- a/go/vt/vttablet/onlineddl/vrepl.go +++ b/go/vt/vttablet/onlineddl/vrepl.go @@ -106,6 +106,9 @@ type VRepl struct { alterQuery string tableRows int64 + originalShowCreateTable string + vreplShowCreateTable string + analyzeTable bool sourceSharedColumns *vrepl.ColumnList @@ -119,8 +122,9 @@ type VRepl struct { chosenSourceUniqueKey *vrepl.UniqueKey chosenTargetUniqueKey *vrepl.UniqueKey - addedUniqueKeys []*vrepl.UniqueKey - removedUniqueKeys []*vrepl.UniqueKey + addedUniqueKeys []*vrepl.UniqueKey + removedUniqueKeys []*vrepl.UniqueKey + removedForeignKeyNames []string revertibleNotes string filterQuery string @@ -134,20 +138,32 @@ type VRepl struct { } // NewVRepl creates a VReplication handler for Online DDL -func NewVRepl(workflow, keyspace, shard, dbName, sourceTable, targetTable, alterQuery string, analyzeTable bool) *VRepl { +func NewVRepl(workflow string, + keyspace string, + shard string, + dbName string, + sourceTable string, + targetTable string, + originalShowCreateTable string, + vreplShowCreateTable string, + alterQuery string, + analyzeTable bool, +) *VRepl { return &VRepl{ - workflow: workflow, - keyspace: keyspace, - shard: shard, - dbName: dbName, - sourceTable: sourceTable, - targetTable: targetTable, - alterQuery: alterQuery, - analyzeTable: analyzeTable, - parser: vrepl.NewAlterTableParser(), - enumToTextMap: map[string]string{}, - intToEnumMap: map[string]bool{}, - convertCharset: map[string](*binlogdatapb.CharsetConversion){}, + workflow: workflow, + keyspace: keyspace, + shard: shard, + dbName: dbName, + sourceTable: sourceTable, + targetTable: targetTable, + originalShowCreateTable: originalShowCreateTable, + vreplShowCreateTable: vreplShowCreateTable, + alterQuery: alterQuery, + analyzeTable: analyzeTable, + parser: vrepl.NewAlterTableParser(), + enumToTextMap: map[string]string{}, + intToEnumMap: map[string]bool{}, + convertCharset: map[string](*binlogdatapb.CharsetConversion){}, } } @@ -408,6 +424,10 @@ func (v *VRepl) analyzeTables(ctx context.Context, conn *dbconnpool.DBConnection } v.addedUniqueKeys = vrepl.AddedUniqueKeys(sourceUniqueKeys, targetUniqueKeys, v.parser.ColumnRenameMap()) v.removedUniqueKeys = vrepl.RemovedUniqueKeys(sourceUniqueKeys, targetUniqueKeys, v.parser.ColumnRenameMap()) + v.removedForeignKeyNames, err = vrepl.RemovedForeignKeyNames(v.originalShowCreateTable, v.vreplShowCreateTable) + if err != nil { + return err + } // chosen source & target unique keys have exact columns in same order sharedPKColumns := &v.chosenSourceUniqueKey.Columns @@ -460,6 +480,9 @@ func (v *VRepl) analyzeTables(ctx context.Context, conn *dbconnpool.DBConnection for _, name := range v.expandedColumnNames { notes = append(notes, fmt.Sprintf("column %s: %s", name, expandedDescriptions[name])) } + for _, name := range v.removedForeignKeyNames { + notes = append(notes, fmt.Sprintf("foreign key %s dropped", name)) + } v.revertibleNotes = strings.Join(notes, "\n") if err != nil { return err diff --git a/go/vt/vttablet/onlineddl/vrepl/foreign_key.go b/go/vt/vttablet/onlineddl/vrepl/foreign_key.go new file mode 100644 index 00000000000..f0925594ec0 --- /dev/null +++ b/go/vt/vttablet/onlineddl/vrepl/foreign_key.go @@ -0,0 +1,53 @@ +/* + Copyright 2016 GitHub Inc. + See https://github.com/github/gh-ost/blob/master/LICENSE +*/ +/* +Copyright 2021 The Vitess Authors. + +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 vrepl + +import ( + "vitess.io/vitess/go/vt/schemadiff" + "vitess.io/vitess/go/vt/sqlparser" +) + +// RemovedForeignKeyNames returns the names of removed foreign keys, ignoring mere name changes +func RemovedForeignKeyNames( + originalCreateTable string, + vreplCreateTable string, +) (names []string, err error) { + if originalCreateTable == "" || vreplCreateTable == "" { + return nil, nil + } + diffHints := schemadiff.DiffHints{ConstraintNamesStrategy: schemadiff.ConstraintNamesIgnoreAll} + diff, err := schemadiff.DiffCreateTablesQueries(originalCreateTable, vreplCreateTable, &diffHints) + if err != nil { + return nil, err + } + + validateWalk := func(node sqlparser.SQLNode) (kontinue bool, err error) { + switch node := node.(type) { + case *sqlparser.DropKey: + if node.Type == sqlparser.ForeignKeyType { + names = append(names, node.Name.String()) + } + } + return true, nil + } + _ = sqlparser.Walk(validateWalk, diff.Statement()) // We never return an error + return names, nil +} diff --git a/go/vt/vttablet/onlineddl/vrepl/foreign_key_test.go b/go/vt/vttablet/onlineddl/vrepl/foreign_key_test.go new file mode 100644 index 00000000000..619ba4847d9 --- /dev/null +++ b/go/vt/vttablet/onlineddl/vrepl/foreign_key_test.go @@ -0,0 +1,74 @@ +/* + Copyright 2016 GitHub Inc. + See https://github.com/github/gh-ost/blob/master/LICENSE +*/ +/* +Copyright 2021 The Vitess Authors. + +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 vrepl + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestRemovedForeignKeyNames(t *testing.T) { + + tcases := []struct { + before string + after string + names []string + }{ + { + before: "create table t (id int primary key)", + after: "create table t (id2 int primary key, i int)", + }, + { + before: "create table t (id int primary key)", + after: "create table t2 (id2 int primary key, i int)", + }, + { + before: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", + after: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", + }, + { + before: "create table t (id int primary key, i int, constraint f1 foreign key (i) references parent (id) on delete cascade)", + after: "create table t (id int primary key, i int, constraint f2 foreign key (i) references parent (id) on delete cascade)", + }, + { + before: "create table t (id int primary key, i int, constraint f foreign key (i) references parent (id) on delete cascade)", + after: "create table t (id int primary key, i int)", + names: []string{"f"}, + }, + { + before: "create table t (id int primary key, i int, i2 int, constraint f1 foreign key (i) references parent (id) on delete cascade, constraint fi2 foreign key (i2) references parent (id) on delete cascade)", + after: "create table t (id int primary key, i int, i2 int, constraint f2 foreign key (i) references parent (id) on delete cascade)", + names: []string{"fi2"}, + }, + { + before: "create table t1 (id int primary key, i int, constraint `check1` CHECK ((`i` < 5)))", + after: "create table t2 (id int primary key, i int)", + }, + } + for _, tcase := range tcases { + t.Run(tcase.before, func(t *testing.T) { + names, err := RemovedForeignKeyNames(tcase.before, tcase.after) + assert.NoError(t, err) + assert.Equal(t, tcase.names, names) + }) + } +} diff --git a/proto/vtctldata.proto b/proto/vtctldata.proto index cfa77dde335..3d59ea1bd5e 100644 --- a/proto/vtctldata.proto +++ b/proto/vtctldata.proto @@ -167,6 +167,7 @@ message SchemaMigration { bool is_immediate_operation = 51; vttime.Time reviewed_at = 52; vttime.Time ready_to_complete_at = 53; + string removed_foreign_key_names = 54; enum Strategy { option allow_alias = true; diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index 080198d420c..398d93080dc 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -42783,6 +42783,9 @@ export namespace vtctldata { /** SchemaMigration ready_to_complete_at */ ready_to_complete_at?: (vttime.ITime|null); + + /** SchemaMigration removed_foreign_key_names */ + removed_foreign_key_names?: (string|null); } /** Represents a SchemaMigration. */ @@ -42953,6 +42956,9 @@ export namespace vtctldata { /** SchemaMigration ready_to_complete_at. */ public ready_to_complete_at?: (vttime.ITime|null); + /** SchemaMigration removed_foreign_key_names. */ + public removed_foreign_key_names: string; + /** * Creates a new SchemaMigration instance using the specified properties. * @param [properties] Properties to set diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index 59c5b95baa8..9ddce1d0059 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -104161,6 +104161,7 @@ export const vtctldata = $root.vtctldata = (() => { * @property {boolean|null} [is_immediate_operation] SchemaMigration is_immediate_operation * @property {vttime.ITime|null} [reviewed_at] SchemaMigration reviewed_at * @property {vttime.ITime|null} [ready_to_complete_at] SchemaMigration ready_to_complete_at + * @property {string|null} [removed_foreign_key_names] SchemaMigration removed_foreign_key_names */ /** @@ -104602,6 +104603,14 @@ export const vtctldata = $root.vtctldata = (() => { */ SchemaMigration.prototype.ready_to_complete_at = null; + /** + * SchemaMigration removed_foreign_key_names. + * @member {string} removed_foreign_key_names + * @memberof vtctldata.SchemaMigration + * @instance + */ + SchemaMigration.prototype.removed_foreign_key_names = ""; + /** * Creates a new SchemaMigration instance using the specified properties. * @function create @@ -104732,6 +104741,8 @@ export const vtctldata = $root.vtctldata = (() => { $root.vttime.Time.encode(message.reviewed_at, writer.uint32(/* id 52, wireType 2 =*/418).fork()).ldelim(); if (message.ready_to_complete_at != null && Object.hasOwnProperty.call(message, "ready_to_complete_at")) $root.vttime.Time.encode(message.ready_to_complete_at, writer.uint32(/* id 53, wireType 2 =*/426).fork()).ldelim(); + if (message.removed_foreign_key_names != null && Object.hasOwnProperty.call(message, "removed_foreign_key_names")) + writer.uint32(/* id 54, wireType 2 =*/434).string(message.removed_foreign_key_names); return writer; }; @@ -104978,6 +104989,10 @@ export const vtctldata = $root.vtctldata = (() => { message.ready_to_complete_at = $root.vttime.Time.decode(reader, reader.uint32()); break; } + case 54: { + message.removed_foreign_key_names = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -105218,6 +105233,9 @@ export const vtctldata = $root.vtctldata = (() => { if (error) return "ready_to_complete_at." + error; } + if (message.removed_foreign_key_names != null && message.hasOwnProperty("removed_foreign_key_names")) + if (!$util.isString(message.removed_foreign_key_names)) + return "removed_foreign_key_names: string expected"; return null; }; @@ -105481,6 +105499,8 @@ export const vtctldata = $root.vtctldata = (() => { throw TypeError(".vtctldata.SchemaMigration.ready_to_complete_at: object expected"); message.ready_to_complete_at = $root.vttime.Time.fromObject(object.ready_to_complete_at); } + if (object.removed_foreign_key_names != null) + message.removed_foreign_key_names = String(object.removed_foreign_key_names); return message; }; @@ -105571,6 +105591,7 @@ export const vtctldata = $root.vtctldata = (() => { object.is_immediate_operation = false; object.reviewed_at = null; object.ready_to_complete_at = null; + object.removed_foreign_key_names = ""; } if (message.uuid != null && message.hasOwnProperty("uuid")) object.uuid = message.uuid; @@ -105693,6 +105714,8 @@ export const vtctldata = $root.vtctldata = (() => { object.reviewed_at = $root.vttime.Time.toObject(message.reviewed_at, options); if (message.ready_to_complete_at != null && message.hasOwnProperty("ready_to_complete_at")) object.ready_to_complete_at = $root.vttime.Time.toObject(message.ready_to_complete_at, options); + if (message.removed_foreign_key_names != null && message.hasOwnProperty("removed_foreign_key_names")) + object.removed_foreign_key_names = message.removed_foreign_key_names; return object; }; From a15ef42929c5d44bd78c960619f672bd50976198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicent=20Mart=C3=AD?= <42793+vmg@users.noreply.github.com> Date: Tue, 7 Nov 2023 11:41:12 +0100 Subject: [PATCH 13/39] Tiny Weights (#14402) Signed-off-by: Vicent Marti --- go/hack/runtime.go | 7 +- go/mysql/collations/colldata/8bit.go | 18 ++ go/mysql/collations/colldata/collation.go | 8 + go/mysql/collations/colldata/uca.go | 23 ++ go/mysql/collations/colldata/uca_test.go | 56 ++++ go/mysql/fastparse/fastparse.go | 2 +- go/sqltypes/bind_variables.go | 4 +- go/sqltypes/parse_rows.go | 10 +- go/sqltypes/result.go | 10 +- go/sqltypes/testing.go | 2 +- go/sqltypes/value.go | 119 +++++--- go/vt/vtgate/engine/aggregations.go | 20 +- go/vt/vtgate/engine/cached_size.go | 12 +- go/vt/vtgate/engine/comparer.go | 78 ----- go/vt/vtgate/engine/comparer_test.go | 114 ------- go/vt/vtgate/engine/distinct.go | 4 +- go/vt/vtgate/engine/fake_vcursor_test.go | 12 +- go/vt/vtgate/engine/memory_sort.go | 108 +------ go/vt/vtgate/engine/memory_sort_test.go | 22 +- go/vt/vtgate/engine/merge_sort.go | 131 ++------ go/vt/vtgate/engine/merge_sort_test.go | 16 +- go/vt/vtgate/engine/ordered_aggregate.go | 11 +- go/vt/vtgate/engine/route.go | 73 +---- go/vt/vtgate/engine/route_test.go | 22 +- go/vt/vtgate/evalengine/api_compare.go | 288 +++++++++++++++++- go/vt/vtgate/evalengine/api_compare_test.go | 70 +++++ go/vt/vtgate/evalengine/weights.go | 130 ++++++++ go/vt/vtgate/evalengine/weights_test.go | 74 +++++ go/vt/vtgate/executor_framework_test.go | 38 ++- go/vt/vtgate/executor_select_test.go | 51 ++-- .../planbuilder/operator_transformers.go | 13 +- go/vt/vttablet/tabletmanager/vdiff/utils.go | 4 +- go/vt/wrangler/vdiff.go | 4 +- 33 files changed, 939 insertions(+), 615 deletions(-) delete mode 100644 go/vt/vtgate/engine/comparer.go delete mode 100644 go/vt/vtgate/engine/comparer_test.go diff --git a/go/hack/runtime.go b/go/hack/runtime.go index 724a6c34f8d..5f6b946e33d 100644 --- a/go/hack/runtime.go +++ b/go/hack/runtime.go @@ -52,8 +52,11 @@ func RuntimeAllocSize(size int64) int64 { return int64(roundupsize(uintptr(size))) } -//go:linkname ParseFloatPrefix strconv.parseFloatPrefix -func ParseFloatPrefix(s string, bitSize int) (float64, int, error) +//go:linkname Atof64 strconv.atof64 +func Atof64(s string) (float64, int, error) + +//go:linkname Atof32 strconv.atof32 +func Atof32(s string) (float32, int, error) //go:linkname FastRand runtime.fastrand func FastRand() uint32 diff --git a/go/mysql/collations/colldata/8bit.go b/go/mysql/collations/colldata/8bit.go index 2355888bbab..67ae8541d56 100644 --- a/go/mysql/collations/colldata/8bit.go +++ b/go/mysql/collations/colldata/8bit.go @@ -17,6 +17,8 @@ limitations under the License. package colldata import ( + "encoding/binary" + "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/mysql/collations/charset" "vitess.io/vitess/go/vt/vthash" @@ -168,6 +170,16 @@ func (c *Collation_8bit_simple_ci) Collate(left, right []byte, rightIsPrefix boo return len(left) - len(right) } +func (c *Collation_8bit_simple_ci) TinyWeightString(src []byte) uint32 { + var w32 [4]byte + sortOrder := c.sort + sortLen := min(4, len(src)) + for i := 0; i < sortLen; i++ { + w32[i] = sortOrder[src[i]] + } + return binary.BigEndian.Uint32(w32[:4]) +} + func (c *Collation_8bit_simple_ci) WeightString(dst, src []byte, numCodepoints int) []byte { padToMax := false sortOrder := c.sort @@ -272,6 +284,12 @@ func (c *Collation_binary) Collate(left, right []byte, isPrefix bool) int { return collationBinary(left, right, isPrefix) } +func (c *Collation_binary) TinyWeightString(src []byte) uint32 { + var w32 [4]byte + copy(w32[:4], src) + return binary.BigEndian.Uint32(w32[:4]) +} + func (c *Collation_binary) WeightString(dst, src []byte, numCodepoints int) []byte { padToMax := false copyCodepoints := len(src) diff --git a/go/mysql/collations/colldata/collation.go b/go/mysql/collations/colldata/collation.go index ec66fc09b58..7697c08cbed 100644 --- a/go/mysql/collations/colldata/collation.go +++ b/go/mysql/collations/colldata/collation.go @@ -155,6 +155,14 @@ type CaseAwareCollation interface { ToLower(dst []byte, src []byte) []byte } +// TinyWeightCollation implements the TinyWeightString API for collations. +type TinyWeightCollation interface { + Collation + // TinyWeightString returns a 32-bit weight string for a source string based on this collation. + // This is usually the 4-byte prefix of the full weight string, calculated more efficiently. + TinyWeightString(src []byte) uint32 +} + func Lookup(id collations.ID) Collation { if int(id) >= len(collationsById) { return nil diff --git a/go/mysql/collations/colldata/uca.go b/go/mysql/collations/colldata/uca.go index 4b7272bfbc3..a59dbf024bd 100644 --- a/go/mysql/collations/colldata/uca.go +++ b/go/mysql/collations/colldata/uca.go @@ -18,6 +18,7 @@ package colldata import ( "bytes" + "encoding/binary" "math/bits" "vitess.io/vitess/go/mysql/collations" @@ -119,6 +120,28 @@ nextLevel: return int(l) - int(r) } +func (c *Collation_utf8mb4_uca_0900) TinyWeightString(src []byte) uint32 { + it := c.uca.Iterator(src) + defer it.Done() + + if fast, ok := it.(*uca.FastIterator900); ok { + var chunk [16]byte + fast.NextWeightBlock64(chunk[:16]) + return binary.BigEndian.Uint32(chunk[:4]) + } + + var w32 uint32 + w, ok := it.Next() + if ok { + w32 = uint32(w) << 16 + w, ok = it.Next() + if ok { + w32 |= uint32(w) + } + } + return w32 +} + func (c *Collation_utf8mb4_uca_0900) WeightString(dst, src []byte, numCodepoints int) []byte { it := c.uca.Iterator(src) defer it.Done() diff --git a/go/mysql/collations/colldata/uca_test.go b/go/mysql/collations/colldata/uca_test.go index 70c9312636e..e00fb5fd6d1 100644 --- a/go/mysql/collations/colldata/uca_test.go +++ b/go/mysql/collations/colldata/uca_test.go @@ -805,6 +805,62 @@ func TestCompareWithWeightString(t *testing.T) { } } +func TestTinyWeightStrings(t *testing.T) { + var Collations = []Collation{ + testcollation(t, "utf8mb4_0900_as_cs"), + testcollation(t, "utf8mb4_0900_as_ci"), + testcollation(t, "utf8mb4_0900_ai_ci"), + } + + var Strings = []string{ + "a", "A", "aa", "AA", "aaa", "AAA", "aaaa", "AAAA", + "b", "B", "BB", "BB", "bbb", "BBB", "bbbb", "BBBB", + "Abc", "aBC", + "ǍḄÇ", "ÁḆĈ", + "\uA73A", "\uA738", + "\uAC00", "\u326E", + ExampleString, + ExampleStringLong, + JapaneseString, + WhitespaceString, + HungarianString, + JapaneseString2, + ChineseString, + ChineseString2, + SpanishString, + EnglishString, + } + + for _, coll := range Collations { + tw := coll.(TinyWeightCollation) + + for _, a := range Strings { + aw := tw.TinyWeightString([]byte(a)) + + for _, b := range Strings { + bw := tw.TinyWeightString([]byte(b)) + cmp := tw.Collate([]byte(a), []byte(b), false) + + switch { + case cmp == 0: + if aw != bw { + t.Errorf("[%s] %q vs %q: should be equal, got %08x / %08x", coll.Name(), a, b, aw, bw) + } + case cmp < 0: + if aw > bw { + t.Errorf("[%s] %q vs %q: should be <=, got %08x / %08x", coll.Name(), a, b, aw, bw) + } + case cmp > 0: + if aw < bw { + t.Errorf("[%s] %q vs %q: should be >= got %08x / %08x", coll.Name(), a, b, aw, bw) + } + } + } + } + } + +} + func TestFastIterators(t *testing.T) { allASCIICharacters := make([]byte, 128) for n := range allASCIICharacters { diff --git a/go/mysql/fastparse/fastparse.go b/go/mysql/fastparse/fastparse.go index 33aa16105c2..f9aca692abd 100644 --- a/go/mysql/fastparse/fastparse.go +++ b/go/mysql/fastparse/fastparse.go @@ -234,7 +234,7 @@ func ParseFloat64(s string) (float64, error) { // We only care to parse as many of the initial float characters of the // string as possible. This functionality is implemented in the `strconv` package // of the standard library, but not exposed, so we hook into it. - val, l, err := hack.ParseFloatPrefix(s[ws:], 64) + val, l, err := hack.Atof64(s[ws:]) for l < len(s[ws:]) { if !isSpace(s[ws+uint(l)]) { break diff --git a/go/sqltypes/bind_variables.go b/go/sqltypes/bind_variables.go index 041730ec517..18beda37702 100644 --- a/go/sqltypes/bind_variables.go +++ b/go/sqltypes/bind_variables.go @@ -49,7 +49,7 @@ func TupleToProto(v []Value) *querypb.Value { // ValueToProto converts Value to a *querypb.Value. func ValueToProto(v Value) *querypb.Value { - return &querypb.Value{Type: v.typ, Value: v.val} + return &querypb.Value{Type: v.Type(), Value: v.val} } // ProtoToValue converts a *querypb.Value to a Value. @@ -143,7 +143,7 @@ func BytesBindVariable(v []byte) *querypb.BindVariable { // ValueBindVariable converts a Value to a bind var. func ValueBindVariable(v Value) *querypb.BindVariable { - return &querypb.BindVariable{Type: v.typ, Value: v.val} + return &querypb.BindVariable{Type: v.Type(), Value: v.val} } // BuildBindVariable builds a *querypb.BindVariable from a valid input type. diff --git a/go/sqltypes/parse_rows.go b/go/sqltypes/parse_rows.go index 2654141ed3b..5e1db627c8b 100644 --- a/go/sqltypes/parse_rows.go +++ b/go/sqltypes/parse_rows.go @@ -19,7 +19,7 @@ package sqltypes import ( "fmt" "io" - "reflect" + "slices" "strconv" "strings" "text/scanner" @@ -127,6 +127,12 @@ func (e *RowMismatchError) Error() string { return fmt.Sprintf("results differ: %v\n\twant: %v\n\tgot: %v", e.err, e.want, e.got) } +func RowEqual(want, got Row) bool { + return slices.EqualFunc(want, got, func(a, b Value) bool { + return a.Equal(b) + }) +} + func RowsEquals(want, got []Row) error { if len(want) != len(got) { return &RowMismatchError{ @@ -143,7 +149,7 @@ func RowsEquals(want, got []Row) error { if matched[i] { continue } - if reflect.DeepEqual(aa, bb) { + if RowEqual(aa, bb) { matched[i] = true ok = true break diff --git a/go/sqltypes/result.go b/go/sqltypes/result.go index 7c04e1d89fa..389b7fff620 100644 --- a/go/sqltypes/result.go +++ b/go/sqltypes/result.go @@ -19,7 +19,7 @@ package sqltypes import ( "crypto/sha256" "fmt" - "reflect" + "slices" "google.golang.org/protobuf/proto" @@ -69,8 +69,8 @@ func (result *Result) Repair(fields []*querypb.Field) { // Usage of j is intentional. for j, f := range fields { for _, r := range result.Rows { - if r[j].typ != Null { - r[j].typ = f.Type + if r[j].Type() != Null { + r[j].typ = uint16(f.Type) } } } @@ -198,7 +198,9 @@ func (result *Result) Equal(other *Result) bool { return FieldsEqual(result.Fields, other.Fields) && result.RowsAffected == other.RowsAffected && result.InsertID == other.InsertID && - reflect.DeepEqual(result.Rows, other.Rows) + slices.EqualFunc(result.Rows, other.Rows, func(a, b Row) bool { + return RowEqual(a, b) + }) } // ResultsEqual compares two arrays of Result. diff --git a/go/sqltypes/testing.go b/go/sqltypes/testing.go index 9042acf6680..3894635eae0 100644 --- a/go/sqltypes/testing.go +++ b/go/sqltypes/testing.go @@ -147,7 +147,7 @@ func TestValue(typ querypb.Type, val string) Value { // This function should only be used for testing. func TestTuple(vals ...Value) Value { return Value{ - typ: Tuple, + typ: uint16(Tuple), val: encodeTuple(vals), } } diff --git a/go/sqltypes/value.go b/go/sqltypes/value.go index 331c494710e..45415814700 100644 --- a/go/sqltypes/value.go +++ b/go/sqltypes/value.go @@ -18,6 +18,7 @@ limitations under the License. package sqltypes import ( + "bytes" "encoding/base64" "encoding/hex" "encoding/json" @@ -52,6 +53,11 @@ var ( ErrIncompatibleTypeCast = errors.New("Cannot convert value to desired type") ) +const ( + // flagTinyWeight marks this Value as having a Tiny Weight String + flagTinyWeight = 0x1 +) + type ( // BinWriter interface is used for encoding values. // Types like bytes.Buffer conform to this interface. @@ -65,7 +71,15 @@ type ( // an integral type, the bytes are always stored as a canonical // representation that matches how MySQL returns such values. Value struct { - typ querypb.Type + // typ is the value's sqltypes.Type (this always fits in 16 bits) + typ uint16 + // flags are the flags set for this Value; right now this field is only + // used to track whether tinyweight is set + flags uint16 + // tinyweight is a weight string prefix for this Value. + // See: evalengine.TinyWeighter + tinyweight uint32 + // val is the raw byte representation of this Value val []byte } @@ -114,7 +128,7 @@ func MakeTrusted(typ querypb.Type, val []byte) Value { if typ == Null { return NULL } - return Value{typ: typ, val: val} + return Value{typ: uint16(typ), val: val} } // NewHexNum builds an Hex Value. @@ -271,7 +285,7 @@ func InterfaceToValue(goval any) (Value, error) { // Type returns the type of Value. func (v Value) Type() querypb.Type { - return v.typ + return querypb.Type(v.typ) } // Raw returns the internal representation of the value. For newer types, @@ -292,7 +306,7 @@ func (v Value) RawStr() string { // match MySQL's representation for hex encoded binary data or newer types. // If the value is not convertible like in the case of Expression, it returns an error. func (v Value) ToBytes() ([]byte, error) { - switch v.typ { + switch v.Type() { case Expression: return nil, vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "expression cannot be converted to bytes") case HexVal: // TODO: all the decode below have problem when decoding odd number of bytes. This needs to be fixed. @@ -345,7 +359,7 @@ func (v Value) ToInt() (int, error) { // ToFloat64 returns the value as MySQL would return it as a float64. func (v Value) ToFloat64() (float64, error) { - if !IsNumber(v.typ) { + if !IsNumber(v.Type()) { return 0, ErrIncompatibleTypeCast } @@ -403,7 +417,7 @@ func (v Value) ToBool() (bool, error) { // ToString returns the value as MySQL would return it as string. // If the value is not convertible like in the case of Expression, it returns nil. func (v Value) ToString() string { - if v.typ == Expression { + if v.Type() == Expression { return "" } return hack.String(v.val) @@ -411,23 +425,23 @@ func (v Value) ToString() string { // String returns a printable version of the value. func (v Value) String() string { - if v.typ == Null { + if v.Type() == Null { return "NULL" } - if v.IsQuoted() || v.typ == Bit { - return fmt.Sprintf("%v(%q)", v.typ, v.val) + if v.IsQuoted() || v.Type() == Bit { + return fmt.Sprintf("%v(%q)", Type(v.typ), v.val) } - return fmt.Sprintf("%v(%s)", v.typ, v.val) + return fmt.Sprintf("%v(%s)", Type(v.typ), v.val) } // EncodeSQL encodes the value into an SQL statement. Can be binary. func (v Value) EncodeSQL(b BinWriter) { switch { - case v.typ == Null: + case v.Type() == Null: b.Write(NullBytes) case v.IsQuoted(): encodeBytesSQL(v.val, b) - case v.typ == Bit: + case v.Type() == Bit: encodeBytesSQLBits(v.val, b) default: b.Write(v.val) @@ -438,13 +452,13 @@ func (v Value) EncodeSQL(b BinWriter) { // as its writer, so it can be inlined for performance. func (v Value) EncodeSQLStringBuilder(b *strings.Builder) { switch { - case v.typ == Null: + case v.Type() == Null: b.Write(NullBytes) case v.IsQuoted(): encodeBytesSQLStringBuilder(v.val, b) - case v.typ == Bit: + case v.Type() == Bit: encodeBytesSQLBits(v.val, b) - case v.typ == Tuple: + case v.Type() == Tuple: b.WriteByte('(') var i int _ = v.ForEachValue(func(bv Value) { @@ -464,11 +478,11 @@ func (v Value) EncodeSQLStringBuilder(b *strings.Builder) { // as its writer, so it can be inlined for performance. func (v Value) EncodeSQLBytes2(b *bytes2.Buffer) { switch { - case v.typ == Null: + case v.Type() == Null: b.Write(NullBytes) case v.IsQuoted(): encodeBytesSQLBytes2(v.val, b) - case v.typ == Bit: + case v.Type() == Bit: encodeBytesSQLBits(v.val, b) default: b.Write(v.val) @@ -478,9 +492,9 @@ func (v Value) EncodeSQLBytes2(b *bytes2.Buffer) { // EncodeASCII encodes the value using 7-bit clean ascii bytes. func (v Value) EncodeASCII(b BinWriter) { switch { - case v.typ == Null: + case v.Type() == Null: b.Write(NullBytes) - case v.IsQuoted() || v.typ == Bit: + case v.IsQuoted() || v.Type() == Bit: encodeBytesASCII(v.val, b) default: b.Write(v.val) @@ -489,75 +503,75 @@ func (v Value) EncodeASCII(b BinWriter) { // IsNull returns true if Value is null. func (v Value) IsNull() bool { - return v.typ == Null + return v.Type() == Null } // IsIntegral returns true if Value is an integral. func (v Value) IsIntegral() bool { - return IsIntegral(v.typ) + return IsIntegral(v.Type()) } // IsSigned returns true if Value is a signed integral. func (v Value) IsSigned() bool { - return IsSigned(v.typ) + return IsSigned(v.Type()) } // IsUnsigned returns true if Value is an unsigned integral. func (v Value) IsUnsigned() bool { - return IsUnsigned(v.typ) + return IsUnsigned(v.Type()) } // IsFloat returns true if Value is a float. func (v Value) IsFloat() bool { - return IsFloat(v.typ) + return IsFloat(v.Type()) } // IsQuoted returns true if Value must be SQL-quoted. func (v Value) IsQuoted() bool { - return IsQuoted(v.typ) + return IsQuoted(v.Type()) } // IsText returns true if Value is a collatable text. func (v Value) IsText() bool { - return IsText(v.typ) + return IsText(v.Type()) } // IsBinary returns true if Value is binary. func (v Value) IsBinary() bool { - return IsBinary(v.typ) + return IsBinary(v.Type()) } // IsDateTime returns true if Value is datetime. func (v Value) IsDateTime() bool { - return v.typ == querypb.Type_DATETIME + return v.Type() == querypb.Type_DATETIME } // IsTimestamp returns true if Value is date. func (v Value) IsTimestamp() bool { - return v.typ == querypb.Type_TIMESTAMP + return v.Type() == querypb.Type_TIMESTAMP } // IsDate returns true if Value is date. func (v Value) IsDate() bool { - return v.typ == querypb.Type_DATE + return v.Type() == querypb.Type_DATE } // IsTime returns true if Value is time. func (v Value) IsTime() bool { - return v.typ == querypb.Type_TIME + return v.Type() == querypb.Type_TIME } // IsDecimal returns true if Value is a decimal. func (v Value) IsDecimal() bool { - return IsDecimal(v.typ) + return IsDecimal(v.Type()) } // IsComparable returns true if the Value is null safe comparable without collation information. func (v *Value) IsComparable() bool { - if v.typ == Null || IsNumber(v.typ) || IsBinary(v.typ) { + if v.Type() == Null || IsNumber(v.Type()) || IsBinary(v.Type()) { return true } - switch v.typ { + switch v.Type() { case Timestamp, Date, Time, Datetime, Enum, Set, TypeJSON, Bit: return true } @@ -568,9 +582,9 @@ func (v *Value) IsComparable() bool { // It's not a complete implementation. func (v Value) MarshalJSON() ([]byte, error) { switch { - case v.IsQuoted() || v.typ == Bit: + case v.IsQuoted() || v.Type() == Bit: return json.Marshal(v.ToString()) - case v.typ == Null: + case v.Type() == Null: return NullBytes, nil } return v.val, nil @@ -670,7 +684,7 @@ func encodeTuple(tuple []Value) []byte { } func (v *Value) ForEachValue(each func(bv Value)) error { - if v.typ != Tuple { + if v.Type() != Tuple { panic("Value.ForEachValue on non-tuple") } @@ -690,13 +704,42 @@ func (v *Value) ForEachValue(each func(bv Value)) error { } buf = buf[varlen:] - each(Value{val: buf[:sz], typ: Type(ty)}) + each(Value{val: buf[:sz], typ: uint16(ty)}) buf = buf[sz:] } return nil } +// Equal compares this Value to other. It ignores any flags set. +func (v Value) Equal(other Value) bool { + return v.typ == other.typ && bytes.Equal(v.val, other.val) +} + +// SetTinyWeight sets this Value's tiny weight string +func (v *Value) SetTinyWeight(w uint32) { + v.tinyweight = w + v.flags |= flagTinyWeight +} + +// TinyWeightCmp performs a fast comparison of this Value with other if both have a Tiny Weight String set. +// For any 2 instances of Value: if both instances have a Tiny Weight string, +// and the weight strings are **different**, the two values will sort accordingly to the 32-bit +// numerical sort of their tiny weight strings. Otherwise, the relative sorting of the two values +// will not be known, and they will require a full sort using e.g. evalengine.NullsafeCompare +// See: evalengine.TinyWeighter +func (v Value) TinyWeightCmp(other Value) int { + // both values need a tinyweight; otherwise the comparison is invalid + if v.flags&other.flags&flagTinyWeight == 0 { + return 0 + } + return int(int64(v.tinyweight) - int64(other.tinyweight)) +} + +func (v Value) TinyWeight() uint32 { + return v.tinyweight +} + func encodeBytesSQL(val []byte, b BinWriter) { buf := &bytes2.Buffer{} encodeBytesSQLBytes2(val, buf) diff --git a/go/vt/vtgate/engine/aggregations.go b/go/vt/vtgate/engine/aggregations.go index 33b80faab55..dd7a259d1b6 100644 --- a/go/vt/vtgate/engine/aggregations.go +++ b/go/vt/vtgate/engine/aggregations.go @@ -108,16 +108,20 @@ type aggregatorDistinct struct { func (a *aggregatorDistinct) shouldReturn(row []sqltypes.Value) (bool, error) { if a.column >= 0 { - if !a.last.IsNull() { - cmp, err := evalengine.NullsafeCompare(a.last, row[a.column], a.coll) - if err != nil { - return true, err - } - if cmp == 0 { - return true, nil + last := a.last + next := row[a.column] + if !last.IsNull() { + if last.TinyWeightCmp(next) == 0 { + cmp, err := evalengine.NullsafeCompare(last, next, a.coll) + if err != nil { + return true, err + } + if cmp == 0 { + return true, nil + } } } - a.last = row[a.column] + a.last = next } return false, nil } diff --git a/go/vt/vtgate/engine/cached_size.go b/go/vt/vtgate/engine/cached_size.go index 5e035a2e479..b70f83b192d 100644 --- a/go/vt/vtgate/engine/cached_size.go +++ b/go/vt/vtgate/engine/cached_size.go @@ -579,9 +579,9 @@ func (cached *MemorySort) CachedSize(alloc bool) int64 { if cc, ok := cached.UpperLimit.(cachedObject); ok { size += cc.CachedSize(true) } - // field OrderBy []vitess.io/vitess/go/vt/vtgate/engine.OrderByParams + // field OrderBy vitess.io/vitess/go/vt/vtgate/evalengine.Comparison { - size += hack.RuntimeAllocSize(int64(cap(cached.OrderBy)) * int64(39)) + size += hack.RuntimeAllocSize(int64(cap(cached.OrderBy)) * int64(27)) } // field Input vitess.io/vitess/go/vt/vtgate/engine.Primitive if cc, ok := cached.Input.(cachedObject); ok { @@ -606,9 +606,9 @@ func (cached *MergeSort) CachedSize(alloc bool) int64 { } } } - // field OrderBy []vitess.io/vitess/go/vt/vtgate/engine.OrderByParams + // field OrderBy vitess.io/vitess/go/vt/vtgate/evalengine.Comparison { - size += hack.RuntimeAllocSize(int64(cap(cached.OrderBy)) * int64(39)) + size += hack.RuntimeAllocSize(int64(cap(cached.OrderBy)) * int64(27)) } return size } @@ -799,9 +799,9 @@ func (cached *Route) CachedSize(alloc bool) int64 { size += hack.RuntimeAllocSize(int64(len(cached.TableName))) // field FieldQuery string size += hack.RuntimeAllocSize(int64(len(cached.FieldQuery))) - // field OrderBy []vitess.io/vitess/go/vt/vtgate/engine.OrderByParams + // field OrderBy vitess.io/vitess/go/vt/vtgate/evalengine.Comparison { - size += hack.RuntimeAllocSize(int64(cap(cached.OrderBy)) * int64(39)) + size += hack.RuntimeAllocSize(int64(cap(cached.OrderBy)) * int64(27)) } // field RoutingParameters *vitess.io/vitess/go/vt/vtgate/engine.RoutingParameters size += cached.RoutingParameters.CachedSize(true) diff --git a/go/vt/vtgate/engine/comparer.go b/go/vt/vtgate/engine/comparer.go deleted file mode 100644 index 591b1cf2be0..00000000000 --- a/go/vt/vtgate/engine/comparer.go +++ /dev/null @@ -1,78 +0,0 @@ -/* -Copyright 2021 The Vitess Authors. - -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 engine - -import ( - "vitess.io/vitess/go/mysql/collations" - "vitess.io/vitess/go/sqltypes" - "vitess.io/vitess/go/vt/vtgate/evalengine" -) - -// comparer is the struct that has the logic for comparing two rows in the result set -type comparer struct { - orderBy, weightString, starColFixedIndex int - collationID collations.ID - desc bool -} - -// compare compares two rows given the comparer and returns which one should be earlier in the result set -// -1 if the first row should be earlier -// 1 is the second row should be earlier -// 0 if both the rows have equal ordering -func (c *comparer) compare(r1, r2 []sqltypes.Value) (int, error) { - var colIndex int - if c.starColFixedIndex > c.orderBy && c.starColFixedIndex < len(r1) { - colIndex = c.starColFixedIndex - } else { - colIndex = c.orderBy - } - cmp, err := evalengine.NullsafeCompare(r1[colIndex], r2[colIndex], c.collationID) - if err != nil { - _, isComparisonErr := err.(evalengine.UnsupportedComparisonError) - _, isCollationErr := err.(evalengine.UnsupportedCollationError) - if !isComparisonErr && !isCollationErr || c.weightString == -1 { - return 0, err - } - // in case of a comparison or collation error switch to using the weight string column for ordering - c.orderBy = c.weightString - c.weightString = -1 - cmp, err = evalengine.NullsafeCompare(r1[c.orderBy], r2[c.orderBy], c.collationID) - if err != nil { - return 0, err - } - } - // change the result if descending ordering is required - if c.desc { - cmp = -cmp - } - return cmp, nil -} - -// extractSlices extracts the three fields of OrderByParams into a slice of comparers -func extractSlices(input []OrderByParams) []*comparer { - var result []*comparer - for _, order := range input { - result = append(result, &comparer{ - orderBy: order.Col, - weightString: order.WeightStringCol, - desc: order.Desc, - starColFixedIndex: order.StarColFixedIndex, - collationID: order.Type.Coll, - }) - } - return result -} diff --git a/go/vt/vtgate/engine/comparer_test.go b/go/vt/vtgate/engine/comparer_test.go deleted file mode 100644 index c1be2c25e82..00000000000 --- a/go/vt/vtgate/engine/comparer_test.go +++ /dev/null @@ -1,114 +0,0 @@ -/* -Copyright 2021 The Vitess Authors. - -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 engine - -import ( - "strconv" - "testing" - - "github.com/stretchr/testify/require" - - "vitess.io/vitess/go/sqltypes" -) - -func TestComparer(t *testing.T) { - tests := []struct { - comparer comparer - row1 []sqltypes.Value - row2 []sqltypes.Value - output int - }{ - { - comparer: comparer{ - orderBy: 0, - weightString: -1, - desc: true, - }, - row1: []sqltypes.Value{ - sqltypes.NewInt64(23), - }, - row2: []sqltypes.Value{ - sqltypes.NewInt64(34), - }, - output: 1, - }, { - comparer: comparer{ - orderBy: 0, - weightString: -1, - desc: false, - }, - row1: []sqltypes.Value{ - sqltypes.NewInt64(23), - }, - row2: []sqltypes.Value{ - sqltypes.NewInt64(23), - }, - output: 0, - }, { - comparer: comparer{ - orderBy: 0, - weightString: -1, - desc: false, - }, - row1: []sqltypes.Value{ - sqltypes.NewInt64(23), - }, - row2: []sqltypes.Value{ - sqltypes.NewInt64(12), - }, - output: 1, - }, { - comparer: comparer{ - orderBy: 1, - weightString: 0, - desc: false, - }, - row1: []sqltypes.Value{ - sqltypes.NewInt64(23), - sqltypes.NewVarChar("b"), - }, - row2: []sqltypes.Value{ - sqltypes.NewInt64(34), - sqltypes.NewVarChar("a"), - }, - output: -1, - }, { - comparer: comparer{ - orderBy: 1, - weightString: 0, - desc: true, - }, - row1: []sqltypes.Value{ - sqltypes.NewInt64(23), - sqltypes.NewVarChar("A"), - }, - row2: []sqltypes.Value{ - sqltypes.NewInt64(23), - sqltypes.NewVarChar("a"), - }, - output: 0, - }, - } - - for i, test := range tests { - t.Run(strconv.Itoa(i), func(t *testing.T) { - got, err := test.comparer.compare(test.row1, test.row2) - require.NoError(t, err) - require.Equal(t, test.output, got) - }) - } -} diff --git a/go/vt/vtgate/engine/distinct.go b/go/vt/vtgate/engine/distinct.go index 477e0803c1b..cd6b93a9f32 100644 --- a/go/vt/vtgate/engine/distinct.go +++ b/go/vt/vtgate/engine/distinct.go @@ -139,8 +139,8 @@ func (pt *probeTable) equal(a, b sqltypes.Row) (bool, error) { for i, checkCol := range pt.checkCols { cmp, err := evalengine.NullsafeCompare(a[i], b[i], checkCol.Type.Coll) if err != nil { - _, isComparisonErr := err.(evalengine.UnsupportedComparisonError) - if !isComparisonErr || checkCol.WsCol == nil { + _, isCollErr := err.(evalengine.UnsupportedCollationError) + if !isCollErr || checkCol.WsCol == nil { return false, err } checkCol = checkCol.SwitchToWeightString() diff --git a/go/vt/vtgate/engine/fake_vcursor_test.go b/go/vt/vtgate/engine/fake_vcursor_test.go index c2418c73560..6c99af33313 100644 --- a/go/vt/vtgate/engine/fake_vcursor_test.go +++ b/go/vt/vtgate/engine/fake_vcursor_test.go @@ -808,8 +808,16 @@ func (t *noopVCursor) GetLogs() ([]ExecuteEntry, error) { func expectResult(t *testing.T, msg string, result, want *sqltypes.Result) { t.Helper() - if !reflect.DeepEqual(result, want) { - t.Errorf("%s:\n%v\nwant:\n%v", msg, result, want) + fieldsResult := fmt.Sprintf("%v", result.Fields) + fieldsWant := fmt.Sprintf("%v", want.Fields) + if fieldsResult != fieldsWant { + t.Errorf("%s (mismatch in Fields):\n%s\nwant:\n%s", msg, fieldsResult, fieldsWant) + } + + rowsResult := fmt.Sprintf("%v", result.Rows) + rowsWant := fmt.Sprintf("%v", want.Rows) + if rowsResult != rowsWant { + t.Errorf("%s (mismatch in Rows):\n%s\nwant:\n%s", msg, rowsResult, rowsWant) } } diff --git a/go/vt/vtgate/engine/memory_sort.go b/go/vt/vtgate/engine/memory_sort.go index b1770225211..b896b303923 100644 --- a/go/vt/vtgate/engine/memory_sort.go +++ b/go/vt/vtgate/engine/memory_sort.go @@ -17,19 +17,16 @@ limitations under the License. package engine import ( - "container/heap" "context" "fmt" "math" "reflect" - "sort" "strconv" "strings" - "vitess.io/vitess/go/vt/vtgate/evalengine" - "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/vtgate/evalengine" ) var _ Primitive = (*MemorySort)(nil) @@ -37,7 +34,7 @@ var _ Primitive = (*MemorySort)(nil) // MemorySort is a primitive that performs in-memory sorting. type MemorySort struct { UpperLimit evalengine.Expr - OrderBy []OrderByParams + OrderBy evalengine.Comparison Input Primitive // TruncateColumnCount specifies the number of columns to return @@ -77,15 +74,10 @@ func (ms *MemorySort) TryExecute(ctx context.Context, vcursor VCursor, bindVars if err != nil { return nil, err } - sh := &sortHeap{ - rows: result.Rows, - comparers: extractSlices(ms.OrderBy), - } - sort.Sort(sh) - if sh.err != nil { - return nil, sh.err + + if err = ms.OrderBy.SortResult(result); err != nil { + return nil, err } - result.Rows = sh.rows if len(result.Rows) > count { result.Rows = result.Rows[:count] } @@ -93,7 +85,9 @@ func (ms *MemorySort) TryExecute(ctx context.Context, vcursor VCursor, bindVars } // TryStreamExecute satisfies the Primitive interface. -func (ms *MemorySort) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { +func (ms *MemorySort) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) (err error) { + defer evalengine.PanicHandler(&err) + count, err := ms.fetchCount(ctx, vcursor, bindVars) if err != nil { return err @@ -103,11 +97,9 @@ func (ms *MemorySort) TryStreamExecute(ctx context.Context, vcursor VCursor, bin return callback(qr.Truncate(ms.TruncateColumnCount)) } - // You have to reverse the ordering because the highest values - // must be dropped once the upper limit is reached. - sh := &sortHeap{ - comparers: extractSlices(ms.OrderBy), - reverse: true, + sorter := &evalengine.Sorter{ + Compare: ms.OrderBy, + Limit: count, } err = vcursor.StreamExecutePrimitive(ctx, ms.Input, bindVars, wantfields, func(qr *sqltypes.Result) error { if len(qr.Fields) != 0 { @@ -116,14 +108,9 @@ func (ms *MemorySort) TryStreamExecute(ctx context.Context, vcursor VCursor, bin } } for _, row := range qr.Rows { - heap.Push(sh, row) - // Remove the highest element from the heap if the size is more than the count - // This optimization means that the maximum size of the heap is going to be (count + 1) - for len(sh.rows) > count { - _ = heap.Pop(sh) - } + sorter.Push(row) } - if vcursor.ExceedsMaxMemoryRows(len(sh.rows)) { + if vcursor.ExceedsMaxMemoryRows(sorter.Len()) { return fmt.Errorf("in-memory row count exceeded allowed limit of %d", vcursor.MaxMemoryRows()) } return nil @@ -131,17 +118,7 @@ func (ms *MemorySort) TryStreamExecute(ctx context.Context, vcursor VCursor, bin if err != nil { return err } - if sh.err != nil { - return sh.err - } - // Set ordering to normal for the final ordering. - sh.reverse = false - sort.Sort(sh) - if sh.err != nil { - // Unreachable. - return sh.err - } - return cb(&sqltypes.Result{Rows: sh.rows}) + return cb(&sqltypes.Result{Rows: sorter.Sorted()}) } // GetFields satisfies the Primitive interface. @@ -194,7 +171,8 @@ func (ms *MemorySort) description() PrimitiveDescription { } func orderByParamsToString(i any) string { - return i.(OrderByParams).String() + obp := i.(evalengine.OrderByParams) + return obp.String() } // GenericJoin will iterate over arrays, slices or maps, and executes the f function to get a @@ -216,57 +194,3 @@ func GenericJoin(input any, f func(any) string) string { } return strings.Join(keys, ", ") } - -// sortHeap is sorted based on the orderBy params. -// Implementation is similar to scatterHeap -type sortHeap struct { - rows [][]sqltypes.Value - comparers []*comparer - reverse bool - err error -} - -// Len satisfies sort.Interface and heap.Interface. -func (sh *sortHeap) Len() int { - return len(sh.rows) -} - -// Less satisfies sort.Interface and heap.Interface. -func (sh *sortHeap) Less(i, j int) bool { - for _, c := range sh.comparers { - if sh.err != nil { - return true - } - cmp, err := c.compare(sh.rows[i], sh.rows[j]) - if err != nil { - sh.err = err - return true - } - if cmp == 0 { - continue - } - if sh.reverse { - cmp = -cmp - } - return cmp < 0 - } - return true -} - -// Swap satisfies sort.Interface and heap.Interface. -func (sh *sortHeap) Swap(i, j int) { - sh.rows[i], sh.rows[j] = sh.rows[j], sh.rows[i] -} - -// Push satisfies heap.Interface. -func (sh *sortHeap) Push(x any) { - sh.rows = append(sh.rows, x.([]sqltypes.Value)) -} - -// Pop satisfies heap.Interface. -func (sh *sortHeap) Pop() any { - n := len(sh.rows) - x := sh.rows[n-1] - sh.rows = sh.rows[:n-1] - return x -} diff --git a/go/vt/vtgate/engine/memory_sort_test.go b/go/vt/vtgate/engine/memory_sort_test.go index 2c73d49e74b..bc9369c57af 100644 --- a/go/vt/vtgate/engine/memory_sort_test.go +++ b/go/vt/vtgate/engine/memory_sort_test.go @@ -54,7 +54,7 @@ func TestMemorySortExecute(t *testing.T) { } ms := &MemorySort{ - OrderBy: []OrderByParams{{ + OrderBy: []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 1, }}, @@ -107,7 +107,7 @@ func TestMemorySortStreamExecuteWeightString(t *testing.T) { } ms := &MemorySort{ - OrderBy: []OrderByParams{{ + OrderBy: []evalengine.OrderByParams{{ WeightStringCol: 0, Col: 1, }}, @@ -173,7 +173,7 @@ func TestMemorySortExecuteWeightString(t *testing.T) { } ms := &MemorySort{ - OrderBy: []OrderByParams{{ + OrderBy: []evalengine.OrderByParams{{ WeightStringCol: 1, Col: 0, }}, @@ -227,7 +227,7 @@ func TestMemorySortStreamExecuteCollation(t *testing.T) { collationID, _ := collations.Local().LookupID("utf8mb4_hu_0900_ai_ci") ms := &MemorySort{ - OrderBy: []OrderByParams{{ + OrderBy: []evalengine.OrderByParams{{ Col: 0, Type: evalengine.Type{Type: sqltypes.VarChar, Coll: collationID}, }}, @@ -315,7 +315,7 @@ func TestMemorySortExecuteCollation(t *testing.T) { collationID, _ := collations.Local().LookupID("utf8mb4_hu_0900_ai_ci") ms := &MemorySort{ - OrderBy: []OrderByParams{{ + OrderBy: []evalengine.OrderByParams{{ Col: 0, Type: evalengine.Type{Type: sqltypes.VarChar, Coll: collationID}, }}, @@ -368,7 +368,7 @@ func TestMemorySortStreamExecute(t *testing.T) { } ms := &MemorySort{ - OrderBy: []OrderByParams{{ + OrderBy: []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 1, }}, @@ -445,7 +445,7 @@ func TestMemorySortExecuteTruncate(t *testing.T) { } ms := &MemorySort{ - OrderBy: []OrderByParams{{ + OrderBy: []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 1, }}, @@ -484,7 +484,7 @@ func TestMemorySortStreamExecuteTruncate(t *testing.T) { } ms := &MemorySort{ - OrderBy: []OrderByParams{{ + OrderBy: []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 1, }}, @@ -527,7 +527,7 @@ func TestMemorySortMultiColumn(t *testing.T) { } ms := &MemorySort{ - OrderBy: []OrderByParams{{ + OrderBy: []evalengine.OrderByParams{{ Col: 1, WeightStringCol: -1, }, { @@ -600,7 +600,7 @@ func TestMemorySortMaxMemoryRows(t *testing.T) { } ms := &MemorySort{ - OrderBy: []OrderByParams{{ + OrderBy: []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 1, }}, @@ -636,7 +636,7 @@ func TestMemorySortExecuteNoVarChar(t *testing.T) { } ms := &MemorySort{ - OrderBy: []OrderByParams{{ + OrderBy: []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 0, }}, diff --git a/go/vt/vtgate/engine/merge_sort.go b/go/vt/vtgate/engine/merge_sort.go index 6c694ae9e37..3c26a383594 100644 --- a/go/vt/vtgate/engine/merge_sort.go +++ b/go/vt/vtgate/engine/merge_sort.go @@ -17,11 +17,11 @@ limitations under the License. package engine import ( - "container/heap" "context" "io" "vitess.io/vitess/go/mysql/sqlerror" + "vitess.io/vitess/go/vt/vtgate/evalengine" "vitess.io/vitess/go/sqltypes" @@ -49,7 +49,7 @@ var _ Primitive = (*MergeSort)(nil) // so that vdiff can use it. In that situation, only StreamExecute is used. type MergeSort struct { Primitives []StreamExecutor - OrderBy []OrderByParams + OrderBy evalengine.Comparison ScatterErrorsAsWarnings bool noInputs noTxNeeded @@ -75,7 +75,9 @@ func (ms *MergeSort) GetFields(ctx context.Context, vcursor VCursor, bindVars ma } // TryStreamExecute performs a streaming exec. -func (ms *MergeSort) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { +func (ms *MergeSort) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) (err error) { + defer evalengine.PanicHandler(&err) + var cancel context.CancelFunc ctx, cancel = context.WithCancel(ctx) defer cancel() @@ -90,22 +92,22 @@ func (ms *MergeSort) TryStreamExecute(ctx context.Context, vcursor VCursor, bind } } + merge := &evalengine.Merger{ + Compare: ms.OrderBy, + } + if wantfields { - err := ms.getStreamingFields(handles, callback) + fields, err := ms.getStreamingFields(handles) if err != nil { return err } - } - - comparers := extractSlices(ms.OrderBy) - sh := &scatterHeap{ - rows: make([]streamRow, 0, len(handles)), - comparers: comparers, + if err := callback(&sqltypes.Result{Fields: fields}); err != nil { + return err + } } var errs []error - // Prime the heap. One element must be pulled from - // each stream. + // Prime the heap. One element must be pulled from each stream. for i, handle := range handles { select { case row, ok := <-handle.row: @@ -121,49 +123,38 @@ func (ms *MergeSort) TryStreamExecute(ctx context.Context, vcursor VCursor, bind // If so, don't add anything to the heap. continue } - sh.rows = append(sh.rows, streamRow{row: row, id: i}) + merge.Push(row, i) case <-ctx.Done(): return ctx.Err() } } - heap.Init(sh) - if sh.err != nil { - return sh.err - } + merge.Init() // Iterate one row at a time: // Pop a row from the heap and send it out. // Then pull the next row from the stream the popped // row came from and push it into the heap. - for len(sh.rows) != 0 { - sr := heap.Pop(sh).(streamRow) - if sh.err != nil { - // Unreachable: This should never fail. - return sh.err - } - if err := callback(&sqltypes.Result{Rows: [][]sqltypes.Value{sr.row}}); err != nil { + for merge.Len() != 0 { + row, stream := merge.Pop() + if err := callback(&sqltypes.Result{Rows: [][]sqltypes.Value{row}}); err != nil { return err } select { - case row, ok := <-handles[sr.id].row: + case row, ok := <-handles[stream].row: if !ok { - if handles[sr.id].err != nil { - return handles[sr.id].err + if handles[stream].err != nil { + return handles[stream].err } continue } - sr.row = row - heap.Push(sh, sr) - if sh.err != nil { - return sh.err - } + merge.Push(row, stream) case <-ctx.Done(): return ctx.Err() } } - err := vterrors.Aggregate(errs) + err = vterrors.Aggregate(errs) if err != nil && ms.ScatterErrorsAsWarnings && len(errs) < len(handles) { // we got errors, but not all shards failed, so we can hide the error and just warn instead partialSuccessScatterQueries.Add(1) @@ -174,7 +165,7 @@ func (ms *MergeSort) TryStreamExecute(ctx context.Context, vcursor VCursor, bind return err } -func (ms *MergeSort) getStreamingFields(handles []*streamHandle, callback func(*sqltypes.Result) error) error { +func (ms *MergeSort) getStreamingFields(handles []*streamHandle) ([]*querypb.Field, error) { var fields []*querypb.Field if ms.ScatterErrorsAsWarnings { @@ -193,20 +184,16 @@ func (ms *MergeSort) getStreamingFields(handles []*streamHandle, callback func(* if fields == nil { // something went wrong. need to figure out where the error can be if !ms.ScatterErrorsAsWarnings { - return handles[0].err + return nil, handles[0].err } var errs []error for _, handle := range handles { errs = append(errs, handle.err) } - return vterrors.Aggregate(errs) - } - - if err := callback(&sqltypes.Result{Fields: fields}); err != nil { - return err + return nil, vterrors.Aggregate(errs) } - return nil + return fields, nil } func (ms *MergeSort) description() PrimitiveDescription { @@ -266,65 +253,3 @@ func runOneStream(ctx context.Context, vcursor VCursor, input StreamExecutor, bi return handle } - -// A streamRow represents a row identified by the stream -// it came from. It is used as an element in scatterHeap. -type streamRow struct { - row []sqltypes.Value - id int -} - -// scatterHeap is the heap that is used for merge-sorting. -// You can push streamRow elements into it. Popping an -// element will return the one with the lowest value -// as defined by the orderBy criteria. If a comparison -// yielded an error, err is set. This must be checked -// after every heap operation. -type scatterHeap struct { - rows []streamRow - err error - comparers []*comparer -} - -// Len satisfies sort.Interface and heap.Interface. -func (sh *scatterHeap) Len() int { - return len(sh.rows) -} - -// Less satisfies sort.Interface and heap.Interface. -func (sh *scatterHeap) Less(i, j int) bool { - for _, c := range sh.comparers { - if sh.err != nil { - return true - } - // First try to compare the columns that we want to order - cmp, err := c.compare(sh.rows[i].row, sh.rows[j].row) - if err != nil { - sh.err = err - return true - } - if cmp == 0 { - continue - } - return cmp < 0 - } - return true -} - -// Swap satisfies sort.Interface and heap.Interface. -func (sh *scatterHeap) Swap(i, j int) { - sh.rows[i], sh.rows[j] = sh.rows[j], sh.rows[i] -} - -// Push satisfies heap.Interface. -func (sh *scatterHeap) Push(x any) { - sh.rows = append(sh.rows, x.(streamRow)) -} - -// Pop satisfies heap.Interface. -func (sh *scatterHeap) Pop() any { - n := len(sh.rows) - x := sh.rows[n-1] - sh.rows = sh.rows[:n-1] - return x -} diff --git a/go/vt/vtgate/engine/merge_sort_test.go b/go/vt/vtgate/engine/merge_sort_test.go index be370c0e86b..803c70ca463 100644 --- a/go/vt/vtgate/engine/merge_sort_test.go +++ b/go/vt/vtgate/engine/merge_sort_test.go @@ -60,7 +60,7 @@ func TestMergeSortNormal(t *testing.T) { "8|h", ), }} - orderBy := []OrderByParams{{ + orderBy := []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 0, }} @@ -118,7 +118,7 @@ func TestMergeSortWeightString(t *testing.T) { "8|h", ), }} - orderBy := []OrderByParams{{ + orderBy := []evalengine.OrderByParams{{ WeightStringCol: 0, Col: 1, }} @@ -180,7 +180,7 @@ func TestMergeSortCollation(t *testing.T) { }} collationID, _ := collations.Local().LookupID("utf8mb4_hu_0900_ai_ci") - orderBy := []OrderByParams{{ + orderBy := []evalengine.OrderByParams{{ Col: 0, Type: evalengine.Type{Type: sqltypes.VarChar, Coll: collationID}, }} @@ -240,7 +240,7 @@ func TestMergeSortDescending(t *testing.T) { "4|d", ), }} - orderBy := []OrderByParams{{ + orderBy := []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 0, Desc: true, @@ -291,7 +291,7 @@ func TestMergeSortEmptyResults(t *testing.T) { }, { results: sqltypes.MakeTestStreamingResults(idColFields), }} - orderBy := []OrderByParams{{ + orderBy := []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 0, }} @@ -319,7 +319,7 @@ func TestMergeSortEmptyResults(t *testing.T) { // TestMergeSortResultFailures tests failures at various // stages of result return. func TestMergeSortResultFailures(t *testing.T) { - orderBy := []OrderByParams{{ + orderBy := []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 0, }} @@ -365,7 +365,7 @@ func TestMergeSortDataFailures(t *testing.T) { "2.1|b", ), }} - orderBy := []OrderByParams{{ + orderBy := []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 0, }} @@ -391,7 +391,7 @@ func TestMergeSortDataFailures(t *testing.T) { require.EqualError(t, err, want) } -func testMergeSort(shardResults []*shardResult, orderBy []OrderByParams, callback func(qr *sqltypes.Result) error) error { +func testMergeSort(shardResults []*shardResult, orderBy []evalengine.OrderByParams, callback func(qr *sqltypes.Result) error) error { prims := make([]StreamExecutor, 0, len(shardResults)) for _, sr := range shardResults { prims = append(prims, sr) diff --git a/go/vt/vtgate/engine/ordered_aggregate.go b/go/vt/vtgate/engine/ordered_aggregate.go index 61a3140aa27..07ea06fa5fd 100644 --- a/go/vt/vtgate/engine/ordered_aggregate.go +++ b/go/vt/vtgate/engine/ordered_aggregate.go @@ -342,11 +342,16 @@ func (oa *OrderedAggregate) nextGroupBy(currentKey, nextRow []sqltypes.Value) (n } for _, gb := range oa.GroupByKeys { - cmp, err := evalengine.NullsafeCompare(currentKey[gb.KeyCol], nextRow[gb.KeyCol], gb.Type.Coll) + v1 := currentKey[gb.KeyCol] + v2 := nextRow[gb.KeyCol] + if v1.TinyWeightCmp(v2) != 0 { + return nextRow, true, nil + } + + cmp, err := evalengine.NullsafeCompare(v1, v2, gb.Type.Coll) if err != nil { - _, isComparisonErr := err.(evalengine.UnsupportedComparisonError) _, isCollationErr := err.(evalengine.UnsupportedCollationError) - if !isComparisonErr && !isCollationErr || gb.WeightStringCol == -1 { + if !isCollationErr || gb.WeightStringCol == -1 { return nil, false, err } gb.KeyCol = gb.WeightStringCol diff --git a/go/vt/vtgate/engine/route.go b/go/vt/vtgate/engine/route.go index 8dc7572e296..30713f45f91 100644 --- a/go/vt/vtgate/engine/route.go +++ b/go/vt/vtgate/engine/route.go @@ -20,13 +20,10 @@ import ( "context" "fmt" "math/rand" - "slices" "sort" - "strconv" "strings" "time" - "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/mysql/sqlerror" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/sqlparser" @@ -71,7 +68,7 @@ type Route struct { // OrderBy specifies the key order for merge sorting. This will be // set only for scatter queries that need the results to be // merge-sorted. - OrderBy []OrderByParams + OrderBy evalengine.Comparison // TruncateColumnCount specifies the number of columns to return // in the final result. Rest of the columns are truncated @@ -112,41 +109,6 @@ func NewRoute(opcode Opcode, keyspace *vindexes.Keyspace, query, fieldQuery stri } } -// OrderByParams specifies the parameters for ordering. -// This is used for merge-sorting scatter queries. -type OrderByParams struct { - Col int - // WeightStringCol is the weight_string column that will be used for sorting. - // It is set to -1 if such a column is not added to the query - WeightStringCol int - Desc bool - StarColFixedIndex int - - // Type for knowing if the collation is relevant - Type evalengine.Type -} - -// String returns a string. Used for plan descriptions -func (obp OrderByParams) String() string { - val := strconv.Itoa(obp.Col) - if obp.StarColFixedIndex > obp.Col { - val = strconv.Itoa(obp.StarColFixedIndex) - } - if obp.WeightStringCol != -1 && obp.WeightStringCol != obp.Col { - val = fmt.Sprintf("(%s|%d)", val, obp.WeightStringCol) - } - if obp.Desc { - val += " DESC" - } else { - val += " ASC" - } - - if sqltypes.IsText(obp.Type.Type) && obp.Type.Coll != collations.Unknown { - val += " COLLATE " + collations.Local().LookupName(obp.Type.Coll) - } - return val -} - var ( partialSuccessScatterQueries = stats.NewCounter("PartialSuccessScatterQueries", "Count of partially successful scatter queries") ) @@ -422,37 +384,15 @@ func (route *Route) GetFields(ctx context.Context, vcursor VCursor, bindVars map } func (route *Route) sort(in *sqltypes.Result) (*sqltypes.Result, error) { - var err error // Since Result is immutable, we make a copy. // The copy can be shallow because we won't be changing // the contents of any row. out := in.ShallowCopy() - comparers := extractSlices(route.OrderBy) - - slices.SortFunc(out.Rows, func(a, b sqltypes.Row) int { - var cmp int - if err != nil { - return -1 - } - // If there are any errors below, the function sets - // the external err and returns true. Once err is set, - // all subsequent calls return true. This will make - // Slice think that all elements are in the correct - // order and return more quickly. - for _, c := range comparers { - cmp, err = c.compare(a, b) - if err != nil { - return -1 - } - if cmp != 0 { - return cmp - } - } - return 0 - }) - - return out.Truncate(route.TruncateColumnCount), err + if err := route.OrderBy.SortResult(out); err != nil { + return nil, err + } + return out.Truncate(route.TruncateColumnCount), nil } func (route *Route) description() PrimitiveDescription { @@ -590,7 +530,8 @@ func getQueries(query string, bvs []map[string]*querypb.BindVariable) []*querypb } func orderByToString(in any) string { - return in.(OrderByParams).String() + obp := in.(evalengine.OrderByParams) + return obp.String() } func (route *Route) executeWarmingReplicaRead(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, queries []*querypb.BoundQuery) { diff --git a/go/vt/vtgate/engine/route_test.go b/go/vt/vtgate/engine/route_test.go index 58e6fb4a9f1..274ac58c7d4 100644 --- a/go/vt/vtgate/engine/route_test.go +++ b/go/vt/vtgate/engine/route_test.go @@ -296,7 +296,7 @@ func TestSelectNone(t *testing.T) { result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) require.NoError(t, err) require.Empty(t, vc.log) - expectResult(t, "sel.StreamExecute", result, nil) + require.Nil(t, result) vc.Rewind() @@ -452,7 +452,7 @@ func TestSelectEqualNoRoute(t *testing.T) { `Execute select from, toc from lkp where from in ::from from: type:TUPLE values:{type:INT64 value:"1"} false`, `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationNone()`, }) - expectResult(t, "sel.StreamExecute", result, nil) + require.Nil(t, result) // test with special no-routes handling sel.NoRoutesSpecialHandling = true @@ -888,7 +888,7 @@ func TestRouteSort(t *testing.T) { "dummy_select", "dummy_select_field", ) - sel.OrderBy = []OrderByParams{{ + sel.OrderBy = []evalengine.OrderByParams{{ Col: 0, WeightStringCol: -1, }} @@ -970,7 +970,7 @@ func TestRouteSortWeightStrings(t *testing.T) { "dummy_select", "dummy_select_field", ) - sel.OrderBy = []OrderByParams{{ + sel.OrderBy = []evalengine.OrderByParams{{ Col: 1, WeightStringCol: 0, }} @@ -1036,7 +1036,7 @@ func TestRouteSortWeightStrings(t *testing.T) { }) t.Run("Error when no weight string set", func(t *testing.T) { - sel.OrderBy = []OrderByParams{{ + sel.OrderBy = []evalengine.OrderByParams{{ Col: 1, WeightStringCol: -1, }} @@ -1075,7 +1075,7 @@ func TestRouteSortCollation(t *testing.T) { collationID, _ := collations.Local().LookupID("utf8mb4_hu_0900_ai_ci") - sel.OrderBy = []OrderByParams{{ + sel.OrderBy = []evalengine.OrderByParams{{ Col: 0, Type: evalengine.Type{Type: sqltypes.VarChar, Coll: collationID}, }} @@ -1141,7 +1141,7 @@ func TestRouteSortCollation(t *testing.T) { }) t.Run("Error when Unknown Collation", func(t *testing.T) { - sel.OrderBy = []OrderByParams{{ + sel.OrderBy = []evalengine.OrderByParams{{ Col: 0, Type: evalengine.UnknownType(), }} @@ -1167,7 +1167,7 @@ func TestRouteSortCollation(t *testing.T) { }) t.Run("Error when Unsupported Collation", func(t *testing.T) { - sel.OrderBy = []OrderByParams{{ + sel.OrderBy = []evalengine.OrderByParams{{ Col: 0, Type: evalengine.Type{Coll: 1111}, }} @@ -1203,7 +1203,7 @@ func TestRouteSortTruncate(t *testing.T) { "dummy_select", "dummy_select_field", ) - sel.OrderBy = []OrderByParams{{ + sel.OrderBy = []evalengine.OrderByParams{{ Col: 0, }} sel.TruncateColumnCount = 1 @@ -1294,7 +1294,7 @@ func TestRouteStreamSortTruncate(t *testing.T) { "dummy_select", "dummy_select_field", ) - sel.OrderBy = []OrderByParams{{ + sel.OrderBy = []evalengine.OrderByParams{{ Col: 0, }} sel.TruncateColumnCount = 1 @@ -1437,7 +1437,7 @@ func TestExecFail(t *testing.T) { vc.Rewind() vc.resultErr = sqlerror.NewSQLError(sqlerror.ERQueryInterrupted, "", "query timeout -20") // test when there is order by column - sel.OrderBy = []OrderByParams{{ + sel.OrderBy = []evalengine.OrderByParams{{ WeightStringCol: -1, Col: 0, }} diff --git a/go/vt/vtgate/evalengine/api_compare.go b/go/vt/vtgate/evalengine/api_compare.go index d05e86a12bb..1f30a17b9d5 100644 --- a/go/vt/vtgate/evalengine/api_compare.go +++ b/go/vt/vtgate/evalengine/api_compare.go @@ -19,25 +19,17 @@ package evalengine import ( "bytes" "fmt" + "slices" + "strconv" "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/mysql/collations/colldata" "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/vterrors" ) -// UnsupportedComparisonError represents the error where the comparison between the two types is unsupported on vitess -type UnsupportedComparisonError struct { - Type1 sqltypes.Type - Type2 sqltypes.Type -} - -// Error function implements the error interface -func (err UnsupportedComparisonError) Error() string { - return fmt.Sprintf("types are not comparable: %v vs %v", err.Type1, err.Type2) -} - // UnsupportedCollationError represents the error where the comparison using provided collation is unsupported on vitess type UnsupportedCollationError struct { ID collations.ID @@ -171,3 +163,277 @@ func NullsafeCompare(v1, v2 sqltypes.Value, collationID collations.ID) (int, err } return compare(v1, v2, collationID) } + +// OrderByParams specifies the parameters for ordering. +// This is used for merge-sorting scatter queries. +type ( + OrderByParams struct { + Col int + // WeightStringCol is the weight_string column that will be used for sorting. + // It is set to -1 if such a column is not added to the query + WeightStringCol int + Desc bool + + // Type for knowing if the collation is relevant + Type Type + } + + Comparison []OrderByParams + + tinyWeighter struct { + col int + apply func(v *sqltypes.Value) + } +) + +// String returns a string. Used for plan descriptions +func (obp *OrderByParams) String() string { + val := strconv.Itoa(obp.Col) + if obp.WeightStringCol != -1 && obp.WeightStringCol != obp.Col { + val = fmt.Sprintf("(%s|%d)", val, obp.WeightStringCol) + } + if obp.Desc { + val += " DESC" + } else { + val += " ASC" + } + + if sqltypes.IsText(obp.Type.Type) && obp.Type.Coll != collations.Unknown { + val += " COLLATE " + collations.Local().LookupName(obp.Type.Coll) + } + return val +} + +func (obp *OrderByParams) Compare(r1, r2 []sqltypes.Value) int { + v1 := r1[obp.Col] + v2 := r2[obp.Col] + cmp := v1.TinyWeightCmp(v2) + + if cmp == 0 { + var err error + cmp, err = NullsafeCompare(v1, v2, obp.Type.Coll) + if err != nil { + _, isCollationErr := err.(UnsupportedCollationError) + if !isCollationErr || obp.WeightStringCol == -1 { + panic(err) + } + // in case of a comparison or collation error switch to using the weight string column for ordering + obp.Col = obp.WeightStringCol + obp.WeightStringCol = -1 + cmp, err = NullsafeCompare(r1[obp.Col], r2[obp.Col], obp.Type.Coll) + if err != nil { + panic(err) + } + } + } + // change the result if descending ordering is required + if obp.Desc { + cmp = -cmp + } + return cmp +} + +func (cmp Comparison) tinyWeighters(fields []*querypb.Field) []tinyWeighter { + weights := make([]tinyWeighter, 0, len(cmp)) + for _, c := range cmp { + if apply := TinyWeighter(fields[c.Col], c.Type.Coll); apply != nil { + weights = append(weights, tinyWeighter{c.Col, apply}) + } + } + return weights +} + +func (cmp Comparison) ApplyTinyWeights(out *sqltypes.Result) { + weights := cmp.tinyWeighters(out.Fields) + if len(weights) == 0 { + return + } + + for _, row := range out.Rows { + for _, w := range weights { + w.apply(&row[w.col]) + } + } +} + +func (cmp Comparison) Compare(a, b sqltypes.Row) int { + for _, c := range cmp { + if cmp := c.Compare(a, b); cmp != 0 { + return cmp + } + } + return 0 +} + +func (cmp Comparison) Less(a, b sqltypes.Row) bool { + for _, c := range cmp { + if cmp := c.Compare(a, b); cmp != 0 { + return cmp < 0 + } + } + return false +} + +func (cmp Comparison) More(a, b sqltypes.Row) bool { + for _, c := range cmp { + if cmp := c.Compare(a, b); cmp != 0 { + return cmp > 0 + } + } + return false +} + +func PanicHandler(err *error) { + if r := recover(); r != nil { + badness, ok := r.(error) + if !ok { + panic(r) + } + + *err = badness + } +} + +func (cmp Comparison) SortResult(out *sqltypes.Result) (err error) { + defer PanicHandler(&err) + cmp.ApplyTinyWeights(out) + cmp.Sort(out.Rows) + return +} + +func (cmp Comparison) Sort(out []sqltypes.Row) { + slices.SortFunc(out, func(a, b sqltypes.Row) int { + return cmp.Compare(a, b) + }) +} + +type Sorter struct { + Compare Comparison + Limit int + + rows []sqltypes.Row + heap bool +} + +func (s *Sorter) Len() int { + return len(s.rows) +} + +func (s *Sorter) Push(row sqltypes.Row) { + if len(s.rows) < s.Limit { + s.rows = append(s.rows, row) + return + } + if !s.heap { + heapify(s.rows, s.Compare.More) + s.heap = true + } + if s.Compare.Compare(s.rows[0], row) < 0 { + return + } + s.rows[0] = row + fix(s.rows, 0, s.Compare.More) +} + +func (s *Sorter) Sorted() []sqltypes.Row { + if !s.heap { + s.Compare.Sort(s.rows) + return s.rows + } + + h := s.rows + end := len(h) + for end > 1 { + end = end - 1 + h[end], h[0] = h[0], h[end] + down(h[:end], 0, s.Compare.More) + } + return h +} + +type mergeRow struct { + row sqltypes.Row + source int +} + +type Merger struct { + Compare Comparison + + rows []mergeRow + less func(a, b mergeRow) bool +} + +func (m *Merger) Len() int { + return len(m.rows) +} + +func (m *Merger) Init() { + m.less = func(a, b mergeRow) bool { + return m.Compare.Less(a.row, b.row) + } + heapify(m.rows, m.less) +} + +func (m *Merger) Push(row sqltypes.Row, source int) { + m.rows = append(m.rows, mergeRow{row, source}) + if m.less != nil { + up(m.rows, len(m.rows)-1, m.less) + } +} + +func (m *Merger) Pop() (sqltypes.Row, int) { + x := m.rows[0] + m.rows[0] = m.rows[len(m.rows)-1] + m.rows = m.rows[:len(m.rows)-1] + down(m.rows, 0, m.less) + return x.row, x.source +} + +func heapify[T any](h []T, less func(a, b T) bool) { + n := len(h) + for i := n/2 - 1; i >= 0; i-- { + down(h, i, less) + } +} + +func fix[T any](h []T, i int, less func(a, b T) bool) { + if !down(h, i, less) { + up(h, i, less) + } +} + +func down[T any](h []T, i0 int, less func(a, b T) bool) bool { + i := i0 + for { + left, right := 2*i+1, 2*i+2 + if left >= len(h) || left < 0 { // `left < 0` in case of overflow + break + } + + // find the smallest child + j := left + if right < len(h) && less(h[right], h[left]) { + j = right + } + + if !less(h[j], h[i]) { + break + } + + h[i], h[j] = h[j], h[i] + i = j + } + return i > i0 +} + +func up[T any](h []T, i int, less func(a, b T) bool) { + for { + parent := (i - 1) / 2 + if i == 0 || !less(h[i], h[parent]) { + break + } + + h[i], h[parent] = h[parent], h[i] + i = parent + } +} diff --git a/go/vt/vtgate/evalengine/api_compare_test.go b/go/vt/vtgate/evalengine/api_compare_test.go index b44d735de22..3f97d9d18e9 100644 --- a/go/vt/vtgate/evalengine/api_compare_test.go +++ b/go/vt/vtgate/evalengine/api_compare_test.go @@ -19,10 +19,14 @@ package evalengine import ( "context" "fmt" + "math" + "math/rand" + "slices" "strings" "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "vitess.io/vitess/go/mysql/collations" @@ -1325,3 +1329,69 @@ func BenchmarkNullSafeComparison(b *testing.B) { } }) } + +func TestCompareSorter(t *testing.T) { + var cases = []struct { + Count int + Limit int + Random sqltypes.RandomGenerator + Cmp Comparison + }{ + { + Count: 100, + Limit: 10, + Random: sqltypes.RandomGenerators[sqltypes.Int64], + Cmp: Comparison{{Col: 0, Desc: false, Type: Type{Type: sqltypes.Int64}}}, + }, + { + Count: 100, + Limit: 10, + Random: sqltypes.RandomGenerators[sqltypes.Int64], + Cmp: Comparison{{Col: 0, Desc: true, Type: Type{Type: sqltypes.Int64}}}, + }, + { + Count: 100, + Limit: math.MaxInt, + Random: sqltypes.RandomGenerators[sqltypes.Int64], + Cmp: Comparison{{Col: 0, Desc: false, Type: Type{Type: sqltypes.Int64}}}, + }, + { + Count: 100, + Limit: math.MaxInt, + Random: sqltypes.RandomGenerators[sqltypes.Int64], + Cmp: Comparison{{Col: 0, Desc: true, Type: Type{Type: sqltypes.Int64}}}, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprintf("%s-%d-%d", tc.Cmp[0].Type.Type, tc.Count, tc.Limit), func(t *testing.T) { + unsorted := make([]sqltypes.Row, 0, tc.Count) + for i := 0; i < tc.Count; i++ { + unsorted = append(unsorted, []sqltypes.Value{tc.Random()}) + } + rand.Shuffle(len(unsorted), func(i, j int) { + unsorted[i], unsorted[j] = unsorted[j], unsorted[i] + }) + + want := slices.Clone(unsorted) + tc.Cmp.Sort(want) + if len(want) > tc.Limit { + want = want[:tc.Limit] + } + + sorter := &Sorter{Compare: tc.Cmp, Limit: tc.Limit} + for _, v := range unsorted { + sorter.Push(v) + } + + sorted := sorter.Sorted() + assert.Equal(t, len(want), len(sorted)) + for i := 0; i < len(want); i++ { + if !sqltypes.RowEqual(want[i], sorted[i]) { + t.Fatalf("row %d is not sorted.\nwant: %v\ngot: %v", i, want, sorted) + } + } + }) + } + +} diff --git a/go/vt/vtgate/evalengine/weights.go b/go/vt/vtgate/evalengine/weights.go index 08ec844f357..fa7fa7e11a6 100644 --- a/go/vt/vtgate/evalengine/weights.go +++ b/go/vt/vtgate/evalengine/weights.go @@ -20,12 +20,14 @@ import ( "encoding/binary" "math" + "vitess.io/vitess/go/hack" "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/mysql/collations/charset" "vitess.io/vitess/go/mysql/collations/colldata" "vitess.io/vitess/go/mysql/decimal" "vitess.io/vitess/go/mysql/json" "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/vterrors" ) @@ -176,3 +178,131 @@ func evalWeightString(dst []byte, e eval, length, precision int) ([]byte, bool, return dst, false, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "unexpected type %v", e.SQLType()) } + +// TinyWeighter returns a callback to apply a Tiny Weight string to a sqltypes.Value. +// A tiny weight string is a compressed 4-byte representation of the value's full weight string that +// sorts identically to its full weight. Obviously, the tiny weight string can collide because +// it's represented in fewer bytes than the full one. +// Hence, for any 2 instances of sqltypes.Value: if both instances have a Tiny Weight string, +// and the weight strings are **different**, the two values will sort accordingly to the 32-bit +// numerical sort of their tiny weight strings. Otherwise, the relative sorting of the two values +// will not be known, and they will require a full sort using e.g. NullsafeCompare. +func TinyWeighter(f *querypb.Field, collation collations.ID) func(v *sqltypes.Value) { + switch { + case sqltypes.IsNull(f.Type): + return nil + + case sqltypes.IsSigned(f.Type): + return func(v *sqltypes.Value) { + i, err := v.ToInt64() + if err != nil { + return + } + // The full weight string for an integer is just its MSB bit-inverted 64 bit representation. + // However, we only have 4 bytes to work with here, so in order to minimize the amount + // of collisions for the tiny weight string, instead of grabbing the top 32 bits of the + // 64 bit representation, we're going to cast to float32. Floats are sortable once bit-inverted, + // and although they cannot represent the full 64-bit range (duh!), that's perfectly fine + // because close-by numbers will collide into the same tiny weight, allowing us to fall back + // to a full comparison. + raw := math.Float32bits(float32(i)) + if i < 0 { + raw = ^raw + } else { + raw = raw ^ (1 << 31) + } + v.SetTinyWeight(raw) + } + + case sqltypes.IsUnsigned(f.Type): + return func(v *sqltypes.Value) { + u, err := v.ToUint64() + if err != nil { + return + } + // See comment for the IsSigned block. No bit-inversion is required here as all floats will be positive. + v.SetTinyWeight(math.Float32bits(float32(u))) + } + + case sqltypes.IsFloat(f.Type): + return func(v *sqltypes.Value) { + fl, err := v.ToFloat64() + if err != nil { + return + } + // Similarly as the IsSigned block, we could take the top 32 bits of the float64 bit representation, + // but by down-sampling to a float32 we reduce the amount of collisions. + raw := math.Float32bits(float32(fl)) + if math.Signbit(fl) { + raw = ^raw + } else { + raw = raw ^ (1 << 31) + } + v.SetTinyWeight(raw) + } + + case sqltypes.IsBinary(f.Type): + return func(v *sqltypes.Value) { + if v.IsNull() { + return + } + + var w32 [4]byte + copy(w32[:4], v.Raw()) + v.SetTinyWeight(binary.BigEndian.Uint32(w32[:4])) + } + + case sqltypes.IsText(f.Type): + if coll := colldata.Lookup(collation); coll != nil { + if twcoll, ok := coll.(colldata.TinyWeightCollation); ok { + return func(v *sqltypes.Value) { + if v.IsNull() { + return + } + v.SetTinyWeight(twcoll.TinyWeightString(v.Raw())) + } + } + } + return nil + + case sqltypes.IsDecimal(f.Type): + return func(v *sqltypes.Value) { + if v.IsNull() { + return + } + // To generate a 32-bit weight string of the decimal, we'll just attempt a fast 32bit atof parse + // of its contents. This can definitely fail for many corner cases, but that's OK: we'll just fall + // back to a full decimal comparison in those cases. + fl, _, err := hack.Atof32(v.RawStr()) + if err != nil { + return + } + raw := math.Float32bits(fl) + if raw&(1<<31) != 0 { + raw = ^raw + } else { + raw = raw ^ (1 << 31) + } + v.SetTinyWeight(raw) + } + + case f.Type == sqltypes.TypeJSON: + return func(v *sqltypes.Value) { + if v.IsNull() { + return + } + j, err := json.NewFromSQL(*v) + if err != nil { + return + } + var w32 [4]byte + // TODO: this can be done more efficiently without having to calculate the full weight string and + // extracting its prefix. + copy(w32[:4], j.WeightString(nil)) + v.SetTinyWeight(binary.BigEndian.Uint32(w32[:4])) + } + + default: + return nil + } +} diff --git a/go/vt/vtgate/evalengine/weights_test.go b/go/vt/vtgate/evalengine/weights_test.go index 50a1d91f20c..0dee4c72d03 100644 --- a/go/vt/vtgate/evalengine/weights_test.go +++ b/go/vt/vtgate/evalengine/weights_test.go @@ -25,8 +25,82 @@ import ( "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" ) +func TestTinyWeightStrings(t *testing.T) { + const Length = 10000 + + var cases = []struct { + typ sqltypes.Type + gen func() sqltypes.Value + col collations.ID + len int + prec int + }{ + {typ: sqltypes.Int32, gen: sqltypes.RandomGenerators[sqltypes.Int32], col: collations.CollationBinaryID}, + {typ: sqltypes.Int64, gen: sqltypes.RandomGenerators[sqltypes.Int64], col: collations.CollationBinaryID}, + {typ: sqltypes.Uint32, gen: sqltypes.RandomGenerators[sqltypes.Uint32], col: collations.CollationBinaryID}, + {typ: sqltypes.Uint64, gen: sqltypes.RandomGenerators[sqltypes.Uint64], col: collations.CollationBinaryID}, + {typ: sqltypes.Float64, gen: sqltypes.RandomGenerators[sqltypes.Float64], col: collations.CollationBinaryID}, + {typ: sqltypes.VarChar, gen: sqltypes.RandomGenerators[sqltypes.VarChar], col: collations.CollationUtf8mb4ID}, + {typ: sqltypes.VarBinary, gen: sqltypes.RandomGenerators[sqltypes.VarBinary], col: collations.CollationBinaryID}, + {typ: sqltypes.Decimal, gen: sqltypes.RandomGenerators[sqltypes.Decimal], col: collations.CollationBinaryID, len: 20, prec: 10}, + {typ: sqltypes.TypeJSON, gen: sqltypes.RandomGenerators[sqltypes.TypeJSON], col: collations.CollationBinaryID}, + } + + for _, tc := range cases { + t.Run(fmt.Sprintf("%v", tc.typ), func(t *testing.T) { + field := &querypb.Field{ + Type: tc.typ, + ColumnLength: uint32(tc.len), + Charset: uint32(tc.col), + Decimals: uint32(tc.prec), + } + weight := TinyWeighter(field, tc.col) + if weight == nil { + t.Fatalf("could not generate Tiny Weight function") + } + + items := make([]sqltypes.Value, 0, Length) + for i := 0; i < Length; i++ { + v := tc.gen() + weight(&v) + items = append(items, v) + } + + var fastComparisons int + var fullComparisons int + slices.SortFunc(items, func(a, b sqltypes.Value) int { + if cmp := a.TinyWeightCmp(b); cmp != 0 { + fastComparisons++ + return cmp + } + + cmp, err := NullsafeCompare(a, b, tc.col) + require.NoError(t, err) + + fullComparisons++ + return cmp + }) + + for i := 0; i < Length-1; i++ { + a := items[i] + b := items[i+1] + + cmp, err := NullsafeCompare(a, b, tc.col) + require.NoError(t, err) + + if cmp > 0 { + t.Fatalf("expected %v [pos=%d] to come after %v [pos=%d]\n%v | %032b\n%v | %032b", a, i, b, i+1, a, a.TinyWeight(), b, b.TinyWeight()) + } + } + + t.Logf("%d fast comparisons, %d full comparisons (%.02f%% were fast)", fastComparisons, fullComparisons, 100.0*float64(fastComparisons)/float64(fastComparisons+fullComparisons)) + }) + } +} + func TestWeightStrings(t *testing.T) { const Length = 1000 diff --git a/go/vt/vtgate/executor_framework_test.go b/go/vt/vtgate/executor_framework_test.go index ceda947e8bb..8baffdfde09 100644 --- a/go/vt/vtgate/executor_framework_test.go +++ b/go/vt/vtgate/executor_framework_test.go @@ -131,7 +131,7 @@ func init() { vindexes.Register("keyrange_lookuper_unique", newKeyRangeLookuperUnique) } -func createExecutorEnv(t testing.TB) (executor *Executor, sbc1, sbc2, sbclookup *sandboxconn.SandboxConn, ctx context.Context) { +func createExecutorEnvCallback(t testing.TB, eachShard func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn)) (executor *Executor, ctx context.Context) { var cancel context.CancelFunc ctx, cancel = context.WithCancel(context.Background()) cell := "aa" @@ -166,19 +166,15 @@ func createExecutorEnv(t testing.TB) (executor *Executor, sbc1, sbc2, sbclookup } resolver := newTestResolver(ctx, hc, serv, cell) - sbc1 = hc.AddTestTablet(cell, "-20", 1, "TestExecutor", "-20", topodatapb.TabletType_PRIMARY, true, 1, nil) - sbc2 = hc.AddTestTablet(cell, "40-60", 1, "TestExecutor", "40-60", topodatapb.TabletType_PRIMARY, true, 1, nil) - // Create these connections so scatter queries don't fail. - _ = hc.AddTestTablet(cell, "20-40", 1, "TestExecutor", "20-40", topodatapb.TabletType_PRIMARY, true, 1, nil) - _ = hc.AddTestTablet(cell, "60-60", 1, "TestExecutor", "60-80", topodatapb.TabletType_PRIMARY, true, 1, nil) - _ = hc.AddTestTablet(cell, "80-a0", 1, "TestExecutor", "80-a0", topodatapb.TabletType_PRIMARY, true, 1, nil) - _ = hc.AddTestTablet(cell, "a0-c0", 1, "TestExecutor", "a0-c0", topodatapb.TabletType_PRIMARY, true, 1, nil) - _ = hc.AddTestTablet(cell, "c0-e0", 1, "TestExecutor", "c0-e0", topodatapb.TabletType_PRIMARY, true, 1, nil) - _ = hc.AddTestTablet(cell, "e0-", 1, "TestExecutor", "e0-", topodatapb.TabletType_PRIMARY, true, 1, nil) - // Below is needed so that SendAnyWherePlan doesn't fail + shards := []string{"-20", "20-40", "40-60", "60-80", "80-a0", "a0-c0", "c0-e0", "e0-"} - sbclookup = hc.AddTestTablet(cell, "0", 1, KsTestUnsharded, "0", topodatapb.TabletType_PRIMARY, true, 1, nil) - _ = hc.AddTestTablet(cell, "2", 3, KsTestUnsharded, "0", topodatapb.TabletType_REPLICA, true, 1, nil) + for _, shard := range shards { + conn := hc.AddTestTablet(cell, shard, 1, KsTestSharded, shard, topodatapb.TabletType_PRIMARY, true, 1, nil) + eachShard(shard, KsTestSharded, topodatapb.TabletType_PRIMARY, conn) + } + + eachShard("0", KsTestUnsharded, topodatapb.TabletType_PRIMARY, hc.AddTestTablet(cell, "0", 1, KsTestUnsharded, "0", topodatapb.TabletType_PRIMARY, true, 1, nil)) + eachShard("0", KsTestUnsharded, topodatapb.TabletType_REPLICA, hc.AddTestTablet(cell, "2", 3, KsTestUnsharded, "0", topodatapb.TabletType_REPLICA, true, 1, nil)) queryLogger := streamlog.New[*logstats.LogStats]("VTGate", queryLogBufferSize) @@ -199,7 +195,21 @@ func createExecutorEnv(t testing.TB) (executor *Executor, sbc1, sbc2, sbclookup cancel() }) - return executor, sbc1, sbc2, sbclookup, ctx + return executor, ctx +} + +func createExecutorEnv(t testing.TB) (executor *Executor, sbc1, sbc2, sbclookup *sandboxconn.SandboxConn, ctx context.Context) { + executor, ctx = createExecutorEnvCallback(t, func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn) { + switch { + case ks == KsTestSharded && shard == "-20": + sbc1 = conn + case ks == KsTestSharded && shard == "40-60": + sbc2 = conn + case ks == KsTestUnsharded && tabletType == topodatapb.TabletType_PRIMARY: + sbclookup = conn + } + }) + return } func createCustomExecutor(t testing.TB, vschema string) (executor *Executor, sbc1, sbc2, sbclookup *sandboxconn.SandboxConn, ctx context.Context) { diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index 62dec384e33..f3544c1362e 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -663,17 +663,8 @@ func TestStreamBuffering(t *testing.T) { } func TestStreamLimitOffset(t *testing.T) { - executor, sbc1, sbc2, _, _ := createExecutorEnv(t) - - // This test is similar to TestStreamUnsharded except that it returns a Result > 10 bytes, - // such that the splitting of the Result into multiple Result responses gets tested. - sbc1.SetResults([]*sqltypes.Result{{ - Fields: []*querypb.Field{ - {Name: "id", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, - {Name: "textcol", Type: sqltypes.VarChar, Charset: uint32(collations.Default())}, - {Name: "weight_string(id)", Type: sqltypes.VarBinary, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_BINARY_FLAG)}, - }, - Rows: [][]sqltypes.Value{{ + returnRows := map[string][]sqltypes.Row{ + "-20": [][]sqltypes.Value{{ sqltypes.NewInt32(1), sqltypes.NewVarChar("1234"), sqltypes.NULL, @@ -682,20 +673,30 @@ func TestStreamLimitOffset(t *testing.T) { sqltypes.NewVarChar("4567"), sqltypes.NULL, }}, - }}) - - sbc2.SetResults([]*sqltypes.Result{{ - Fields: []*querypb.Field{ - {Name: "id", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, - {Name: "textcol", Type: sqltypes.VarChar, Charset: uint32(collations.Default())}, - {Name: "weight_string(id)", Type: sqltypes.VarBinary, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_BINARY_FLAG)}, - }, - Rows: [][]sqltypes.Value{{ + "40-60": [][]sqltypes.Value{{ sqltypes.NewInt32(2), sqltypes.NewVarChar("2345"), sqltypes.NULL, }}, - }}) + "80-a0": [][]sqltypes.Value{{ + sqltypes.NewInt32(3), + sqltypes.NewVarChar("3456"), + sqltypes.NULL, + }}, + } + + executor, _ := createExecutorEnvCallback(t, func(shard, ks string, tabletType topodatapb.TabletType, conn *sandboxconn.SandboxConn) { + if ks == KsTestSharded { + conn.SetResults([]*sqltypes.Result{{ + Fields: []*querypb.Field{ + {Name: "id", Type: sqltypes.Int32, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_NUM_FLAG)}, + {Name: "textcol", Type: sqltypes.VarChar, Charset: uint32(collations.Default())}, + {Name: "weight_string(id)", Type: sqltypes.VarBinary, Charset: collations.CollationBinaryID, Flags: uint32(querypb.MySqlFlag_BINARY_FLAG)}, + }, + Rows: returnRows[shard], + }}) + } + }) results := make(chan *sqltypes.Result, 10) session := &vtgatepb.Session{ @@ -722,11 +723,11 @@ func TestStreamLimitOffset(t *testing.T) { }, Rows: [][]sqltypes.Value{{ - sqltypes.NewInt32(1), - sqltypes.NewVarChar("1234"), + sqltypes.NewInt32(3), + sqltypes.NewVarChar("3456"), }, { - sqltypes.NewInt32(1), - sqltypes.NewVarChar("foo"), + sqltypes.NewInt32(4), + sqltypes.NewVarChar("4567"), }}, } var gotResults []*sqltypes.Result diff --git a/go/vt/vtgate/planbuilder/operator_transformers.go b/go/vt/vtgate/planbuilder/operator_transformers.go index f51cbee047b..a04c4b00c2c 100644 --- a/go/vt/vtgate/planbuilder/operator_transformers.go +++ b/go/vt/vtgate/planbuilder/operator_transformers.go @@ -269,12 +269,11 @@ func createMemorySort(ctx *plancontext.PlanningContext, src logicalPlan, orderin for idx, order := range ordering.Order { typ, _ := ctx.SemTable.TypeForExpr(order.SimplifiedExpr) - ms.eMemorySort.OrderBy = append(ms.eMemorySort.OrderBy, engine.OrderByParams{ - Col: ordering.Offset[idx], - WeightStringCol: ordering.WOffset[idx], - Desc: order.Inner.Direction == sqlparser.DescOrder, - StarColFixedIndex: ordering.Offset[idx], - Type: typ, + ms.eMemorySort.OrderBy = append(ms.eMemorySort.OrderBy, evalengine.OrderByParams{ + Col: ordering.Offset[idx], + WeightStringCol: ordering.WOffset[idx], + Desc: order.Inner.Direction == sqlparser.DescOrder, + Type: typ, }) } @@ -500,7 +499,7 @@ func buildRouteLogicalPlan(ctx *plancontext.PlanningContext, op *operators.Route eroute, err := routeToEngineRoute(ctx, op, hints) for _, order := range op.Ordering { typ, _ := ctx.SemTable.TypeForExpr(order.AST) - eroute.OrderBy = append(eroute.OrderBy, engine.OrderByParams{ + eroute.OrderBy = append(eroute.OrderBy, evalengine.OrderByParams{ Col: order.Offset, WeightStringCol: order.WOffset, Desc: order.Direction == sqlparser.DescOrder, diff --git a/go/vt/vttablet/tabletmanager/vdiff/utils.go b/go/vt/vttablet/tabletmanager/vdiff/utils.go index d756e6f6984..5904fd41795 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/utils.go +++ b/go/vt/vttablet/tabletmanager/vdiff/utils.go @@ -38,7 +38,7 @@ func newMergeSorter(participants map[string]*shardStreamer, comparePKs []compare for _, participant := range participants { prims = append(prims, participant) } - ob := make([]engine.OrderByParams, len(comparePKs)) + ob := make([]evalengine.OrderByParams, len(comparePKs)) for i, cpk := range comparePKs { weightStringCol := -1 // if the collation is nil or unknown, use binary collation to compare as bytes @@ -49,7 +49,7 @@ func newMergeSorter(participants map[string]*shardStreamer, comparePKs []compare if cpk.collation != collations.Unknown { t.Coll = cpk.collation } - ob[i] = engine.OrderByParams{Col: cpk.colIndex, WeightStringCol: weightStringCol, Type: t} + ob[i] = evalengine.OrderByParams{Col: cpk.colIndex, WeightStringCol: weightStringCol, Type: t} } return &engine.MergeSort{ Primitives: prims, diff --git a/go/vt/wrangler/vdiff.go b/go/vt/wrangler/vdiff.go index d09232e8997..2d6e49b73d7 100644 --- a/go/vt/wrangler/vdiff.go +++ b/go/vt/wrangler/vdiff.go @@ -780,7 +780,7 @@ func newMergeSorter(participants map[string]*shardStreamer, comparePKs []compare for _, participant := range participants { prims = append(prims, participant) } - ob := make([]engine.OrderByParams, 0, len(comparePKs)) + ob := make([]evalengine.OrderByParams, 0, len(comparePKs)) for _, cpk := range comparePKs { weightStringCol := -1 // if the collation is nil or unknown, use binary collation to compare as bytes @@ -788,7 +788,7 @@ func newMergeSorter(participants map[string]*shardStreamer, comparePKs []compare if cpk.collation != collations.Unknown { t.Coll = cpk.collation } - ob = append(ob, engine.OrderByParams{Col: cpk.colIndex, WeightStringCol: weightStringCol, Type: t}) + ob = append(ob, evalengine.OrderByParams{Col: cpk.colIndex, WeightStringCol: weightStringCol, Type: t}) } return &engine.MergeSort{ Primitives: prims, From 6eebcb7b05a0650788445cf1bd99c60e54cf7659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicent=20Mart=C3=AD?= <42793+vmg@users.noreply.github.com> Date: Tue, 7 Nov 2023 11:51:42 +0100 Subject: [PATCH 14/39] mysql/conn: do not allocate during writes (#14482) Signed-off-by: Vicent Marti --- go/mysql/conn.go | 62 +++++++++++++++++++----------------------------- 1 file changed, 25 insertions(+), 37 deletions(-) diff --git a/go/mysql/conn.go b/go/mysql/conn.go index aa9cd94c7d5..9cac35ea01f 100644 --- a/go/mysql/conn.go +++ b/go/mysql/conn.go @@ -333,7 +333,7 @@ func (c *Conn) endWriterBuffering() error { c.bufferedWriter = nil }() - c.stopFlushTimer() + c.flushTimer.Stop() return c.bufferedWriter.Flush() } @@ -345,43 +345,20 @@ func (c *Conn) returnReader() { readersPool.Put(c.bufferedReader) } -// getWriter returns the current writer. It may be either -// the original connection or a wrapper. The returned unget -// function must be invoked after the writing is finished. -// In buffered mode, the unget starts a timer to flush any -// buffered data. -func (c *Conn) getWriter() (w io.Writer, unget func()) { - c.bufMu.Lock() - if c.bufferedWriter != nil { - return c.bufferedWriter, func() { - c.startFlushTimer() - c.bufMu.Unlock() - } - } - c.bufMu.Unlock() - return c.conn, func() {} -} - // startFlushTimer must be called while holding lock on bufMu. func (c *Conn) startFlushTimer() { - c.stopFlushTimer() - c.flushTimer = time.AfterFunc(mysqlServerFlushDelay, func() { - c.bufMu.Lock() - defer c.bufMu.Unlock() - - if c.bufferedWriter == nil { - return - } - c.stopFlushTimer() - c.bufferedWriter.Flush() - }) -} + if c.flushTimer == nil { + c.flushTimer = time.AfterFunc(mysqlServerFlushDelay, func() { + c.bufMu.Lock() + defer c.bufMu.Unlock() -// stopFlushTimer must be called while holding lock on bufMu. -func (c *Conn) stopFlushTimer() { - if c.flushTimer != nil { - c.flushTimer.Stop() - c.flushTimer = nil + if c.bufferedWriter == nil { + return + } + c.bufferedWriter.Flush() + }) + } else { + c.flushTimer.Reset(mysqlServerFlushDelay) } } @@ -615,8 +592,19 @@ func (c *Conn) writePacket(data []byte) error { index := 0 dataLength := len(data) - packetHeaderSize - w, unget := c.getWriter() - defer unget() + var w io.Writer + + c.bufMu.Lock() + if c.bufferedWriter != nil { + w = c.bufferedWriter + defer func() { + c.startFlushTimer() + c.bufMu.Unlock() + }() + } else { + c.bufMu.Unlock() + w = c.conn + } var header [packetHeaderSize]byte for { From 1a9119d089b0b244ae491db39b22a5fe08fd0269 Mon Sep 17 00:00:00 2001 From: Deepthi Sigireddi Date: Tue, 7 Nov 2023 12:38:06 -0800 Subject: [PATCH 15/39] examples: fix flag syntax for zkctl (#14469) Signed-off-by: deepthi --- .github/workflows/local_example.yml | 2 +- examples/common/scripts/zk-down.sh | 2 +- examples/common/scripts/zk-up.sh | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index bd6bbb247e3..348e191abff 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -8,7 +8,7 @@ jobs: runs-on: gh-hosted-runners-16cores-1 strategy: matrix: - topo: [consul,etcd,k8s] + topo: [consul,etcd,zk2] steps: - name: Skip CI diff --git a/examples/common/scripts/zk-down.sh b/examples/common/scripts/zk-down.sh index a9fa1e80a30..f244f2b0f05 100755 --- a/examples/common/scripts/zk-down.sh +++ b/examples/common/scripts/zk-down.sh @@ -21,6 +21,6 @@ source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" # Stop ZooKeeper servers. echo "Stopping zk servers..." for zkid in $zkids; do - zkctl -zk.myid $zkid -zk.cfg $zkcfg -log_dir $VTDATAROOT/tmp shutdown + zkctl --zk.myid $zkid --zk.cfg $zkcfg --log_dir $VTDATAROOT/tmp shutdown done diff --git a/examples/common/scripts/zk-up.sh b/examples/common/scripts/zk-up.sh index 519d5305b25..3137ed724cc 100755 --- a/examples/common/scripts/zk-up.sh +++ b/examples/common/scripts/zk-up.sh @@ -19,7 +19,6 @@ source "$(dirname "${BASH_SOURCE[0]:-$0}")/../env.sh" cell=${CELL:-'test'} - # Start ZooKeeper servers. # The "zkctl init" command won't return until the server is able to contact its # peers, so we need to start them all in the background and then wait for them. @@ -32,7 +31,7 @@ for zkid in $zkids; do echo " $VTDATAROOT/$zkdir" action='start' fi - zkctl -zk.myid $zkid -zk.cfg $zkcfg -log_dir $VTDATAROOT/tmp $action \ + zkctl --zk.myid $zkid --zk.cfg $zkcfg --log_dir $VTDATAROOT/tmp $action \ > $VTDATAROOT/tmp/zkctl_$zkid.out 2>&1 & pids[$zkid]=$! done From 225fc70d58aae86da7b9172d65d8017e0fbdcaab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Taylor?= Date: Wed, 8 Nov 2023 11:28:27 +0100 Subject: [PATCH 16/39] Add support for AVG on sharded queries (#14419) --- .../queries/aggregation/aggregation_test.go | 50 +++-- go/vt/vtgate/engine/opcode/constants.go | 6 +- .../operators/aggregation_pushing.go | 109 +++++++-- go/vt/vtgate/planbuilder/operators/phases.go | 59 ++--- .../planbuilder/operators/queryprojection.go | 104 +++++---- .../planbuilder/testdata/aggr_cases.json | 211 ++++++++++++++++++ .../planbuilder/testdata/tpch_cases.json | 45 +++- .../testdata/unsupported_cases.json | 5 - 8 files changed, 482 insertions(+), 107 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go index ed917efda4c..b1123e634e8 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go +++ b/go/test/endtoend/vtgate/queries/aggregation/aggregation_test.go @@ -73,6 +73,7 @@ func TestAggregateTypes(t *testing.T) { mcmp.AssertMatches("select val1 as a, count(*) from aggr_test group by a order by a", `[[VARCHAR("a") INT64(2)] [VARCHAR("b") INT64(1)] [VARCHAR("c") INT64(2)] [VARCHAR("d") INT64(1)] [VARCHAR("e") INT64(2)]]`) mcmp.AssertMatches("select val1 as a, count(*) from aggr_test group by a order by 2, a", `[[VARCHAR("b") INT64(1)] [VARCHAR("d") INT64(1)] [VARCHAR("a") INT64(2)] [VARCHAR("c") INT64(2)] [VARCHAR("e") INT64(2)]]`) mcmp.AssertMatches("select sum(val1) from aggr_test", `[[FLOAT64(0)]]`) + mcmp.AssertMatches("select avg(val1) from aggr_test", `[[FLOAT64(0)]]`) } func TestGroupBy(t *testing.T) { @@ -172,6 +173,13 @@ func TestAggrOnJoin(t *testing.T) { mcmp.AssertMatches("select a.val1 from aggr_test a join t3 t on a.val2 = t.id7 group by a.val1 having count(*) = 4", `[[VARCHAR("a")]]`) + + mcmp.AssertMatches(`select avg(a1.val2), avg(a2.val2) from aggr_test a1 join aggr_test a2 on a1.val2 = a2.id join t3 t on a2.val2 = t.id7`, + "[[DECIMAL(1.5000) DECIMAL(1.0000)]]") + + mcmp.AssertMatches(`select a1.val1, avg(a1.val2) from aggr_test a1 join aggr_test a2 on a1.val2 = a2.id join t3 t on a2.val2 = t.id7 group by a1.val1`, + `[[VARCHAR("a") DECIMAL(1.0000)] [VARCHAR("b") DECIMAL(1.0000)] [VARCHAR("c") DECIMAL(3.0000)]]`) + } func TestNotEqualFilterOnScatter(t *testing.T) { @@ -314,22 +322,26 @@ func TestAggOnTopOfLimit(t *testing.T) { for _, workload := range []string{"oltp", "olap"} { t.Run(workload, func(t *testing.T) { utils.Exec(t, mcmp.VtConn, fmt.Sprintf("set workload = '%s'", workload)) - mcmp.AssertMatches(" select count(*) from (select id, val1 from aggr_test where val2 < 4 limit 2) as x", "[[INT64(2)]]") - mcmp.AssertMatches(" select count(val1) from (select id, val1 from aggr_test where val2 < 4 order by val1 desc limit 2) as x", "[[INT64(2)]]") - mcmp.AssertMatches(" select count(*) from (select id, val1 from aggr_test where val2 is null limit 2) as x", "[[INT64(2)]]") - mcmp.AssertMatches(" select count(val1) from (select id, val1 from aggr_test where val2 is null limit 2) as x", "[[INT64(1)]]") - mcmp.AssertMatches(" select count(val2) from (select id, val2 from aggr_test where val2 is null limit 2) as x", "[[INT64(0)]]") - mcmp.AssertMatches(" select val1, count(*) from (select id, val1 from aggr_test where val2 < 4 order by val1 limit 2) as x group by val1", `[[NULL INT64(1)] [VARCHAR("a") INT64(1)]]`) - mcmp.AssertMatchesNoOrder(" select val1, count(val2) from (select val1, val2 from aggr_test limit 8) as x group by val1", `[[NULL INT64(1)] [VARCHAR("a") INT64(2)] [VARCHAR("b") INT64(1)] [VARCHAR("c") INT64(2)]]`) + mcmp.AssertMatches("select count(*) from (select id, val1 from aggr_test where val2 < 4 limit 2) as x", "[[INT64(2)]]") + mcmp.AssertMatches("select count(val1) from (select id, val1 from aggr_test where val2 < 4 order by val1 desc limit 2) as x", "[[INT64(2)]]") + mcmp.AssertMatches("select count(*) from (select id, val1 from aggr_test where val2 is null limit 2) as x", "[[INT64(2)]]") + mcmp.AssertMatches("select count(val1) from (select id, val1 from aggr_test where val2 is null limit 2) as x", "[[INT64(1)]]") + mcmp.AssertMatches("select count(val2) from (select id, val2 from aggr_test where val2 is null limit 2) as x", "[[INT64(0)]]") + mcmp.AssertMatches("select avg(val2) from (select id, val2 from aggr_test where val2 is null limit 2) as x", "[[NULL]]") + mcmp.AssertMatches("select val1, count(*) from (select id, val1 from aggr_test where val2 < 4 order by val1 limit 2) as x group by val1", `[[NULL INT64(1)] [VARCHAR("a") INT64(1)]]`) + mcmp.AssertMatchesNoOrder("select val1, count(val2) from (select val1, val2 from aggr_test limit 8) as x group by val1", `[[NULL INT64(1)] [VARCHAR("a") INT64(2)] [VARCHAR("b") INT64(1)] [VARCHAR("c") INT64(2)]]`) + mcmp.AssertMatchesNoOrder("select val1, avg(val2) from (select val1, val2 from aggr_test limit 8) as x group by val1", `[[NULL DECIMAL(2.0000)] [VARCHAR("a") DECIMAL(3.5000)] [VARCHAR("b") DECIMAL(1.0000)] [VARCHAR("c") DECIMAL(3.5000)]]`) // mysql returns FLOAT64(0), vitess returns DECIMAL(0) - mcmp.AssertMatchesNoCompare(" select count(*), sum(val1) from (select id, val1 from aggr_test where val2 < 4 order by val1 desc limit 2) as x", "[[INT64(2) FLOAT64(0)]]", "[[INT64(2) FLOAT64(0)]]") - mcmp.AssertMatches(" select count(val1), sum(id) from (select id, val1 from aggr_test where val2 < 4 order by val1 desc limit 2) as x", "[[INT64(2) DECIMAL(7)]]") - mcmp.AssertMatches(" select count(*), sum(id) from (select id, val1 from aggr_test where val2 is null limit 2) as x", "[[INT64(2) DECIMAL(14)]]") - mcmp.AssertMatches(" select count(val1), sum(id) from (select id, val1 from aggr_test where val2 is null limit 2) as x", "[[INT64(1) DECIMAL(14)]]") - mcmp.AssertMatches(" select count(val2), sum(val2) from (select id, val2 from aggr_test where val2 is null limit 2) as x", "[[INT64(0) NULL]]") - mcmp.AssertMatches(" select val1, count(*), sum(id) from (select id, val1 from aggr_test where val2 < 4 order by val1 limit 2) as x group by val1", `[[NULL INT64(1) DECIMAL(7)] [VARCHAR("a") INT64(1) DECIMAL(2)]]`) - mcmp.AssertMatchesNoOrder(" select val1, count(val2), sum(val2) from (select val1, val2 from aggr_test limit 8) as x group by val1", `[[NULL INT64(1) DECIMAL(2)] [VARCHAR("a") INT64(2) DECIMAL(7)] [VARCHAR("b") INT64(1) DECIMAL(1)] [VARCHAR("c") INT64(2) DECIMAL(7)]]`) + mcmp.AssertMatches("select count(*), sum(val1), avg(val1) from (select id, val1 from aggr_test where val2 < 4 order by val1 desc limit 2) as x", "[[INT64(2) FLOAT64(0) FLOAT64(0)]]") + mcmp.AssertMatches("select count(val1), sum(id) from (select id, val1 from aggr_test where val2 < 4 order by val1 desc limit 2) as x", "[[INT64(2) DECIMAL(7)]]") + mcmp.AssertMatches("select count(val1), sum(id), avg(id) from (select id, val1 from aggr_test where val2 < 4 order by val1 desc limit 2) as x", "[[INT64(2) DECIMAL(7) DECIMAL(3.5000)]]") + mcmp.AssertMatches("select count(*), sum(id) from (select id, val1 from aggr_test where val2 is null limit 2) as x", "[[INT64(2) DECIMAL(14)]]") + mcmp.AssertMatches("select count(val1), sum(id) from (select id, val1 from aggr_test where val2 is null limit 2) as x", "[[INT64(1) DECIMAL(14)]]") + mcmp.AssertMatches("select count(val2), sum(val2) from (select id, val2 from aggr_test where val2 is null limit 2) as x", "[[INT64(0) NULL]]") + mcmp.AssertMatches("select val1, count(*), sum(id) from (select id, val1 from aggr_test where val2 < 4 order by val1 limit 2) as x group by val1", `[[NULL INT64(1) DECIMAL(7)] [VARCHAR("a") INT64(1) DECIMAL(2)]]`) + mcmp.AssertMatchesNoOrder("select val1, count(val2), sum(val2), avg(val2) from (select val1, val2 from aggr_test limit 8) as x group by val1", + `[[NULL INT64(1) DECIMAL(2) DECIMAL(2.0000)] [VARCHAR("a") INT64(2) DECIMAL(7) DECIMAL(3.5000)] [VARCHAR("b") INT64(1) DECIMAL(1) DECIMAL(1.0000)] [VARCHAR("c") INT64(2) DECIMAL(7) DECIMAL(3.5000)]]`) }) } } @@ -343,6 +355,8 @@ func TestEmptyTableAggr(t *testing.T) { utils.Exec(t, mcmp.VtConn, fmt.Sprintf("set workload = %s", workload)) mcmp.AssertMatches(" select count(*) from t1 inner join t2 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[INT64(0)]]") mcmp.AssertMatches(" select count(*) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[INT64(0)]]") + mcmp.AssertMatches(" select count(t1.value) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[INT64(0)]]") + mcmp.AssertMatches(" select avg(t1.value) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[NULL]]") mcmp.AssertMatches(" select t1.`name`, count(*) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo' group by t1.`name`", "[]") mcmp.AssertMatches(" select t1.`name`, count(*) from t1 inner join t2 on (t1.t1_id = t2.id) where t1.value = 'foo' group by t1.`name`", "[]") }) @@ -355,8 +369,10 @@ func TestEmptyTableAggr(t *testing.T) { utils.Exec(t, mcmp.VtConn, fmt.Sprintf("set workload = %s", workload)) mcmp.AssertMatches(" select count(*) from t1 inner join t2 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[INT64(0)]]") mcmp.AssertMatches(" select count(*) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[INT64(0)]]") - mcmp.AssertMatches(" select t1.`name`, count(*) from t1 inner join t2 on (t1.t1_id = t2.id) where t1.value = 'foo' group by t1.`name`", "[]") + mcmp.AssertMatches(" select count(t1.value) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[INT64(0)]]") + mcmp.AssertMatches(" select avg(t1.value) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo'", "[[NULL]]") mcmp.AssertMatches(" select t1.`name`, count(*) from t2 inner join t1 on (t1.t1_id = t2.id) where t1.value = 'foo' group by t1.`name`", "[]") + mcmp.AssertMatches(" select t1.`name`, count(*) from t1 inner join t2 on (t1.t1_id = t2.id) where t1.value = 'foo' group by t1.`name`", "[]") }) } @@ -398,6 +414,8 @@ func TestAggregateLeftJoin(t *testing.T) { mcmp.AssertMatches("SELECT count(*) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[INT64(2)]]`) mcmp.AssertMatches("SELECT sum(t1.shardkey) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[DECIMAL(1)]]`) mcmp.AssertMatches("SELECT sum(t2.shardkey) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[DECIMAL(1)]]`) + mcmp.AssertMatches("SELECT avg(t1.shardkey) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[DECIMAL(0.5000)]]`) + mcmp.AssertMatches("SELECT avg(t2.shardkey) FROM t1 LEFT JOIN t2 ON t1.t1_id = t2.id", `[[DECIMAL(1.0000)]]`) mcmp.AssertMatches("SELECT count(*) FROM t2 LEFT JOIN t1 ON t1.t1_id = t2.id WHERE IFNULL(t1.name, 'NOTSET') = 'r'", `[[INT64(1)]]`) } @@ -426,6 +444,7 @@ func TestScalarAggregate(t *testing.T) { mcmp.Exec("insert into aggr_test(id, val1, val2) values(1,'a',1), (2,'A',1), (3,'b',1), (4,'c',3), (5,'c',4)") mcmp.AssertMatches("select count(distinct val1) from aggr_test", `[[INT64(3)]]`) + mcmp.AssertMatches("select avg(val1) from aggr_test", `[[FLOAT64(0)]]`) } func TestAggregationRandomOnAnAggregatedValue(t *testing.T) { @@ -478,6 +497,7 @@ func TestComplexAggregation(t *testing.T) { mcmp.Exec(`SELECT 1+COUNT(t1_id) FROM t1`) mcmp.Exec(`SELECT COUNT(t1_id)+1 FROM t1`) mcmp.Exec(`SELECT COUNT(t1_id)+MAX(shardkey) FROM t1`) + mcmp.Exec(`SELECT COUNT(t1_id)+MAX(shardkey)+AVG(t1_id) FROM t1`) mcmp.Exec(`SELECT shardkey, MIN(t1_id)+MAX(t1_id) FROM t1 GROUP BY shardkey`) mcmp.Exec(`SELECT shardkey + MIN(t1_id)+MAX(t1_id) FROM t1 GROUP BY shardkey`) mcmp.Exec(`SELECT name+COUNT(t1_id)+1 FROM t1 GROUP BY name`) diff --git a/go/vt/vtgate/engine/opcode/constants.go b/go/vt/vtgate/engine/opcode/constants.go index dd73a78974d..8a70df79d0c 100644 --- a/go/vt/vtgate/engine/opcode/constants.go +++ b/go/vt/vtgate/engine/opcode/constants.go @@ -74,6 +74,7 @@ const ( AggregateAnyValue AggregateCountStar AggregateGroupConcat + AggregateAvg _NumOfOpCodes // This line must be last of the opcodes! ) @@ -85,6 +86,7 @@ var ( AggregateCountStar: sqltypes.Int64, AggregateSumDistinct: sqltypes.Decimal, AggregateSum: sqltypes.Decimal, + AggregateAvg: sqltypes.Decimal, AggregateGtid: sqltypes.VarChar, } ) @@ -96,6 +98,7 @@ var SupportedAggregates = map[string]AggregateOpcode{ "sum": AggregateSum, "min": AggregateMin, "max": AggregateMax, + "avg": AggregateAvg, // These functions don't exist in mysql, but are used // to display the plan. "count_distinct": AggregateCountDistinct, @@ -117,6 +120,7 @@ var AggregateName = map[AggregateOpcode]string{ AggregateCountStar: "count_star", AggregateGroupConcat: "group_concat", AggregateAnyValue: "any_value", + AggregateAvg: "avg", } func (code AggregateOpcode) String() string { @@ -148,7 +152,7 @@ func (code AggregateOpcode) Type(typ querypb.Type) querypb.Type { return sqltypes.Text case AggregateMax, AggregateMin, AggregateAnyValue: return typ - case AggregateSumDistinct, AggregateSum: + case AggregateSumDistinct, AggregateSum, AggregateAvg: if typ == sqltypes.Unknown { return sqltypes.Unknown } diff --git a/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go b/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go index 85c50427364..0127e81b4c4 100644 --- a/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go +++ b/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go @@ -34,22 +34,33 @@ func tryPushAggregator(ctx *plancontext.PlanningContext, aggregator *Aggregator) if aggregator.Pushed { return aggregator, rewrite.SameTree, nil } + + // this rewrite is always valid, and we should do it whenever possible + if route, ok := aggregator.Source.(*Route); ok && (route.IsSingleShard() || overlappingUniqueVindex(ctx, aggregator.Grouping)) { + return rewrite.Swap(aggregator, route, "push down aggregation under route - remove original") + } + + // other rewrites require us to have reached this phase before we can consider them + if !reachedPhase(ctx, delegateAggregation) { + return aggregator, rewrite.SameTree, nil + } + + // if we have not yet been able to push this aggregation down, + // we need to turn AVG into SUM/COUNT to support this over a sharded keyspace + if needAvgBreaking(aggregator.Aggregations) { + return splitAvgAggregations(ctx, aggregator) + } + switch src := aggregator.Source.(type) { case *Route: // if we have a single sharded route, we can push it down output, applyResult, err = pushAggregationThroughRoute(ctx, aggregator, src) case *ApplyJoin: - if reachedPhase(ctx, delegateAggregation) { - output, applyResult, err = pushAggregationThroughJoin(ctx, aggregator, src) - } + output, applyResult, err = pushAggregationThroughJoin(ctx, aggregator, src) case *Filter: - if reachedPhase(ctx, delegateAggregation) { - output, applyResult, err = pushAggregationThroughFilter(ctx, aggregator, src) - } + output, applyResult, err = pushAggregationThroughFilter(ctx, aggregator, src) case *SubQueryContainer: - if reachedPhase(ctx, delegateAggregation) { - output, applyResult, err = pushAggregationThroughSubquery(ctx, aggregator, src) - } + output, applyResult, err = pushAggregationThroughSubquery(ctx, aggregator, src) default: return aggregator, rewrite.SameTree, nil } @@ -135,15 +146,6 @@ func pushAggregationThroughRoute( aggregator *Aggregator, route *Route, ) (ops.Operator, *rewrite.ApplyResult, error) { - // If the route is single-shard, or we are grouping by sharding keys, we can just push down the aggregation - if route.IsSingleShard() || overlappingUniqueVindex(ctx, aggregator.Grouping) { - return rewrite.Swap(aggregator, route, "push down aggregation under route - remove original") - } - - if !reachedPhase(ctx, delegateAggregation) { - return nil, nil, nil - } - // Create a new aggregator to be placed below the route. aggrBelowRoute := aggregator.SplitAggregatorBelowRoute(route.Inputs()) aggrBelowRoute.Aggregations = nil @@ -806,3 +808,74 @@ func initColReUse(size int) []int { } func extractExpr(expr *sqlparser.AliasedExpr) sqlparser.Expr { return expr.Expr } + +func needAvgBreaking(aggrs []Aggr) bool { + for _, aggr := range aggrs { + if aggr.OpCode == opcode.AggregateAvg { + return true + } + } + return false +} + +// splitAvgAggregations takes an aggregator that has AVG aggregations in it and splits +// these into sum/count expressions that can be spread out to shards +func splitAvgAggregations(ctx *plancontext.PlanningContext, aggr *Aggregator) (ops.Operator, *rewrite.ApplyResult, error) { + proj := newAliasedProjection(aggr) + + var columns []*sqlparser.AliasedExpr + var aggregations []Aggr + + for offset, col := range aggr.Columns { + avg, ok := col.Expr.(*sqlparser.Avg) + if !ok { + proj.addColumnWithoutPushing(ctx, col, false /* addToGroupBy */) + continue + } + + if avg.Distinct { + panic(vterrors.VT12001("AVG(distinct <>)")) + } + + // We have an AVG that we need to split + sumExpr := &sqlparser.Sum{Arg: avg.Arg} + countExpr := &sqlparser.Count{Args: []sqlparser.Expr{avg.Arg}} + calcExpr := &sqlparser.BinaryExpr{ + Operator: sqlparser.DivOp, + Left: sumExpr, + Right: countExpr, + } + + outputColumn := aeWrap(col.Expr) + outputColumn.As = sqlparser.NewIdentifierCI(col.ColumnName()) + _, err := proj.addUnexploredExpr(sqlparser.CloneRefOfAliasedExpr(col), calcExpr) + if err != nil { + return nil, nil, err + } + col.Expr = sumExpr + found := false + for aggrOffset, aggregation := range aggr.Aggregations { + if offset == aggregation.ColOffset { + // We have found the AVG column. We'll change it to SUM, and then we add a COUNT as well + aggr.Aggregations[aggrOffset].OpCode = opcode.AggregateSum + + countExprAlias := aeWrap(countExpr) + countAggr := NewAggr(opcode.AggregateCount, countExpr, countExprAlias, sqlparser.String(countExpr)) + countAggr.ColOffset = len(aggr.Columns) + len(columns) + aggregations = append(aggregations, countAggr) + columns = append(columns, countExprAlias) + found = true + break // no need to search the remaining aggregations + } + } + if !found { + // if we get here, it's because we didn't find the aggregation. Something is wrong + panic(vterrors.VT13001("no aggregation pointing to this column was found")) + } + } + + aggr.Columns = append(aggr.Columns, columns...) + aggr.Aggregations = append(aggr.Aggregations, aggregations...) + + return proj, rewrite.NewTree("split avg aggregation", proj), nil +} diff --git a/go/vt/vtgate/planbuilder/operators/phases.go b/go/vt/vtgate/planbuilder/operators/phases.go index ba13a828d0b..36149f89985 100644 --- a/go/vt/vtgate/planbuilder/operators/phases.go +++ b/go/vt/vtgate/planbuilder/operators/phases.go @@ -19,6 +19,7 @@ package operators import ( "vitess.io/vitess/go/slice" "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/planbuilder/operators/ops" "vitess.io/vitess/go/vt/vtgate/planbuilder/operators/rewrite" "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" @@ -56,9 +57,9 @@ func (p Phase) String() string { return "optimize Distinct operations" case subquerySettling: return "settle subqueries" + default: + panic(vterrors.VT13001("unhandled default case")) } - - return "unknown" } func (p Phase) shouldRun(s semantics.QuerySignature) bool { @@ -73,8 +74,9 @@ func (p Phase) shouldRun(s semantics.QuerySignature) bool { return s.Distinct case subquerySettling: return s.SubQueries + default: + return true } - return true } func (p Phase) act(ctx *plancontext.PlanningContext, op ops.Operator) (ops.Operator, error) { @@ -84,14 +86,14 @@ func (p Phase) act(ctx *plancontext.PlanningContext, op ops.Operator) (ops.Opera case delegateAggregation: return enableDelegateAggregation(ctx, op) case addAggrOrdering: - return addOrderBysForAggregations(ctx, op) + return addOrderingForAllAggregations(ctx, op) case cleanOutPerfDistinct: return removePerformanceDistinctAboveRoute(ctx, op) case subquerySettling: return settleSubqueries(ctx, op), nil + default: + return op, nil } - - return op, nil } // getPhases returns the ordered phases that the planner will undergo. @@ -120,7 +122,8 @@ func enableDelegateAggregation(ctx *plancontext.PlanningContext, op ops.Operator return addColumnsToInput(ctx, op) } -func addOrderBysForAggregations(ctx *plancontext.PlanningContext, root ops.Operator) (ops.Operator, error) { +// addOrderingForAllAggregations is run we have pushed down Aggregators as far down as possible. +func addOrderingForAllAggregations(ctx *plancontext.PlanningContext, root ops.Operator) (ops.Operator, error) { visitor := func(in ops.Operator, _ semantics.TableSet, isRoot bool) (ops.Operator, *rewrite.ApplyResult, error) { aggrOp, ok := in.(*Aggregator) if !ok { @@ -131,30 +134,36 @@ func addOrderBysForAggregations(ctx *plancontext.PlanningContext, root ops.Opera if err != nil { return nil, nil, err } - if !requireOrdering { - return in, rewrite.SameTree, nil - } - orderBys := slice.Map(aggrOp.Grouping, func(from GroupBy) ops.OrderBy { - return from.AsOrderBy() - }) - if aggrOp.DistinctExpr != nil { - orderBys = append(orderBys, ops.OrderBy{ - Inner: &sqlparser.Order{ - Expr: aggrOp.DistinctExpr, - }, - SimplifiedExpr: aggrOp.DistinctExpr, - }) - } - aggrOp.Source = &Ordering{ - Source: aggrOp.Source, - Order: orderBys, + + var res *rewrite.ApplyResult + if requireOrdering { + addOrderingFor(aggrOp) + res = rewrite.NewTree("added ordering before aggregation", in) } - return in, rewrite.NewTree("added ordering before aggregation", in), nil + return in, res, nil } return rewrite.BottomUp(root, TableID, visitor, stopAtRoute) } +func addOrderingFor(aggrOp *Aggregator) { + orderBys := slice.Map(aggrOp.Grouping, func(from GroupBy) ops.OrderBy { + return from.AsOrderBy() + }) + if aggrOp.DistinctExpr != nil { + orderBys = append(orderBys, ops.OrderBy{ + Inner: &sqlparser.Order{ + Expr: aggrOp.DistinctExpr, + }, + SimplifiedExpr: aggrOp.DistinctExpr, + }) + } + aggrOp.Source = &Ordering{ + Source: aggrOp.Source, + Order: orderBys, + } +} + func needsOrdering(ctx *plancontext.PlanningContext, in *Aggregator) (bool, error) { requiredOrder := slice.Map(in.Grouping, func(from GroupBy) sqlparser.Expr { return from.SimplifiedExpr diff --git a/go/vt/vtgate/planbuilder/operators/queryprojection.go b/go/vt/vtgate/planbuilder/operators/queryprojection.go index b7040807300..ff188d6c895 100644 --- a/go/vt/vtgate/planbuilder/operators/queryprojection.go +++ b/go/vt/vtgate/planbuilder/operators/queryprojection.go @@ -686,25 +686,13 @@ func (qp *QueryProjection) NeedsDistinct() bool { } func (qp *QueryProjection) AggregationExpressions(ctx *plancontext.PlanningContext, allowComplexExpression bool) (out []Aggr, complex bool, err error) { -orderBy: - for _, orderExpr := range qp.OrderExprs { - orderExpr := orderExpr.SimplifiedExpr - for _, expr := range qp.SelectExprs { - col, ok := expr.Col.(*sqlparser.AliasedExpr) - if !ok { - continue - } - if ctx.SemTable.EqualsExprWithDeps(col.Expr, orderExpr) { - continue orderBy // we found the expression we were looking for! - } - } - qp.SelectExprs = append(qp.SelectExprs, SelectExpr{ - Col: &sqlparser.AliasedExpr{Expr: orderExpr}, - Aggr: containsAggr(orderExpr), - }) - qp.AddedColumn++ + qp.addOrderByToSelect(ctx) + addAggr := func(a Aggr) { + out = append(out, a) + } + makeComplex := func() { + complex = true } - // Here we go over the expressions we are returning. Since we know we are aggregating, // all expressions have to be either grouping expressions or aggregate expressions. // If we find an expression that is neither, we treat is as a special aggregation function AggrRandom @@ -733,34 +721,66 @@ orderBy: return nil, false, vterrors.VT12001("in scatter query: complex aggregate expression") } - sqlparser.CopyOnRewrite(aliasedExpr.Expr, func(node, parent sqlparser.SQLNode) bool { - ex, isExpr := node.(sqlparser.Expr) - if !isExpr { - return true - } - if aggr, isAggr := node.(sqlparser.AggrFunc); isAggr { - ae := aeWrap(aggr) - if aggr == aliasedExpr.Expr { - ae = aliasedExpr - } - aggrFunc := createAggrFromAggrFunc(aggr, ae) - aggrFunc.Index = &idxCopy - out = append(out, aggrFunc) - return false + sqlparser.CopyOnRewrite(aliasedExpr.Expr, qp.extractAggr(ctx, idx, aliasedExpr, addAggr, makeComplex), nil, nil) + } + return +} + +func (qp *QueryProjection) extractAggr( + ctx *plancontext.PlanningContext, + idx int, + aliasedExpr *sqlparser.AliasedExpr, + addAggr func(a Aggr), + makeComplex func(), +) func(node sqlparser.SQLNode, parent sqlparser.SQLNode) bool { + return func(node, parent sqlparser.SQLNode) bool { + ex, isExpr := node.(sqlparser.Expr) + if !isExpr { + return true + } + if aggr, isAggr := node.(sqlparser.AggrFunc); isAggr { + ae := aeWrap(aggr) + if aggr == aliasedExpr.Expr { + ae = aliasedExpr } - if containsAggr(node) { - complex = true - return true + aggrFunc := createAggrFromAggrFunc(aggr, ae) + aggrFunc.Index = &idx + addAggr(aggrFunc) + return false + } + if containsAggr(node) { + makeComplex() + return true + } + if !qp.isExprInGroupByExprs(ctx, ex) { + aggr := NewAggr(opcode.AggregateAnyValue, nil, aeWrap(ex), "") + aggr.Index = &idx + addAggr(aggr) + } + return false + } +} + +func (qp *QueryProjection) addOrderByToSelect(ctx *plancontext.PlanningContext) { +orderBy: + // We need to return all columns that are being used for ordering + for _, orderExpr := range qp.OrderExprs { + orderExpr := orderExpr.SimplifiedExpr + for _, expr := range qp.SelectExprs { + col, ok := expr.Col.(*sqlparser.AliasedExpr) + if !ok { + continue } - if !qp.isExprInGroupByExprs(ctx, ex) { - aggr := NewAggr(opcode.AggregateAnyValue, nil, aeWrap(ex), "") - aggr.Index = &idxCopy - out = append(out, aggr) + if ctx.SemTable.EqualsExprWithDeps(col.Expr, orderExpr) { + continue orderBy // we found the expression we were looking for! } - return false - }, nil, nil) + } + qp.SelectExprs = append(qp.SelectExprs, SelectExpr{ + Col: &sqlparser.AliasedExpr{Expr: orderExpr}, + Aggr: containsAggr(orderExpr), + }) + qp.AddedColumn++ } - return } func createAggrFromAggrFunc(fnc sqlparser.AggrFunc, aliasedExpr *sqlparser.AliasedExpr) Aggr { diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json index e47b17cd2ae..827c64464f8 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -6038,5 +6038,216 @@ "user.user_extra" ] } + }, + { + "comment": "avg function on scatter query", + "query": "select avg(id) from user", + "plan": { + "QueryType": "SELECT", + "Original": "select avg(id) from user", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + "sum(id) / count(id) as avg(id)" + ], + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Scalar", + "Aggregates": "sum(0) AS avg(id), sum_count(1) AS count(id)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select sum(id), count(id) from `user` where 1 != 1", + "Query": "select sum(id), count(id) from `user`", + "Table": "`user`" + } + ] + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } + }, + { + "comment": "avg function on scatter query deep inside the output expression", + "query": "select avg(id)+count(foo)+bar from user group by bar", + "plan": { + "QueryType": "SELECT", + "Original": "select avg(id)+count(foo)+bar from user group by bar", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + "avg(id) + count(foo) + bar as avg(id) + count(foo) + bar" + ], + "Inputs": [ + { + "OperatorType": "Projection", + "Expressions": [ + ":0 as bar", + "sum(id) / count(id) as avg(id)", + ":2 as count(foo)" + ], + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Ordered", + "Aggregates": "sum(1) AS avg(id), sum_count(2) AS count(foo), sum_count(3) AS count(id)", + "GroupBy": "(0|4)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select bar, sum(id), count(foo), count(id), weight_string(bar) from `user` where 1 != 1 group by bar, weight_string(bar)", + "OrderBy": "(0|4) ASC", + "Query": "select bar, sum(id), count(foo), count(id), weight_string(bar) from `user` group by bar, weight_string(bar) order by bar asc", + "Table": "`user`" + } + ] + } + ] + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } + }, + { + "comment": "avg function on scatter query deep inside the output expression", + "query": "select avg(id)+count(foo)+bar from user group by bar", + "plan": { + "QueryType": "SELECT", + "Original": "select avg(id)+count(foo)+bar from user group by bar", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + "avg(id) + count(foo) + bar as avg(id) + count(foo) + bar" + ], + "Inputs": [ + { + "OperatorType": "Projection", + "Expressions": [ + ":0 as bar", + "sum(id) / count(id) as avg(id)", + ":2 as count(foo)" + ], + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Ordered", + "Aggregates": "sum(1) AS avg(id), sum_count(2) AS count(foo), sum_count(3) AS count(id)", + "GroupBy": "(0|4)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select bar, sum(id), count(foo), count(id), weight_string(bar) from `user` where 1 != 1 group by bar, weight_string(bar)", + "OrderBy": "(0|4) ASC", + "Query": "select bar, sum(id), count(foo), count(id), weight_string(bar) from `user` group by bar, weight_string(bar) order by bar asc", + "Table": "`user`" + } + ] + } + ] + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } + }, + { + "comment": "two avg aggregations", + "query": "select avg(foo), avg(bar) from user", + "plan": { + "QueryType": "SELECT", + "Original": "select avg(foo), avg(bar) from user", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + "sum(foo) / count(foo) as avg(foo)", + "sum(bar) / count(bar) as avg(bar)" + ], + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Scalar", + "Aggregates": "sum(0) AS avg(foo), sum(1) AS avg(bar), sum_count(2) AS count(foo), sum_count(3) AS count(bar)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select sum(foo), sum(bar), count(foo), count(bar) from `user` where 1 != 1", + "Query": "select sum(foo), sum(bar), count(foo), count(bar) from `user`", + "Table": "`user`" + } + ] + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } + }, + { + "comment": "avg and count on the same argument", + "query": "select avg(foo), count(foo) from user", + "plan": { + "QueryType": "SELECT", + "Original": "select avg(foo), count(foo) from user", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + "sum(foo) / count(foo) as avg(foo)", + ":1 as count(foo)" + ], + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Scalar", + "Aggregates": "sum(0) AS avg(foo), sum_count(1) AS count(foo), sum_count(2) AS count(foo)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select sum(foo), count(foo), count(foo) from `user` where 1 != 1", + "Query": "select sum(foo), count(foo), count(foo) from `user`", + "Table": "`user`" + } + ] + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/tpch_cases.json b/go/vt/vtgate/planbuilder/testdata/tpch_cases.json index f40ea961334..61f602c4e33 100644 --- a/go/vt/vtgate/planbuilder/testdata/tpch_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/tpch_cases.json @@ -2,7 +2,50 @@ { "comment": "TPC-H query 1", "query": "select l_returnflag, l_linestatus, sum(l_quantity) as sum_qty, sum(l_extendedprice) as sum_base_price, sum(l_extendedprice * (1 - l_discount)) as sum_disc_price, sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge, avg(l_quantity) as avg_qty, avg(l_extendedprice) as avg_price, avg(l_discount) as avg_disc, count(*) as count_order from lineitem where l_shipdate <= '1998-12-01' - interval '108' day group by l_returnflag, l_linestatus order by l_returnflag, l_linestatus", - "plan": "VT12001: unsupported: in scatter query: aggregation function 'avg(l_quantity) as avg_qty'" + "plan": { + "QueryType": "SELECT", + "Original": "select l_returnflag, l_linestatus, sum(l_quantity) as sum_qty, sum(l_extendedprice) as sum_base_price, sum(l_extendedprice * (1 - l_discount)) as sum_disc_price, sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge, avg(l_quantity) as avg_qty, avg(l_extendedprice) as avg_price, avg(l_discount) as avg_disc, count(*) as count_order from lineitem where l_shipdate <= '1998-12-01' - interval '108' day group by l_returnflag, l_linestatus order by l_returnflag, l_linestatus", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + ":0 as l_returnflag", + ":1 as l_linestatus", + ":2 as sum_qty", + ":3 as sum_base_price", + ":4 as sum_disc_price", + ":5 as sum_charge", + "sum(l_quantity) / count(l_quantity) as avg_qty", + "sum(l_extendedprice) / count(l_extendedprice) as avg_price", + "sum(l_discount) / count(l_discount) as avg_disc", + ":9 as count_order" + ], + "Inputs": [ + { + "OperatorType": "Aggregate", + "Variant": "Ordered", + "Aggregates": "sum(2) AS sum_qty, sum(3) AS sum_base_price, sum(4) AS sum_disc_price, sum(5) AS sum_charge, sum(6) AS avg_qty, sum(7) AS avg_price, sum(8) AS avg_disc, sum_count_star(9) AS count_order, sum_count(10) AS count(l_quantity), sum_count(11) AS count(l_extendedprice), sum_count(12) AS count(l_discount)", + "GroupBy": "(0|13), (1|14)", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "main", + "Sharded": true + }, + "FieldQuery": "select l_returnflag, l_linestatus, sum(l_quantity) as sum_qty, sum(l_extendedprice) as sum_base_price, sum(l_extendedprice * (1 - l_discount)) as sum_disc_price, sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge, sum(l_quantity) as avg_qty, sum(l_extendedprice) as avg_price, sum(l_discount) as avg_disc, count(*) as count_order, count(l_quantity), count(l_extendedprice), count(l_discount), weight_string(l_returnflag), weight_string(l_linestatus) from lineitem where 1 != 1 group by l_returnflag, l_linestatus, weight_string(l_returnflag), weight_string(l_linestatus)", + "OrderBy": "(0|13) ASC, (1|14) ASC", + "Query": "select l_returnflag, l_linestatus, sum(l_quantity) as sum_qty, sum(l_extendedprice) as sum_base_price, sum(l_extendedprice * (1 - l_discount)) as sum_disc_price, sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge, sum(l_quantity) as avg_qty, sum(l_extendedprice) as avg_price, sum(l_discount) as avg_disc, count(*) as count_order, count(l_quantity), count(l_extendedprice), count(l_discount), weight_string(l_returnflag), weight_string(l_linestatus) from lineitem where l_shipdate <= '1998-12-01' - interval '108' day group by l_returnflag, l_linestatus, weight_string(l_returnflag), weight_string(l_linestatus) order by l_returnflag asc, l_linestatus asc", + "Table": "lineitem" + } + ] + } + ] + }, + "TablesUsed": [ + "main.lineitem" + ] + } }, { "comment": "TPC-H query 2", diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json index 923e7804782..6fb4e6d36ab 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json @@ -224,11 +224,6 @@ "query": "create view main.view_a as select * from user.user_extra", "plan": "VT12001: unsupported: Select query does not belong to the same keyspace as the view statement" }, - { - "comment": "avg function on scatter query", - "query": "select avg(id) from user", - "plan": "VT12001: unsupported: in scatter query: aggregation function 'avg(id)'" - }, { "comment": "outer and inner subquery route reference the same \"uu.id\" name\n# but they refer to different things. The first reference is to the outermost query,\n# and the second reference is to the innermost 'from' subquery.\n# This query will never work as the inner derived table is only selecting one of the column", "query": "select id2 from user uu where id in (select id from user where id = uu.id and user.col in (select col from (select id from user_extra where user_id = 5) uu where uu.user_id = uu.id))", From 43e533bdb7ada66e864dddccb8b3024e8448004e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Nov 2023 10:42:28 -0600 Subject: [PATCH 17/39] Bump google.golang.org/grpc from 1.55.0-dev to 1.56.3 (#14364) Signed-off-by: dependabot[bot] Signed-off-by: Florent Poinsard Signed-off-by: Dirkjan Bussink Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Florent Poinsard Co-authored-by: Dirkjan Bussink --- go.mod | 34 ++++----- go.sum | 70 ++++++++++--------- go/flags/endtoend/mysqlctl.txt | 6 +- go/flags/endtoend/mysqlctld.txt | 6 +- go/flags/endtoend/topo2topo.txt | 6 +- go/flags/endtoend/vtaclcheck.txt | 6 +- go/flags/endtoend/vtbackup.txt | 6 +- go/flags/endtoend/vtcombo.txt | 6 +- go/flags/endtoend/vtctlclient.txt | 8 ++- go/flags/endtoend/vtctld.txt | 6 +- go/flags/endtoend/vtctldclient.txt | 8 ++- go/flags/endtoend/vtexplain.txt | 6 +- go/flags/endtoend/vtgate.txt | 6 +- go/flags/endtoend/vtgateclienttest.txt | 6 +- go/flags/endtoend/vtorc.txt | 6 +- go/flags/endtoend/vttablet.txt | 6 +- go/flags/endtoend/vttestserver.txt | 6 +- go/flags/endtoend/zkctl.txt | 6 +- go/test/endtoend/cluster/mysqlctld_process.go | 12 +++- go/test/endtoend/cluster/topo_process.go | 45 ++++++++---- go/test/endtoend/cluster/vtctld_process.go | 11 ++- go/test/endtoend/cluster/vtgate_process.go | 6 +- go/test/endtoend/cluster/vtorc_process.go | 17 ++++- .../endtoend/recovery/pitr/binlog_server.go | 8 ++- go/vt/proto/binlogdata/binlogdata.pb.go | 2 +- go/vt/proto/binlogservice/binlogservice.pb.go | 2 +- go/vt/proto/logutil/logutil.pb.go | 2 +- go/vt/proto/mysqlctl/mysqlctl.pb.go | 2 +- go/vt/proto/query/query.pb.go | 2 +- go/vt/proto/queryservice/queryservice.pb.go | 2 +- .../replicationdata/replicationdata.pb.go | 2 +- go/vt/proto/tableacl/tableacl.pb.go | 2 +- .../tabletmanagerdata/tabletmanagerdata.pb.go | 2 +- .../tabletmanagerservice.pb.go | 2 +- go/vt/proto/throttlerdata/throttlerdata.pb.go | 2 +- .../throttlerservice/throttlerservice.pb.go | 2 +- go/vt/proto/topodata/topodata.pb.go | 2 +- go/vt/proto/vschema/vschema.pb.go | 2 +- go/vt/proto/vtadmin/vtadmin.pb.go | 2 +- go/vt/proto/vtctldata/vtctldata.pb.go | 2 +- go/vt/proto/vtctlservice/vtctlservice.pb.go | 2 +- go/vt/proto/vtgate/vtgate.pb.go | 2 +- go/vt/proto/vtgateservice/vtgateservice.pb.go | 2 +- go/vt/proto/vtrpc/vtrpc.pb.go | 2 +- go/vt/proto/vttest/vttest.pb.go | 2 +- go/vt/proto/vttime/vttime.pb.go | 2 +- 46 files changed, 207 insertions(+), 140 deletions(-) diff --git a/go.mod b/go.mod index 19fec748de8..7a396338352 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module vitess.io/vitess go 1.21 require ( - cloud.google.com/go/storage v1.29.0 + cloud.google.com/go/storage v1.30.1 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 github.com/Azure/azure-pipeline-go v0.2.3 github.com/Azure/azure-storage-blob-go v0.15.0 @@ -19,12 +19,12 @@ require ( github.com/evanphx/json-patch v5.6.0+incompatible github.com/fsnotify/fsnotify v1.6.0 github.com/go-sql-driver/mysql v1.7.0 - github.com/golang/glog v1.0.0 + github.com/golang/glog v1.1.2 github.com/golang/protobuf v1.5.3 github.com/golang/snappy v0.0.4 github.com/google/go-cmp v0.5.9 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 - github.com/google/uuid v1.3.0 + github.com/google/uuid v1.3.1 github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 @@ -74,18 +74,18 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.17.0 - golang.org/x/oauth2 v0.7.0 - golang.org/x/sys v0.13.0 + golang.org/x/oauth2 v0.11.0 + golang.org/x/sys v0.14.0 golang.org/x/term v0.13.0 - golang.org/x/text v0.13.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 - google.golang.org/api v0.121.0 - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect - google.golang.org/grpc v1.55.0-dev + google.golang.org/api v0.128.0 + google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/grpc v1.59.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/grpc/examples v0.0.0-20210430044426-28078834f35b - google.golang.org/protobuf v1.30.0 + google.golang.org/protobuf v1.31.0 gopkg.in/DataDog/dd-trace-go.v1 v1.50.1 gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect gopkg.in/ldap.v2 v2.5.1 @@ -114,10 +114,10 @@ require ( ) require ( - cloud.google.com/go v0.110.0 // indirect - cloud.google.com/go/compute v1.19.0 // indirect + cloud.google.com/go v0.110.9 // indirect + cloud.google.com/go/compute v1.23.2 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.13.0 // indirect + cloud.google.com/go/iam v1.1.4 // indirect github.com/DataDog/appsec-internal-go v1.0.0 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.43.1 // indirect github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.45.0-rc.1 // indirect @@ -138,9 +138,9 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/btree v1.0.1 // indirect - github.com/google/s2a-go v0.1.3 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.8.0 // indirect + github.com/google/s2a-go v0.1.4 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect @@ -177,6 +177,8 @@ require ( go4.org/unsafe/assume-no-moving-gc v0.0.0-20230426161633-7e06285ff160 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index f0b6cc35a35..395f8439090 100644 --- a/go.sum +++ b/go.sum @@ -17,24 +17,22 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.9 h1:e7ITSqGFFk4rbz/JFIqZh3G4VEHguhAL4BQcFlWtU68= +cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.23.2 h1:nWEMDhgbBkBJjfpVySqU4jgWdc22PLR0o4vEexZHers= +cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/iam v1.1.4 h1:K6n/GZHFTtEoKT5aUG3l9diPi0VduZNQ1PfdnpkkIFk= +cloud.google.com/go/iam v1.1.4/go.mod h1:l/rg8l1AaA+VFMho/HYx2Vv6xinPSLMF8qfhRPIZ0L8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -45,8 +43,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0= @@ -210,8 +208,8 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -285,22 +283,22 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= -github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/safehtml v0.1.0 h1:EwLKo8qawTKfsi0orxcQAZzu07cICaBeFMegAU9eaT8= github.com/google/safehtml v0.1.0/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= 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/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.4 h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4= +github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= 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/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= -github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= @@ -769,8 +767,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= 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= @@ -856,8 +854,8 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -875,8 +873,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 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/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -965,8 +963,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.121.0 h1:8Oopoo8Vavxx6gt+sgs8s8/X60WBAtKQq6JqnkF+xow= -google.golang.org/api v0.121.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= 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= @@ -1014,8 +1012,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= 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= @@ -1036,8 +1038,8 @@ google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA5 google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.55.0-dev h1:b3WG8LoyS+X/C5ZbIWsJGjt8Hhqq0wUVX8+rPF/BHZo= -google.golang.org/grpc v1.55.0-dev/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/grpc/examples v0.0.0-20210430044426-28078834f35b h1:D/GTYPo6I1oEo08Bfpuj3xl5XE+UGHj7//5fVyKxhsQ= @@ -1055,8 +1057,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/DataDog/dd-trace-go.v1 v1.50.1 h1:DUpHhh+MHtpYnUyGr5rpfvKUXkRg93TSEHii/LZVF6g= gopkg.in/DataDog/dd-trace-go.v1 v1.50.1/go.mod h1:sw4gV8LIXseC5ISMbDJmm79OJDdl8I2Hhtelb6lpHuQ= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/go/flags/endtoend/mysqlctl.txt b/go/flags/endtoend/mysqlctl.txt index a8f832d3345..518c3f49d4a 100644 --- a/go/flags/endtoend/mysqlctl.txt +++ b/go/flags/endtoend/mysqlctl.txt @@ -64,7 +64,7 @@ Flags: --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) @@ -86,12 +86,12 @@ Flags: --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --service_map strings comma separated list of services to enable (or disable if prefixed with '-') Example: grpc-queryservice --socket_file string Local unix socket file to listen on - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --table-refresh-interval int interval in milliseconds to refresh tables in status page with refreshRequired class --tablet_dir string The directory within the vtdataroot to store vttablet/mysql files. Defaults to being generated by the tablet uid. --tablet_uid uint32 Tablet UID. (default 41983) --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging Use "mysqlctl [command] --help" for more information about a command. diff --git a/go/flags/endtoend/mysqlctld.txt b/go/flags/endtoend/mysqlctld.txt index 06b48347bf6..141c6697070 100644 --- a/go/flags/endtoend/mysqlctld.txt +++ b/go/flags/endtoend/mysqlctld.txt @@ -89,7 +89,7 @@ Flags: --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) @@ -111,11 +111,11 @@ Flags: --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --service_map strings comma separated list of services to enable (or disable if prefixed with '-') Example: grpc-queryservice --socket_file string Local unix socket file to listen on - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --table-refresh-interval int interval in milliseconds to refresh tables in status page with refreshRequired class --tablet_dir string The directory within the vtdataroot to store vttablet/mysql files. Defaults to being generated by the tablet uid. --tablet_uid uint32 Tablet UID (default 41983) --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --wait_time duration How long to wait for mysqld startup or shutdown (default 5m0s) diff --git a/go/flags/endtoend/topo2topo.txt b/go/flags/endtoend/topo2topo.txt index 4391a32a1a8..a96d3cfda61 100644 --- a/go/flags/endtoend/topo2topo.txt +++ b/go/flags/endtoend/topo2topo.txt @@ -27,7 +27,7 @@ Flags: -h, --help help for topo2topo --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) @@ -35,10 +35,10 @@ Flags: --pprof strings enable profiling --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --to_implementation string topology implementation to copy data to --to_root string topology server root to copy data to --to_server string topology server address to copy data to --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging diff --git a/go/flags/endtoend/vtaclcheck.txt b/go/flags/endtoend/vtaclcheck.txt index 34bef9a05f9..a7ba7604f46 100644 --- a/go/flags/endtoend/vtaclcheck.txt +++ b/go/flags/endtoend/vtaclcheck.txt @@ -15,7 +15,7 @@ Flags: -h, --help help for vtaclcheck --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) @@ -24,7 +24,7 @@ Flags: --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --static-auth-file string The path of the auth_server_static JSON file to check - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging diff --git a/go/flags/endtoend/vtbackup.txt b/go/flags/endtoend/vtbackup.txt index 2dd6bf3ef28..8610606eca2 100644 --- a/go/flags/endtoend/vtbackup.txt +++ b/go/flags/endtoend/vtbackup.txt @@ -147,7 +147,7 @@ Flags: --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) @@ -201,7 +201,7 @@ Flags: --stats_common_tags strings Comma-separated list of common tags for the stats backend. It provides both label and values. Example: label1:value1,label2:value2 --stats_drop_variables string Variables to be dropped from the list of exported variables. --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --tablet_manager_grpc_ca string the server ca to use to validate servers when connecting --tablet_manager_grpc_cert string the cert to use to connect --tablet_manager_grpc_concurrency int concurrency to use to talk to a vttablet server for performance-sensitive RPCs (like ExecuteFetchAs{Dba,AllPrivs,App}) (default 8) @@ -230,7 +230,7 @@ Flags: --upgrade-safe Whether to use innodb_fast_shutdown=0 for the backup so it is safe to use for MySQL upgrades. --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --xbstream_restore_flags string Flags to pass to xbstream command during restore. These should be space separated and will be added to the end of the command. These need to match the ones used for backup e.g. --compress / --decompress, --encrypt / --decrypt --xtrabackup_backup_flags string Flags to pass to backup command. These should be space separated and will be added to the end of the command --xtrabackup_prepare_flags string Flags to pass to prepare command. These should be space separated and will be added to the end of the command diff --git a/go/flags/endtoend/vtcombo.txt b/go/flags/endtoend/vtcombo.txt index 71c11c54088..5a029b8dd84 100644 --- a/go/flags/endtoend/vtcombo.txt +++ b/go/flags/endtoend/vtcombo.txt @@ -189,7 +189,7 @@ Flags: --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) --lock_heartbeat_time duration If there is lock function used. This will keep the lock connection active by using this heartbeat (default 5s) --lock_tables_timeout duration How long to keep the table locked before timing out (default 1m0s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_queries_to_file string Enable query logging to the specified file @@ -329,7 +329,7 @@ Flags: --stats_common_tags strings Comma-separated list of common tags for the stats backend. It provides both label and values. Example: label1:value1,label2:value2 --stats_drop_variables string Variables to be dropped from the list of exported variables. --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --stream_buffer_size int the number of bytes sent from vtgate for each stream call. It's recommended to keep this value in sync with vttablet's query-server-config-stream-buffer-size. (default 32768) --stream_health_buffer_size uint max streaming health entries to buffer per streaming health client (default 20) --table-refresh-interval int interval in milliseconds to refresh tables in status page with refreshRequired class @@ -395,7 +395,7 @@ Flags: --unhealthy_threshold duration replication lag after which a replica is considered unhealthy (default 2h0m0s) --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vreplication-parallel-insert-workers int Number of parallel insertion workers to use during copy phase. Set <= 1 to disable parallelism, or > 1 to enable concurrent insertion during copy phase. (default 1) --vreplication_copy_phase_duration duration Duration for each copy phase loop (before running the next catchup: default 1h) (default 1h0m0s) --vreplication_copy_phase_max_innodb_history_list_length int The maximum InnoDB transaction history that can exist on a vstreamer (source) before starting another round of copying rows. This helps to limit the impact on the source tablet. (default 1000000) diff --git a/go/flags/endtoend/vtctlclient.txt b/go/flags/endtoend/vtctlclient.txt index 7fa186acbd0..4a4e44763f1 100644 --- a/go/flags/endtoend/vtctlclient.txt +++ b/go/flags/endtoend/vtctlclient.txt @@ -22,23 +22,25 @@ Usage of vtctlclient: --jaeger-agent-host string host and port to send spans to. if empty, no tracing will be done --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --pprof strings enable profiling --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --server string server to use for connection - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --tracer string tracing service to use (default "noop") --tracing-enable-logging whether to enable logging in the tracing service --tracing-sampling-rate float sampling rate for the probabilistic jaeger sampler (default 0.1) --tracing-sampling-type string sampling strategy to use for jaeger. possible values are 'const', 'probabilistic', 'rateLimiting', or 'remote' (default "const") --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vtctl_client_protocol string Protocol to use to talk to the vtctl server. (default "grpc") --vtctld_grpc_ca string the server ca to use to validate servers when connecting --vtctld_grpc_cert string the cert to use to connect diff --git a/go/flags/endtoend/vtctld.txt b/go/flags/endtoend/vtctld.txt index a9a5cebb0f3..82895637c69 100644 --- a/go/flags/endtoend/vtctld.txt +++ b/go/flags/endtoend/vtctld.txt @@ -88,7 +88,7 @@ Flags: --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) @@ -126,7 +126,7 @@ Flags: --stats_common_tags strings Comma-separated list of common tags for the stats backend. It provides both label and values. Example: label1:value1,label2:value2 --stats_drop_variables string Variables to be dropped from the list of exported variables. --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --table-refresh-interval int interval in milliseconds to refresh tables in status page with refreshRequired class --tablet_dir string The directory within the vtdataroot to store vttablet/mysql files. Defaults to being generated by the tablet uid. --tablet_grpc_ca string the server ca to use to validate servers when connecting @@ -171,5 +171,5 @@ Flags: --tracing-sampling-type string sampling strategy to use for jaeger. possible values are 'const', 'probabilistic', 'rateLimiting', or 'remote' (default "const") --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vtctld_sanitize_log_messages When true, vtctld sanitizes logging. diff --git a/go/flags/endtoend/vtctldclient.txt b/go/flags/endtoend/vtctldclient.txt index 7fddb7eebfe..f70f17f8136 100644 --- a/go/flags/endtoend/vtctldclient.txt +++ b/go/flags/endtoend/vtctldclient.txt @@ -115,18 +115,20 @@ Flags: -h, --help help for vtctldclient --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory + --log_link string If non-empty, add symbolic links in this directory to the log files --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) + --logbuflevel int Buffer log messages logged at this level or lower (-1 means don't buffer; 0 means buffer INFO only; ...). Has limited applicability on non-prod platforms. --logtostderr log to standard error instead of files --mysql_server_version string MySQL server version to advertise. (default "8.0.30-Vitess") --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --server string server to use for the connection (required) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) -v, --v Level log level for V logs --version version for vtctldclient - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vtctl_client_protocol string Protocol to use to talk to the vtctl server. (default "grpc") --vtctld_grpc_ca string the server ca to use to validate servers when connecting --vtctld_grpc_cert string the cert to use to connect diff --git a/go/flags/endtoend/vtexplain.txt b/go/flags/endtoend/vtexplain.txt index f75559474c0..748856a97a6 100644 --- a/go/flags/endtoend/vtexplain.txt +++ b/go/flags/endtoend/vtexplain.txt @@ -54,7 +54,7 @@ Flags: --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --ks-shard-map string JSON map of keyspace name -> shard name -> ShardReference object. The inner map is the same as the output of FindAllShardsInKeyspace --ks-shard-map-file string File containing json blob of keyspace name -> shard name -> ShardReference object - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) @@ -74,9 +74,9 @@ Flags: --sql-file string Identifies the file that contains the SQL commands to analyze --sql-max-length-errors int truncate queries in error logs to the given length (default unlimited) --sql-max-length-ui int truncate queries in debug UIs to the given length (default 512) (default 512) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vschema string Identifies the VTGate routing schema --vschema-file string Identifies the VTGate routing schema file diff --git a/go/flags/endtoend/vtgate.txt b/go/flags/endtoend/vtgate.txt index 6bad7c768aa..55974504d5e 100644 --- a/go/flags/endtoend/vtgate.txt +++ b/go/flags/endtoend/vtgate.txt @@ -105,7 +105,7 @@ Flags: --legacy_replication_lag_algorithm Use the legacy algorithm when selecting vttablets for serving. (default true) --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) --lock_heartbeat_time duration If there is lock function used. This will keep the lock connection active by using this heartbeat (default 5s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_queries_to_file string Enable query logging to the specified file @@ -188,7 +188,7 @@ Flags: --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) --statsd_address string Address for statsd client --statsd_sample_rate float Sample rate for statsd metrics (default 1) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --stream_buffer_size int the number of bytes sent from vtgate for each stream call. It's recommended to keep this value in sync with vttablet's query-server-config-stream-buffer-size. (default 32768) --table-refresh-interval int interval in milliseconds to refresh tables in status page with refreshRequired class --tablet_filters strings Specifies a comma-separated list of 'keyspace|shard_name or keyrange' values to filter the tablets to watch. @@ -228,7 +228,7 @@ Flags: --truncate-error-len int truncate errors sent to client if they are longer than this value (0 means do not truncate) --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vschema_ddl_authorized_users string List of users authorized to execute vschema ddl operations, or '%' to allow all users. --vtgate-config-terse-errors prevent bind vars from escaping in returned errors --warming-reads-concurrency int Number of concurrent warming reads allowed (default 500) diff --git a/go/flags/endtoend/vtgateclienttest.txt b/go/flags/endtoend/vtgateclienttest.txt index 4580d4d6ce7..6a05d975466 100644 --- a/go/flags/endtoend/vtgateclienttest.txt +++ b/go/flags/endtoend/vtgateclienttest.txt @@ -44,7 +44,7 @@ Flags: --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) @@ -59,9 +59,9 @@ Flags: --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --service_map strings comma separated list of services to enable (or disable if prefixed with '-') Example: grpc-queryservice - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --table-refresh-interval int interval in milliseconds to refresh tables in status page with refreshRequired class --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vschema_ddl_authorized_users string List of users authorized to execute vschema ddl operations, or '%' to allow all users. diff --git a/go/flags/endtoend/vtorc.txt b/go/flags/endtoend/vtorc.txt index b13756e793c..0bbe8ef7469 100644 --- a/go/flags/endtoend/vtorc.txt +++ b/go/flags/endtoend/vtorc.txt @@ -50,7 +50,7 @@ Flags: --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) @@ -76,7 +76,7 @@ Flags: --stats_common_tags strings Comma-separated list of common tags for the stats backend. It provides both label and values. Example: label1:value1,label2:value2 --stats_drop_variables string Variables to be dropped from the list of exported variables. --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --table-refresh-interval int interval in milliseconds to refresh tables in status page with refreshRequired class --tablet_manager_grpc_ca string the server ca to use to validate servers when connecting --tablet_manager_grpc_cert string the cert to use to connect @@ -106,5 +106,5 @@ Flags: --topo_zk_tls_key string the key to use to connect to the zk topo server, enables TLS --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --wait-replicas-timeout duration Duration for which to wait for replica's to respond when issuing RPCs (default 30s) diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index 30fe5e41172..7f18d8dc76b 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -213,7 +213,7 @@ Flags: --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) --lock-timeout duration Maximum time for which a shard/keyspace lock can be acquired for (default 45s) --lock_tables_timeout duration How long to keep the table locked before timing out (default 1m0s) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_queries Enable query logging to syslog. @@ -331,7 +331,7 @@ Flags: --stats_emit_period duration Interval between emitting stats to all registered backends (default 1m0s) --statsd_address string Address for statsd client --statsd_sample_rate float Sample rate for statsd metrics (default 1) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --stream_health_buffer_size uint max streaming health entries to buffer per streaming health client (default 20) --table-acl-config string path to table access checker config file; send SIGHUP to reload this file --table-acl-config-reload-interval duration Ticker to reload ACLs. Duration flag, format e.g.: 30s. Default: do not reload @@ -400,7 +400,7 @@ Flags: --unhealthy_threshold duration replication lag after which a replica is considered unhealthy (default 2h0m0s) --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vreplication-parallel-insert-workers int Number of parallel insertion workers to use during copy phase. Set <= 1 to disable parallelism, or > 1 to enable concurrent insertion during copy phase. (default 1) --vreplication_copy_phase_duration duration Duration for each copy phase loop (before running the next catchup: default 1h) (default 1h0m0s) --vreplication_copy_phase_max_innodb_history_list_length int The maximum InnoDB transaction history that can exist on a vstreamer (source) before starting another round of copying rows. This helps to limit the impact on the source tablet. (default 1000000) diff --git a/go/flags/endtoend/vttestserver.txt b/go/flags/endtoend/vttestserver.txt index fb9c42d932a..f6b9332a95e 100644 --- a/go/flags/endtoend/vttestserver.txt +++ b/go/flags/endtoend/vttestserver.txt @@ -75,7 +75,7 @@ Flags: --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) --keyspaces strings Comma separated list of keyspaces (default [test_keyspace]) --lameduck-period duration keep running at least this long after SIGTERM before stopping (default 50ms) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) @@ -112,7 +112,7 @@ Flags: --snapshot_file string A MySQL DB snapshot file --sql-max-length-errors int truncate queries in error logs to the given length (default unlimited) --sql-max-length-ui int truncate queries in debug UIs to the given length (default 512) (default 512) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --table-refresh-interval int interval in milliseconds to refresh tables in status page with refreshRequired class --tablet_dir string The directory within the vtdataroot to store vttablet/mysql files. Defaults to being generated by the tablet uid. --tablet_hostname string The hostname to use for the tablet otherwise it will be derived from OS' hostname (default "localhost") @@ -138,7 +138,7 @@ Flags: --transaction_mode string Transaction mode MULTI (default), SINGLE or TWOPC (default "MULTI") --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --vschema_ddl_authorized_users string Comma separated list of users authorized to execute vschema ddl operations via vtgate --vtctl_client_protocol string Protocol to use to talk to the vtctl server. (default "grpc") --vtctld_grpc_ca string the server ca to use to validate servers when connecting diff --git a/go/flags/endtoend/zkctl.txt b/go/flags/endtoend/zkctl.txt index d1aea061ea5..727c0f28191 100644 --- a/go/flags/endtoend/zkctl.txt +++ b/go/flags/endtoend/zkctl.txt @@ -22,17 +22,17 @@ Flags: -h, --help help for zkctl --keep_logs duration keep logs for this long (using ctime) (zero to keep forever) --keep_logs_by_mtime duration keep logs for this long (using mtime) (zero to keep forever) - --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_backtrace_at traceLocations when logging hits line file:N, emit a stack trace --log_dir string If non-empty, write log files in this directory --log_err_stacks log stack traces for errors --log_rotate_max_size uint size in bytes at which logs are rotated (glog.MaxSize) (default 1887436800) --logtostderr log to standard error instead of files --pprof strings enable profiling --purge_logs_interval duration how often try to remove old logs (default 1h0m0s) - --stderrthreshold severity logs at or above this threshold go to stderr (default 1) + --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) --v Level log level for V logs -v, --version print binary version - --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging + --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging --zk.cfg string zkid@server1:leaderPort1:electionPort1:clientPort1,...) (default "6@:3801:3802:3803") --zk.extra stringArray extra config line(s) to append verbatim to config (flag can be specified more than once) --zk.myid uint which server do you want to be? only needed when running multiple instance on one box, otherwise myid is implied by hostname diff --git a/go/test/endtoend/cluster/mysqlctld_process.go b/go/test/endtoend/cluster/mysqlctld_process.go index 60d30bc6cc0..08409c1246d 100644 --- a/go/test/endtoend/cluster/mysqlctld_process.go +++ b/go/test/endtoend/cluster/mysqlctld_process.go @@ -92,7 +92,15 @@ func (mysqlctld *MysqlctldProcess) Start() error { "--init_db_sql_file", mysqlctld.InitDBFile) } - errFile, _ := os.Create(path.Join(mysqlctld.LogDirectory, "mysqlctld-stderr.txt")) + err := os.MkdirAll(mysqlctld.LogDirectory, 0755) + if err != nil { + log.Errorf("Failed to create directory for mysqlctld logs: %v", err) + return err + } + errFile, err := os.Create(path.Join(mysqlctld.LogDirectory, "mysqlctld-stderr.txt")) + if err != nil { + log.Errorf("Failed to create directory for mysqlctld stderr: %v", err) + } tempProcess.Stderr = errFile tempProcess.Env = append(tempProcess.Env, os.Environ()...) @@ -103,7 +111,7 @@ func (mysqlctld *MysqlctldProcess) Start() error { log.Infof("%v", strings.Join(tempProcess.Args, " ")) - err := tempProcess.Start() + err = tempProcess.Start() if err != nil { return err } diff --git a/go/test/endtoend/cluster/topo_process.go b/go/test/endtoend/cluster/topo_process.go index 45a2e6586fa..776ed7da27e 100644 --- a/go/test/endtoend/cluster/topo_process.go +++ b/go/test/endtoend/cluster/topo_process.go @@ -145,10 +145,10 @@ func (topo *TopoProcess) SetupEtcd() (err error) { // SetupZookeeper spawns a new zookeeper topo service and initializes it with the defaults. // The service is kept running in the background until TearDown() is called. -func (topo *TopoProcess) SetupZookeeper(cluster *LocalProcessCluster) (err error) { +func (topo *TopoProcess) SetupZookeeper(cluster *LocalProcessCluster) error { host, err := os.Hostname() if err != nil { - return + return err } topo.ZKPorts = fmt.Sprintf("%d:%d:%d", cluster.GetAndReservePort(), cluster.GetAndReservePort(), topo.Port) @@ -160,16 +160,21 @@ func (topo *TopoProcess) SetupZookeeper(cluster *LocalProcessCluster) (err error "init", ) - errFile, _ := os.Create(path.Join(topo.DataDirectory, "topo-stderr.txt")) + err = os.MkdirAll(topo.LogDirectory, 0755) + if err != nil { + log.Errorf("Failed to create log directory for zookeeper: %v", err) + return err + } + errFile, err := os.Create(path.Join(topo.LogDirectory, "topo-stderr.txt")) + if err != nil { + log.Errorf("Failed to create file for zookeeper stderr: %v", err) + return err + } topo.proc.Stderr = errFile topo.proc.Env = append(topo.proc.Env, os.Environ()...) log.Infof("Starting zookeeper with args %v", strings.Join(topo.proc.Args, " ")) - err = topo.proc.Run() - if err != nil { - return - } - return + return topo.proc.Run() } // ConsulConfigs are the configurations that are added the config files which are used by consul @@ -193,13 +198,25 @@ type PortsInfo struct { func (topo *TopoProcess) SetupConsul(cluster *LocalProcessCluster) (err error) { topo.VerifyURL = fmt.Sprintf("http://%s:%d/v1/kv/?keys", topo.Host, topo.Port) - _ = os.MkdirAll(topo.LogDirectory, os.ModePerm) - _ = os.MkdirAll(topo.DataDirectory, os.ModePerm) + err = os.MkdirAll(topo.LogDirectory, os.ModePerm) + if err != nil { + log.Errorf("Failed to create directory for consul logs: %v", err) + return + } + err = os.MkdirAll(topo.DataDirectory, os.ModePerm) + if err != nil { + log.Errorf("Failed to create directory for consul data: %v", err) + return + } configFile := path.Join(os.Getenv("VTDATAROOT"), "consul.json") logFile := path.Join(topo.LogDirectory, "/consul.log") - _, _ = os.Create(logFile) + _, err = os.Create(logFile) + if err != nil { + log.Errorf("Failed to create file for consul logs: %v", err) + return + } var config []byte configs := ConsulConfigs{ @@ -233,7 +250,11 @@ func (topo *TopoProcess) SetupConsul(cluster *LocalProcessCluster) (err error) { "-config-file", configFile, ) - errFile, _ := os.Create(path.Join(topo.DataDirectory, "topo-stderr.txt")) + errFile, err := os.Create(path.Join(topo.LogDirectory, "topo-stderr.txt")) + if err != nil { + log.Errorf("Failed to create file for consul stderr: %v", err) + return + } topo.proc.Stderr = errFile topo.proc.Env = append(topo.proc.Env, os.Environ()...) diff --git a/go/test/endtoend/cluster/vtctld_process.go b/go/test/endtoend/cluster/vtctld_process.go index d0b2e5ab93e..d87427af9b9 100644 --- a/go/test/endtoend/cluster/vtctld_process.go +++ b/go/test/endtoend/cluster/vtctld_process.go @@ -79,7 +79,16 @@ func (vtctld *VtctldProcess) Setup(cell string, extraArgs ...string) (err error) } vtctld.proc.Args = append(vtctld.proc.Args, extraArgs...) - errFile, _ := os.Create(path.Join(vtctld.LogDir, "vtctld-stderr.txt")) + err = os.MkdirAll(vtctld.LogDir, 0755) + if err != nil { + log.Errorf("cannot create log directory for vtctld: %v", err) + return err + } + errFile, err := os.Create(path.Join(vtctld.LogDir, "vtctld-stderr.txt")) + if err != nil { + log.Errorf("cannot create error log file for vtctld: %v", err) + return err + } vtctld.proc.Stderr = errFile vtctld.ErrorLog = errFile.Name() diff --git a/go/test/endtoend/cluster/vtgate_process.go b/go/test/endtoend/cluster/vtgate_process.go index ab82a32f651..d1877fb89bb 100644 --- a/go/test/endtoend/cluster/vtgate_process.go +++ b/go/test/endtoend/cluster/vtgate_process.go @@ -130,7 +130,11 @@ func (vtgate *VtgateProcess) Setup() (err error) { vtgate.proc.Args = append(vtgate.proc.Args, vtgate.ExtraArgs...) - errFile, _ := os.Create(path.Join(vtgate.LogDir, "vtgate-stderr.txt")) + errFile, err := os.Create(path.Join(vtgate.LogDir, "vtgate-stderr.txt")) + if err != nil { + log.Errorf("cannot create error log file for vtgate: %v", err) + return err + } vtgate.proc.Stderr = errFile vtgate.proc.Env = append(vtgate.proc.Env, os.Environ()...) diff --git a/go/test/endtoend/cluster/vtorc_process.go b/go/test/endtoend/cluster/vtorc_process.go index f80690d8d60..25bbb74c36c 100644 --- a/go/test/endtoend/cluster/vtorc_process.go +++ b/go/test/endtoend/cluster/vtorc_process.go @@ -86,7 +86,16 @@ func (orc *VTOrcProcess) Setup() (err error) { // create the configuration file timeNow := time.Now().UnixNano() - configFile, _ := os.Create(path.Join(orc.LogDir, fmt.Sprintf("orc-config-%d.json", timeNow))) + err = os.MkdirAll(orc.LogDir, 0755) + if err != nil { + log.Errorf("cannot create log directory for vtorc: %v", err) + return err + } + configFile, err := os.Create(path.Join(orc.LogDir, fmt.Sprintf("orc-config-%d.json", timeNow))) + if err != nil { + log.Errorf("cannot create config file for vtorc: %v", err) + return err + } orc.ConfigPath = configFile.Name() // Add the default configurations and print them out @@ -135,7 +144,11 @@ func (orc *VTOrcProcess) Setup() (err error) { if orc.LogFileName == "" { orc.LogFileName = fmt.Sprintf("orc-stderr-%d.txt", timeNow) } - errFile, _ := os.Create(path.Join(orc.LogDir, orc.LogFileName)) + errFile, err := os.Create(path.Join(orc.LogDir, orc.LogFileName)) + if err != nil { + log.Errorf("cannot create error log file for vtorc: %v", err) + return err + } orc.proc.Stderr = errFile orc.proc.Env = append(orc.proc.Env, os.Environ()...) diff --git a/go/test/endtoend/recovery/pitr/binlog_server.go b/go/test/endtoend/recovery/pitr/binlog_server.go index 764af2b57cf..3b78b0d4ad7 100644 --- a/go/test/endtoend/recovery/pitr/binlog_server.go +++ b/go/test/endtoend/recovery/pitr/binlog_server.go @@ -93,14 +93,18 @@ func (bs *binLogServer) start(source mysqlSource) error { bs.proc.Args = append(bs.proc.Args, fmt.Sprintf("-ripple_master_password=%s", source.password)) } - errFile, _ := os.Create(path.Join(bs.dataDirectory, "log.txt")) + errFile, err := os.Create(path.Join(bs.dataDirectory, "log.txt")) + if err != nil { + log.Errorf("cannot create error log file for binlog server: %v", err) + return err + } bs.proc.Stderr = errFile bs.proc.Env = append(bs.proc.Env, os.Environ()...) log.Infof("Running binlog server with command: %v", strings.Join(bs.proc.Args, " ")) - err := bs.proc.Start() + err = bs.proc.Start() if err != nil { return err } diff --git a/go/vt/proto/binlogdata/binlogdata.pb.go b/go/vt/proto/binlogdata/binlogdata.pb.go index c0a4bd08860..21855e871cc 100644 --- a/go/vt/proto/binlogdata/binlogdata.pb.go +++ b/go/vt/proto/binlogdata/binlogdata.pb.go @@ -19,7 +19,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: binlogdata.proto diff --git a/go/vt/proto/binlogservice/binlogservice.pb.go b/go/vt/proto/binlogservice/binlogservice.pb.go index 4eac50296c1..4ff35fbe17d 100644 --- a/go/vt/proto/binlogservice/binlogservice.pb.go +++ b/go/vt/proto/binlogservice/binlogservice.pb.go @@ -19,7 +19,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: binlogservice.proto diff --git a/go/vt/proto/logutil/logutil.pb.go b/go/vt/proto/logutil/logutil.pb.go index b2675716168..619328301bc 100644 --- a/go/vt/proto/logutil/logutil.pb.go +++ b/go/vt/proto/logutil/logutil.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: logutil.proto diff --git a/go/vt/proto/mysqlctl/mysqlctl.pb.go b/go/vt/proto/mysqlctl/mysqlctl.pb.go index 19f70887681..87d07442c8c 100644 --- a/go/vt/proto/mysqlctl/mysqlctl.pb.go +++ b/go/vt/proto/mysqlctl/mysqlctl.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: mysqlctl.proto diff --git a/go/vt/proto/query/query.pb.go b/go/vt/proto/query/query.pb.go index b8e7e4fe05e..1f1091cd7a3 100644 --- a/go/vt/proto/query/query.pb.go +++ b/go/vt/proto/query/query.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: query.proto diff --git a/go/vt/proto/queryservice/queryservice.pb.go b/go/vt/proto/queryservice/queryservice.pb.go index babedcde966..aeb80f854bf 100644 --- a/go/vt/proto/queryservice/queryservice.pb.go +++ b/go/vt/proto/queryservice/queryservice.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: queryservice.proto diff --git a/go/vt/proto/replicationdata/replicationdata.pb.go b/go/vt/proto/replicationdata/replicationdata.pb.go index ec90d6943ac..30a7bb93b54 100644 --- a/go/vt/proto/replicationdata/replicationdata.pb.go +++ b/go/vt/proto/replicationdata/replicationdata.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: replicationdata.proto diff --git a/go/vt/proto/tableacl/tableacl.pb.go b/go/vt/proto/tableacl/tableacl.pb.go index 3b26ace8157..53fbd4714bd 100644 --- a/go/vt/proto/tableacl/tableacl.pb.go +++ b/go/vt/proto/tableacl/tableacl.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: tableacl.proto diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go index c9039a3cfd9..b35347b3892 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: tabletmanagerdata.proto diff --git a/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go b/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go index 608282049ba..6cb55ecf221 100644 --- a/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go +++ b/go/vt/proto/tabletmanagerservice/tabletmanagerservice.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: tabletmanagerservice.proto diff --git a/go/vt/proto/throttlerdata/throttlerdata.pb.go b/go/vt/proto/throttlerdata/throttlerdata.pb.go index fb12bc09ce8..a109402cd9e 100644 --- a/go/vt/proto/throttlerdata/throttlerdata.pb.go +++ b/go/vt/proto/throttlerdata/throttlerdata.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: throttlerdata.proto diff --git a/go/vt/proto/throttlerservice/throttlerservice.pb.go b/go/vt/proto/throttlerservice/throttlerservice.pb.go index 9bca73e067c..7bf95215939 100644 --- a/go/vt/proto/throttlerservice/throttlerservice.pb.go +++ b/go/vt/proto/throttlerservice/throttlerservice.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: throttlerservice.proto diff --git a/go/vt/proto/topodata/topodata.pb.go b/go/vt/proto/topodata/topodata.pb.go index 43ecdbce963..e2a97369ba7 100644 --- a/go/vt/proto/topodata/topodata.pb.go +++ b/go/vt/proto/topodata/topodata.pb.go @@ -20,7 +20,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: topodata.proto diff --git a/go/vt/proto/vschema/vschema.pb.go b/go/vt/proto/vschema/vschema.pb.go index 8726fb35745..b45f7010c56 100644 --- a/go/vt/proto/vschema/vschema.pb.go +++ b/go/vt/proto/vschema/vschema.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vschema.proto diff --git a/go/vt/proto/vtadmin/vtadmin.pb.go b/go/vt/proto/vtadmin/vtadmin.pb.go index 3e41edd5f7e..2fc1e14a7f2 100644 --- a/go/vt/proto/vtadmin/vtadmin.pb.go +++ b/go/vt/proto/vtadmin/vtadmin.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtadmin.proto diff --git a/go/vt/proto/vtctldata/vtctldata.pb.go b/go/vt/proto/vtctldata/vtctldata.pb.go index 5f70d625ffa..a1d8ce39ec1 100644 --- a/go/vt/proto/vtctldata/vtctldata.pb.go +++ b/go/vt/proto/vtctldata/vtctldata.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtctldata.proto diff --git a/go/vt/proto/vtctlservice/vtctlservice.pb.go b/go/vt/proto/vtctlservice/vtctlservice.pb.go index 41231828a3d..fc2221d7074 100644 --- a/go/vt/proto/vtctlservice/vtctlservice.pb.go +++ b/go/vt/proto/vtctlservice/vtctlservice.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtctlservice.proto diff --git a/go/vt/proto/vtgate/vtgate.pb.go b/go/vt/proto/vtgate/vtgate.pb.go index aee90d134a4..6b9bca8e118 100644 --- a/go/vt/proto/vtgate/vtgate.pb.go +++ b/go/vt/proto/vtgate/vtgate.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtgate.proto diff --git a/go/vt/proto/vtgateservice/vtgateservice.pb.go b/go/vt/proto/vtgateservice/vtgateservice.pb.go index 2008d486dc9..ba174dec2ea 100644 --- a/go/vt/proto/vtgateservice/vtgateservice.pb.go +++ b/go/vt/proto/vtgateservice/vtgateservice.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtgateservice.proto diff --git a/go/vt/proto/vtrpc/vtrpc.pb.go b/go/vt/proto/vtrpc/vtrpc.pb.go index 0c82dc34bf5..e45d6f37849 100644 --- a/go/vt/proto/vtrpc/vtrpc.pb.go +++ b/go/vt/proto/vtrpc/vtrpc.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vtrpc.proto diff --git a/go/vt/proto/vttest/vttest.pb.go b/go/vt/proto/vttest/vttest.pb.go index 4b4f269d38c..18ab7a83bb9 100644 --- a/go/vt/proto/vttest/vttest.pb.go +++ b/go/vt/proto/vttest/vttest.pb.go @@ -41,7 +41,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vttest.proto diff --git a/go/vt/proto/vttime/vttime.pb.go b/go/vt/proto/vttime/vttime.pb.go index 5cdf3f616ce..ae64898857b 100644 --- a/go/vt/proto/vttime/vttime.pb.go +++ b/go/vt/proto/vttime/vttime.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc v3.21.3 // source: vttime.proto From 23bca1792bd568d0f615948bbde77ee4decc9a95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Taylor?= Date: Thu, 9 Nov 2023 10:57:35 +0100 Subject: [PATCH 18/39] Refactor: use NonEmpty() instead of !IsEmpty() (#14499) --- .../vreplication/materialize/create.go | 2 +- go/vt/sqlparser/ast_format.go | 24 +++++++++---------- go/vt/sqlparser/ast_format_fast.go | 24 +++++++++---------- go/vt/sqlparser/ast_funcs.go | 16 ++++++++++--- go/vt/sqlparser/ast_rewriting.go | 2 +- go/vt/sqlparser/utils.go | 4 ++-- go/vt/topotools/vschema_ddl.go | 2 +- go/vt/vtgate/planbuilder/builder.go | 2 +- go/vt/vtgate/planbuilder/call_proc.go | 2 +- go/vt/vtgate/planbuilder/delete.go | 2 +- .../planbuilder/operators/projection.go | 4 ++-- .../planbuilder/operators/queryprojection.go | 4 ++-- go/vt/vtgate/planbuilder/operators/table.go | 2 +- go/vt/vtgate/planbuilder/show.go | 10 ++++---- go/vt/vtgate/semantics/derived_table.go | 4 ++-- go/vt/vtgate/semantics/early_rewriter.go | 4 ++-- go/vt/vtgate/semantics/scoper.go | 2 +- go/vt/vtgate/semantics/table_set.go | 2 +- go/vt/vtgate/semantics/vtable.go | 2 +- .../tabletmanager/vdiff/table_plan.go | 12 +++++----- go/vt/vttablet/tabletserver/schema/tracker.go | 2 +- .../tabletserver/vstreamer/planbuilder.go | 6 ++--- go/vt/wrangler/vdiff.go | 6 ++--- 23 files changed, 75 insertions(+), 65 deletions(-) diff --git a/go/cmd/vtctldclient/command/vreplication/materialize/create.go b/go/cmd/vtctldclient/command/vreplication/materialize/create.go index d835b0f3426..51f3ee42ee9 100644 --- a/go/cmd/vtctldclient/command/vreplication/materialize/create.go +++ b/go/cmd/vtctldclient/command/vreplication/materialize/create.go @@ -167,7 +167,7 @@ func (ts *tableSettings) Set(v string) error { err = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { switch node := node.(type) { case sqlparser.TableName: - if !node.Name.IsEmpty() { + if node.Name.NotEmpty() { if seenSourceTables[node.Name.String()] { return false, fmt.Errorf("multiple source_expression queries use the same table: %q", node.Name.String()) } diff --git a/go/vt/sqlparser/ast_format.go b/go/vt/sqlparser/ast_format.go index 3176ea2c12e..299ca3bed51 100644 --- a/go/vt/sqlparser/ast_format.go +++ b/go/vt/sqlparser/ast_format.go @@ -831,7 +831,7 @@ func (idx *IndexDefinition) Format(buf *TrackedBuffer) { // Format formats the node. func (ii *IndexInfo) Format(buf *TrackedBuffer) { - if !ii.ConstraintName.IsEmpty() { + if ii.ConstraintName.NotEmpty() { buf.astPrintf(ii, "constraint %v ", ii.ConstraintName) } switch ii.Type { @@ -847,7 +847,7 @@ func (ii *IndexInfo) Format(buf *TrackedBuffer) { case IndexTypeFullText: buf.astPrintf(ii, "%s %s", keywordStrings[FULLTEXT], keywordStrings[KEY]) } - if !ii.Name.IsEmpty() { + if ii.Name.NotEmpty() { buf.astPrintf(ii, " %v", ii.Name) } } @@ -883,7 +883,7 @@ func (node VindexParam) Format(buf *TrackedBuffer) { // Format formats the node. func (c *ConstraintDefinition) Format(buf *TrackedBuffer) { - if !c.Name.IsEmpty() { + if c.Name.NotEmpty() { buf.astPrintf(c, "constraint %v ", c.Name) } c.Details.Format(buf) @@ -1114,7 +1114,7 @@ func (node *StarExpr) Format(buf *TrackedBuffer) { // Format formats the node. func (node *AliasedExpr) Format(buf *TrackedBuffer) { buf.astPrintf(node, "%v", node.Expr) - if !node.As.IsEmpty() { + if node.As.NotEmpty() { buf.astPrintf(node, " as %v", node.As) } } @@ -1163,7 +1163,7 @@ func (node TableExprs) Format(buf *TrackedBuffer) { // Format formats the node. func (node *AliasedTableExpr) Format(buf *TrackedBuffer) { buf.astPrintf(node, "%v%v", node.Expr, node.Partitions) - if !node.As.IsEmpty() { + if node.As.NotEmpty() { buf.astPrintf(node, " as %v", node.As) if len(node.Columns) != 0 { buf.astPrintf(node, "%v", node.Columns) @@ -1189,7 +1189,7 @@ func (node TableName) Format(buf *TrackedBuffer) { if node.IsEmpty() { return } - if !node.Qualifier.IsEmpty() { + if node.Qualifier.NotEmpty() { buf.astPrintf(node, "%v.", node.Qualifier) } buf.astPrintf(node, "%v", node.Name) @@ -1544,7 +1544,7 @@ func (node *CollateExpr) Format(buf *TrackedBuffer) { // Format formats the node. func (node *FuncExpr) Format(buf *TrackedBuffer) { - if !node.Qualifier.IsEmpty() { + if node.Qualifier.NotEmpty() { buf.astPrintf(node, "%v.", node.Qualifier) } // Function names should not be back-quoted even @@ -1598,7 +1598,7 @@ func (node *JSONStorageSizeExpr) Format(buf *TrackedBuffer) { // Format formats the node func (node *OverClause) Format(buf *TrackedBuffer) { buf.WriteString("over") - if !node.WindowName.IsEmpty() { + if node.WindowName.NotEmpty() { buf.astPrintf(node, " %v", node.WindowName) } if node.WindowSpec != nil { @@ -1608,7 +1608,7 @@ func (node *OverClause) Format(buf *TrackedBuffer) { // Format formats the node func (node *WindowSpecification) Format(buf *TrackedBuffer) { - if !node.Name.IsEmpty() { + if node.Name.NotEmpty() { buf.astPrintf(node, " %v", node.Name) } if node.PartitionClause != nil { @@ -2020,7 +2020,7 @@ func (node *ShowBasic) Format(buf *TrackedBuffer) { if !node.Tbl.IsEmpty() { buf.astPrintf(node, " from %v", node.Tbl) } - if !node.DbName.IsEmpty() { + if node.DbName.NotEmpty() { buf.astPrintf(node, " from %v", node.DbName) } buf.astPrintf(node, "%v", node.Filter) @@ -2070,7 +2070,7 @@ func (node *CreateDatabase) Format(buf *TrackedBuffer) { // Format formats the node. func (node *AlterDatabase) Format(buf *TrackedBuffer) { buf.literal("alter database") - if !node.DBName.IsEmpty() { + if node.DBName.NotEmpty() { buf.astPrintf(node, " %v", node.DBName) } if node.UpdateDataDirectory { @@ -2354,7 +2354,7 @@ func (node *DropColumn) Format(buf *TrackedBuffer) { // Format formats the node func (node *DropKey) Format(buf *TrackedBuffer) { buf.astPrintf(node, "drop %s", node.Type.ToString()) - if !node.Name.IsEmpty() { + if node.Name.NotEmpty() { buf.astPrintf(node, " %v", node.Name) } } diff --git a/go/vt/sqlparser/ast_format_fast.go b/go/vt/sqlparser/ast_format_fast.go index b99c96c87ab..c951636d3f9 100644 --- a/go/vt/sqlparser/ast_format_fast.go +++ b/go/vt/sqlparser/ast_format_fast.go @@ -1128,7 +1128,7 @@ func (idx *IndexDefinition) FormatFast(buf *TrackedBuffer) { // FormatFast formats the node. func (ii *IndexInfo) FormatFast(buf *TrackedBuffer) { - if !ii.ConstraintName.IsEmpty() { + if ii.ConstraintName.NotEmpty() { buf.WriteString("constraint ") ii.ConstraintName.FormatFast(buf) buf.WriteByte(' ') @@ -1154,7 +1154,7 @@ func (ii *IndexInfo) FormatFast(buf *TrackedBuffer) { buf.WriteByte(' ') buf.WriteString(keywordStrings[KEY]) } - if !ii.Name.IsEmpty() { + if ii.Name.NotEmpty() { buf.WriteByte(' ') ii.Name.FormatFast(buf) } @@ -1196,7 +1196,7 @@ func (node VindexParam) FormatFast(buf *TrackedBuffer) { // FormatFast formats the node. func (c *ConstraintDefinition) FormatFast(buf *TrackedBuffer) { - if !c.Name.IsEmpty() { + if c.Name.NotEmpty() { buf.WriteString("constraint ") c.Name.FormatFast(buf) buf.WriteByte(' ') @@ -1474,7 +1474,7 @@ func (node *StarExpr) FormatFast(buf *TrackedBuffer) { // FormatFast formats the node. func (node *AliasedExpr) FormatFast(buf *TrackedBuffer) { node.Expr.FormatFast(buf) - if !node.As.IsEmpty() { + if node.As.NotEmpty() { buf.WriteString(" as ") node.As.FormatFast(buf) } @@ -1530,7 +1530,7 @@ func (node TableExprs) FormatFast(buf *TrackedBuffer) { func (node *AliasedTableExpr) FormatFast(buf *TrackedBuffer) { node.Expr.FormatFast(buf) node.Partitions.FormatFast(buf) - if !node.As.IsEmpty() { + if node.As.NotEmpty() { buf.WriteString(" as ") node.As.FormatFast(buf) if len(node.Columns) != 0 { @@ -1558,7 +1558,7 @@ func (node TableName) FormatFast(buf *TrackedBuffer) { if node.IsEmpty() { return } - if !node.Qualifier.IsEmpty() { + if node.Qualifier.NotEmpty() { node.Qualifier.FormatFast(buf) buf.WriteByte('.') } @@ -2064,7 +2064,7 @@ func (node *CollateExpr) FormatFast(buf *TrackedBuffer) { // FormatFast formats the node. func (node *FuncExpr) FormatFast(buf *TrackedBuffer) { - if !node.Qualifier.IsEmpty() { + if node.Qualifier.NotEmpty() { node.Qualifier.FormatFast(buf) buf.WriteByte('.') } @@ -2138,7 +2138,7 @@ func (node *JSONStorageSizeExpr) FormatFast(buf *TrackedBuffer) { // FormatFast formats the node func (node *OverClause) FormatFast(buf *TrackedBuffer) { buf.WriteString("over") - if !node.WindowName.IsEmpty() { + if node.WindowName.NotEmpty() { buf.WriteByte(' ') node.WindowName.FormatFast(buf) } @@ -2151,7 +2151,7 @@ func (node *OverClause) FormatFast(buf *TrackedBuffer) { // FormatFast formats the node func (node *WindowSpecification) FormatFast(buf *TrackedBuffer) { - if !node.Name.IsEmpty() { + if node.Name.NotEmpty() { buf.WriteByte(' ') node.Name.FormatFast(buf) } @@ -2690,7 +2690,7 @@ func (node *ShowBasic) FormatFast(buf *TrackedBuffer) { buf.WriteString(" from ") node.Tbl.FormatFast(buf) } - if !node.DbName.IsEmpty() { + if node.DbName.NotEmpty() { buf.WriteString(" from ") node.DbName.FormatFast(buf) } @@ -2751,7 +2751,7 @@ func (node *CreateDatabase) FormatFast(buf *TrackedBuffer) { // FormatFast formats the node. func (node *AlterDatabase) FormatFast(buf *TrackedBuffer) { buf.WriteString("alter database") - if !node.DBName.IsEmpty() { + if node.DBName.NotEmpty() { buf.WriteByte(' ') node.DBName.FormatFast(buf) } @@ -3118,7 +3118,7 @@ func (node *DropColumn) FormatFast(buf *TrackedBuffer) { func (node *DropKey) FormatFast(buf *TrackedBuffer) { buf.WriteString("drop ") buf.WriteString(node.Type.ToString()) - if !node.Name.IsEmpty() { + if node.Name.NotEmpty() { buf.WriteByte(' ') node.Name.FormatFast(buf) } diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 951d9879bdb..6a1d5600740 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -400,7 +400,7 @@ func (node *AliasedTableExpr) RemoveHints() *AliasedTableExpr { // TableName returns a TableName pointing to this table expr func (node *AliasedTableExpr) TableName() (TableName, error) { - if !node.As.IsEmpty() { + if node.As.NotEmpty() { return TableName{Name: node.As}, nil } @@ -868,6 +868,11 @@ func (node IdentifierCI) IsEmpty() bool { return node.val == "" } +// NonEmpty returns true if the name is not empty. +func (node IdentifierCI) NotEmpty() bool { + return !node.IsEmpty() +} + // String returns the unescaped column name. It must // not be used for SQL generation. Use sqlparser.String // instead. The Stringer conformance is for usage @@ -935,6 +940,11 @@ func (node IdentifierCS) IsEmpty() bool { return node.v == "" } +// NonEmpty returns true if TabIdent is not empty. +func (node IdentifierCS) NotEmpty() bool { + return !node.IsEmpty() +} + // String returns the unescaped table name. It must // not be used for SQL generation. Use sqlparser.String // instead. The Stringer conformance is for usage @@ -2099,7 +2109,7 @@ func GetAllSelects(selStmt SelectStatement) []*Select { // ColumnName returns the alias if one was provided, otherwise prints the AST func (ae *AliasedExpr) ColumnName() string { - if !ae.As.IsEmpty() { + if ae.As.NotEmpty() { return ae.As.String() } @@ -2131,7 +2141,7 @@ func RemoveKeyspace(in SQLNode) { _ = Walk(func(node SQLNode) (kontinue bool, err error) { switch col := node.(type) { case *ColName: - if !col.Qualifier.Qualifier.IsEmpty() { + if col.Qualifier.Qualifier.NotEmpty() { col.Qualifier.Qualifier = NewIdentifierCS("") } } diff --git a/go/vt/sqlparser/ast_rewriting.go b/go/vt/sqlparser/ast_rewriting.go index 45711f8d535..f3255143dbb 100644 --- a/go/vt/sqlparser/ast_rewriting.go +++ b/go/vt/sqlparser/ast_rewriting.go @@ -307,7 +307,7 @@ func (er *astRewriter) visitSelect(node *Select) { } aliasedExpr, ok := col.(*AliasedExpr) - if !ok || !aliasedExpr.As.IsEmpty() { + if !ok || aliasedExpr.As.NotEmpty() { continue } buf := NewTrackedBuffer(nil) diff --git a/go/vt/sqlparser/utils.go b/go/vt/sqlparser/utils.go index 0f3c66f2ea3..2258eb2fd02 100644 --- a/go/vt/sqlparser/utils.go +++ b/go/vt/sqlparser/utils.go @@ -135,14 +135,14 @@ func ReplaceTableQualifiers(query, olddb, newdb string) (string, error) { upd := Rewrite(in, func(cursor *Cursor) bool { switch node := cursor.Node().(type) { case TableName: - if !node.Qualifier.IsEmpty() && + if node.Qualifier.NotEmpty() && node.Qualifier.String() == oldQualifier.String() { node.Qualifier = newQualifier cursor.Replace(node) modified = true } case *ShowBasic: // for things like 'show tables from _vt' - if !node.DbName.IsEmpty() && + if node.DbName.NotEmpty() && node.DbName.String() == oldQualifier.String() { node.DbName = newQualifier cursor.Replace(node) diff --git a/go/vt/topotools/vschema_ddl.go b/go/vt/topotools/vschema_ddl.go index ff4d9f4ad04..3c6f5bced3c 100644 --- a/go/vt/topotools/vschema_ddl.go +++ b/go/vt/topotools/vschema_ddl.go @@ -124,7 +124,7 @@ func ApplyVSchemaDDL(ksName string, ks *vschemapb.Keyspace, alterVschema *sqlpar // already exists. spec := alterVschema.VindexSpec name := spec.Name.String() - if !spec.Type.IsEmpty() { + if spec.Type.NotEmpty() { owner, params := spec.ParseParams() if vindex, ok := ks.Vindexes[name]; ok { if vindex.Type != spec.Type.String() { diff --git a/go/vt/vtgate/planbuilder/builder.go b/go/vt/vtgate/planbuilder/builder.go index a67878d7119..2777181907d 100644 --- a/go/vt/vtgate/planbuilder/builder.go +++ b/go/vt/vtgate/planbuilder/builder.go @@ -246,7 +246,7 @@ func buildAnalyzePlan(stmt sqlparser.Statement, _ *sqlparser.ReservedVars, vsche var err error dest := key.Destination(key.DestinationAllShards{}) - if !analyzeStmt.Table.Qualifier.IsEmpty() && sqlparser.SystemSchema(analyzeStmt.Table.Qualifier.String()) { + if analyzeStmt.Table.Qualifier.NotEmpty() && sqlparser.SystemSchema(analyzeStmt.Table.Qualifier.String()) { ks, err = vschema.AnyKeyspace() if err != nil { return nil, err diff --git a/go/vt/vtgate/planbuilder/call_proc.go b/go/vt/vtgate/planbuilder/call_proc.go index 13fe5cc60e4..34f475689aa 100644 --- a/go/vt/vtgate/planbuilder/call_proc.go +++ b/go/vt/vtgate/planbuilder/call_proc.go @@ -25,7 +25,7 @@ import ( func buildCallProcPlan(stmt *sqlparser.CallProc, vschema plancontext.VSchema) (*planResult, error) { var ks string - if !stmt.Name.Qualifier.IsEmpty() { + if stmt.Name.Qualifier.NotEmpty() { ks = stmt.Name.Qualifier.String() } diff --git a/go/vt/vtgate/planbuilder/delete.go b/go/vt/vtgate/planbuilder/delete.go index 188c1485d1d..e8b71ea9a0e 100644 --- a/go/vt/vtgate/planbuilder/delete.go +++ b/go/vt/vtgate/planbuilder/delete.go @@ -95,7 +95,7 @@ func rewriteSingleTbl(del *sqlparser.Delete) (*sqlparser.Delete, error) { if !ok { return del, nil } - if !atExpr.As.IsEmpty() && !sqlparser.Equals.IdentifierCS(del.Targets[0].Name, atExpr.As) { + if atExpr.As.NotEmpty() && !sqlparser.Equals.IdentifierCS(del.Targets[0].Name, atExpr.As) { // Unknown table in MULTI DELETE return nil, vterrors.VT03003(del.Targets[0].Name.String()) } diff --git a/go/vt/vtgate/planbuilder/operators/projection.go b/go/vt/vtgate/planbuilder/operators/projection.go index 1c751467890..bad9cb0e87e 100644 --- a/go/vt/vtgate/planbuilder/operators/projection.go +++ b/go/vt/vtgate/planbuilder/operators/projection.go @@ -166,7 +166,7 @@ func (ap AliasedProjections) AddColumn(col *sqlparser.AliasedExpr) (ProjCols, in func (pe *ProjExpr) String() string { var alias, expr, info string - if !pe.Original.As.IsEmpty() { + if pe.Original.As.NotEmpty() { alias = " AS " + pe.Original.As.String() } if sqlparser.Equals.Expr(pe.EvalExpr, pe.ColExpr) { @@ -399,7 +399,7 @@ func (p *Projection) GetSelectExprs(*plancontext.PlanningContext) sqlparser.Sele var output sqlparser.SelectExprs for _, pe := range cols { ae := &sqlparser.AliasedExpr{Expr: pe.EvalExpr} - if !pe.Original.As.IsEmpty() { + if pe.Original.As.NotEmpty() { ae.As = pe.Original.As } else if !sqlparser.Equals.Expr(ae.Expr, pe.Original.Expr) { ae.As = sqlparser.NewIdentifierCI(pe.Original.ColumnName()) diff --git a/go/vt/vtgate/planbuilder/operators/queryprojection.go b/go/vt/vtgate/planbuilder/operators/queryprojection.go index ff188d6c895..e3f4d349d2a 100644 --- a/go/vt/vtgate/planbuilder/operators/queryprojection.go +++ b/go/vt/vtgate/planbuilder/operators/queryprojection.go @@ -515,7 +515,7 @@ func (qp *QueryProjection) GetSimplifiedExpr(ctx *plancontext.PlanningContext, e if !ok { continue } - aliased := !ae.As.IsEmpty() + aliased := ae.As.NotEmpty() if aliased { if in.Name.Equal(ae.As) { err = check(ae.Expr) @@ -818,7 +818,7 @@ func (qp *QueryProjection) FindSelectExprIndexForExpr(ctx *plancontext.PlanningC continue } if isCol { - isAliasExpr := !aliasedExpr.As.IsEmpty() + isAliasExpr := aliasedExpr.As.NotEmpty() if isAliasExpr && colExpr.Name.Equal(aliasedExpr.As) { return &idx, aliasedExpr } diff --git a/go/vt/vtgate/planbuilder/operators/table.go b/go/vt/vtgate/planbuilder/operators/table.go index 09a99170932..e731ec54201 100644 --- a/go/vt/vtgate/planbuilder/operators/table.go +++ b/go/vt/vtgate/planbuilder/operators/table.go @@ -130,7 +130,7 @@ func addColumn(ctx *plancontext.PlanningContext, op ColNameColumns, e sqlparser. func (to *Table) ShortDescription() string { tbl := to.VTable.String() var alias, where string - if !to.QTable.Alias.As.IsEmpty() { + if to.QTable.Alias.As.NotEmpty() { alias = " AS " + to.QTable.Alias.As.String() } diff --git a/go/vt/vtgate/planbuilder/show.go b/go/vt/vtgate/planbuilder/show.go index aba5b1a9016..6e5fad4023a 100644 --- a/go/vt/vtgate/planbuilder/show.go +++ b/go/vt/vtgate/planbuilder/show.go @@ -164,7 +164,7 @@ func buildVariablePlan(show *sqlparser.ShowBasic, vschema plancontext.VSchema) ( } func buildShowTblPlan(show *sqlparser.ShowBasic, vschema plancontext.VSchema) (engine.Primitive, error) { - if !show.DbName.IsEmpty() { + if show.DbName.NotEmpty() { show.Tbl.Qualifier = sqlparser.NewIdentifierCS(show.DbName.String()) // Remove Database Name from the query. show.DbName = sqlparser.NewIdentifierCS("") @@ -174,7 +174,7 @@ func buildShowTblPlan(show *sqlparser.ShowBasic, vschema plancontext.VSchema) (e var ks *vindexes.Keyspace var err error - if !show.Tbl.Qualifier.IsEmpty() && sqlparser.SystemSchema(show.Tbl.Qualifier.String()) { + if show.Tbl.Qualifier.NotEmpty() && sqlparser.SystemSchema(show.Tbl.Qualifier.String()) { ks, err = vschema.AnyKeyspace() if err != nil { return nil, err @@ -486,7 +486,7 @@ func buildCreateTblPlan(show *sqlparser.ShowCreate, vschema plancontext.VSchema) var ks *vindexes.Keyspace var err error - if !show.Op.Qualifier.IsEmpty() && sqlparser.SystemSchema(show.Op.Qualifier.String()) { + if show.Op.Qualifier.NotEmpty() && sqlparser.SystemSchema(show.Op.Qualifier.String()) { ks, err = vschema.AnyKeyspace() if err != nil { return nil, err @@ -519,7 +519,7 @@ func buildCreateTblPlan(show *sqlparser.ShowCreate, vschema plancontext.VSchema) func buildCreatePlan(show *sqlparser.ShowCreate, vschema plancontext.VSchema) (engine.Primitive, error) { dbName := "" - if !show.Op.Qualifier.IsEmpty() { + if show.Op.Qualifier.NotEmpty() { dbName = show.Op.Qualifier.String() } @@ -567,7 +567,7 @@ func buildShowVGtidPlan(show *sqlparser.ShowBasic, vschema plancontext.VSchema) func buildShowGtidPlan(show *sqlparser.ShowBasic, vschema plancontext.VSchema) (engine.Primitive, error) { dbName := "" - if !show.DbName.IsEmpty() { + if show.DbName.NotEmpty() { dbName = show.DbName.String() } dest, ks, _, err := vschema.TargetDestination(dbName) diff --git a/go/vt/vtgate/semantics/derived_table.go b/go/vt/vtgate/semantics/derived_table.go index 9001848f6b4..732a75ac696 100644 --- a/go/vt/vtgate/semantics/derived_table.go +++ b/go/vt/vtgate/semantics/derived_table.go @@ -77,7 +77,7 @@ func handleAliasedExpr(vTbl *DerivedTable, expr *sqlparser.AliasedExpr, cols sql return } - if !expr.As.IsEmpty() { + if expr.As.NotEmpty() { vTbl.columnNames = append(vTbl.columnNames, expr.As.String()) return } @@ -161,7 +161,7 @@ func (dt *DerivedTable) getColumns() []ColumnInfo { } func (dt *DerivedTable) hasStar() bool { - return dt.tables.NonEmpty() + return dt.tables.NotEmpty() } // GetTables implements the TableInfo interface diff --git a/go/vt/vtgate/semantics/early_rewriter.go b/go/vt/vtgate/semantics/early_rewriter.go index 36060ed8334..d3c5f312426 100644 --- a/go/vt/vtgate/semantics/early_rewriter.go +++ b/go/vt/vtgate/semantics/early_rewriter.go @@ -67,7 +67,7 @@ func (r *earlyRewriter) down(cursor *sqlparser.Cursor) error { func (r *earlyRewriter) handleAliasedTable(node *sqlparser.AliasedTableExpr) error { tbl, ok := node.Expr.(sqlparser.TableName) - if !ok || !tbl.Qualifier.IsEmpty() { + if !ok || tbl.Qualifier.NotEmpty() { return nil } scope := r.scoper.currentScope() @@ -348,7 +348,7 @@ func (r *earlyRewriter) rewriteOrderByExpr(node *sqlparser.Literal) (sqlparser.E return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "don't know how to handle %s", sqlparser.String(node)) } - if !aliasedExpr.As.IsEmpty() { + if aliasedExpr.As.NotEmpty() { return sqlparser.NewColName(aliasedExpr.As.String()), nil } diff --git a/go/vt/vtgate/semantics/scoper.go b/go/vt/vtgate/semantics/scoper.go index 458e08b1f15..c782da03678 100644 --- a/go/vt/vtgate/semantics/scoper.go +++ b/go/vt/vtgate/semantics/scoper.go @@ -320,7 +320,7 @@ func checkForInvalidAliasUse(cte *sqlparser.CommonTableExpr, name string) (err e // TODO I'm sure there is a better. way, but we need to do this to stop infinite loops from occurring down := func(node sqlparser.SQLNode, parent sqlparser.SQLNode) bool { tbl, ok := node.(sqlparser.TableName) - if !ok || !tbl.Qualifier.IsEmpty() { + if !ok || tbl.Qualifier.NotEmpty() { return err == nil } if tbl.Name.String() == name { diff --git a/go/vt/vtgate/semantics/table_set.go b/go/vt/vtgate/semantics/table_set.go index 0ddbc87a224..acc83306869 100644 --- a/go/vt/vtgate/semantics/table_set.go +++ b/go/vt/vtgate/semantics/table_set.go @@ -57,7 +57,7 @@ func (ts TableSet) NumberOfTables() int { } // NonEmpty returns true if there are tables in the tableset -func (ts TableSet) NonEmpty() bool { +func (ts TableSet) NotEmpty() bool { return !ts.IsEmpty() } diff --git a/go/vt/vtgate/semantics/vtable.go b/go/vt/vtgate/semantics/vtable.go index 48439694b47..271da126cd4 100644 --- a/go/vt/vtgate/semantics/vtable.go +++ b/go/vt/vtgate/semantics/vtable.go @@ -94,7 +94,7 @@ func (v *vTableInfo) getColumns() []ColumnInfo { } func (v *vTableInfo) hasStar() bool { - return v.tables.NonEmpty() + return v.tables.NotEmpty() } // GetTables implements the TableInfo interface diff --git a/go/vt/vttablet/tabletmanager/vdiff/table_plan.go b/go/vt/vttablet/tabletmanager/vdiff/table_plan.go index e669dbd9a33..f636eea5cae 100644 --- a/go/vt/vttablet/tabletmanager/vdiff/table_plan.go +++ b/go/vt/vttablet/tabletmanager/vdiff/table_plan.go @@ -88,14 +88,14 @@ func (td *tableDiffer) buildTablePlan(dbClient binlogplayer.DBClient, dbName str } case *sqlparser.AliasedExpr: var targetCol *sqlparser.ColName - if !selExpr.As.IsEmpty() { - targetCol = &sqlparser.ColName{Name: selExpr.As} - } else { + if selExpr.As.IsEmpty() { if colAs, ok := selExpr.Expr.(*sqlparser.ColName); ok { targetCol = colAs } else { return nil, fmt.Errorf("expression needs an alias: %v", sqlparser.String(selExpr)) } + } else { + targetCol = &sqlparser.ColName{Name: selExpr.As} } // If the input was "select a as b", then source will use "a" and target will use "b". sourceSelect.SelectExprs = append(sourceSelect.SelectExprs, selExpr) @@ -157,7 +157,7 @@ func (td *tableDiffer) buildTablePlan(dbClient binlogplayer.DBClient, dbName str return nil, err } // Remove in_keyrange. It's not understood by mysql. - sourceSelect.Where = sel.Where //removeKeyrange(sel.Where) + sourceSelect.Where = sel.Where // removeKeyrange(sel.Where) // The source should also perform the group by. sourceSelect.GroupBy = sel.GroupBy sourceSelect.OrderBy = tp.orderBy @@ -186,8 +186,8 @@ func (tp *tablePlan) findPKs(dbClient binlogplayer.DBClient, targetSelect *sqlpa switch ct := expr.(type) { case *sqlparser.ColName: colname = ct.Name.String() - case *sqlparser.FuncExpr: //eg. weight_string() - //no-op + case *sqlparser.FuncExpr: // eg. weight_string() + // no-op default: log.Warningf("Not considering column %v for PK, type %v not handled", selExpr, ct) } diff --git a/go/vt/vttablet/tabletserver/schema/tracker.go b/go/vt/vttablet/tabletserver/schema/tracker.go index 9b4deaff6c4..684bb6d317d 100644 --- a/go/vt/vttablet/tabletserver/schema/tracker.go +++ b/go/vt/vttablet/tabletserver/schema/tracker.go @@ -263,7 +263,7 @@ func MustReloadSchemaOnDDL(sql string, dbname string) bool { if table.IsEmpty() { continue } - if !table.Qualifier.IsEmpty() && table.Qualifier.String() != dbname { + if table.Qualifier.NotEmpty() && table.Qualifier.String() != dbname { continue } tableName := table.Name.String() diff --git a/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go b/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go index 30fbfdb7a01..fc9408d050e 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go +++ b/go/vt/vttablet/tabletserver/vstreamer/planbuilder.go @@ -338,7 +338,7 @@ func ruleMatches(tableName string, filter *binlogdatapb.Filter) bool { // tableMatches is similar to buildPlan below and MatchTable in vreplication/table_plan_builder.go. func tableMatches(table sqlparser.TableName, dbname string, filter *binlogdatapb.Filter) bool { - if !table.Qualifier.IsEmpty() && table.Qualifier.String() != dbname { + if table.Qualifier.NotEmpty() && table.Qualifier.String() != dbname { return false } return ruleMatches(table.Name.String(), filter) @@ -528,7 +528,7 @@ func (plan *Plan) analyzeWhere(vschema *localVSchema, where *sqlparser.Where) er if !ok { return fmt.Errorf("unexpected: %v", sqlparser.String(expr)) } - //StrVal is varbinary, we do not support varchar since we would have to implement all collation types + // StrVal is varbinary, we do not support varchar since we would have to implement all collation types if val.Type != sqlparser.IntVal && val.Type != sqlparser.StrVal { return fmt.Errorf("unexpected: %v", sqlparser.String(expr)) } @@ -702,7 +702,7 @@ func (plan *Plan) analyzeExpr(vschema *localVSchema, selExpr sqlparser.SelectExp return ColExpr{}, fmt.Errorf("unsupported function: %v", sqlparser.String(inner)) } case *sqlparser.Literal: - //allow only intval 1 + // allow only intval 1 if inner.Type != sqlparser.IntVal { return ColExpr{}, fmt.Errorf("only integer literals are supported") } diff --git a/go/vt/wrangler/vdiff.go b/go/vt/wrangler/vdiff.go index 2d6e49b73d7..2cbe5032c92 100644 --- a/go/vt/wrangler/vdiff.go +++ b/go/vt/wrangler/vdiff.go @@ -672,14 +672,14 @@ func (df *vdiff) buildTablePlan(table *tabletmanagerdatapb.TableDefinition, quer } case *sqlparser.AliasedExpr: var targetCol *sqlparser.ColName - if !selExpr.As.IsEmpty() { - targetCol = &sqlparser.ColName{Name: selExpr.As} - } else { + if selExpr.As.IsEmpty() { if colAs, ok := selExpr.Expr.(*sqlparser.ColName); ok { targetCol = colAs } else { return nil, fmt.Errorf("expression needs an alias: %v", sqlparser.String(selExpr)) } + } else { + targetCol = &sqlparser.ColName{Name: selExpr.As} } // If the input was "select a as b", then source will use "a" and target will use "b". sourceSelect.SelectExprs = append(sourceSelect.SelectExprs, selExpr) From e61eae02d29a5e9e1c34e07b654a1463a1ed238b Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Fri, 10 Nov 2023 12:54:48 +0530 Subject: [PATCH 19/39] Foreign key on update action with non literal values (#14278) Signed-off-by: Harshit Gangal Signed-off-by: Manan Gupta Co-authored-by: Manan Gupta --- .../vtgate/foreignkey/fk_fuzz_test.go | 170 ++--- go/test/endtoend/vtgate/foreignkey/fk_test.go | 176 +++++ .../endtoend/vtgate/foreignkey/utils_test.go | 114 ++++ go/vt/vtgate/engine/cached_size.go | 21 +- go/vt/vtgate/engine/fk_cascade.go | 163 +++-- go/vt/vtgate/engine/fk_cascade_test.go | 80 ++- go/vt/vtgate/engine/fk_verify.go | 15 +- go/vt/vtgate/engine/fk_verify_test.go | 6 +- .../planbuilder/operator_transformers.go | 7 +- .../vtgate/planbuilder/operators/ast_to_op.go | 19 +- go/vt/vtgate/planbuilder/operators/delete.go | 8 +- .../planbuilder/operators/fk_cascade.go | 15 +- go/vt/vtgate/planbuilder/operators/update.go | 215 ++++-- .../testdata/foreignkey_cases.json | 635 +++++++++++++++++- .../testdata/postprocess_cases.json | 4 +- go/vt/vtgate/planbuilder/update.go | 7 + go/vt/vtgate/semantics/analyzer.go | 40 +- go/vt/vtgate/semantics/analyzer_fk_test.go | 582 ++++++++++++++++ go/vt/vtgate/semantics/analyzer_test.go | 554 --------------- go/vt/vtgate/semantics/early_rewriter.go | 41 ++ go/vt/vtgate/semantics/semantic_state.go | 89 +++ go/vt/vtgate/semantics/semantic_state_test.go | 233 ++++++- go/vt/vtgate/vindexes/foreign_keys.go | 16 +- 23 files changed, 2333 insertions(+), 877 deletions(-) create mode 100644 go/vt/vtgate/semantics/analyzer_fk_test.go diff --git a/go/test/endtoend/vtgate/foreignkey/fk_fuzz_test.go b/go/test/endtoend/vtgate/foreignkey/fk_fuzz_test.go index 134b9cfa180..f7d7340d6a4 100644 --- a/go/test/endtoend/vtgate/foreignkey/fk_fuzz_test.go +++ b/go/test/endtoend/vtgate/foreignkey/fk_fuzz_test.go @@ -28,9 +28,7 @@ import ( _ "github.com/go-sql-driver/mysql" "github.com/stretchr/testify/require" - "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" - "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/utils" "vitess.io/vitess/go/vt/log" ) @@ -39,6 +37,7 @@ type QueryFormat string const ( SQLQueries QueryFormat = "SQLQueries" + OlapSQLQueries QueryFormat = "OlapSQLQueries" PreparedStatmentQueries QueryFormat = "PreparedStatmentQueries" PreparedStatementPacket QueryFormat = "PreparedStatementPacket" ) @@ -95,7 +94,7 @@ func (fz *fuzzer) generateQuery() []string { val := rand.Intn(fz.insertShare + fz.updateShare + fz.deleteShare) if val < fz.insertShare { switch fz.queryFormat { - case SQLQueries: + case OlapSQLQueries, SQLQueries: return []string{fz.generateInsertDMLQuery()} case PreparedStatmentQueries: return fz.getPreparedInsertQueries() @@ -105,7 +104,7 @@ func (fz *fuzzer) generateQuery() []string { } if val < fz.insertShare+fz.updateShare { switch fz.queryFormat { - case SQLQueries: + case OlapSQLQueries, SQLQueries: return []string{fz.generateUpdateDMLQuery()} case PreparedStatmentQueries: return fz.getPreparedUpdateQueries() @@ -114,7 +113,7 @@ func (fz *fuzzer) generateQuery() []string { } } switch fz.queryFormat { - case SQLQueries: + case OlapSQLQueries, SQLQueries: return []string{fz.generateDeleteDMLQuery()} case PreparedStatmentQueries: return fz.getPreparedDeleteQueries() @@ -131,41 +130,43 @@ func (fz *fuzzer) generateInsertDMLQuery() string { if tableName == "fk_t20" { colValue := rand.Intn(1 + fz.maxValForCol) col2Value := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, col, col2) values (%v, %v, %v)", tableName, idValue, convertColValueToString(colValue), convertColValueToString(col2Value)) + return fmt.Sprintf("insert into %v (id, col, col2) values (%v, %v, %v)", tableName, idValue, convertIntValueToString(colValue), convertIntValueToString(col2Value)) } else if isMultiColFkTable(tableName) { colaValue := rand.Intn(1 + fz.maxValForCol) colbValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, cola, colb) values (%v, %v, %v)", tableName, idValue, convertColValueToString(colaValue), convertColValueToString(colbValue)) + return fmt.Sprintf("insert into %v (id, cola, colb) values (%v, %v, %v)", tableName, idValue, convertIntValueToString(colaValue), convertIntValueToString(colbValue)) } else { colValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, col) values (%v, %v)", tableName, idValue, convertColValueToString(colValue)) + return fmt.Sprintf("insert into %v (id, col) values (%v, %v)", tableName, idValue, convertIntValueToString(colValue)) } } -// convertColValueToString converts the given value to a string -func convertColValueToString(value int) string { - if value == 0 { - return "NULL" - } - return fmt.Sprintf("%d", value) -} - // generateUpdateDMLQuery generates an UPDATE query from the parameters for the fuzzer. func (fz *fuzzer) generateUpdateDMLQuery() string { tableId := rand.Intn(len(fkTables)) idValue := 1 + rand.Intn(fz.maxValForId) tableName := fkTables[tableId] if tableName == "fk_t20" { - colValue := rand.Intn(1 + fz.maxValForCol) - col2Value := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("update %v set col = %v, col2 = %v where id = %v", tableName, convertColValueToString(colValue), convertColValueToString(col2Value), idValue) + colValue := convertIntValueToString(rand.Intn(1 + fz.maxValForCol)) + col2Value := convertIntValueToString(rand.Intn(1 + fz.maxValForCol)) + return fmt.Sprintf("update %v set col = %v, col2 = %v where id = %v", tableName, colValue, col2Value, idValue) } else if isMultiColFkTable(tableName) { - colaValue := rand.Intn(1 + fz.maxValForCol) - colbValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("update %v set cola = %v, colb = %v where id = %v", tableName, convertColValueToString(colaValue), convertColValueToString(colbValue), idValue) + if rand.Intn(2) == 0 { + colaValue := convertIntValueToString(rand.Intn(1 + fz.maxValForCol)) + colbValue := convertIntValueToString(rand.Intn(1 + fz.maxValForCol)) + if fz.concurrency > 1 { + colaValue = fz.generateExpression(rand.Intn(4)+1, "cola", "colb", "id") + colbValue = fz.generateExpression(rand.Intn(4)+1, "cola", "colb", "id") + } + return fmt.Sprintf("update %v set cola = %v, colb = %v where id = %v", tableName, colaValue, colbValue, idValue) + } else { + colValue := fz.generateExpression(rand.Intn(4)+1, "cola", "colb", "id") + colToUpdate := []string{"cola", "colb"}[rand.Intn(2)] + return fmt.Sprintf("update %v set %v = %v where id = %v", tableName, colToUpdate, colValue, idValue) + } } else { - colValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("update %v set col = %v where id = %v", tableName, convertColValueToString(colValue), idValue) + colValue := fz.generateExpression(rand.Intn(4)+1, "col", "id") + return fmt.Sprintf("update %v set col = %v where id = %v", tableName, colValue, idValue) } } @@ -222,13 +223,16 @@ func (fz *fuzzer) runFuzzerThread(t *testing.T, sharded bool, fuzzerThreadId int _, _ = vitessDb.Exec("use `uks`") } } + if fz.queryFormat == OlapSQLQueries { + _ = utils.Exec(t, mcmp.VtConn, "set workload = olap") + } for { // If fuzzer thread is marked to be stopped, then we should exit this go routine. if fz.shouldStop.Load() == true { return } switch fz.queryFormat { - case SQLQueries, PreparedStatmentQueries: + case OlapSQLQueries, SQLQueries, PreparedStatmentQueries: if fz.generateAndExecuteStatementQuery(t, mcmp) { return } @@ -338,8 +342,8 @@ func (fz *fuzzer) getPreparedInsertQueries() []string { return []string{ "prepare stmt_insert from 'insert into fk_t20 (id, col, col2) values (?, ?, ?)'", fmt.Sprintf("SET @id = %v", idValue), - fmt.Sprintf("SET @col = %v", convertColValueToString(colValue)), - fmt.Sprintf("SET @col2 = %v", convertColValueToString(col2Value)), + fmt.Sprintf("SET @col = %v", convertIntValueToString(colValue)), + fmt.Sprintf("SET @col2 = %v", convertIntValueToString(col2Value)), "execute stmt_insert using @id, @col, @col2", } } else if isMultiColFkTable(tableName) { @@ -348,8 +352,8 @@ func (fz *fuzzer) getPreparedInsertQueries() []string { return []string{ fmt.Sprintf("prepare stmt_insert from 'insert into %v (id, cola, colb) values (?, ?, ?)'", tableName), fmt.Sprintf("SET @id = %v", idValue), - fmt.Sprintf("SET @cola = %v", convertColValueToString(colaValue)), - fmt.Sprintf("SET @colb = %v", convertColValueToString(colbValue)), + fmt.Sprintf("SET @cola = %v", convertIntValueToString(colaValue)), + fmt.Sprintf("SET @colb = %v", convertIntValueToString(colbValue)), "execute stmt_insert using @id, @cola, @colb", } } else { @@ -357,7 +361,7 @@ func (fz *fuzzer) getPreparedInsertQueries() []string { return []string{ fmt.Sprintf("prepare stmt_insert from 'insert into %v (id, col) values (?, ?)'", tableName), fmt.Sprintf("SET @id = %v", idValue), - fmt.Sprintf("SET @col = %v", convertColValueToString(colValue)), + fmt.Sprintf("SET @col = %v", convertIntValueToString(colValue)), "execute stmt_insert using @id, @col", } } @@ -374,8 +378,8 @@ func (fz *fuzzer) getPreparedUpdateQueries() []string { return []string{ "prepare stmt_update from 'update fk_t20 set col = ?, col2 = ? where id = ?'", fmt.Sprintf("SET @id = %v", idValue), - fmt.Sprintf("SET @col = %v", convertColValueToString(colValue)), - fmt.Sprintf("SET @col2 = %v", convertColValueToString(col2Value)), + fmt.Sprintf("SET @col = %v", convertIntValueToString(colValue)), + fmt.Sprintf("SET @col2 = %v", convertIntValueToString(col2Value)), "execute stmt_update using @col, @col2, @id", } } else if isMultiColFkTable(tableName) { @@ -384,8 +388,8 @@ func (fz *fuzzer) getPreparedUpdateQueries() []string { return []string{ fmt.Sprintf("prepare stmt_update from 'update %v set cola = ?, colb = ? where id = ?'", tableName), fmt.Sprintf("SET @id = %v", idValue), - fmt.Sprintf("SET @cola = %v", convertColValueToString(colaValue)), - fmt.Sprintf("SET @colb = %v", convertColValueToString(colbValue)), + fmt.Sprintf("SET @cola = %v", convertIntValueToString(colaValue)), + fmt.Sprintf("SET @colb = %v", convertIntValueToString(colbValue)), "execute stmt_update using @cola, @colb, @id", } } else { @@ -393,7 +397,7 @@ func (fz *fuzzer) getPreparedUpdateQueries() []string { return []string{ fmt.Sprintf("prepare stmt_update from 'update %v set col = ? where id = ?'", tableName), fmt.Sprintf("SET @id = %v", idValue), - fmt.Sprintf("SET @col = %v", convertColValueToString(colValue)), + fmt.Sprintf("SET @col = %v", convertIntValueToString(colValue)), "execute stmt_update using @col, @id", } } @@ -419,14 +423,14 @@ func (fz *fuzzer) generateParameterizedInsertQuery() (query string, params []any if tableName == "fk_t20" { colValue := rand.Intn(1 + fz.maxValForCol) col2Value := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, col, col2) values (?, ?, ?)", tableName), []any{idValue, convertColValueToString(colValue), convertColValueToString(col2Value)} + return fmt.Sprintf("insert into %v (id, col, col2) values (?, ?, ?)", tableName), []any{idValue, convertIntValueToString(colValue), convertIntValueToString(col2Value)} } else if isMultiColFkTable(tableName) { colaValue := rand.Intn(1 + fz.maxValForCol) colbValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, cola, colb) values (?, ?, ?)", tableName), []any{idValue, convertColValueToString(colaValue), convertColValueToString(colbValue)} + return fmt.Sprintf("insert into %v (id, cola, colb) values (?, ?, ?)", tableName), []any{idValue, convertIntValueToString(colaValue), convertIntValueToString(colbValue)} } else { colValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, col) values (?, ?)", tableName), []any{idValue, convertColValueToString(colValue)} + return fmt.Sprintf("insert into %v (id, col) values (?, ?)", tableName), []any{idValue, convertIntValueToString(colValue)} } } @@ -438,14 +442,14 @@ func (fz *fuzzer) generateParameterizedUpdateQuery() (query string, params []any if tableName == "fk_t20" { colValue := rand.Intn(1 + fz.maxValForCol) col2Value := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("update %v set col = ?, col2 = ? where id = ?", tableName), []any{convertColValueToString(colValue), convertColValueToString(col2Value), idValue} + return fmt.Sprintf("update %v set col = ?, col2 = ? where id = ?", tableName), []any{convertIntValueToString(colValue), convertIntValueToString(col2Value), idValue} } else if isMultiColFkTable(tableName) { colaValue := rand.Intn(1 + fz.maxValForCol) colbValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("update %v set cola = ?, colb = ? where id = ?", tableName), []any{convertColValueToString(colaValue), convertColValueToString(colbValue), idValue} + return fmt.Sprintf("update %v set cola = ?, colb = ? where id = ?", tableName), []any{convertIntValueToString(colaValue), convertIntValueToString(colbValue), idValue} } else { colValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("update %v set col = ? where id = ?", tableName), []any{convertColValueToString(colValue), idValue} + return fmt.Sprintf("update %v set col = ? where id = ?", tableName), []any{convertIntValueToString(colValue), idValue} } } @@ -606,7 +610,7 @@ func TestFkFuzzTest(t *testing.T) { for _, tt := range testcases { for _, testSharded := range []bool{false, true} { - for _, queryFormat := range []QueryFormat{SQLQueries, PreparedStatmentQueries, PreparedStatementPacket} { + for _, queryFormat := range []QueryFormat{OlapSQLQueries, SQLQueries, PreparedStatmentQueries, PreparedStatementPacket} { t.Run(getTestName(tt.name, testSharded)+fmt.Sprintf(" QueryFormat - %v", queryFormat), func(t *testing.T) { mcmp, closer := start(t) defer closer() @@ -650,85 +654,3 @@ func TestFkFuzzTest(t *testing.T) { } } } - -// ensureDatabaseState ensures that the database is either empty or not. -func ensureDatabaseState(t *testing.T, vtconn *mysql.Conn, empty bool) { - results := collectFkTablesState(vtconn) - isEmpty := true - for _, res := range results { - if len(res.Rows) > 0 { - isEmpty = false - } - } - require.Equal(t, isEmpty, empty) -} - -// verifyDataIsCorrect verifies that the data in MySQL database matches the data in the Vitess database. -func verifyDataIsCorrect(t *testing.T, mcmp utils.MySQLCompare, concurrency int) { - // For single concurrent thread, we run all the queries on both MySQL and Vitess, so we can verify correctness - // by just checking if the data in MySQL and Vitess match. - if concurrency == 1 { - for _, table := range fkTables { - query := fmt.Sprintf("SELECT * FROM %v ORDER BY id", table) - mcmp.Exec(query) - } - } else { - // For higher concurrency, we don't have MySQL data to verify everything is fine, - // so we'll have to do something different. - // We run LEFT JOIN queries on all the parent and child tables linked by foreign keys - // to make sure that nothing is broken in the database. - for _, reference := range fkReferences { - query := fmt.Sprintf("select %v.id from %v left join %v on (%v.col = %v.col) where %v.col is null and %v.col is not null", reference.childTable, reference.childTable, reference.parentTable, reference.parentTable, reference.childTable, reference.parentTable, reference.childTable) - if isMultiColFkTable(reference.childTable) { - query = fmt.Sprintf("select %v.id from %v left join %v on (%v.cola = %v.cola and %v.colb = %v.colb) where %v.cola is null and %v.cola is not null and %v.colb is not null", reference.childTable, reference.childTable, reference.parentTable, reference.parentTable, reference.childTable, reference.parentTable, reference.childTable, reference.parentTable, reference.childTable, reference.childTable) - } - res, err := mcmp.VtConn.ExecuteFetch(query, 1000, false) - require.NoError(t, err) - require.Zerof(t, len(res.Rows), "Query %v gave non-empty results", query) - } - } - // We also verify that the results in Primary and Replica table match as is. - for _, keyspace := range clusterInstance.Keyspaces { - for _, shard := range keyspace.Shards { - var primaryTab, replicaTab *cluster.Vttablet - for _, vttablet := range shard.Vttablets { - if vttablet.Type == "primary" { - primaryTab = vttablet - } else { - replicaTab = vttablet - } - } - require.NotNil(t, primaryTab) - require.NotNil(t, replicaTab) - checkReplicationHealthy(t, replicaTab) - cluster.WaitForReplicationPos(t, primaryTab, replicaTab, true, 60.0) - primaryConn, err := utils.GetMySQLConn(primaryTab, fmt.Sprintf("vt_%v", keyspace.Name)) - require.NoError(t, err) - replicaConn, err := utils.GetMySQLConn(replicaTab, fmt.Sprintf("vt_%v", keyspace.Name)) - require.NoError(t, err) - primaryRes := collectFkTablesState(primaryConn) - replicaRes := collectFkTablesState(replicaConn) - verifyDataMatches(t, primaryRes, replicaRes) - } - } -} - -// verifyDataMatches verifies that the two list of results are the same. -func verifyDataMatches(t *testing.T, resOne []*sqltypes.Result, resTwo []*sqltypes.Result) { - require.EqualValues(t, len(resTwo), len(resOne), "Res 1 - %v, Res 2 - %v", resOne, resTwo) - for idx, resultOne := range resOne { - resultTwo := resTwo[idx] - require.True(t, resultOne.Equal(resultTwo), "Data for %v doesn't match\nRows 1\n%v\nRows 2\n%v", fkTables[idx], resultOne.Rows, resultTwo.Rows) - } -} - -// collectFkTablesState collects the data stored in the foreign key tables for the given connection. -func collectFkTablesState(conn *mysql.Conn) []*sqltypes.Result { - var tablesData []*sqltypes.Result - for _, table := range fkTables { - query := fmt.Sprintf("SELECT * FROM %v ORDER BY id", table) - res, _ := conn.ExecuteFetch(query, 10000, true) - tablesData = append(tablesData, res) - } - return tablesData -} diff --git a/go/test/endtoend/vtgate/foreignkey/fk_test.go b/go/test/endtoend/vtgate/foreignkey/fk_test.go index 46bbc2ed433..ff7ddef66ff 100644 --- a/go/test/endtoend/vtgate/foreignkey/fk_test.go +++ b/go/test/endtoend/vtgate/foreignkey/fk_test.go @@ -27,6 +27,7 @@ import ( "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/utils" + "vitess.io/vitess/go/vt/log" binlogdatapb "vitess.io/vitess/go/vt/proto/binlogdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/vt/vtgate/vtgateconn" @@ -775,6 +776,181 @@ func TestFkScenarios(t *testing.T) { } } +// TestFkQueries is for testing a specific set of queries one after the other. +func TestFkQueries(t *testing.T) { + // Wait for schema-tracking to be complete. + waitForSchemaTrackingForFkTables(t) + // Remove all the foreign key constraints for all the replicas. + // We can then verify that the replica, and the primary have the same data, to ensure + // that none of the queries ever lead to cascades/updates on MySQL level. + for _, ks := range []string{shardedKs, unshardedKs} { + replicas := getReplicaTablets(ks) + for _, replica := range replicas { + removeAllForeignKeyConstraints(t, replica, ks) + } + } + + testcases := []struct { + name string + queries []string + }{ + { + name: "Non-literal update", + queries: []string{ + "insert into fk_t10 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t11 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "update fk_t10 set col = id + 3", + }, + }, { + name: "Non-literal update with order by", + queries: []string{ + "insert into fk_t10 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t11 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "update fk_t10 set col = id + 3 order by id desc", + }, + }, { + name: "Non-literal update with order by that require parent and child foreign keys verification - success", + queries: []string{ + "insert into fk_t10 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8)", + "insert into fk_t11 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t12 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t13 (id, col) values (1,1),(2,2)", + "update fk_t11 set col = id + 3 where id >= 3", + }, + }, { + name: "Non-literal update with order by that require parent and child foreign keys verification - parent fails", + queries: []string{ + "insert into fk_t10 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t11 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t12 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "update fk_t11 set col = id + 3", + }, + }, { + name: "Non-literal update with order by that require parent and child foreign keys verification - child fails", + queries: []string{ + "insert into fk_t10 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8)", + "insert into fk_t11 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t12 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t13 (id, col) values (1,1),(2,2)", + "update fk_t11 set col = id + 3", + }, + }, { + name: "Single column update in a multi-col table - success", + queries: []string{ + "insert into fk_multicol_t1 (id, cola, colb) values (1, 1, 1), (2, 2, 2)", + "insert into fk_multicol_t2 (id, cola, colb) values (1, 1, 1)", + "update fk_multicol_t1 set colb = 4 + (colb) where id = 2", + }, + }, { + name: "Single column update in a multi-col table - restrict failure", + queries: []string{ + "insert into fk_multicol_t1 (id, cola, colb) values (1, 1, 1), (2, 2, 2)", + "insert into fk_multicol_t2 (id, cola, colb) values (1, 1, 1)", + "update fk_multicol_t1 set colb = 4 + (colb) where id = 1", + }, + }, { + name: "Single column update in multi-col table - cascade and set null", + queries: []string{ + "insert into fk_multicol_t15 (id, cola, colb) values (1, 1, 1), (2, 2, 2)", + "insert into fk_multicol_t16 (id, cola, colb) values (1, 1, 1), (2, 2, 2)", + "insert into fk_multicol_t17 (id, cola, colb) values (1, 1, 1), (2, 2, 2)", + "update fk_multicol_t15 set colb = 4 + (colb) where id = 1", + }, + }, { + name: "Non literal update that evaluates to NULL - restricted", + queries: []string{ + "insert into fk_t10 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t11 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t13 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "update fk_t10 set col = id + null where id = 1", + }, + }, { + name: "Non literal update that evaluates to NULL - success", + queries: []string{ + "insert into fk_t10 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t11 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "insert into fk_t12 (id, col) values (1,1),(2,2),(3,3),(4,4),(5,5)", + "update fk_t10 set col = id + null where id = 1", + }, + }, { + name: "Multi column foreign key update with one literal and one non-literal update", + queries: []string{ + "insert into fk_multicol_t15 (id, cola, colb) values (1,1,1),(2,2,2)", + "insert into fk_multicol_t16 (id, cola, colb) values (1,1,1),(2,2,2)", + "update fk_multicol_t15 set cola = 3, colb = (id * 2) - 2", + }, + }, + } + + for _, testcase := range testcases { + t.Run(testcase.name, func(t *testing.T) { + mcmp, closer := start(t) + defer closer() + _ = utils.Exec(t, mcmp.VtConn, "use `uks`") + + // Ensure that the Vitess database is originally empty + ensureDatabaseState(t, mcmp.VtConn, true) + ensureDatabaseState(t, mcmp.MySQLConn, true) + + for _, query := range testcase.queries { + _, _ = mcmp.ExecAllowAndCompareError(query) + if t.Failed() { + break + } + } + + // ensure Vitess database has some data. This ensures not all the commands failed. + ensureDatabaseState(t, mcmp.VtConn, false) + // Verify the consistency of the data. + verifyDataIsCorrect(t, mcmp, 1) + }) + } +} + +// TestFkOneCase is for testing a specific set of queries. On the CI this test won't run since we'll keep the queries empty. +func TestFkOneCase(t *testing.T) { + queries := []string{} + if len(queries) == 0 { + t.Skip("No queries to test") + } + // Wait for schema-tracking to be complete. + waitForSchemaTrackingForFkTables(t) + // Remove all the foreign key constraints for all the replicas. + // We can then verify that the replica, and the primary have the same data, to ensure + // that none of the queries ever lead to cascades/updates on MySQL level. + for _, ks := range []string{shardedKs, unshardedKs} { + replicas := getReplicaTablets(ks) + for _, replica := range replicas { + removeAllForeignKeyConstraints(t, replica, ks) + } + } + + mcmp, closer := start(t) + defer closer() + _ = utils.Exec(t, mcmp.VtConn, "use `uks`") + + // Ensure that the Vitess database is originally empty + ensureDatabaseState(t, mcmp.VtConn, true) + ensureDatabaseState(t, mcmp.MySQLConn, true) + + for _, query := range queries { + _, _ = mcmp.ExecAllowAndCompareError(query) + if t.Failed() { + log.Errorf("Query failed - %v", query) + break + } + } + vitessData := collectFkTablesState(mcmp.VtConn) + for idx, table := range fkTables { + log.Errorf("Vitess data for %v -\n%v", table, vitessData[idx].Rows) + } + + // ensure Vitess database has some data. This ensures not all the commands failed. + ensureDatabaseState(t, mcmp.VtConn, false) + // Verify the consistency of the data. + verifyDataIsCorrect(t, mcmp, 1) +} + func TestCyclicFks(t *testing.T) { mcmp, closer := start(t) defer closer() diff --git a/go/test/endtoend/vtgate/foreignkey/utils_test.go b/go/test/endtoend/vtgate/foreignkey/utils_test.go index 5e0b4a8a3cc..b97e57d685c 100644 --- a/go/test/endtoend/vtgate/foreignkey/utils_test.go +++ b/go/test/endtoend/vtgate/foreignkey/utils_test.go @@ -19,15 +19,21 @@ package foreignkey import ( "database/sql" "fmt" + "math/rand" "strings" "testing" + "time" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/test/endtoend/cluster" "vitess.io/vitess/go/test/endtoend/utils" ) +var supportedOpps = []string{"*", "+", "-"} + // getTestName prepends whether the test is for a sharded keyspace or not to the test name. func getTestName(testName string, testSharded bool) string { if testSharded { @@ -41,6 +47,32 @@ func isMultiColFkTable(tableName string) bool { return strings.Contains(tableName, "multicol") } +func (fz *fuzzer) generateExpression(length int, cols ...string) string { + expr := fz.getColOrInt(cols...) + if length == 1 { + return expr + } + rhsExpr := fz.generateExpression(length-1, cols...) + op := supportedOpps[rand.Intn(len(supportedOpps))] + return fmt.Sprintf("%v %s (%v)", expr, op, rhsExpr) +} + +// getColOrInt gets a column or an integer/NULL literal with equal probability. +func (fz *fuzzer) getColOrInt(cols ...string) string { + if len(cols) == 0 || rand.Intn(2) == 0 { + return convertIntValueToString(rand.Intn(1 + fz.maxValForCol)) + } + return cols[rand.Intn(len(cols))] +} + +// convertIntValueToString converts the given value to a string +func convertIntValueToString(value int) string { + if value == 0 { + return "NULL" + } + return fmt.Sprintf("%d", value) +} + // waitForSchemaTrackingForFkTables waits for schema tracking to have run and seen the tables used // for foreign key tests. func waitForSchemaTrackingForFkTables(t *testing.T) { @@ -142,3 +174,85 @@ func compareVitessAndMySQLErrors(t *testing.T, vtErr, mysqlErr error) { out := fmt.Sprintf("Vitess and MySQL are not erroring the same way.\nVitess error: %v\nMySQL error: %v", vtErr, mysqlErr) t.Error(out) } + +// ensureDatabaseState ensures that the database is either empty or not. +func ensureDatabaseState(t *testing.T, vtconn *mysql.Conn, empty bool) { + results := collectFkTablesState(vtconn) + isEmpty := true + for _, res := range results { + if len(res.Rows) > 0 { + isEmpty = false + } + } + require.Equal(t, isEmpty, empty) +} + +// verifyDataIsCorrect verifies that the data in MySQL database matches the data in the Vitess database. +func verifyDataIsCorrect(t *testing.T, mcmp utils.MySQLCompare, concurrency int) { + // For single concurrent thread, we run all the queries on both MySQL and Vitess, so we can verify correctness + // by just checking if the data in MySQL and Vitess match. + if concurrency == 1 { + for _, table := range fkTables { + query := fmt.Sprintf("SELECT * FROM %v ORDER BY id", table) + mcmp.Exec(query) + } + } else { + // For higher concurrency, we don't have MySQL data to verify everything is fine, + // so we'll have to do something different. + // We run LEFT JOIN queries on all the parent and child tables linked by foreign keys + // to make sure that nothing is broken in the database. + for _, reference := range fkReferences { + query := fmt.Sprintf("select %v.id from %v left join %v on (%v.col = %v.col) where %v.col is null and %v.col is not null", reference.childTable, reference.childTable, reference.parentTable, reference.parentTable, reference.childTable, reference.parentTable, reference.childTable) + if isMultiColFkTable(reference.childTable) { + query = fmt.Sprintf("select %v.id from %v left join %v on (%v.cola = %v.cola and %v.colb = %v.colb) where %v.cola is null and %v.cola is not null and %v.colb is not null", reference.childTable, reference.childTable, reference.parentTable, reference.parentTable, reference.childTable, reference.parentTable, reference.childTable, reference.parentTable, reference.childTable, reference.childTable) + } + res, err := mcmp.VtConn.ExecuteFetch(query, 1000, false) + require.NoError(t, err) + require.Zerof(t, len(res.Rows), "Query %v gave non-empty results", query) + } + } + // We also verify that the results in Primary and Replica table match as is. + for _, keyspace := range clusterInstance.Keyspaces { + for _, shard := range keyspace.Shards { + var primaryTab, replicaTab *cluster.Vttablet + for _, vttablet := range shard.Vttablets { + if vttablet.Type == "primary" { + primaryTab = vttablet + } else { + replicaTab = vttablet + } + } + require.NotNil(t, primaryTab) + require.NotNil(t, replicaTab) + checkReplicationHealthy(t, replicaTab) + cluster.WaitForReplicationPos(t, primaryTab, replicaTab, true, 1*time.Minute) + primaryConn, err := utils.GetMySQLConn(primaryTab, fmt.Sprintf("vt_%v", keyspace.Name)) + require.NoError(t, err) + replicaConn, err := utils.GetMySQLConn(replicaTab, fmt.Sprintf("vt_%v", keyspace.Name)) + require.NoError(t, err) + primaryRes := collectFkTablesState(primaryConn) + replicaRes := collectFkTablesState(replicaConn) + verifyDataMatches(t, primaryRes, replicaRes) + } + } +} + +// verifyDataMatches verifies that the two list of results are the same. +func verifyDataMatches(t *testing.T, resOne []*sqltypes.Result, resTwo []*sqltypes.Result) { + require.EqualValues(t, len(resTwo), len(resOne), "Res 1 - %v, Res 2 - %v", resOne, resTwo) + for idx, resultOne := range resOne { + resultTwo := resTwo[idx] + require.True(t, resultOne.Equal(resultTwo), "Data for %v doesn't match\nRows 1\n%v\nRows 2\n%v", fkTables[idx], resultOne.Rows, resultTwo.Rows) + } +} + +// collectFkTablesState collects the data stored in the foreign key tables for the given connection. +func collectFkTablesState(conn *mysql.Conn) []*sqltypes.Result { + var tablesData []*sqltypes.Result + for _, table := range fkTables { + query := fmt.Sprintf("SELECT * FROM %v ORDER BY id", table) + res, _ := conn.ExecuteFetch(query, 10000, true) + tablesData = append(tablesData, res) + } + return tablesData +} diff --git a/go/vt/vtgate/engine/cached_size.go b/go/vt/vtgate/engine/cached_size.go index b70f83b192d..d878650c63e 100644 --- a/go/vt/vtgate/engine/cached_size.go +++ b/go/vt/vtgate/engine/cached_size.go @@ -280,7 +280,7 @@ func (cached *FkChild) CachedSize(alloc bool) int64 { } size := int64(0) if alloc { - size += int64(64) + size += int64(80) } // field BVName string size += hack.RuntimeAllocSize(int64(len(cached.BVName))) @@ -288,6 +288,13 @@ func (cached *FkChild) CachedSize(alloc bool) int64 { { size += hack.RuntimeAllocSize(int64(cap(cached.Cols)) * int64(8)) } + // field NonLiteralInfo []vitess.io/vitess/go/vt/vtgate/engine.NonLiteralUpdateInfo + { + size += hack.RuntimeAllocSize(int64(cap(cached.NonLiteralInfo)) * int64(32)) + for _, elem := range cached.NonLiteralInfo { + size += elem.CachedSize(false) + } + } // field Exec vitess.io/vitess/go/vt/vtgate/engine.Primitive if cc, ok := cached.Exec.(cachedObject); ok { size += cc.CachedSize(true) @@ -612,6 +619,18 @@ func (cached *MergeSort) CachedSize(alloc bool) int64 { } return size } +func (cached *NonLiteralUpdateInfo) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(32) + } + // field UpdateExprBvName string + size += hack.RuntimeAllocSize(int64(len(cached.UpdateExprBvName))) + return size +} func (cached *OnlineDDL) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) diff --git a/go/vt/vtgate/engine/fk_cascade.go b/go/vt/vtgate/engine/fk_cascade.go index d0bddbea8f9..691e326fec7 100644 --- a/go/vt/vtgate/engine/fk_cascade.go +++ b/go/vt/vtgate/engine/fk_cascade.go @@ -19,6 +19,7 @@ package engine import ( "context" "fmt" + "maps" "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" @@ -29,9 +30,24 @@ import ( // FkChild contains the Child Primitive to be executed collecting the values from the Selection Primitive using the column indexes. // BVName is used to pass the value as bind variable to the Child Primitive. type FkChild struct { + // BVName is the bind variable name for the tuple bind variable used in the primitive. BVName string - Cols []int // indexes - Exec Primitive + // Cols are the indexes of the column that need to be selected from the SELECT query to create the tuple bind variable. + Cols []int + // NonLiteralInfo stores the information that is needed to run an update query with non-literal values. + NonLiteralInfo []NonLiteralUpdateInfo + Exec Primitive +} + +// NonLiteralUpdateInfo stores the information required to process non-literal update queries. +// It stores 3 information- +// 1. UpdateExprCol- The index of the updated expression in the select query. +// 2. UpdateExprBvName- The bind variable name to store the updated expression into. +// 3. CompExprCol- The index of the comparison expression in the select query to know if the row value is actually being changed or not. +type NonLiteralUpdateInfo struct { + UpdateExprCol int + UpdateExprBvName string + CompExprCol int } // FkCascade is a primitive that implements foreign key cascading using Selection as values required to execute the FkChild Primitives. @@ -82,81 +98,110 @@ func (fkc *FkCascade) TryExecute(ctx context.Context, vcursor VCursor, bindVars } for _, child := range fkc.Children { - // We create a bindVariable for each Child - // that stores the tuple of columns involved in the fk constraint. - bv := &querypb.BindVariable{ - Type: querypb.Type_TUPLE, + // Having non-empty UpdateExprBvNames is an indication that we have an update query with non-literal expressions in it. + // We need to run this query differently because we need to run an update for each row we get back from the SELECT. + if len(child.NonLiteralInfo) > 0 { + err = fkc.executeNonLiteralExprFkChild(ctx, vcursor, bindVars, wantfields, selectionRes, child) + } else { + err = fkc.executeLiteralExprFkChild(ctx, vcursor, bindVars, wantfields, selectionRes, child, false) } - for _, row := range selectionRes.Rows { - var tupleValues []sqltypes.Value - for _, colIdx := range child.Cols { - tupleValues = append(tupleValues, row[colIdx]) - } - bv.Values = append(bv.Values, sqltypes.TupleToProto(tupleValues)) - } - // Execute the child primitive, and bail out incase of failure. - // Since this Primitive is always executed in a transaction, the changes should - // be rolled back incase of an error. - bindVars[child.BVName] = bv - _, err = vcursor.ExecutePrimitive(ctx, child.Exec, bindVars, wantfields) if err != nil { return nil, err } - delete(bindVars, child.BVName) } // All the children are modified successfully, we can now execute the Parent Primitive. return vcursor.ExecutePrimitive(ctx, fkc.Parent, bindVars, wantfields) } -// TryStreamExecute implements the Primitive interface. -func (fkc *FkCascade) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { - // We create a bindVariable for each Child - // that stores the tuple of columns involved in the fk constraint. - var bindVariables []*querypb.BindVariable - for range fkc.Children { - bindVariables = append(bindVariables, &querypb.BindVariable{ - Type: querypb.Type_TUPLE, - }) +func (fkc *FkCascade) executeLiteralExprFkChild(ctx context.Context, vcursor VCursor, in map[string]*querypb.BindVariable, wantfields bool, selectionRes *sqltypes.Result, child *FkChild, isStreaming bool) error { + bindVars := maps.Clone(in) + // We create a bindVariable that stores the tuple of columns involved in the fk constraint. + bv := &querypb.BindVariable{ + Type: querypb.Type_TUPLE, } + for _, row := range selectionRes.Rows { + var tupleValues []sqltypes.Value - // Execute the Selection primitive to find the rows that are going to modified. - // This will be used to find the rows that need modification on the children. - err := vcursor.StreamExecutePrimitive(ctx, fkc.Selection, bindVars, wantfields, func(result *sqltypes.Result) error { - if len(result.Rows) == 0 { - return nil - } - for idx, child := range fkc.Children { - for _, row := range result.Rows { - var tupleValues []sqltypes.Value - for _, colIdx := range child.Cols { - tupleValues = append(tupleValues, row[colIdx]) - } - bindVariables[idx].Values = append(bindVariables[idx].Values, sqltypes.TupleToProto(tupleValues)) - } + for _, colIdx := range child.Cols { + tupleValues = append(tupleValues, row[colIdx]) } - return nil - }) - if err != nil { - return err + bv.Values = append(bv.Values, sqltypes.TupleToProto(tupleValues)) } - // Execute the child primitive, and bail out incase of failure. // Since this Primitive is always executed in a transaction, the changes should // be rolled back incase of an error. - for idx, child := range fkc.Children { - bindVars[child.BVName] = bindVariables[idx] - err = vcursor.StreamExecutePrimitive(ctx, child.Exec, bindVars, wantfields, func(result *sqltypes.Result) error { - return nil - }) + bindVars[child.BVName] = bv + var err error + if isStreaming { + err = vcursor.StreamExecutePrimitive(ctx, child.Exec, bindVars, wantfields, func(result *sqltypes.Result) error { return nil }) + } else { + _, err = vcursor.ExecutePrimitive(ctx, child.Exec, bindVars, wantfields) + } + if err != nil { + return err + } + return nil +} + +func (fkc *FkCascade) executeNonLiteralExprFkChild(ctx context.Context, vcursor VCursor, in map[string]*querypb.BindVariable, wantfields bool, selectionRes *sqltypes.Result, child *FkChild) error { + // For each row in the SELECT we need to run the child primitive. + for _, row := range selectionRes.Rows { + bindVars := maps.Clone(in) + // First we check if any of the columns is being updated at all. + skipRow := true + for _, info := range child.NonLiteralInfo { + // We use a null-safe comparison, so the value is guaranteed to be not null. + // We check if the column has updated or not. + isUnchanged, err := row[info.CompExprCol].ToBool() + if err != nil { + return err + } + if !isUnchanged { + // If any column has changed, then we can't skip this row. + // We need to execute the child primitive. + skipRow = false + break + } + } + // If none of the columns have changed, then there is no update to cascade, we can move on. + if skipRow { + continue + } + // We create a bindVariable that stores the tuple of columns involved in the fk constraint. + bv := &querypb.BindVariable{ + Type: querypb.Type_TUPLE, + } + // Create a tuple from the Row. + var tupleValues []sqltypes.Value + for _, colIdx := range child.Cols { + tupleValues = append(tupleValues, row[colIdx]) + } + bv.Values = append(bv.Values, sqltypes.TupleToProto(tupleValues)) + // Execute the child primitive, and bail out incase of failure. + // Since this Primitive is always executed in a transaction, the changes should + // be rolled back in case of an error. + bindVars[child.BVName] = bv + + // Next, we need to copy the updated expressions value into the bind variables map. + for _, info := range child.NonLiteralInfo { + bindVars[info.UpdateExprBvName] = sqltypes.ValueBindVariable(row[info.UpdateExprCol]) + } + _, err := vcursor.ExecutePrimitive(ctx, child.Exec, bindVars, wantfields) if err != nil { return err } - delete(bindVars, child.BVName) } + return nil +} - // All the children are modified successfully, we can now execute the Parent Primitive. - return vcursor.StreamExecutePrimitive(ctx, fkc.Parent, bindVars, wantfields, callback) +// TryStreamExecute implements the Primitive interface. +func (fkc *FkCascade) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { + res, err := fkc.TryExecute(ctx, vcursor, bindVars, wantfields) + if err != nil { + return err + } + return callback(res) } // Inputs implements the Primitive interface. @@ -168,11 +213,15 @@ func (fkc *FkCascade) Inputs() ([]Primitive, []map[string]any) { inputName: "Selection", }) for idx, child := range fkc.Children { - inputsMap = append(inputsMap, map[string]any{ + childInfoMap := map[string]any{ inputName: fmt.Sprintf("CascadeChild-%d", idx+1), "BvName": child.BVName, "Cols": child.Cols, - }) + } + if len(child.NonLiteralInfo) > 0 { + childInfoMap["NonLiteralUpdateInfo"] = child.NonLiteralInfo + } + inputsMap = append(inputsMap, childInfoMap) inputs = append(inputs, child.Exec) } inputs = append(inputs, fkc.Parent) diff --git a/go/vt/vtgate/engine/fk_cascade_test.go b/go/vt/vtgate/engine/fk_cascade_test.go index ddd381003b1..942fe44a709 100644 --- a/go/vt/vtgate/engine/fk_cascade_test.go +++ b/go/vt/vtgate/engine/fk_cascade_test.go @@ -80,7 +80,7 @@ func TestDeleteCascade(t *testing.T) { require.NoError(t, err) vc.ExpectLog(t, []string{ `ResolveDestinations ks [] Destinations:DestinationAllShards()`, - `StreamExecuteMulti select cola, colb from parent where foo = 48 ks.0: {} `, + `ExecuteMultiShard ks.0: select cola, colb from parent where foo = 48 {} false false`, `ResolveDestinations ks [] Destinations:DestinationAllShards()`, `ExecuteMultiShard ks.0: delete from child where (ca, cb) in ::__vals {__vals: type:TUPLE values:{type:TUPLE value:"\x89\x02\x011\x950\x01a"} values:{type:TUPLE value:"\x89\x02\x012\x950\x01b"}} true true`, `ResolveDestinations ks [] Destinations:DestinationAllShards()`, @@ -141,7 +141,7 @@ func TestUpdateCascade(t *testing.T) { require.NoError(t, err) vc.ExpectLog(t, []string{ `ResolveDestinations ks [] Destinations:DestinationAllShards()`, - `StreamExecuteMulti select cola, colb from parent where foo = 48 ks.0: {} `, + `ExecuteMultiShard ks.0: select cola, colb from parent where foo = 48 {} false false`, `ResolveDestinations ks [] Destinations:DestinationAllShards()`, `ExecuteMultiShard ks.0: update child set ca = :vtg1 where (ca, cb) in ::__vals {__vals: type:TUPLE values:{type:TUPLE value:"\x89\x02\x011\x950\x01a"} values:{type:TUPLE value:"\x89\x02\x012\x950\x01b"}} true true`, `ResolveDestinations ks [] Destinations:DestinationAllShards()`, @@ -149,6 +149,82 @@ func TestUpdateCascade(t *testing.T) { }) } +// TestNonLiteralUpdateCascade tests that FkCascade executes the child and parent primitives for a non-literal update cascade. +func TestNonLiteralUpdateCascade(t *testing.T) { + fakeRes := sqltypes.MakeTestResult(sqltypes.MakeTestFields("cola|cola <=> colb + 2|colb + 2", "int64|int64|int64"), "1|1|3", "2|0|5", "3|0|7") + + inputP := &Route{ + Query: "select cola, cola <=> colb + 2, colb + 2, from parent where foo = 48", + RoutingParameters: &RoutingParameters{ + Opcode: Unsharded, + Keyspace: &vindexes.Keyspace{Name: "ks"}, + }, + } + childP := &Update{ + DML: &DML{ + Query: "update child set ca = :fkc_upd where (ca) in ::__vals", + RoutingParameters: &RoutingParameters{ + Opcode: Unsharded, + Keyspace: &vindexes.Keyspace{Name: "ks"}, + }, + }, + } + parentP := &Update{ + DML: &DML{ + Query: "update parent set cola = colb + 2 where foo = 48", + RoutingParameters: &RoutingParameters{ + Opcode: Unsharded, + Keyspace: &vindexes.Keyspace{Name: "ks"}, + }, + }, + } + fkc := &FkCascade{ + Selection: inputP, + Children: []*FkChild{{ + BVName: "__vals", + Cols: []int{0}, + NonLiteralInfo: []NonLiteralUpdateInfo{ + { + UpdateExprBvName: "fkc_upd", + UpdateExprCol: 2, + CompExprCol: 1, + }, + }, + Exec: childP, + }}, + Parent: parentP, + } + + vc := newDMLTestVCursor("0") + vc.results = []*sqltypes.Result{fakeRes} + _, err := fkc.TryExecute(context.Background(), vc, map[string]*querypb.BindVariable{}, true) + require.NoError(t, err) + vc.ExpectLog(t, []string{ + `ResolveDestinations ks [] Destinations:DestinationAllShards()`, + `ExecuteMultiShard ks.0: select cola, cola <=> colb + 2, colb + 2, from parent where foo = 48 {} false false`, + `ResolveDestinations ks [] Destinations:DestinationAllShards()`, + `ExecuteMultiShard ks.0: update child set ca = :fkc_upd where (ca) in ::__vals {__vals: type:TUPLE values:{type:TUPLE value:"\x89\x02\x012"} fkc_upd: type:INT64 value:"5"} true true`, + `ResolveDestinations ks [] Destinations:DestinationAllShards()`, + `ExecuteMultiShard ks.0: update child set ca = :fkc_upd where (ca) in ::__vals {__vals: type:TUPLE values:{type:TUPLE value:"\x89\x02\x013"} fkc_upd: type:INT64 value:"7"} true true`, + `ResolveDestinations ks [] Destinations:DestinationAllShards()`, + `ExecuteMultiShard ks.0: update parent set cola = colb + 2 where foo = 48 {} true true`, + }) + + vc.Rewind() + err = fkc.TryStreamExecute(context.Background(), vc, map[string]*querypb.BindVariable{}, true, func(result *sqltypes.Result) error { return nil }) + require.NoError(t, err) + vc.ExpectLog(t, []string{ + `ResolveDestinations ks [] Destinations:DestinationAllShards()`, + `ExecuteMultiShard ks.0: select cola, cola <=> colb + 2, colb + 2, from parent where foo = 48 {} false false`, + `ResolveDestinations ks [] Destinations:DestinationAllShards()`, + `ExecuteMultiShard ks.0: update child set ca = :fkc_upd where (ca) in ::__vals {__vals: type:TUPLE values:{type:TUPLE value:"\x89\x02\x012"} fkc_upd: type:INT64 value:"5"} true true`, + `ResolveDestinations ks [] Destinations:DestinationAllShards()`, + `ExecuteMultiShard ks.0: update child set ca = :fkc_upd where (ca) in ::__vals {__vals: type:TUPLE values:{type:TUPLE value:"\x89\x02\x013"} fkc_upd: type:INT64 value:"7"} true true`, + `ResolveDestinations ks [] Destinations:DestinationAllShards()`, + `ExecuteMultiShard ks.0: update parent set cola = colb + 2 where foo = 48 {} true true`, + }) +} + // TestNeedsTransactionInExecPrepared tests that if we have a foreign key cascade inside an ExecStmt plan, then we do mark the plan to require a transaction. func TestNeedsTransactionInExecPrepared(t *testing.T) { // Even if FkCascade is wrapped in ExecStmt, the plan should be marked such that it requires a transaction. diff --git a/go/vt/vtgate/engine/fk_verify.go b/go/vt/vtgate/engine/fk_verify.go index 350aeec59e0..8625fbe2362 100644 --- a/go/vt/vtgate/engine/fk_verify.go +++ b/go/vt/vtgate/engine/fk_verify.go @@ -83,18 +83,11 @@ func (f *FkVerify) TryExecute(ctx context.Context, vcursor VCursor, bindVars map // TryStreamExecute implements the Primitive interface func (f *FkVerify) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { - for _, v := range f.Verify { - err := vcursor.StreamExecutePrimitive(ctx, v.Exec, bindVars, wantfields, func(qr *sqltypes.Result) error { - if len(qr.Rows) > 0 { - return getError(v.Typ) - } - return nil - }) - if err != nil { - return err - } + res, err := f.TryExecute(ctx, vcursor, bindVars, wantfields) + if err != nil { + return err } - return vcursor.StreamExecutePrimitive(ctx, f.Exec, bindVars, wantfields, callback) + return callback(res) } // Inputs implements the Primitive interface diff --git a/go/vt/vtgate/engine/fk_verify_test.go b/go/vt/vtgate/engine/fk_verify_test.go index 5635a32bc2c..5c9ff83c2ec 100644 --- a/go/vt/vtgate/engine/fk_verify_test.go +++ b/go/vt/vtgate/engine/fk_verify_test.go @@ -74,7 +74,7 @@ func TestFKVerifyUpdate(t *testing.T) { require.NoError(t, err) vc.ExpectLog(t, []string{ `ResolveDestinations ks [] Destinations:DestinationAllShards()`, - `StreamExecuteMulti select 1 from child c left join parent p on p.cola = 1 and p.colb = 'a' where p.cola is null and p.colb is null ks.0: {} `, + `ExecuteMultiShard ks.0: select 1 from child c left join parent p on p.cola = 1 and p.colb = 'a' where p.cola is null and p.colb is null {} false false`, `ResolveDestinations ks [] Destinations:DestinationAllShards()`, `ExecuteMultiShard ks.0: update child set cola = 1, colb = 'a' where foo = 48 {} true true`, }) @@ -97,7 +97,7 @@ func TestFKVerifyUpdate(t *testing.T) { require.ErrorContains(t, err, "Cannot add or update a child row: a foreign key constraint fails") vc.ExpectLog(t, []string{ `ResolveDestinations ks [] Destinations:DestinationAllShards()`, - `StreamExecuteMulti select 1 from child c left join parent p on p.cola = 1 and p.colb = 'a' where p.cola is null and p.colb is null ks.0: {} `, + `ExecuteMultiShard ks.0: select 1 from child c left join parent p on p.cola = 1 and p.colb = 'a' where p.cola is null and p.colb is null {} false false`, }) }) @@ -119,7 +119,7 @@ func TestFKVerifyUpdate(t *testing.T) { require.ErrorContains(t, err, "Cannot delete or update a parent row: a foreign key constraint fails") vc.ExpectLog(t, []string{ `ResolveDestinations ks [] Destinations:DestinationAllShards()`, - `StreamExecuteMulti select 1 from grandchild g join child c on g.cola = c.cola and g.colb = c.colb where c.foo = 48 ks.0: {} `, + `ExecuteMultiShard ks.0: select 1 from grandchild g join child c on g.cola = c.cola and g.colb = c.colb where c.foo = 48 {} false false`, }) }) } diff --git a/go/vt/vtgate/planbuilder/operator_transformers.go b/go/vt/vtgate/planbuilder/operator_transformers.go index a04c4b00c2c..59200e92e2a 100644 --- a/go/vt/vtgate/planbuilder/operator_transformers.go +++ b/go/vt/vtgate/planbuilder/operator_transformers.go @@ -139,9 +139,10 @@ func transformFkCascade(ctx *plancontext.PlanningContext, fkc *operators.FkCasca childEngine := childLP.Primitive() children = append(children, &engine.FkChild{ - BVName: child.BVName, - Cols: child.Cols, - Exec: childEngine, + BVName: child.BVName, + Cols: child.Cols, + NonLiteralInfo: child.NonLiteralInfo, + Exec: childEngine, }) } diff --git a/go/vt/vtgate/planbuilder/operators/ast_to_op.go b/go/vt/vtgate/planbuilder/operators/ast_to_op.go index bc4aaf8a4e6..64d9826a80e 100644 --- a/go/vt/vtgate/planbuilder/operators/ast_to_op.go +++ b/go/vt/vtgate/planbuilder/operators/ast_to_op.go @@ -28,6 +28,7 @@ import ( ) const foreignKeyConstraintValues = "fkc_vals" +const foreignKeyUpdateExpr = "fkc_upd" // translateQueryToOp creates an operator tree that represents the input SELECT or UNION query func translateQueryToOp(ctx *plancontext.PlanningContext, selStmt sqlparser.Statement) (op ops.Operator, err error) { @@ -213,7 +214,10 @@ func createOpFromStmt(ctx *plancontext.PlanningContext, stmt sqlparser.Statement // we should augment the semantic analysis to also tell us whether the given query has any cross shard parent foreign keys to validate. // If there are, then we have to run the query with FOREIGN_KEY_CHECKS off because we can't be sure if the DML will succeed on MySQL with the checks on. // So, we should set VerifyAllFKs to true. i.e. we should add `|| ctx.SemTable.RequireForeignKeyChecksOff()` to the below condition. - ctx.VerifyAllFKs = verifyAllFKs + if verifyAllFKs { + // If ctx.VerifyAllFKs is already true we don't want to turn it off. + ctx.VerifyAllFKs = verifyAllFKs + } // From all the parent foreign keys involved, we should remove the one that we need to ignore. err = ctx.SemTable.RemoveParentForeignKey(fkToIgnore) @@ -397,6 +401,7 @@ func createSelectionOp( selectExprs []sqlparser.SelectExpr, tableExprs sqlparser.TableExprs, where *sqlparser.Where, + orderBy sqlparser.OrderBy, limit *sqlparser.Limit, lock sqlparser.Lock, ) (ops.Operator, error) { @@ -404,20 +409,10 @@ func createSelectionOp( SelectExprs: selectExprs, From: tableExprs, Where: where, + OrderBy: orderBy, Limit: limit, Lock: lock, } // There are no foreign keys to check for a select query, so we can pass anything for verifyAllFKs and fkToIgnore. return createOpFromStmt(ctx, selectionStmt, false /* verifyAllFKs */, "" /* fkToIgnore */) } - -func selectParentColumns(fk vindexes.ChildFKInfo, lastOffset int) ([]int, []sqlparser.SelectExpr) { - var cols []int - var exprs []sqlparser.SelectExpr - for _, column := range fk.ParentColumns { - cols = append(cols, lastOffset) - exprs = append(exprs, aeWrap(sqlparser.NewColName(column.String()))) - lastOffset++ - } - return cols, exprs -} diff --git a/go/vt/vtgate/planbuilder/operators/delete.go b/go/vt/vtgate/planbuilder/operators/delete.go index f02444671c1..dd37ed5db01 100644 --- a/go/vt/vtgate/planbuilder/operators/delete.go +++ b/go/vt/vtgate/planbuilder/operators/delete.go @@ -181,16 +181,16 @@ func createFkCascadeOpForDelete(ctx *plancontext.PlanningContext, parentOp ops.O } // We need to select all the parent columns for the foreign key constraint, to use in the update of the child table. - cols, exprs := selectParentColumns(fk, len(selectExprs)) - selectExprs = append(selectExprs, exprs...) + var offsets []int + offsets, selectExprs = addColumns(ctx, fk.ParentColumns, selectExprs) - fkChild, err := createFkChildForDelete(ctx, fk, cols) + fkChild, err := createFkChildForDelete(ctx, fk, offsets) if err != nil { return nil, err } fkChildren = append(fkChildren, fkChild) } - selectionOp, err := createSelectionOp(ctx, selectExprs, delStmt.TableExprs, delStmt.Where, nil, sqlparser.ForUpdateLock) + selectionOp, err := createSelectionOp(ctx, selectExprs, delStmt.TableExprs, delStmt.Where, nil, nil, sqlparser.ForUpdateLock) if err != nil { return nil, err } diff --git a/go/vt/vtgate/planbuilder/operators/fk_cascade.go b/go/vt/vtgate/planbuilder/operators/fk_cascade.go index 90c797d55e8..73b902a4980 100644 --- a/go/vt/vtgate/planbuilder/operators/fk_cascade.go +++ b/go/vt/vtgate/planbuilder/operators/fk_cascade.go @@ -19,15 +19,17 @@ package operators import ( "slices" + "vitess.io/vitess/go/vt/vtgate/engine" "vitess.io/vitess/go/vt/vtgate/planbuilder/operators/ops" "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" ) // FkChild is used to represent a foreign key child table operation type FkChild struct { - BVName string - Cols []int // indexes - Op ops.Operator + BVName string + Cols []int // indexes + NonLiteralInfo []engine.NonLiteralUpdateInfo + Op ops.Operator noColumns noPredicates @@ -88,9 +90,10 @@ func (fkc *FkCascade) Clone(inputs []ops.Operator) ops.Operator { } newFkc.Children = append(newFkc.Children, &FkChild{ - BVName: fkc.Children[idx-2].BVName, - Cols: slices.Clone(fkc.Children[idx-2].Cols), - Op: operator, + BVName: fkc.Children[idx-2].BVName, + Cols: slices.Clone(fkc.Children[idx-2].Cols), + NonLiteralInfo: slices.Clone(fkc.Children[idx-2].NonLiteralInfo), + Op: operator, }) } return newFkc diff --git a/go/vt/vtgate/planbuilder/operators/update.go b/go/vt/vtgate/planbuilder/operators/update.go index 743812f9dd7..b7a3a4da2d6 100644 --- a/go/vt/vtgate/planbuilder/operators/update.go +++ b/go/vt/vtgate/planbuilder/operators/update.go @@ -125,6 +125,12 @@ func createOperatorFromUpdate(ctx *plancontext.PlanningContext, updStmt *sqlpars return nil, vterrors.VT12001("update with limit with foreign key constraints") } + // Now we check if any of the foreign key columns that are being udpated have dependencies on other updated columns. + // This is unsafe, and we currently don't support this in Vitess. + if err = ctx.SemTable.ErrIfFkDependentColumnUpdated(updStmt.Exprs); err != nil { + return nil, err + } + return buildFkOperator(ctx, updOp, updClone, parentFks, childFks, vindexTable) } @@ -203,11 +209,6 @@ func createUpdateOperator(ctx *plancontext.PlanningContext, updStmt *sqlparser.U } func buildFkOperator(ctx *plancontext.PlanningContext, updOp ops.Operator, updClone *sqlparser.Update, parentFks []vindexes.ParentFKInfo, childFks []vindexes.ChildFKInfo, updatedTable *vindexes.Table) (ops.Operator, error) { - // We only support simple expressions in update queries for foreign key handling. - if isNonLiteral(updClone.Exprs, parentFks, childFks) { - return nil, vterrors.VT12001("update expression with non-literal values with foreign key constraints") - } - restrictChildFks, cascadeChildFks := splitChildFks(childFks) op, err := createFKCascadeOp(ctx, updOp, updClone, cascadeChildFks, updatedTable) @@ -218,25 +219,6 @@ func buildFkOperator(ctx *plancontext.PlanningContext, updOp ops.Operator, updCl return createFKVerifyOp(ctx, op, updClone, parentFks, restrictChildFks) } -func isNonLiteral(updExprs sqlparser.UpdateExprs, parentFks []vindexes.ParentFKInfo, childFks []vindexes.ChildFKInfo) bool { - for _, updateExpr := range updExprs { - if sqlparser.IsLiteral(updateExpr.Expr) { - continue - } - for _, parentFk := range parentFks { - if parentFk.ChildColumns.FindColumn(updateExpr.Name.Name) >= 0 { - return true - } - } - for _, childFk := range childFks { - if childFk.ParentColumns.FindColumn(updateExpr.Name.Name) >= 0 { - return true - } - } - } - return false -} - // splitChildFks splits the child foreign keys into restrict and cascade list as restrict is handled through Verify operator and cascade is handled through Cascade operator. func splitChildFks(fks []vindexes.ChildFKInfo) (restrictChildFks, cascadeChildFks []vindexes.ChildFKInfo) { for _, fk := range fks { @@ -271,17 +253,33 @@ func createFKCascadeOp(ctx *plancontext.PlanningContext, parentOp ops.Operator, } // We need to select all the parent columns for the foreign key constraint, to use in the update of the child table. - cols, exprs := selectParentColumns(fk, len(selectExprs)) - selectExprs = append(selectExprs, exprs...) + var selectOffsets []int + selectOffsets, selectExprs = addColumns(ctx, fk.ParentColumns, selectExprs) + + // If we are updating a foreign key column to a non-literal value then, need information about + // 1. whether the new value is different from the old value + // 2. the new value itself. + // 3. the bind variable to assign to this value. + var nonLiteralUpdateInfo []engine.NonLiteralUpdateInfo + ue := ctx.SemTable.GetUpdateExpressionsForFk(fk.String(updatedTable)) + // We only need to store these offsets and add these expressions to SELECT when there are non-literal updates present. + if hasNonLiteralUpdate(ue) { + for _, updExpr := range ue { + // We add the expression and a comparison expression to the SELECT exprssion while storing their offsets. + var info engine.NonLiteralUpdateInfo + info, selectExprs = addNonLiteralUpdExprToSelect(ctx, updExpr, selectExprs) + nonLiteralUpdateInfo = append(nonLiteralUpdateInfo, info) + } + } - fkChild, err := createFkChildForUpdate(ctx, fk, updStmt, cols, updatedTable) + fkChild, err := createFkChildForUpdate(ctx, fk, selectOffsets, nonLiteralUpdateInfo, updatedTable) if err != nil { return nil, err } fkChildren = append(fkChildren, fkChild) } - selectionOp, err := createSelectionOp(ctx, selectExprs, updStmt.TableExprs, updStmt.Where, nil, sqlparser.ForUpdateLock) + selectionOp, err := createSelectionOp(ctx, selectExprs, updStmt.TableExprs, updStmt.Where, updStmt.OrderBy, nil, sqlparser.ForUpdateLock) if err != nil { return nil, err } @@ -293,8 +291,73 @@ func createFKCascadeOp(ctx *plancontext.PlanningContext, parentOp ops.Operator, }, nil } +// hasNonLiteralUpdate checks if any of the update expressions have a non-literal update. +func hasNonLiteralUpdate(exprs sqlparser.UpdateExprs) bool { + for _, expr := range exprs { + if !sqlparser.IsLiteral(expr.Expr) { + return true + } + } + return false +} + +// addColumns adds the given set of columns to the select expressions provided. It tries to reuse the columns if already present in it. +// It returns the list of offsets for the columns and the updated select expressions. +func addColumns(ctx *plancontext.PlanningContext, columns sqlparser.Columns, exprs []sqlparser.SelectExpr) ([]int, []sqlparser.SelectExpr) { + var offsets []int + selectExprs := exprs + for _, column := range columns { + ae := aeWrap(sqlparser.NewColName(column.String())) + exists := false + for idx, expr := range exprs { + if ctx.SemTable.EqualsExpr(expr.(*sqlparser.AliasedExpr).Expr, ae.Expr) { + offsets = append(offsets, idx) + exists = true + break + } + } + if !exists { + offsets = append(offsets, len(selectExprs)) + selectExprs = append(selectExprs, ae) + + } + } + return offsets, selectExprs +} + +// For an update query having non-literal updates, we add the updated expression and a comparison expression to the select query. +// For example, for a query like `update fk_table set col = id * 100 + 1` +// We would add the expression `id * 100 + 1` and the comparison expression `col <=> id * 100 + 1` to the select query. +func addNonLiteralUpdExprToSelect(ctx *plancontext.PlanningContext, updExpr *sqlparser.UpdateExpr, exprs []sqlparser.SelectExpr) (engine.NonLiteralUpdateInfo, []sqlparser.SelectExpr) { + // Create the comparison expression. + compExpr := sqlparser.NewComparisonExpr(sqlparser.NullSafeEqualOp, updExpr.Name, updExpr.Expr, nil) + info := engine.NonLiteralUpdateInfo{ + CompExprCol: -1, + UpdateExprCol: -1, + } + // Add the expressions to the select expressions. We make sure to reuse the offset if it has already been added once. + for idx, selectExpr := range exprs { + if ctx.SemTable.EqualsExpr(selectExpr.(*sqlparser.AliasedExpr).Expr, compExpr) { + info.CompExprCol = idx + } + if ctx.SemTable.EqualsExpr(selectExpr.(*sqlparser.AliasedExpr).Expr, updExpr.Expr) { + info.UpdateExprCol = idx + } + } + // If the expression doesn't exist, then we add the expression and store the offset. + if info.CompExprCol == -1 { + info.CompExprCol = len(exprs) + exprs = append(exprs, aeWrap(compExpr)) + } + if info.UpdateExprCol == -1 { + info.UpdateExprCol = len(exprs) + exprs = append(exprs, aeWrap(updExpr.Expr)) + } + return info, exprs +} + // createFkChildForUpdate creates the update query operator for the child table based on the foreign key constraints. -func createFkChildForUpdate(ctx *plancontext.PlanningContext, fk vindexes.ChildFKInfo, updStmt *sqlparser.Update, cols []int, updatedTable *vindexes.Table) (*FkChild, error) { +func createFkChildForUpdate(ctx *plancontext.PlanningContext, fk vindexes.ChildFKInfo, selectOffsets []int, nonLiteralUpdateInfo []engine.NonLiteralUpdateInfo, updatedTable *vindexes.Table) (*FkChild, error) { // Create a ValTuple of child column names var valTuple sqlparser.ValTuple for _, column := range fk.ChildColumns { @@ -307,13 +370,22 @@ func createFkChildForUpdate(ctx *plancontext.PlanningContext, fk vindexes.ChildF compExpr := sqlparser.NewComparisonExpr(sqlparser.InOp, valTuple, sqlparser.NewListArg(bvName), nil) var childWhereExpr sqlparser.Expr = compExpr + // In the case of non-literal updates, we need to assign bindvariables for storing the updated value of the columns + // coming from the SELECT query. + if len(nonLiteralUpdateInfo) > 0 { + for idx, info := range nonLiteralUpdateInfo { + info.UpdateExprBvName = ctx.ReservedVars.ReserveVariable(foreignKeyUpdateExpr) + nonLiteralUpdateInfo[idx] = info + } + } + var childOp ops.Operator var err error switch fk.OnUpdate { case sqlparser.Cascade: - childOp, err = buildChildUpdOpForCascade(ctx, fk, updStmt, childWhereExpr, updatedTable) + childOp, err = buildChildUpdOpForCascade(ctx, fk, childWhereExpr, nonLiteralUpdateInfo, updatedTable) case sqlparser.SetNull: - childOp, err = buildChildUpdOpForSetNull(ctx, fk, updStmt, childWhereExpr) + childOp, err = buildChildUpdOpForSetNull(ctx, fk, childWhereExpr, nonLiteralUpdateInfo, updatedTable) case sqlparser.SetDefault: return nil, vterrors.VT09016() } @@ -322,9 +394,10 @@ func createFkChildForUpdate(ctx *plancontext.PlanningContext, fk vindexes.ChildF } return &FkChild{ - BVName: bvName, - Cols: cols, - Op: childOp, + BVName: bvName, + Cols: selectOffsets, + Op: childOp, + NonLiteralInfo: nonLiteralUpdateInfo, }, nil } @@ -332,11 +405,11 @@ func createFkChildForUpdate(ctx *plancontext.PlanningContext, fk vindexes.ChildF // The query looks like this - // // `UPDATE SET WHERE IN ()` -func buildChildUpdOpForCascade(ctx *plancontext.PlanningContext, fk vindexes.ChildFKInfo, updStmt *sqlparser.Update, childWhereExpr sqlparser.Expr, updatedTable *vindexes.Table) (ops.Operator, error) { +func buildChildUpdOpForCascade(ctx *plancontext.PlanningContext, fk vindexes.ChildFKInfo, childWhereExpr sqlparser.Expr, nonLiteralUpdateInfo []engine.NonLiteralUpdateInfo, updatedTable *vindexes.Table) (ops.Operator, error) { // The update expressions are the same as the update expressions in the parent update query // with the column names replaced with the child column names. var childUpdateExprs sqlparser.UpdateExprs - for _, updateExpr := range updStmt.Exprs { + for idx, updateExpr := range ctx.SemTable.GetUpdateExpressionsForFk(fk.String(updatedTable)) { colIdx := fk.ParentColumns.FindColumn(updateExpr.Name.Name) if colIdx == -1 { continue @@ -344,9 +417,13 @@ func buildChildUpdOpForCascade(ctx *plancontext.PlanningContext, fk vindexes.Chi // The where condition is the same as the comparison expression above // with the column names replaced with the child column names. + childUpdateExpr := updateExpr.Expr + if len(nonLiteralUpdateInfo) > 0 && nonLiteralUpdateInfo[idx].UpdateExprBvName != "" { + childUpdateExpr = sqlparser.NewArgument(nonLiteralUpdateInfo[idx].UpdateExprBvName) + } childUpdateExprs = append(childUpdateExprs, &sqlparser.UpdateExpr{ Name: sqlparser.NewColName(fk.ChildColumns[colIdx].String()), - Expr: updateExpr.Expr, + Expr: childUpdateExpr, }) } // Because we could be updating the child to a non-null value, @@ -373,7 +450,13 @@ func buildChildUpdOpForCascade(ctx *plancontext.PlanningContext, fk vindexes.Chi // `UPDATE SET // WHERE IN () // [AND ({ IS NULL OR}... NOT IN ())]` -func buildChildUpdOpForSetNull(ctx *plancontext.PlanningContext, fk vindexes.ChildFKInfo, updStmt *sqlparser.Update, childWhereExpr sqlparser.Expr) (ops.Operator, error) { +func buildChildUpdOpForSetNull( + ctx *plancontext.PlanningContext, + fk vindexes.ChildFKInfo, + childWhereExpr sqlparser.Expr, + nonLiteralUpdateInfo []engine.NonLiteralUpdateInfo, + updatedTable *vindexes.Table, +) (ops.Operator, error) { // For the SET NULL type constraint, we need to set all the child columns to NULL. var childUpdateExprs sqlparser.UpdateExprs for _, column := range fk.ChildColumns { @@ -392,7 +475,7 @@ func buildChildUpdOpForSetNull(ctx *plancontext.PlanningContext, fk vindexes.Chi // For example, if we are setting `update parent cola = :v1 and colb = :v2`, then on the child, the where condition would look something like this - // `:v1 IS NULL OR :v2 IS NULL OR (child_cola, child_colb) NOT IN ((:v1,:v2))` // So, if either of :v1 or :v2 is NULL, then the entire condition is true (which is the same as not having the condition when :v1 or :v2 is NULL). - compExpr := nullSafeNotInComparison(updStmt.Exprs, fk) + compExpr := nullSafeNotInComparison(ctx.SemTable.GetUpdateExpressionsForFk(fk.String(updatedTable)), fk, updatedTable.GetTableName(), nonLiteralUpdateInfo) if compExpr != nil { childWhereExpr = &sqlparser.AndExpr{ Left: childWhereExpr, @@ -408,7 +491,13 @@ func buildChildUpdOpForSetNull(ctx *plancontext.PlanningContext, fk vindexes.Chi } // createFKVerifyOp creates the verify operator for the parent foreign key constraints. -func createFKVerifyOp(ctx *plancontext.PlanningContext, childOp ops.Operator, updStmt *sqlparser.Update, parentFks []vindexes.ParentFKInfo, restrictChildFks []vindexes.ChildFKInfo) (ops.Operator, error) { +func createFKVerifyOp( + ctx *plancontext.PlanningContext, + childOp ops.Operator, + updStmt *sqlparser.Update, + parentFks []vindexes.ParentFKInfo, + restrictChildFks []vindexes.ChildFKInfo, +) (ops.Operator, error) { if len(parentFks) == 0 && len(restrictChildFks) == 0 { return childOp, nil } @@ -445,13 +534,13 @@ func createFKVerifyOp(ctx *plancontext.PlanningContext, childOp ops.Operator, up // Each parent foreign key constraint is verified by an anti join query of the form: // select 1 from child_tbl left join parent_tbl on -// where and and limit 1 +// where and and and limit 1 // E.g: // Child (c1, c2) references Parent (p1, p2) -// update Child set c1 = 1 where id = 1 +// update Child set c1 = c2 + 1 where id = 1 // verify query: -// select 1 from Child left join Parent on Parent.p1 = 1 and Parent.p2 = Child.c2 -// where Parent.p1 is null and Parent.p2 is null and Child.id = 1 +// select 1 from Child left join Parent on Parent.p1 = Child.c2 + 1 and Parent.p2 = Child.c2 +// where Parent.p1 is null and Parent.p2 is null and Child.id = 1 and Child.c2 + 1 is not null // and Child.c2 is not null // limit 1 func createFkVerifyOpForParentFKForUpdate(ctx *plancontext.PlanningContext, updStmt *sqlparser.Update, pFK vindexes.ParentFKInfo) (ops.Operator, error) { @@ -479,7 +568,7 @@ func createFkVerifyOpForParentFKForUpdate(ctx *plancontext.PlanningContext, updS var joinExpr sqlparser.Expr if matchedExpr == nil { predicate = &sqlparser.AndExpr{ - Left: parentIsNullExpr, + Left: predicate, Right: &sqlparser.IsExpr{ Left: sqlparser.NewColNameWithQualifier(pFK.ChildColumns[idx].String(), childTbl), Right: sqlparser.IsNotNullOp, @@ -491,10 +580,18 @@ func createFkVerifyOpForParentFKForUpdate(ctx *plancontext.PlanningContext, updS Right: sqlparser.NewColNameWithQualifier(pFK.ChildColumns[idx].String(), childTbl), } } else { + prefixedMatchExpr := prefixColNames(childTbl, matchedExpr.Expr) joinExpr = &sqlparser.ComparisonExpr{ Operator: sqlparser.EqualOp, Left: sqlparser.NewColNameWithQualifier(pFK.ParentColumns[idx].String(), parentTbl), - Right: prefixColNames(childTbl, matchedExpr.Expr), + Right: prefixedMatchExpr, + } + predicate = &sqlparser.AndExpr{ + Left: predicate, + Right: &sqlparser.IsExpr{ + Left: prefixedMatchExpr, + Right: sqlparser.IsNotNullOp, + }, } } @@ -519,6 +616,7 @@ func createFkVerifyOpForParentFKForUpdate(ctx *plancontext.PlanningContext, updS sqlparser.NewJoinCondition(joinCond, nil)), }, sqlparser.NewWhere(sqlparser.WhereClause, whereCond), + nil, sqlparser.NewLimitWithoutOffset(1), sqlparser.ShareModeLock) } @@ -527,10 +625,10 @@ func createFkVerifyOpForParentFKForUpdate(ctx *plancontext.PlanningContext, updS // select 1 from child_tbl join parent_tbl on where [AND ({ IS NULL OR}... NOT IN ())] limit 1 // E.g: // Child (c1, c2) references Parent (p1, p2) -// update Parent set p1 = 1 where id = 1 +// update Parent set p1 = col + 1 where id = 1 // verify query: // select 1 from Child join Parent on Parent.p1 = Child.c1 and Parent.p2 = Child.c2 -// where Parent.id = 1 and (1 IS NULL OR (child.c1) NOT IN ((1))) limit 1 +// where Parent.id = 1 and ((Parent.col + 1) IS NULL OR (child.c1) NOT IN ((Parent.col + 1))) limit 1 func createFkVerifyOpForChildFKForUpdate(ctx *plancontext.PlanningContext, updStmt *sqlparser.Update, cFk vindexes.ChildFKInfo) (ops.Operator, error) { // ON UPDATE RESTRICT foreign keys that require validation, should only be allowed in the case where we // are verifying all the FKs on vtgate level. @@ -573,7 +671,7 @@ func createFkVerifyOpForChildFKForUpdate(ctx *plancontext.PlanningContext, updSt // For example, if we are setting `update child cola = :v1 and colb = :v2`, then on the parent, the where condition would look something like this - // `:v1 IS NULL OR :v2 IS NULL OR (cola, colb) NOT IN ((:v1,:v2))` // So, if either of :v1 or :v2 is NULL, then the entire condition is true (which is the same as not having the condition when :v1 or :v2 is NULL). - compExpr := nullSafeNotInComparison(updStmt.Exprs, cFk) + compExpr := nullSafeNotInComparison(updStmt.Exprs, cFk, parentTbl, nil) if compExpr != nil { whereCond = sqlparser.AndExpressions(whereCond, compExpr) } @@ -588,6 +686,7 @@ func createFkVerifyOpForChildFKForUpdate(ctx *plancontext.PlanningContext, updSt sqlparser.NewJoinCondition(joinCond, nil)), }, sqlparser.NewWhere(sqlparser.WhereClause, whereCond), + nil, sqlparser.NewLimitWithoutOffset(1), sqlparser.ShareModeLock) } @@ -597,22 +696,24 @@ func createFkVerifyOpForChildFKForUpdate(ctx *plancontext.PlanningContext, updSt // `:v1 IS NULL OR :v2 IS NULL OR (cola, colb) NOT IN ((:v1,:v2))` // So, if either of :v1 or :v2 is NULL, then the entire condition is true (which is the same as not having the condition when :v1 or :v2 is NULL) // This expression is used in cascading SET NULLs and in verifying whether an update should be restricted. -func nullSafeNotInComparison(updateExprs sqlparser.UpdateExprs, cFk vindexes.ChildFKInfo) sqlparser.Expr { +func nullSafeNotInComparison(updateExprs sqlparser.UpdateExprs, cFk vindexes.ChildFKInfo, parentTbl sqlparser.TableName, nonLiteralUpdateInfo []engine.NonLiteralUpdateInfo) sqlparser.Expr { + var valTuple sqlparser.ValTuple var updateValues sqlparser.ValTuple - for _, updateExpr := range updateExprs { + for idx, updateExpr := range updateExprs { colIdx := cFk.ParentColumns.FindColumn(updateExpr.Name.Name) if colIdx >= 0 { if sqlparser.IsNull(updateExpr.Expr) { return nil } - updateValues = append(updateValues, updateExpr.Expr) + childUpdateExpr := prefixColNames(parentTbl, updateExpr.Expr) + if len(nonLiteralUpdateInfo) > 0 && nonLiteralUpdateInfo[idx].UpdateExprBvName != "" { + childUpdateExpr = sqlparser.NewArgument(nonLiteralUpdateInfo[idx].UpdateExprBvName) + } + updateValues = append(updateValues, childUpdateExpr) + valTuple = append(valTuple, sqlparser.NewColNameWithQualifier(cFk.ChildColumns[colIdx].String(), cFk.Table.GetTableName())) } } - // Create a ValTuple of child column names - var valTuple sqlparser.ValTuple - for _, column := range cFk.ChildColumns { - valTuple = append(valTuple, sqlparser.NewColNameWithQualifier(column.String(), cFk.Table.GetTableName())) - } + var finalExpr sqlparser.Expr = sqlparser.NewComparisonExpr(sqlparser.NotInOp, valTuple, sqlparser.ValTuple{updateValues}, nil) for _, value := range updateValues { finalExpr = &sqlparser.OrExpr{ diff --git a/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json b/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json index 065691d2356..afe42a45720 100644 --- a/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json @@ -656,8 +656,8 @@ "Name": "unsharded_fk_allow", "Sharded": false }, - "FieldQuery": "select col1, col1 from u_tbl1 where 1 != 1", - "Query": "select col1, col1 from u_tbl1 for update", + "FieldQuery": "select col1 from u_tbl1 where 1 != 1", + "Query": "select col1 from u_tbl1 for update", "Table": "u_tbl1" }, { @@ -715,7 +715,7 @@ "OperatorType": "FkCascade", "BvName": "fkc_vals2", "Cols": [ - 1 + 0 ], "Inputs": [ { @@ -789,17 +789,248 @@ "plan": "VT12001: unsupported: update with limit with foreign key constraints" }, { - "comment": "update in a table with non-literal value - set null fail due to child update where condition", + "comment": "update in a table with non-literal value - set null", "query": "update u_tbl2 set m = 2, col2 = col1 + 'bar' where id = 1", - "plan": "VT12001: unsupported: update expression with non-literal values with foreign key constraints" + "plan": { + "QueryType": "UPDATE", + "Original": "update u_tbl2 set m = 2, col2 = col1 + 'bar' where id = 1", + "Instructions": { + "OperatorType": "FKVerify", + "Inputs": [ + { + "InputName": "VerifyParent-1", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select 1 from u_tbl2 left join u_tbl1 on u_tbl1.col1 = u_tbl2.col1 + 'bar' where 1 != 1", + "Query": "select 1 from u_tbl2 left join u_tbl1 on u_tbl1.col1 = u_tbl2.col1 + 'bar' where u_tbl2.col1 + 'bar' is not null and u_tbl2.id = 1 and u_tbl1.col1 is null limit 1 lock in share mode", + "Table": "u_tbl1, u_tbl2" + }, + { + "InputName": "PostVerify", + "OperatorType": "FkCascade", + "Inputs": [ + { + "InputName": "Selection", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select col2, col2 <=> u_tbl2.col1 + 'bar', u_tbl2.col1 + 'bar' from u_tbl2 where 1 != 1", + "Query": "select col2, col2 <=> u_tbl2.col1 + 'bar', u_tbl2.col1 + 'bar' from u_tbl2 where u_tbl2.id = 1 for update", + "Table": "u_tbl2" + }, + { + "InputName": "CascadeChild-1", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "BvName": "fkc_vals", + "Cols": [ + 0 + ], + "NonLiteralUpdateInfo": [ + { + "UpdateExprCol": 2, + "UpdateExprBvName": "fkc_upd", + "CompExprCol": 1 + } + ], + "Query": "update u_tbl3 set col3 = null where (col3) in ::fkc_vals and (:fkc_upd is null or (u_tbl3.col3) not in ((:fkc_upd)))", + "Table": "u_tbl3" + }, + { + "InputName": "Parent", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "update /*+ SET_VAR(foreign_key_checks=OFF) */ u_tbl2 set m = 2, col2 = u_tbl2.col1 + 'bar' where u_tbl2.id = 1", + "Table": "u_tbl2" + } + ] + } + ] + }, + "TablesUsed": [ + "unsharded_fk_allow.u_tbl1", + "unsharded_fk_allow.u_tbl2", + "unsharded_fk_allow.u_tbl3" + ] + } }, { - "comment": "update in a table with non-literal value - with cascade fail as the cascade value is not known", + "comment": "update in a table with non-literal value - with cascade", "query": "update u_tbl1 set m = 2, col1 = x + 'bar' where id = 1", - "plan": "VT12001: unsupported: update expression with non-literal values with foreign key constraints" + "plan": { + "QueryType": "UPDATE", + "Original": "update u_tbl1 set m = 2, col1 = x + 'bar' where id = 1", + "Instructions": { + "OperatorType": "FkCascade", + "Inputs": [ + { + "InputName": "Selection", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select col1, col1 <=> u_tbl1.x + 'bar', u_tbl1.x + 'bar' from u_tbl1 where 1 != 1", + "Query": "select col1, col1 <=> u_tbl1.x + 'bar', u_tbl1.x + 'bar' from u_tbl1 where id = 1 for update", + "Table": "u_tbl1" + }, + { + "InputName": "CascadeChild-1", + "OperatorType": "FkCascade", + "BvName": "fkc_vals", + "Cols": [ + 0 + ], + "NonLiteralUpdateInfo": [ + { + "UpdateExprCol": 2, + "UpdateExprBvName": "fkc_upd", + "CompExprCol": 1 + } + ], + "Inputs": [ + { + "InputName": "Selection", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select col2 from u_tbl2 where 1 != 1", + "Query": "select col2 from u_tbl2 where (col2) in ::fkc_vals for update", + "Table": "u_tbl2" + }, + { + "InputName": "CascadeChild-1", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "BvName": "fkc_vals1", + "Cols": [ + 0 + ], + "Query": "update u_tbl3 set col3 = null where (col3) in ::fkc_vals1 and (:fkc_upd is null or (u_tbl3.col3) not in ((:fkc_upd)))", + "Table": "u_tbl3" + }, + { + "InputName": "Parent", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "update /*+ SET_VAR(foreign_key_checks=OFF) */ u_tbl2 set col2 = :fkc_upd where (col2) in ::fkc_vals", + "Table": "u_tbl2" + } + ] + }, + { + "InputName": "CascadeChild-2", + "OperatorType": "FkCascade", + "BvName": "fkc_vals2", + "Cols": [ + 0 + ], + "NonLiteralUpdateInfo": [ + { + "UpdateExprCol": 2, + "UpdateExprBvName": "fkc_upd1", + "CompExprCol": 1 + } + ], + "Inputs": [ + { + "InputName": "Selection", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select col9 from u_tbl9 where 1 != 1", + "Query": "select col9 from u_tbl9 where (col9) in ::fkc_vals2 and (:fkc_upd1 is null or (u_tbl9.col9) not in ((:fkc_upd1))) for update", + "Table": "u_tbl9" + }, + { + "InputName": "CascadeChild-1", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "BvName": "fkc_vals3", + "Cols": [ + 0 + ], + "Query": "update u_tbl8 set col8 = null where (col8) in ::fkc_vals3", + "Table": "u_tbl8" + }, + { + "InputName": "Parent", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "update u_tbl9 set col9 = null where (col9) in ::fkc_vals2 and (:fkc_upd1 is null or (u_tbl9.col9) not in ((:fkc_upd1)))", + "Table": "u_tbl9" + } + ] + }, + { + "InputName": "Parent", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "update /*+ SET_VAR(foreign_key_checks=OFF) */ u_tbl1 set m = 2, col1 = u_tbl1.x + 'bar' where id = 1", + "Table": "u_tbl1" + } + ] + }, + "TablesUsed": [ + "unsharded_fk_allow.u_tbl1", + "unsharded_fk_allow.u_tbl2", + "unsharded_fk_allow.u_tbl3", + "unsharded_fk_allow.u_tbl8", + "unsharded_fk_allow.u_tbl9" + ] + } }, { - "comment": "update in a table with set null, non-literal value on non-foreign key column - allowed", + "comment": "update in a table with set null, non-literal value on non-foreign key column", "query": "update u_tbl2 set m = col1 + 'bar', col2 = 2 where id = 1", "plan": { "QueryType": "UPDATE", @@ -856,7 +1087,7 @@ } }, { - "comment": "update in a table with cascade, non-literal value on non-foreign key column - allowed", + "comment": "update in a table with cascade, non-literal value on non-foreign key column", "query": "update u_tbl1 set m = x + 'bar', col1 = 2 where id = 1", "plan": { "QueryType": "UPDATE", @@ -872,8 +1103,8 @@ "Name": "unsharded_fk_allow", "Sharded": false }, - "FieldQuery": "select col1, col1 from u_tbl1 where 1 != 1", - "Query": "select col1, col1 from u_tbl1 where id = 1 for update", + "FieldQuery": "select col1 from u_tbl1 where 1 != 1", + "Query": "select col1 from u_tbl1 where id = 1 for update", "Table": "u_tbl1" }, { @@ -931,7 +1162,7 @@ "OperatorType": "FkCascade", "BvName": "fkc_vals2", "Cols": [ - 1 + 0 ], "Inputs": [ { @@ -1010,9 +1241,87 @@ "plan": "VT12001: unsupported: foreign keys management at vitess with limit" }, { - "comment": "update with fk on cross-shard with a where condition on non-literal value - disallowed", + "comment": "update with fk on cross-shard with a update condition on non-literal value", "query": "update tbl3 set coly = colx + 10 where coly = 10", - "plan": "VT12001: unsupported: update expression with non-literal values with foreign key constraints" + "plan": { + "QueryType": "UPDATE", + "Original": "update tbl3 set coly = colx + 10 where coly = 10", + "Instructions": { + "OperatorType": "FKVerify", + "Inputs": [ + { + "InputName": "VerifyParent-1", + "OperatorType": "Limit", + "Count": "1", + "Inputs": [ + { + "OperatorType": "Projection", + "Expressions": [ + "1 as 1" + ], + "Inputs": [ + { + "OperatorType": "Filter", + "Predicate": "tbl1.t1col1 is null", + "Inputs": [ + { + "OperatorType": "Join", + "Variant": "LeftJoin", + "JoinColumnIndexes": "R:0,R:0", + "JoinVars": { + "tbl3_colx": 0 + }, + "TableName": "tbl3_tbl1", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "sharded_fk_allow", + "Sharded": true + }, + "FieldQuery": "select tbl3.colx from tbl3 where 1 != 1", + "Query": "select tbl3.colx from tbl3 where tbl3.colx + 10 is not null and tbl3.coly = 10 lock in share mode", + "Table": "tbl3" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "sharded_fk_allow", + "Sharded": true + }, + "FieldQuery": "select tbl1.t1col1 from tbl1 where 1 != 1", + "Query": "select tbl1.t1col1 from tbl1 where tbl1.t1col1 = :tbl3_colx + 10 lock in share mode", + "Table": "tbl1" + } + ] + } + ] + } + ] + } + ] + }, + { + "InputName": "PostVerify", + "OperatorType": "Update", + "Variant": "Scatter", + "Keyspace": { + "Name": "sharded_fk_allow", + "Sharded": true + }, + "TargetTabletType": "PRIMARY", + "Query": "update /*+ SET_VAR(foreign_key_checks=OFF) */ tbl3 set coly = tbl3.colx + 10 where tbl3.coly = 10", + "Table": "tbl3" + } + ] + }, + "TablesUsed": [ + "sharded_fk_allow.tbl1", + "sharded_fk_allow.tbl3" + ] + } }, { "comment": "update with fk on cross-shard with a where condition", @@ -1297,7 +1606,7 @@ "Sharded": false }, "FieldQuery": "select 1 from u_tbl4 left join u_tbl3 on u_tbl3.col3 = :v1 where 1 != 1", - "Query": "select 1 from u_tbl4 left join u_tbl3 on u_tbl3.col3 = :v1 where (u_tbl4.col4) in ::fkc_vals and u_tbl3.col3 is null limit 1 lock in share mode", + "Query": "select 1 from u_tbl4 left join u_tbl3 on u_tbl3.col3 = :v1 where (u_tbl4.col4) in ::fkc_vals and :v1 is not null and u_tbl3.col3 is null limit 1 lock in share mode", "Table": "u_tbl3, u_tbl4" }, { @@ -1653,5 +1962,301 @@ "sharded_fk_allow.tbl5" ] } + }, + { + "comment": "foreign key column updated by using a column which is also getting updated", + "query": "update u_tbl1 set foo = 100, col1 = baz + 1 + foo where bar = 42", + "plan": "VT12001: unsupported: foo column referenced in foreign key column col1 is itself updated" + }, + { + "comment": "foreign key column updated by using a column which is also getting updated - self reference column is allowed", + "query": "update u_tbl7 set foo = 100, col7 = baz + 1 + col7 where bar = 42", + "plan": { + "QueryType": "UPDATE", + "Original": "update u_tbl7 set foo = 100, col7 = baz + 1 + col7 where bar = 42", + "Instructions": { + "OperatorType": "FkCascade", + "Inputs": [ + { + "InputName": "Selection", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select col7, col7 <=> baz + 1 + col7, baz + 1 + col7 from u_tbl7 where 1 != 1", + "Query": "select col7, col7 <=> baz + 1 + col7, baz + 1 + col7 from u_tbl7 where bar = 42 for update", + "Table": "u_tbl7" + }, + { + "InputName": "CascadeChild-1", + "OperatorType": "FKVerify", + "BvName": "fkc_vals", + "Cols": [ + 0 + ], + "NonLiteralUpdateInfo": [ + { + "UpdateExprCol": 2, + "UpdateExprBvName": "fkc_upd", + "CompExprCol": 1 + } + ], + "Inputs": [ + { + "InputName": "VerifyParent-1", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select 1 from u_tbl4 left join u_tbl3 on u_tbl3.col3 = :fkc_upd where 1 != 1", + "Query": "select 1 from u_tbl4 left join u_tbl3 on u_tbl3.col3 = :fkc_upd where (u_tbl4.col4) in ::fkc_vals and :fkc_upd is not null and u_tbl3.col3 is null limit 1 lock in share mode", + "Table": "u_tbl3, u_tbl4" + }, + { + "InputName": "VerifyChild-2", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select 1 from u_tbl4, u_tbl9 where 1 != 1", + "Query": "select 1 from u_tbl4, u_tbl9 where (u_tbl4.col4) in ::fkc_vals and (:fkc_upd is null or (u_tbl9.col9) not in ((:fkc_upd))) and u_tbl4.col4 = u_tbl9.col9 limit 1 lock in share mode", + "Table": "u_tbl4, u_tbl9" + }, + { + "InputName": "PostVerify", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "update /*+ SET_VAR(foreign_key_checks=OFF) */ u_tbl4 set col4 = :fkc_upd where (u_tbl4.col4) in ::fkc_vals", + "Table": "u_tbl4" + } + ] + }, + { + "InputName": "Parent", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "update /*+ SET_VAR(foreign_key_checks=OFF) */ u_tbl7 set foo = 100, col7 = baz + 1 + col7 where bar = 42", + "Table": "u_tbl7" + } + ] + }, + "TablesUsed": [ + "unsharded_fk_allow.u_tbl3", + "unsharded_fk_allow.u_tbl4", + "unsharded_fk_allow.u_tbl7", + "unsharded_fk_allow.u_tbl9" + ] + } + }, + { + "comment": "Single column updated in a multi-col table", + "query": "update u_multicol_tbl1 set cola = cola + 3 where id = 3", + "plan": { + "QueryType": "UPDATE", + "Original": "update u_multicol_tbl1 set cola = cola + 3 where id = 3", + "Instructions": { + "OperatorType": "FkCascade", + "Inputs": [ + { + "InputName": "Selection", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select cola, colb, cola <=> u_multicol_tbl1.cola + 3, u_multicol_tbl1.cola + 3 from u_multicol_tbl1 where 1 != 1", + "Query": "select cola, colb, cola <=> u_multicol_tbl1.cola + 3, u_multicol_tbl1.cola + 3 from u_multicol_tbl1 where id = 3 for update", + "Table": "u_multicol_tbl1" + }, + { + "InputName": "CascadeChild-1", + "OperatorType": "FkCascade", + "BvName": "fkc_vals", + "Cols": [ + 0, + 1 + ], + "NonLiteralUpdateInfo": [ + { + "UpdateExprCol": 3, + "UpdateExprBvName": "fkc_upd", + "CompExprCol": 2 + } + ], + "Inputs": [ + { + "InputName": "Selection", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select cola, colb from u_multicol_tbl2 where 1 != 1", + "Query": "select cola, colb from u_multicol_tbl2 where (cola, colb) in ::fkc_vals and (:fkc_upd is null or (u_multicol_tbl2.cola) not in ((:fkc_upd))) for update", + "Table": "u_multicol_tbl2" + }, + { + "InputName": "CascadeChild-1", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "BvName": "fkc_vals1", + "Cols": [ + 0, + 1 + ], + "Query": "update /*+ SET_VAR(foreign_key_checks=OFF) */ u_multicol_tbl3 set cola = null, colb = null where (cola, colb) in ::fkc_vals1", + "Table": "u_multicol_tbl3" + }, + { + "InputName": "Parent", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "update u_multicol_tbl2 set cola = null, colb = null where (cola, colb) in ::fkc_vals and (:fkc_upd is null or (u_multicol_tbl2.cola) not in ((:fkc_upd)))", + "Table": "u_multicol_tbl2" + } + ] + }, + { + "InputName": "Parent", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "update /*+ SET_VAR(foreign_key_checks=OFF) */ u_multicol_tbl1 set cola = u_multicol_tbl1.cola + 3 where id = 3", + "Table": "u_multicol_tbl1" + } + ] + }, + "TablesUsed": [ + "unsharded_fk_allow.u_multicol_tbl1", + "unsharded_fk_allow.u_multicol_tbl2", + "unsharded_fk_allow.u_multicol_tbl3" + ] + } + }, + { + "comment": "updating multiple columns of a fk constraint such that one uses the other", + "query": "update u_multicol_tbl3 set cola = id, colb = 5 * (cola + (1 - (cola))) where id = 2", + "plan": "VT12001: unsupported: cola column referenced in foreign key column colb is itself updated" + }, + { + "comment": "multicol foreign key updates with one literal and one non-literal update", + "query": "update u_multicol_tbl2 set cola = 2, colb = colc - (2) where id = 7", + "plan": { + "QueryType": "UPDATE", + "Original": "update u_multicol_tbl2 set cola = 2, colb = colc - (2) where id = 7", + "Instructions": { + "OperatorType": "FKVerify", + "Inputs": [ + { + "InputName": "VerifyParent-1", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select 1 from u_multicol_tbl2 left join u_multicol_tbl1 on u_multicol_tbl1.cola = 2 and u_multicol_tbl1.colb = u_multicol_tbl2.colc - 2 where 1 != 1", + "Query": "select 1 from u_multicol_tbl2 left join u_multicol_tbl1 on u_multicol_tbl1.cola = 2 and u_multicol_tbl1.colb = u_multicol_tbl2.colc - 2 where u_multicol_tbl2.colc - 2 is not null and u_multicol_tbl2.id = 7 and u_multicol_tbl1.cola is null and u_multicol_tbl1.colb is null limit 1 lock in share mode", + "Table": "u_multicol_tbl1, u_multicol_tbl2" + }, + { + "InputName": "PostVerify", + "OperatorType": "FkCascade", + "Inputs": [ + { + "InputName": "Selection", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select cola, colb, cola <=> 2, 2, colb <=> u_multicol_tbl2.colc - 2, u_multicol_tbl2.colc - 2 from u_multicol_tbl2 where 1 != 1", + "Query": "select cola, colb, cola <=> 2, 2, colb <=> u_multicol_tbl2.colc - 2, u_multicol_tbl2.colc - 2 from u_multicol_tbl2 where u_multicol_tbl2.id = 7 for update", + "Table": "u_multicol_tbl2" + }, + { + "InputName": "CascadeChild-1", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "BvName": "fkc_vals", + "Cols": [ + 0, + 1 + ], + "NonLiteralUpdateInfo": [ + { + "UpdateExprCol": 3, + "UpdateExprBvName": "fkc_upd", + "CompExprCol": 2 + }, + { + "UpdateExprCol": 5, + "UpdateExprBvName": "fkc_upd1", + "CompExprCol": 4 + } + ], + "Query": "update /*+ SET_VAR(foreign_key_checks=OFF) */ u_multicol_tbl3 set cola = :fkc_upd, colb = :fkc_upd1 where (cola, colb) in ::fkc_vals", + "Table": "u_multicol_tbl3" + }, + { + "InputName": "Parent", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "update /*+ SET_VAR(foreign_key_checks=OFF) */ u_multicol_tbl2 set cola = 2, colb = u_multicol_tbl2.colc - 2 where u_multicol_tbl2.id = 7", + "Table": "u_multicol_tbl2" + } + ] + } + ] + }, + "TablesUsed": [ + "unsharded_fk_allow.u_multicol_tbl1", + "unsharded_fk_allow.u_multicol_tbl2", + "unsharded_fk_allow.u_multicol_tbl3" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/postprocess_cases.json b/go/vt/vtgate/planbuilder/testdata/postprocess_cases.json index cad8e9be1eb..9373ae35a29 100644 --- a/go/vt/vtgate/planbuilder/testdata/postprocess_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/postprocess_cases.json @@ -88,7 +88,7 @@ "Sharded": true }, "FieldQuery": "select `user`.col1 as a, `user`.col2 from `user` where 1 != 1", - "Query": "select `user`.col1 as a, `user`.col2 from `user` where `user`.col1 = 1 and `user`.col1 = `user`.col2 and 1 = 1", + "Query": "select `user`.col1 as a, `user`.col2 from `user` where `user`.col1 = 1 and `user`.col1 = `user`.col2", "Table": "`user`" }, { @@ -99,7 +99,7 @@ "Sharded": true }, "FieldQuery": "select user_extra.col3 from user_extra where 1 != 1", - "Query": "select user_extra.col3 from user_extra where user_extra.col3 = 1 and 1 = 1", + "Query": "select user_extra.col3 from user_extra where user_extra.col3 = 1", "Table": "user_extra" } ] diff --git a/go/vt/vtgate/planbuilder/update.go b/go/vt/vtgate/planbuilder/update.go index eced4251ab3..dfb841a4d11 100644 --- a/go/vt/vtgate/planbuilder/update.go +++ b/go/vt/vtgate/planbuilder/update.go @@ -46,6 +46,13 @@ func gen4UpdateStmtPlanner( return nil, err } + // If there are non-literal foreign key updates, we have to run the query with foreign key checks off. + if ctx.SemTable.HasNonLiteralForeignKeyUpdate(updStmt.Exprs) { + // Since we are running the query with foreign key checks off, we have to verify all the foreign keys validity on vtgate. + ctx.VerifyAllFKs = true + updStmt.Comments = updStmt.Comments.Prepend("/*+ SET_VAR(foreign_key_checks=OFF) */").Parsed() + } + // Remove all the foreign keys that don't require any handling. err = ctx.SemTable.RemoveNonRequiredForeignKeys(ctx.VerifyAllFKs, vindexes.UpdateAction) if err != nil { diff --git a/go/vt/vtgate/semantics/analyzer.go b/go/vt/vtgate/semantics/analyzer.go index e524b1a33cf..96c604d76a1 100644 --- a/go/vt/vtgate/semantics/analyzer.go +++ b/go/vt/vtgate/semantics/analyzer.go @@ -108,7 +108,7 @@ func (a *analyzer) newSemTable(statement sqlparser.Statement, coll collations.ID columns[union] = info.exprs } - childFks, parentFks, err := a.getInvolvedForeignKeys(statement) + childFks, parentFks, childFkToUpdExprs, err := a.getInvolvedForeignKeys(statement) if err != nil { return nil, err } @@ -130,6 +130,7 @@ func (a *analyzer) newSemTable(statement sqlparser.Statement, coll collations.ID QuerySignature: a.sig, childForeignKeysInvolved: childFks, parentForeignKeysInvolved: parentFks, + childFkToUpdExprs: childFkToUpdExprs, }, nil } @@ -317,14 +318,14 @@ func (a *analyzer) noteQuerySignature(node sqlparser.SQLNode) { } // getInvolvedForeignKeys gets the foreign keys that might require taking care off when executing the given statement. -func (a *analyzer) getInvolvedForeignKeys(statement sqlparser.Statement) (map[TableSet][]vindexes.ChildFKInfo, map[TableSet][]vindexes.ParentFKInfo, error) { +func (a *analyzer) getInvolvedForeignKeys(statement sqlparser.Statement) (map[TableSet][]vindexes.ChildFKInfo, map[TableSet][]vindexes.ParentFKInfo, map[string]sqlparser.UpdateExprs, error) { // There are only the DML statements that require any foreign keys handling. switch stmt := statement.(type) { case *sqlparser.Delete: // For DELETE statements, none of the parent foreign keys require handling. // So we collect all the child foreign keys. allChildFks, _, err := a.getAllManagedForeignKeys() - return allChildFks, nil, err + return allChildFks, nil, nil, err case *sqlparser.Insert: // For INSERT statements, we have 3 different cases: // 1. REPLACE statement: REPLACE statements are essentially DELETEs and INSERTs rolled into one. @@ -334,35 +335,35 @@ func (a *analyzer) getInvolvedForeignKeys(statement sqlparser.Statement) (map[Ta // 3. INSERT with ON DUPLICATE KEY UPDATE: This might trigger an update on the columns specified in the ON DUPLICATE KEY UPDATE clause. allChildFks, allParentFKs, err := a.getAllManagedForeignKeys() if err != nil { - return nil, nil, err + return nil, nil, nil, err } if stmt.Action == sqlparser.ReplaceAct { - return allChildFks, allParentFKs, nil + return allChildFks, allParentFKs, nil, nil } if len(stmt.OnDup) == 0 { - return nil, allParentFKs, nil + return nil, allParentFKs, nil, nil } // If only a certain set of columns are being updated, then there might be some child foreign keys that don't need any consideration since their columns aren't being updated. // So, we filter these child foreign keys out. We can't filter any parent foreign keys because the statement will INSERT a row too, which requires validating all the parent foreign keys. - updatedChildFks, _ := a.filterForeignKeysUsingUpdateExpressions(allChildFks, nil, sqlparser.UpdateExprs(stmt.OnDup)) - return updatedChildFks, allParentFKs, nil + updatedChildFks, _, childFkToUpdExprs := a.filterForeignKeysUsingUpdateExpressions(allChildFks, nil, sqlparser.UpdateExprs(stmt.OnDup)) + return updatedChildFks, allParentFKs, childFkToUpdExprs, nil case *sqlparser.Update: // For UPDATE queries we get all the parent and child foreign keys, but we can filter some of them out if the columns that they consist off aren't being updated or are set to NULLs. allChildFks, allParentFks, err := a.getAllManagedForeignKeys() if err != nil { - return nil, nil, err + return nil, nil, nil, err } - childFks, parentFks := a.filterForeignKeysUsingUpdateExpressions(allChildFks, allParentFks, stmt.Exprs) - return childFks, parentFks, nil + childFks, parentFks, childFkToUpdExprs := a.filterForeignKeysUsingUpdateExpressions(allChildFks, allParentFks, stmt.Exprs) + return childFks, parentFks, childFkToUpdExprs, nil default: - return nil, nil, nil + return nil, nil, nil, nil } } // filterForeignKeysUsingUpdateExpressions filters the child and parent foreign key constraints that don't require any validations/cascades given the updated expressions. -func (a *analyzer) filterForeignKeysUsingUpdateExpressions(allChildFks map[TableSet][]vindexes.ChildFKInfo, allParentFks map[TableSet][]vindexes.ParentFKInfo, updExprs sqlparser.UpdateExprs) (map[TableSet][]vindexes.ChildFKInfo, map[TableSet][]vindexes.ParentFKInfo) { +func (a *analyzer) filterForeignKeysUsingUpdateExpressions(allChildFks map[TableSet][]vindexes.ChildFKInfo, allParentFks map[TableSet][]vindexes.ParentFKInfo, updExprs sqlparser.UpdateExprs) (map[TableSet][]vindexes.ChildFKInfo, map[TableSet][]vindexes.ParentFKInfo, map[string]sqlparser.UpdateExprs) { if len(allChildFks) == 0 && len(allParentFks) == 0 { - return nil, nil + return nil, nil, nil } pFksRequired := make(map[TableSet][]bool, len(allParentFks)) @@ -377,6 +378,9 @@ func (a *analyzer) filterForeignKeysUsingUpdateExpressions(allChildFks map[Table // updExprToTableSet stores the tables that the updated expressions are from. updExprToTableSet := make(map[*sqlparser.ColName]TableSet) + // childFKToUpdExprs stores child foreign key to update expressions mapping. + childFKToUpdExprs := map[string]sqlparser.UpdateExprs{} + // Go over all the update expressions for _, updateExpr := range updExprs { deps := a.binder.direct.dependencies(updateExpr.Name) @@ -393,6 +397,10 @@ func (a *analyzer) filterForeignKeysUsingUpdateExpressions(allChildFks map[Table for idx, childFk := range childFks { if childFk.ParentColumns.FindColumn(updateExpr.Name.Name) >= 0 { cFksRequired[deps][idx] = true + tbl, _ := a.tables.tableInfoFor(deps) + ue := childFKToUpdExprs[childFk.String(tbl.GetVindexTable())] + ue = append(ue, updateExpr) + childFKToUpdExprs[childFk.String(tbl.GetVindexTable())] = ue } } // If we are setting a column to NULL, then we don't need to verify the existance of an @@ -434,7 +442,6 @@ func (a *analyzer) filterForeignKeysUsingUpdateExpressions(allChildFks map[Table } } pFksNeedsHandling[ts] = pFKNeeded - } for ts, childFks := range allChildFks { var cFKNeeded []vindexes.ChildFKInfo @@ -444,9 +451,8 @@ func (a *analyzer) filterForeignKeysUsingUpdateExpressions(allChildFks map[Table } } cFksNeedsHandling[ts] = cFKNeeded - } - return cFksNeedsHandling, pFksNeedsHandling + return cFksNeedsHandling, pFksNeedsHandling, childFKToUpdExprs } // getAllManagedForeignKeys gets all the foreign keys for the query we are analyzing that Vitess is reposible for managing. diff --git a/go/vt/vtgate/semantics/analyzer_fk_test.go b/go/vt/vtgate/semantics/analyzer_fk_test.go new file mode 100644 index 00000000000..5ba6041ef5c --- /dev/null +++ b/go/vt/vtgate/semantics/analyzer_fk_test.go @@ -0,0 +1,582 @@ +/* +Copyright 2023 The Vitess Authors. + +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 semantics + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + vschemapb "vitess.io/vitess/go/vt/proto/vschema" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vtgate/vindexes" +) + +var parentTbl = &vindexes.Table{ + Name: sqlparser.NewIdentifierCS("parentt"), + Keyspace: &vindexes.Keyspace{ + Name: "ks", + }, +} + +var tbl = map[string]TableInfo{ + "t0": &RealTable{ + Table: &vindexes.Table{ + Name: sqlparser.NewIdentifierCS("t0"), + Keyspace: &vindexes.Keyspace{Name: "ks"}, + ChildForeignKeys: []vindexes.ChildFKInfo{ + ckInfo(parentTbl, []string{"col"}, []string{"col"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"col1", "col2"}, []string{"ccol1", "ccol2"}, sqlparser.SetNull), + }, + ParentForeignKeys: []vindexes.ParentFKInfo{ + pkInfo(parentTbl, []string{"colb"}, []string{"colb"}), + pkInfo(parentTbl, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), + }, + }, + }, + "t1": &RealTable{ + Table: &vindexes.Table{ + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: &vindexes.Keyspace{Name: "ks_unmanaged", Sharded: true}, + ChildForeignKeys: []vindexes.ChildFKInfo{ + ckInfo(parentTbl, []string{"cola"}, []string{"cola"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"cola1", "cola2"}, []string{"ccola1", "ccola2"}, sqlparser.SetNull), + }, + }, + }, + "t2": &RealTable{ + Table: &vindexes.Table{ + Name: sqlparser.NewIdentifierCS("t2"), + Keyspace: &vindexes.Keyspace{Name: "ks"}, + }, + }, + "t3": &RealTable{ + Table: &vindexes.Table{ + Name: sqlparser.NewIdentifierCS("t3"), + Keyspace: &vindexes.Keyspace{Name: "undefined_ks", Sharded: true}, + }, + }, + "t4": &RealTable{ + Table: &vindexes.Table{ + Name: sqlparser.NewIdentifierCS("t4"), + Keyspace: &vindexes.Keyspace{Name: "ks"}, + ChildForeignKeys: []vindexes.ChildFKInfo{ + ckInfo(parentTbl, []string{"colb"}, []string{"child_colb"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}, sqlparser.SetNull), + ckInfo(parentTbl, []string{"colx", "coly"}, []string{"child_colx", "child_coly"}, sqlparser.Cascade), + ckInfo(parentTbl, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), + }, + ParentForeignKeys: []vindexes.ParentFKInfo{ + pkInfo(parentTbl, []string{"pcola", "pcolx"}, []string{"cola", "colx"}), + pkInfo(parentTbl, []string{"pcolc"}, []string{"colc"}), + pkInfo(parentTbl, []string{"pcolb", "pcola"}, []string{"colb", "cola"}), + pkInfo(parentTbl, []string{"pcolb"}, []string{"colb"}), + pkInfo(parentTbl, []string{"pcola"}, []string{"cola"}), + pkInfo(parentTbl, []string{"pcolb", "pcolx"}, []string{"colb", "colx"}), + }, + }, + }, + "t5": &RealTable{ + Table: &vindexes.Table{ + Name: sqlparser.NewIdentifierCS("t5"), + Keyspace: &vindexes.Keyspace{Name: "ks"}, + ChildForeignKeys: []vindexes.ChildFKInfo{ + ckInfo(parentTbl, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"colc", "colx"}, []string{"child_colc", "child_colx"}, sqlparser.SetNull), + ckInfo(parentTbl, []string{"colx", "coly"}, []string{"child_colx", "child_coly"}, sqlparser.Cascade), + }, + ParentForeignKeys: []vindexes.ParentFKInfo{ + pkInfo(parentTbl, []string{"pcolc", "pcolx"}, []string{"colc", "colx"}), + pkInfo(parentTbl, []string{"pcola"}, []string{"cola"}), + pkInfo(parentTbl, []string{"pcold", "pcolc"}, []string{"cold", "colc"}), + pkInfo(parentTbl, []string{"pcold"}, []string{"cold"}), + pkInfo(parentTbl, []string{"pcold", "pcolx"}, []string{"cold", "colx"}), + }, + }, + }, + "t6": &RealTable{ + Table: &vindexes.Table{ + Name: sqlparser.NewIdentifierCS("t6"), + Keyspace: &vindexes.Keyspace{Name: "ks"}, + ChildForeignKeys: []vindexes.ChildFKInfo{ + ckInfo(parentTbl, []string{"col"}, []string{"col"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"col1", "col2"}, []string{"ccol1", "ccol2"}, sqlparser.SetNull), + ckInfo(parentTbl, []string{"colb"}, []string{"child_colb"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}, sqlparser.SetNull), + ckInfo(parentTbl, []string{"colx", "coly"}, []string{"child_colx", "child_coly"}, sqlparser.Cascade), + ckInfo(parentTbl, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), + }, + ParentForeignKeys: []vindexes.ParentFKInfo{ + pkInfo(parentTbl, []string{"colb"}, []string{"colb"}), + pkInfo(parentTbl, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), + }, + }, + }, +} + +// TestGetAllManagedForeignKeys tests the functionality of getAllManagedForeignKeys. +func TestGetAllManagedForeignKeys(t *testing.T) { + tests := []struct { + name string + analyzer *analyzer + childFkWanted map[TableSet][]vindexes.ChildFKInfo + parentFkWanted map[TableSet][]vindexes.ParentFKInfo + expectedErr string + }{ + { + name: "Collect all foreign key constraints", + analyzer: &analyzer{ + tables: &tableCollector{ + Tables: []TableInfo{ + tbl["t0"], + tbl["t1"], + &DerivedTable{}, + }, + si: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + "ks_unmanaged": vschemapb.Keyspace_unmanaged, + }, + }, + }, + }, + childFkWanted: map[TableSet][]vindexes.ChildFKInfo{ + SingleTableSet(0): { + ckInfo(parentTbl, []string{"col"}, []string{"col"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"col1", "col2"}, []string{"ccol1", "ccol2"}, sqlparser.SetNull), + }, + }, + parentFkWanted: map[TableSet][]vindexes.ParentFKInfo{ + SingleTableSet(0): { + pkInfo(parentTbl, []string{"colb"}, []string{"colb"}), + pkInfo(parentTbl, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), + }, + }, + }, + { + name: "keyspace not found in schema information", + analyzer: &analyzer{ + tables: &tableCollector{ + Tables: []TableInfo{ + tbl["t2"], + tbl["t3"], + }, + si: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + }, + }, + }, + }, + expectedErr: "undefined_ks keyspace not found", + }, + { + name: "Cyclic fk constraints error", + analyzer: &analyzer{ + tables: &tableCollector{ + Tables: []TableInfo{ + tbl["t0"], tbl["t1"], + &DerivedTable{}, + }, + si: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + "ks_unmanaged": vschemapb.Keyspace_unmanaged, + }, + KsError: map[string]error{ + "ks": fmt.Errorf("VT09019: ks has cyclic foreign keys"), + }, + }, + }, + }, + expectedErr: "VT09019: ks has cyclic foreign keys", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + childFk, parentFk, err := tt.analyzer.getAllManagedForeignKeys() + if tt.expectedErr != "" { + require.EqualError(t, err, tt.expectedErr) + return + } + require.EqualValues(t, tt.childFkWanted, childFk) + require.EqualValues(t, tt.parentFkWanted, parentFk) + }) + } +} + +// TestFilterForeignKeysUsingUpdateExpressions tests the functionality of filterForeignKeysUsingUpdateExpressions. +func TestFilterForeignKeysUsingUpdateExpressions(t *testing.T) { + cola := sqlparser.NewColName("cola") + colb := sqlparser.NewColName("colb") + colc := sqlparser.NewColName("colc") + cold := sqlparser.NewColName("cold") + a := &analyzer{ + binder: &binder{ + direct: map[sqlparser.Expr]TableSet{ + cola: SingleTableSet(0), + colb: SingleTableSet(0), + colc: SingleTableSet(1), + cold: SingleTableSet(1), + }, + }, + tables: &tableCollector{ + Tables: []TableInfo{ + tbl["t4"], + tbl["t5"], + }, + si: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + }, + }, + }, + } + updateExprs := sqlparser.UpdateExprs{ + &sqlparser.UpdateExpr{Name: cola, Expr: sqlparser.NewIntLiteral("1")}, + &sqlparser.UpdateExpr{Name: colb, Expr: &sqlparser.NullVal{}}, + &sqlparser.UpdateExpr{Name: colc, Expr: sqlparser.NewIntLiteral("1")}, + &sqlparser.UpdateExpr{Name: cold, Expr: &sqlparser.NullVal{}}, + } + tests := []struct { + name string + analyzer *analyzer + allChildFks map[TableSet][]vindexes.ChildFKInfo + allParentFks map[TableSet][]vindexes.ParentFKInfo + updExprs sqlparser.UpdateExprs + childFksWanted map[TableSet][]vindexes.ChildFKInfo + parentFksWanted map[TableSet][]vindexes.ParentFKInfo + }{ + { + name: "Child Foreign Keys Filtering", + analyzer: a, + allParentFks: nil, + allChildFks: map[TableSet][]vindexes.ChildFKInfo{ + SingleTableSet(0): tbl["t4"].(*RealTable).Table.ChildForeignKeys, + SingleTableSet(1): tbl["t5"].(*RealTable).Table.ChildForeignKeys, + }, + updExprs: updateExprs, + childFksWanted: map[TableSet][]vindexes.ChildFKInfo{ + SingleTableSet(0): { + ckInfo(parentTbl, []string{"colb"}, []string{"child_colb"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}, sqlparser.SetNull), + }, + SingleTableSet(1): { + ckInfo(parentTbl, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"colc", "colx"}, []string{"child_colc", "child_colx"}, sqlparser.SetNull), + }, + }, + parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{}, + }, { + name: "Parent Foreign Keys Filtering", + analyzer: a, + allParentFks: map[TableSet][]vindexes.ParentFKInfo{ + SingleTableSet(0): tbl["t4"].(*RealTable).Table.ParentForeignKeys, + SingleTableSet(1): tbl["t5"].(*RealTable).Table.ParentForeignKeys, + }, + allChildFks: nil, + updExprs: updateExprs, + childFksWanted: map[TableSet][]vindexes.ChildFKInfo{}, + parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{ + SingleTableSet(0): { + pkInfo(parentTbl, []string{"pcola", "pcolx"}, []string{"cola", "colx"}), + pkInfo(parentTbl, []string{"pcola"}, []string{"cola"}), + }, + SingleTableSet(1): { + pkInfo(parentTbl, []string{"pcolc", "pcolx"}, []string{"colc", "colx"}), + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + childFks, parentFks, _ := tt.analyzer.filterForeignKeysUsingUpdateExpressions(tt.allChildFks, tt.allParentFks, tt.updExprs) + require.EqualValues(t, tt.childFksWanted, childFks) + require.EqualValues(t, tt.parentFksWanted, parentFks) + }) + } +} + +// TestGetInvolvedForeignKeys tests the functionality of getInvolvedForeignKeys. +func TestGetInvolvedForeignKeys(t *testing.T) { + cola := sqlparser.NewColName("cola") + colb := sqlparser.NewColName("colb") + colc := sqlparser.NewColName("colc") + cold := sqlparser.NewColName("cold") + tests := []struct { + name string + stmt sqlparser.Statement + analyzer *analyzer + childFksWanted map[TableSet][]vindexes.ChildFKInfo + parentFksWanted map[TableSet][]vindexes.ParentFKInfo + childFkUpdateExprsWanted map[string]sqlparser.UpdateExprs + expectedErr string + }{ + { + name: "Delete Query", + stmt: &sqlparser.Delete{}, + analyzer: &analyzer{ + tables: &tableCollector{ + Tables: []TableInfo{ + tbl["t0"], + tbl["t1"], + }, + si: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + "ks_unmanaged": vschemapb.Keyspace_unmanaged, + }, + }, + }, + }, + childFksWanted: map[TableSet][]vindexes.ChildFKInfo{ + SingleTableSet(0): { + ckInfo(parentTbl, []string{"col"}, []string{"col"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"col1", "col2"}, []string{"ccol1", "ccol2"}, sqlparser.SetNull), + }, + }, + }, + { + name: "Update statement", + stmt: &sqlparser.Update{ + Exprs: sqlparser.UpdateExprs{ + &sqlparser.UpdateExpr{Name: cola, Expr: sqlparser.NewIntLiteral("1")}, + &sqlparser.UpdateExpr{Name: colb, Expr: &sqlparser.NullVal{}}, + &sqlparser.UpdateExpr{Name: colc, Expr: sqlparser.NewIntLiteral("1")}, + &sqlparser.UpdateExpr{Name: cold, Expr: &sqlparser.NullVal{}}, + }, + }, + analyzer: &analyzer{ + binder: &binder{ + direct: map[sqlparser.Expr]TableSet{ + cola: SingleTableSet(0), + colb: SingleTableSet(0), + colc: SingleTableSet(1), + cold: SingleTableSet(1), + }, + }, + tables: &tableCollector{ + Tables: []TableInfo{ + tbl["t4"], + tbl["t5"], + }, + si: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + }, + }, + }, + }, + childFksWanted: map[TableSet][]vindexes.ChildFKInfo{ + SingleTableSet(0): { + ckInfo(parentTbl, []string{"colb"}, []string{"child_colb"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}, sqlparser.SetNull), + }, + SingleTableSet(1): { + ckInfo(parentTbl, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"colc", "colx"}, []string{"child_colc", "child_colx"}, sqlparser.SetNull), + }, + }, + parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{ + SingleTableSet(0): { + pkInfo(parentTbl, []string{"pcola", "pcolx"}, []string{"cola", "colx"}), + pkInfo(parentTbl, []string{"pcola"}, []string{"cola"}), + }, + SingleTableSet(1): { + pkInfo(parentTbl, []string{"pcolc", "pcolx"}, []string{"colc", "colx"}), + }, + }, + childFkUpdateExprsWanted: map[string]sqlparser.UpdateExprs{ + "ks.parentt|child_cola|child_colx||ks.t4|cola|colx": {&sqlparser.UpdateExpr{Name: cola, Expr: sqlparser.NewIntLiteral("1")}}, + "ks.parentt|child_colb||ks.t4|colb": {&sqlparser.UpdateExpr{Name: colb, Expr: &sqlparser.NullVal{}}}, + "ks.parentt|child_colc|child_colx||ks.t5|colc|colx": {&sqlparser.UpdateExpr{Name: colc, Expr: sqlparser.NewIntLiteral("1")}}, + "ks.parentt|child_cold||ks.t5|cold": {&sqlparser.UpdateExpr{Name: cold, Expr: &sqlparser.NullVal{}}}, + }, + }, + { + name: "Replace Query", + stmt: &sqlparser.Insert{ + Action: sqlparser.ReplaceAct, + }, + analyzer: &analyzer{ + tables: &tableCollector{ + Tables: []TableInfo{ + tbl["t0"], + tbl["t1"], + }, + si: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + "ks_unmanaged": vschemapb.Keyspace_unmanaged, + }, + }, + }, + }, + childFksWanted: map[TableSet][]vindexes.ChildFKInfo{ + SingleTableSet(0): { + ckInfo(parentTbl, []string{"col"}, []string{"col"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"col1", "col2"}, []string{"ccol1", "ccol2"}, sqlparser.SetNull), + }, + }, + parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{ + SingleTableSet(0): { + pkInfo(parentTbl, []string{"colb"}, []string{"colb"}), + pkInfo(parentTbl, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), + }, + }, + }, + { + name: "Insert Query", + stmt: &sqlparser.Insert{ + Action: sqlparser.InsertAct, + }, + analyzer: &analyzer{ + tables: &tableCollector{ + Tables: []TableInfo{ + tbl["t0"], + tbl["t1"], + }, + si: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + "ks_unmanaged": vschemapb.Keyspace_unmanaged, + }, + }, + }, + }, + childFksWanted: nil, + parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{ + SingleTableSet(0): { + pkInfo(parentTbl, []string{"colb"}, []string{"colb"}), + pkInfo(parentTbl, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), + }, + }, + }, + { + name: "Insert Query with On Duplicate", + stmt: &sqlparser.Insert{ + Action: sqlparser.InsertAct, + OnDup: sqlparser.OnDup{ + &sqlparser.UpdateExpr{Name: cola, Expr: sqlparser.NewIntLiteral("1")}, + &sqlparser.UpdateExpr{Name: colb, Expr: &sqlparser.NullVal{}}, + }, + }, + analyzer: &analyzer{ + binder: &binder{ + direct: map[sqlparser.Expr]TableSet{ + cola: SingleTableSet(0), + colb: SingleTableSet(0), + }, + }, + tables: &tableCollector{ + Tables: []TableInfo{ + tbl["t6"], + tbl["t1"], + }, + si: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + "ks_unmanaged": vschemapb.Keyspace_unmanaged, + }, + }, + }, + }, + childFksWanted: map[TableSet][]vindexes.ChildFKInfo{ + SingleTableSet(0): { + ckInfo(parentTbl, []string{"colb"}, []string{"child_colb"}, sqlparser.Restrict), + ckInfo(parentTbl, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}, sqlparser.SetNull), + }, + }, + parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{ + SingleTableSet(0): { + pkInfo(parentTbl, []string{"colb"}, []string{"colb"}), + pkInfo(parentTbl, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), + }, + }, + childFkUpdateExprsWanted: map[string]sqlparser.UpdateExprs{ + "ks.parentt|child_cola|child_colx||ks.t6|cola|colx": {&sqlparser.UpdateExpr{Name: cola, Expr: sqlparser.NewIntLiteral("1")}}, + "ks.parentt|child_colb||ks.t6|colb": {&sqlparser.UpdateExpr{Name: colb, Expr: &sqlparser.NullVal{}}}, + }, + }, + { + name: "Insert error", + stmt: &sqlparser.Insert{}, + analyzer: &analyzer{ + tables: &tableCollector{ + Tables: []TableInfo{ + tbl["t2"], + tbl["t3"], + }, + si: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + }, + }, + }, + }, + expectedErr: "undefined_ks keyspace not found", + }, + { + name: "Update error", + stmt: &sqlparser.Update{}, + analyzer: &analyzer{ + tables: &tableCollector{ + Tables: []TableInfo{ + tbl["t2"], + tbl["t3"], + }, + si: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + "ks": vschemapb.Keyspace_managed, + }, + }, + }, + }, + expectedErr: "undefined_ks keyspace not found", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + childFks, parentFks, childFkUpdateExprs, err := tt.analyzer.getInvolvedForeignKeys(tt.stmt) + if tt.expectedErr != "" { + require.EqualError(t, err, tt.expectedErr) + return + } + require.EqualValues(t, tt.childFksWanted, childFks) + require.EqualValues(t, tt.childFkUpdateExprsWanted, childFkUpdateExprs) + require.EqualValues(t, tt.parentFksWanted, parentFks) + }) + } +} + +func ckInfo(cTable *vindexes.Table, pCols []string, cCols []string, refAction sqlparser.ReferenceAction) vindexes.ChildFKInfo { + return vindexes.ChildFKInfo{ + Table: cTable, + ParentColumns: sqlparser.MakeColumns(pCols...), + ChildColumns: sqlparser.MakeColumns(cCols...), + OnDelete: refAction, + } +} + +func pkInfo(parentTable *vindexes.Table, pCols []string, cCols []string) vindexes.ParentFKInfo { + return vindexes.ParentFKInfo{ + Table: parentTable, + ParentColumns: sqlparser.MakeColumns(pCols...), + ChildColumns: sqlparser.MakeColumns(cCols...), + } +} diff --git a/go/vt/vtgate/semantics/analyzer_test.go b/go/vt/vtgate/semantics/analyzer_test.go index c8251dd36c3..cb19d5deafd 100644 --- a/go/vt/vtgate/semantics/analyzer_test.go +++ b/go/vt/vtgate/semantics/analyzer_test.go @@ -17,7 +17,6 @@ limitations under the License. package semantics import ( - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -25,7 +24,6 @@ import ( "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" - vschemapb "vitess.io/vitess/go/vt/proto/vschema" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtgate/vindexes" ) @@ -1627,555 +1625,3 @@ func fakeSchemaInfo() *FakeSI { } return si } - -var tbl = map[string]TableInfo{ - "t0": &RealTable{ - Table: &vindexes.Table{ - Keyspace: &vindexes.Keyspace{Name: "ks"}, - ChildForeignKeys: []vindexes.ChildFKInfo{ - ckInfo(nil, []string{"col"}, []string{"col"}, sqlparser.Restrict), - ckInfo(nil, []string{"col1", "col2"}, []string{"ccol1", "ccol2"}, sqlparser.SetNull), - }, - ParentForeignKeys: []vindexes.ParentFKInfo{ - pkInfo(nil, []string{"colb"}, []string{"colb"}), - pkInfo(nil, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), - }, - }, - }, - "t1": &RealTable{ - Table: &vindexes.Table{ - Keyspace: &vindexes.Keyspace{Name: "ks_unmanaged", Sharded: true}, - ChildForeignKeys: []vindexes.ChildFKInfo{ - ckInfo(nil, []string{"cola"}, []string{"cola"}, sqlparser.Restrict), - ckInfo(nil, []string{"cola1", "cola2"}, []string{"ccola1", "ccola2"}, sqlparser.SetNull), - }, - }, - }, - "t2": &RealTable{ - Table: &vindexes.Table{ - Keyspace: &vindexes.Keyspace{Name: "ks"}, - }, - }, - "t3": &RealTable{ - Table: &vindexes.Table{ - Keyspace: &vindexes.Keyspace{Name: "undefined_ks", Sharded: true}, - }, - }, -} - -// TestGetAllManagedForeignKeys tests the functionality of getAllManagedForeignKeys. -func TestGetAllManagedForeignKeys(t *testing.T) { - tests := []struct { - name string - analyzer *analyzer - childFkWanted map[TableSet][]vindexes.ChildFKInfo - parentFkWanted map[TableSet][]vindexes.ParentFKInfo - expectedErr string - }{ - { - name: "Collect all foreign key constraints", - analyzer: &analyzer{ - tables: &tableCollector{ - Tables: []TableInfo{tbl["t0"], tbl["t1"], - &DerivedTable{}, - }, - si: &FakeSI{ - KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ - "ks": vschemapb.Keyspace_managed, - "ks_unmanaged": vschemapb.Keyspace_unmanaged, - }, - }, - }, - }, - childFkWanted: map[TableSet][]vindexes.ChildFKInfo{ - SingleTableSet(0): { - ckInfo(nil, []string{"col"}, []string{"col"}, sqlparser.Restrict), - ckInfo(nil, []string{"col1", "col2"}, []string{"ccol1", "ccol2"}, sqlparser.SetNull), - }, - }, - parentFkWanted: map[TableSet][]vindexes.ParentFKInfo{ - SingleTableSet(0): { - pkInfo(nil, []string{"colb"}, []string{"colb"}), - pkInfo(nil, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), - }, - }, - }, - { - name: "keyspace not found in schema information", - analyzer: &analyzer{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t2"], - tbl["t3"], - }, - si: &FakeSI{ - KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ - "ks": vschemapb.Keyspace_managed, - }, - }, - }, - }, - expectedErr: "undefined_ks keyspace not found", - }, - { - name: "Cyclic fk constraints error", - analyzer: &analyzer{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t0"], tbl["t1"], - &DerivedTable{}, - }, - si: &FakeSI{ - KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ - "ks": vschemapb.Keyspace_managed, - "ks_unmanaged": vschemapb.Keyspace_unmanaged, - }, - KsError: map[string]error{ - "ks": fmt.Errorf("VT09019: ks has cyclic foreign keys"), - }, - }, - }, - }, - expectedErr: "VT09019: ks has cyclic foreign keys", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - childFk, parentFk, err := tt.analyzer.getAllManagedForeignKeys() - if tt.expectedErr != "" { - require.EqualError(t, err, tt.expectedErr) - return - } - require.EqualValues(t, tt.childFkWanted, childFk) - require.EqualValues(t, tt.parentFkWanted, parentFk) - }) - } -} - -// TestFilterForeignKeysUsingUpdateExpressions tests the functionality of filterForeignKeysUsingUpdateExpressions. -func TestFilterForeignKeysUsingUpdateExpressions(t *testing.T) { - cola := sqlparser.NewColName("cola") - colb := sqlparser.NewColName("colb") - colc := sqlparser.NewColName("colc") - cold := sqlparser.NewColName("cold") - a := &analyzer{ - binder: &binder{ - direct: map[sqlparser.Expr]TableSet{ - cola: SingleTableSet(0), - colb: SingleTableSet(0), - colc: SingleTableSet(1), - cold: SingleTableSet(1), - }, - }, - } - updateExprs := sqlparser.UpdateExprs{ - &sqlparser.UpdateExpr{Name: cola, Expr: sqlparser.NewIntLiteral("1")}, - &sqlparser.UpdateExpr{Name: colb, Expr: &sqlparser.NullVal{}}, - &sqlparser.UpdateExpr{Name: colc, Expr: sqlparser.NewIntLiteral("1")}, - &sqlparser.UpdateExpr{Name: cold, Expr: &sqlparser.NullVal{}}, - } - tests := []struct { - name string - analyzer *analyzer - allChildFks map[TableSet][]vindexes.ChildFKInfo - allParentFks map[TableSet][]vindexes.ParentFKInfo - updExprs sqlparser.UpdateExprs - childFksWanted map[TableSet][]vindexes.ChildFKInfo - parentFksWanted map[TableSet][]vindexes.ParentFKInfo - }{ - { - name: "Child Foreign Keys Filtering", - analyzer: a, - allParentFks: nil, - allChildFks: map[TableSet][]vindexes.ChildFKInfo{ - SingleTableSet(0): { - ckInfo(nil, []string{"colb"}, []string{"child_colb"}, sqlparser.Restrict), - ckInfo(nil, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}, sqlparser.SetNull), - ckInfo(nil, []string{"colx", "coly"}, []string{"child_colx", "child_coly"}, sqlparser.Cascade), - ckInfo(nil, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), - }, - SingleTableSet(1): { - ckInfo(nil, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), - ckInfo(nil, []string{"colc", "colx"}, []string{"child_colc", "child_colx"}, sqlparser.SetNull), - ckInfo(nil, []string{"colx", "coly"}, []string{"child_colx", "child_coly"}, sqlparser.Cascade), - }, - }, - updExprs: updateExprs, - childFksWanted: map[TableSet][]vindexes.ChildFKInfo{ - SingleTableSet(0): { - ckInfo(nil, []string{"colb"}, []string{"child_colb"}, sqlparser.Restrict), - ckInfo(nil, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}, sqlparser.SetNull), - }, - SingleTableSet(1): { - ckInfo(nil, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), - ckInfo(nil, []string{"colc", "colx"}, []string{"child_colc", "child_colx"}, sqlparser.SetNull), - }, - }, - parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{}, - }, { - name: "Parent Foreign Keys Filtering", - analyzer: a, - allParentFks: map[TableSet][]vindexes.ParentFKInfo{ - SingleTableSet(0): { - pkInfo(nil, []string{"pcola", "pcolx"}, []string{"cola", "colx"}), - pkInfo(nil, []string{"pcolc"}, []string{"colc"}), - pkInfo(nil, []string{"pcolb", "pcola"}, []string{"colb", "cola"}), - pkInfo(nil, []string{"pcolb"}, []string{"colb"}), - pkInfo(nil, []string{"pcola"}, []string{"cola"}), - pkInfo(nil, []string{"pcolb", "pcolx"}, []string{"colb", "colx"}), - }, - SingleTableSet(1): { - pkInfo(nil, []string{"pcolc", "pcolx"}, []string{"colc", "colx"}), - pkInfo(nil, []string{"pcola"}, []string{"cola"}), - pkInfo(nil, []string{"pcold", "pcolc"}, []string{"cold", "colc"}), - pkInfo(nil, []string{"pcold"}, []string{"cold"}), - pkInfo(nil, []string{"pcold", "pcolx"}, []string{"cold", "colx"}), - }, - }, - allChildFks: nil, - updExprs: updateExprs, - childFksWanted: map[TableSet][]vindexes.ChildFKInfo{}, - parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{ - SingleTableSet(0): { - pkInfo(nil, []string{"pcola", "pcolx"}, []string{"cola", "colx"}), - pkInfo(nil, []string{"pcola"}, []string{"cola"}), - }, - SingleTableSet(1): { - pkInfo(nil, []string{"pcolc", "pcolx"}, []string{"colc", "colx"}), - }, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - childFks, parentFks := tt.analyzer.filterForeignKeysUsingUpdateExpressions(tt.allChildFks, tt.allParentFks, tt.updExprs) - require.EqualValues(t, tt.childFksWanted, childFks) - require.EqualValues(t, tt.parentFksWanted, parentFks) - }) - } -} - -// TestGetInvolvedForeignKeys tests the functionality of getInvolvedForeignKeys. -func TestGetInvolvedForeignKeys(t *testing.T) { - cola := sqlparser.NewColName("cola") - colb := sqlparser.NewColName("colb") - colc := sqlparser.NewColName("colc") - cold := sqlparser.NewColName("cold") - tests := []struct { - name string - stmt sqlparser.Statement - analyzer *analyzer - childFksWanted map[TableSet][]vindexes.ChildFKInfo - parentFksWanted map[TableSet][]vindexes.ParentFKInfo - expectedErr string - }{ - { - name: "Delete Query", - stmt: &sqlparser.Delete{}, - analyzer: &analyzer{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t0"], - tbl["t1"], - }, - si: &FakeSI{ - KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ - "ks": vschemapb.Keyspace_managed, - "ks_unmanaged": vschemapb.Keyspace_unmanaged, - }, - }, - }, - }, - childFksWanted: map[TableSet][]vindexes.ChildFKInfo{ - SingleTableSet(0): { - ckInfo(nil, []string{"col"}, []string{"col"}, sqlparser.Restrict), - ckInfo(nil, []string{"col1", "col2"}, []string{"ccol1", "ccol2"}, sqlparser.SetNull), - }, - }, - }, - { - name: "Update statement", - stmt: &sqlparser.Update{ - Exprs: sqlparser.UpdateExprs{ - &sqlparser.UpdateExpr{ - Name: cola, - Expr: sqlparser.NewIntLiteral("1"), - }, - &sqlparser.UpdateExpr{ - Name: colb, - Expr: &sqlparser.NullVal{}, - }, - &sqlparser.UpdateExpr{ - Name: colc, - Expr: sqlparser.NewIntLiteral("1"), - }, - &sqlparser.UpdateExpr{ - Name: cold, - Expr: &sqlparser.NullVal{}, - }, - }, - }, - analyzer: &analyzer{ - binder: &binder{ - direct: map[sqlparser.Expr]TableSet{ - cola: SingleTableSet(0), - colb: SingleTableSet(0), - colc: SingleTableSet(1), - cold: SingleTableSet(1), - }, - }, - tables: &tableCollector{ - Tables: []TableInfo{ - &RealTable{ - Table: &vindexes.Table{ - Keyspace: &vindexes.Keyspace{Name: "ks"}, - ChildForeignKeys: []vindexes.ChildFKInfo{ - ckInfo(nil, []string{"colb"}, []string{"child_colb"}, sqlparser.Restrict), - ckInfo(nil, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}, sqlparser.SetNull), - ckInfo(nil, []string{"colx", "coly"}, []string{"child_colx", "child_coly"}, sqlparser.Cascade), - ckInfo(nil, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), - }, - ParentForeignKeys: []vindexes.ParentFKInfo{ - pkInfo(nil, []string{"pcola", "pcolx"}, []string{"cola", "colx"}), - pkInfo(nil, []string{"pcolc"}, []string{"colc"}), - pkInfo(nil, []string{"pcolb", "pcola"}, []string{"colb", "cola"}), - pkInfo(nil, []string{"pcolb"}, []string{"colb"}), - pkInfo(nil, []string{"pcola"}, []string{"cola"}), - pkInfo(nil, []string{"pcolb", "pcolx"}, []string{"colb", "colx"}), - }, - }, - }, - &RealTable{ - Table: &vindexes.Table{ - Keyspace: &vindexes.Keyspace{Name: "ks"}, - ChildForeignKeys: []vindexes.ChildFKInfo{ - ckInfo(nil, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), - ckInfo(nil, []string{"colc", "colx"}, []string{"child_colc", "child_colx"}, sqlparser.SetNull), - ckInfo(nil, []string{"colx", "coly"}, []string{"child_colx", "child_coly"}, sqlparser.Cascade), - }, - ParentForeignKeys: []vindexes.ParentFKInfo{ - pkInfo(nil, []string{"pcolc", "pcolx"}, []string{"colc", "colx"}), - pkInfo(nil, []string{"pcola"}, []string{"cola"}), - pkInfo(nil, []string{"pcold", "pcolc"}, []string{"cold", "colc"}), - pkInfo(nil, []string{"pcold"}, []string{"cold"}), - pkInfo(nil, []string{"pcold", "pcolx"}, []string{"cold", "colx"}), - }, - }, - }, - }, - si: &FakeSI{ - KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ - "ks": vschemapb.Keyspace_managed, - }, - }, - }, - }, - childFksWanted: map[TableSet][]vindexes.ChildFKInfo{ - SingleTableSet(0): { - ckInfo(nil, []string{"colb"}, []string{"child_colb"}, sqlparser.Restrict), - ckInfo(nil, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}, sqlparser.SetNull), - }, - SingleTableSet(1): { - ckInfo(nil, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), - ckInfo(nil, []string{"colc", "colx"}, []string{"child_colc", "child_colx"}, sqlparser.SetNull), - }, - }, - parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{ - SingleTableSet(0): { - pkInfo(nil, []string{"pcola", "pcolx"}, []string{"cola", "colx"}), - pkInfo(nil, []string{"pcola"}, []string{"cola"}), - }, - SingleTableSet(1): { - pkInfo(nil, []string{"pcolc", "pcolx"}, []string{"colc", "colx"}), - }, - }, - }, - { - name: "Replace Query", - stmt: &sqlparser.Insert{ - Action: sqlparser.ReplaceAct, - }, - analyzer: &analyzer{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t0"], - tbl["t1"], - }, - si: &FakeSI{ - KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ - "ks": vschemapb.Keyspace_managed, - "ks_unmanaged": vschemapb.Keyspace_unmanaged, - }, - }, - }, - }, - childFksWanted: map[TableSet][]vindexes.ChildFKInfo{ - SingleTableSet(0): { - ckInfo(nil, []string{"col"}, []string{"col"}, sqlparser.Restrict), - ckInfo(nil, []string{"col1", "col2"}, []string{"ccol1", "ccol2"}, sqlparser.SetNull), - }, - }, - parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{ - SingleTableSet(0): { - pkInfo(nil, []string{"colb"}, []string{"colb"}), - pkInfo(nil, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), - }, - }, - }, - { - name: "Insert Query", - stmt: &sqlparser.Insert{ - Action: sqlparser.InsertAct, - }, - analyzer: &analyzer{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t0"], - tbl["t1"], - }, - si: &FakeSI{ - KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ - "ks": vschemapb.Keyspace_managed, - "ks_unmanaged": vschemapb.Keyspace_unmanaged, - }, - }, - }, - }, - childFksWanted: nil, - parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{ - SingleTableSet(0): { - pkInfo(nil, []string{"colb"}, []string{"colb"}), - pkInfo(nil, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), - }, - }, - }, - { - name: "Insert Query with On Duplicate", - stmt: &sqlparser.Insert{ - Action: sqlparser.InsertAct, - OnDup: sqlparser.OnDup{ - &sqlparser.UpdateExpr{ - Name: cola, - Expr: sqlparser.NewIntLiteral("1"), - }, - &sqlparser.UpdateExpr{ - Name: colb, - Expr: &sqlparser.NullVal{}, - }, - }, - }, - analyzer: &analyzer{ - binder: &binder{ - direct: map[sqlparser.Expr]TableSet{ - cola: SingleTableSet(0), - colb: SingleTableSet(0), - }, - }, - tables: &tableCollector{ - Tables: []TableInfo{ - &RealTable{ - Table: &vindexes.Table{ - Keyspace: &vindexes.Keyspace{Name: "ks"}, - ChildForeignKeys: []vindexes.ChildFKInfo{ - ckInfo(nil, []string{"col"}, []string{"col"}, sqlparser.Restrict), - ckInfo(nil, []string{"col1", "col2"}, []string{"ccol1", "ccol2"}, sqlparser.SetNull), - ckInfo(nil, []string{"colb"}, []string{"child_colb"}, sqlparser.Restrict), - ckInfo(nil, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}, sqlparser.SetNull), - ckInfo(nil, []string{"colx", "coly"}, []string{"child_colx", "child_coly"}, sqlparser.Cascade), - ckInfo(nil, []string{"cold"}, []string{"child_cold"}, sqlparser.Restrict), - }, - ParentForeignKeys: []vindexes.ParentFKInfo{ - pkInfo(nil, []string{"colb"}, []string{"colb"}), - pkInfo(nil, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), - }, - }, - }, - tbl["t1"], - }, - si: &FakeSI{ - KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ - "ks": vschemapb.Keyspace_managed, - "ks_unmanaged": vschemapb.Keyspace_unmanaged, - }, - }, - }, - }, - childFksWanted: map[TableSet][]vindexes.ChildFKInfo{ - SingleTableSet(0): { - ckInfo(nil, []string{"colb"}, []string{"child_colb"}, sqlparser.Restrict), - ckInfo(nil, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}, sqlparser.SetNull), - }, - }, - parentFksWanted: map[TableSet][]vindexes.ParentFKInfo{ - SingleTableSet(0): { - pkInfo(nil, []string{"colb"}, []string{"colb"}), - pkInfo(nil, []string{"colb1", "colb2"}, []string{"ccolb1", "ccolb2"}), - }, - }, - }, - { - name: "Insert error", - stmt: &sqlparser.Insert{}, - analyzer: &analyzer{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t2"], - tbl["t3"], - }, - si: &FakeSI{ - KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ - "ks": vschemapb.Keyspace_managed, - }, - }, - }, - }, - expectedErr: "undefined_ks keyspace not found", - }, - { - name: "Update error", - stmt: &sqlparser.Update{}, - analyzer: &analyzer{ - tables: &tableCollector{ - Tables: []TableInfo{ - tbl["t2"], - tbl["t3"], - }, - si: &FakeSI{ - KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ - "ks": vschemapb.Keyspace_managed, - }, - }, - }, - }, - expectedErr: "undefined_ks keyspace not found", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - childFks, parentFks, err := tt.analyzer.getInvolvedForeignKeys(tt.stmt) - if tt.expectedErr != "" { - require.EqualError(t, err, tt.expectedErr) - return - } - require.EqualValues(t, tt.childFksWanted, childFks) - require.EqualValues(t, tt.parentFksWanted, parentFks) - }) - } -} - -func ckInfo(cTable *vindexes.Table, pCols []string, cCols []string, refAction sqlparser.ReferenceAction) vindexes.ChildFKInfo { - return vindexes.ChildFKInfo{ - Table: cTable, - ParentColumns: sqlparser.MakeColumns(pCols...), - ChildColumns: sqlparser.MakeColumns(cCols...), - OnDelete: refAction, - } -} - -func pkInfo(parentTable *vindexes.Table, pCols []string, cCols []string) vindexes.ParentFKInfo { - return vindexes.ParentFKInfo{ - Table: parentTable, - ParentColumns: sqlparser.MakeColumns(pCols...), - ChildColumns: sqlparser.MakeColumns(cCols...), - } -} diff --git a/go/vt/vtgate/semantics/early_rewriter.go b/go/vt/vtgate/semantics/early_rewriter.go index d3c5f312426..0349ef3f79d 100644 --- a/go/vt/vtgate/semantics/early_rewriter.go +++ b/go/vt/vtgate/semantics/early_rewriter.go @@ -47,6 +47,8 @@ func (r *earlyRewriter) down(cursor *sqlparser.Cursor) error { handleOrderBy(r, cursor, node) case *sqlparser.OrExpr: rewriteOrExpr(cursor, node) + case *sqlparser.AndExpr: + rewriteAndExpr(cursor, node) case *sqlparser.NotExpr: rewriteNotExpr(cursor, node) case sqlparser.GroupBy: @@ -176,6 +178,45 @@ func rewriteOrExpr(cursor *sqlparser.Cursor, node *sqlparser.OrExpr) { } } +// rewriteAndExpr rewrites AND expressions when either side is TRUE. +func rewriteAndExpr(cursor *sqlparser.Cursor, node *sqlparser.AndExpr) { + newNode := rewriteAndTrue(*node) + if newNode != nil { + cursor.ReplaceAndRevisit(newNode) + } +} + +func rewriteAndTrue(andExpr sqlparser.AndExpr) sqlparser.Expr { + // we are looking for the pattern `WHERE c = 1 AND 1 = 1` + isTrue := func(subExpr sqlparser.Expr) bool { + evalEnginePred, err := evalengine.Translate(subExpr, nil) + if err != nil { + return false + } + + env := evalengine.EmptyExpressionEnv() + res, err := env.Evaluate(evalEnginePred) + if err != nil { + return false + } + + boolValue, err := res.Value(collations.Default()).ToBool() + if err != nil { + return false + } + + return boolValue + } + + if isTrue(andExpr.Left) { + return andExpr.Right + } else if isTrue(andExpr.Right) { + return andExpr.Left + } + + return nil +} + // handleLiteral processes literals within the context of ORDER BY expressions. func handleLiteral(r *earlyRewriter, cursor *sqlparser.Cursor, node *sqlparser.Literal) error { newNode, err := r.rewriteOrderByExpr(node) diff --git a/go/vt/vtgate/semantics/semantic_state.go b/go/vt/vtgate/semantics/semantic_state.go index 94b1302b357..48ab4322bc8 100644 --- a/go/vt/vtgate/semantics/semantic_state.go +++ b/go/vt/vtgate/semantics/semantic_state.go @@ -137,6 +137,7 @@ type ( // The map is keyed by the tableset of the table that each of the foreign key belongs to. childForeignKeysInvolved map[TableSet][]vindexes.ChildFKInfo parentForeignKeysInvolved map[TableSet][]vindexes.ParentFKInfo + childFkToUpdExprs map[string]sqlparser.UpdateExprs } columnName struct { @@ -196,6 +197,11 @@ func (st *SemTable) GetParentForeignKeysList() []vindexes.ParentFKInfo { return parentFkInfos } +// GetUpdateExpressionsForFk gets the update expressions for the given serialized foreign key constraint. +func (st *SemTable) GetUpdateExpressionsForFk(foreignKey string) sqlparser.UpdateExprs { + return st.childFkToUpdExprs[foreignKey] +} + // RemoveParentForeignKey removes the given foreign key from the parent foreign keys that sem table stores. func (st *SemTable) RemoveParentForeignKey(fkToIgnore string) error { for ts, fkInfos := range st.parentForeignKeysInvolved { @@ -279,6 +285,89 @@ func (st *SemTable) RemoveNonRequiredForeignKeys(verifyAllFks bool, getAction fu return nil } +// ErrIfFkDependentColumnUpdated checks if a foreign key column that is being updated is dependent on another column which also being updated. +func (st *SemTable) ErrIfFkDependentColumnUpdated(updateExprs sqlparser.UpdateExprs) error { + // Go over all the update expressions + for _, updateExpr := range updateExprs { + deps := st.RecursiveDeps(updateExpr.Name) + if deps.NumberOfTables() != 1 { + panic("expected to have single table dependency") + } + // Get all the child and parent foreign keys for the given table that the update expression belongs to. + childFks := st.childForeignKeysInvolved[deps] + parentFKs := st.parentForeignKeysInvolved[deps] + + involvedInFk := false + // Check if this updated column is part of any child or parent foreign key. + for _, childFk := range childFks { + if childFk.ParentColumns.FindColumn(updateExpr.Name.Name) >= 0 { + involvedInFk = true + break + } + } + for _, parentFk := range parentFKs { + if parentFk.ChildColumns.FindColumn(updateExpr.Name.Name) >= 0 { + involvedInFk = true + break + } + } + + if !involvedInFk { + continue + } + + // We cannot support updating a foreign key column that is using a column which is also being updated for 2 reasons— + // 1. For the child foreign keys, we aren't sure what the final value of the updated foreign key column will be. So we don't know + // what to cascade to the child. The selection that we do isn't enough to know if the updated value, since one of the columns used in the update is also being updated. + // 2. For the parent foreign keys, we don't know if we need to reject this update. Because we don't know the final updated value, the update might need to be failed, + // but we can't say for certain. + var dependencyUpdatedErr error + _ = sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { + col, ok := node.(*sqlparser.ColName) + if !ok { + return true, nil + } + // self reference column dependency is not considered a dependent column being updated. + if st.EqualsExpr(updateExpr.Name, col) { + return true, nil + } + for _, updExpr := range updateExprs { + if st.EqualsExpr(updExpr.Name, col) { + dependencyUpdatedErr = vterrors.VT12001(fmt.Sprintf("%v column referenced in foreign key column %v is itself updated", sqlparser.String(col), sqlparser.String(updateExpr.Name))) + return false, nil + } + } + return false, nil + }, updateExpr.Expr) + if dependencyUpdatedErr != nil { + return dependencyUpdatedErr + } + } + return nil +} + +// HasNonLiteralForeignKeyUpdate checks for non-literal updates in expressions linked to a foreign key. +func (st *SemTable) HasNonLiteralForeignKeyUpdate(updExprs sqlparser.UpdateExprs) bool { + for _, updateExpr := range updExprs { + if sqlparser.IsLiteral(updateExpr.Expr) { + continue + } + parentFks := st.parentForeignKeysInvolved[st.RecursiveDeps(updateExpr.Name)] + for _, parentFk := range parentFks { + if parentFk.ChildColumns.FindColumn(updateExpr.Name.Name) >= 0 { + return true + } + } + childFks := st.childForeignKeysInvolved[st.RecursiveDeps(updateExpr.Name)] + for _, childFk := range childFks { + if childFk.ParentColumns.FindColumn(updateExpr.Name.Name) >= 0 { + return true + } + } + } + return false +} + // isShardScoped checks if the foreign key constraint is shard-scoped or not. It uses the vindex information to make this call. func isShardScoped(pTable *vindexes.Table, cTable *vindexes.Table, pCols sqlparser.Columns, cCols sqlparser.Columns) bool { if !pTable.Keyspace.Sharded { diff --git a/go/vt/vtgate/semantics/semantic_state_test.go b/go/vt/vtgate/semantics/semantic_state_test.go index ab855322d76..b904f3656de 100644 --- a/go/vt/vtgate/semantics/semantic_state_test.go +++ b/go/vt/vtgate/semantics/semantic_state_test.go @@ -24,6 +24,7 @@ import ( "github.com/stretchr/testify/require" querypb "vitess.io/vitess/go/vt/proto/query" + vschemapb "vitess.io/vitess/go/vt/proto/vschema" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtgate/vindexes" ) @@ -418,7 +419,7 @@ func TestRemoveParentForeignKey(t *testing.T) { }, }, }, - fkToIgnore: "ks.t2child_coldks.t3cold", + fkToIgnore: "ks.t2|child_cold||ks.t3|cold", parentFksWanted: []vindexes.ParentFKInfo{ pkInfo(t3Table, []string{"colb"}, []string{"child_colb"}), pkInfo(t3Table, []string{"cola", "colx"}, []string{"child_cola", "child_colx"}), @@ -748,3 +749,233 @@ func TestRemoveNonRequiredForeignKeys(t *testing.T) { }) } } + +func TestIsFkDependentColumnUpdated(t *testing.T) { + keyspaceName := "ks" + t3Table := &vindexes.Table{ + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + Name: sqlparser.NewIdentifierCS("t3"), + } + tests := []struct { + name string + query string + fakeSi *FakeSI + updatedErr string + }{ + { + name: "updated child foreign key column is dependent on another updated column", + query: "update t1 set col = id + 1, id = 6 where foo = 3", + fakeSi: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + keyspaceName: vschemapb.Keyspace_managed, + }, + Tables: map[string]*vindexes.Table{ + "t1": { + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + ChildForeignKeys: []vindexes.ChildFKInfo{ + ckInfo(t3Table, []string{"col"}, []string{"col"}, sqlparser.Cascade), + }, + }, + }, + }, + updatedErr: "VT12001: unsupported: id column referenced in foreign key column col is itself updated", + }, { + name: "updated parent foreign key column is dependent on another updated column", + query: "update t1 set col = id + 1, id = 6 where foo = 3", + fakeSi: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + keyspaceName: vschemapb.Keyspace_managed, + }, + Tables: map[string]*vindexes.Table{ + "t1": { + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + ParentForeignKeys: []vindexes.ParentFKInfo{ + pkInfo(t3Table, []string{"col"}, []string{"col"}), + }, + }, + }, + }, + updatedErr: "VT12001: unsupported: id column referenced in foreign key column col is itself updated", + }, { + name: "no foreign key column is dependent on a updated value", + query: "update t1 set col = id + 1 where foo = 3", + fakeSi: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + keyspaceName: vschemapb.Keyspace_managed, + }, + Tables: map[string]*vindexes.Table{ + "t1": { + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + ParentForeignKeys: []vindexes.ParentFKInfo{ + pkInfo(t3Table, []string{"col"}, []string{"col"}), + }, + }, + }, + }, + updatedErr: "", + }, { + name: "self-referenced foreign key", + query: "update t1 set col = col + 1 where foo = 3", + fakeSi: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + keyspaceName: vschemapb.Keyspace_managed, + }, + Tables: map[string]*vindexes.Table{ + "t1": { + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + ParentForeignKeys: []vindexes.ParentFKInfo{ + pkInfo(t3Table, []string{"col"}, []string{"col"}), + }, + }, + }, + }, + updatedErr: "", + }, { + name: "no foreign keys", + query: "update t1 set col = id + 1, id = 6 where foo = 3", + fakeSi: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + keyspaceName: vschemapb.Keyspace_managed, + }, + Tables: map[string]*vindexes.Table{ + "t1": { + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + }, + }, + }, + updatedErr: "", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + stmt, err := sqlparser.Parse(tt.query) + require.NoError(t, err) + semTable, err := Analyze(stmt, keyspaceName, tt.fakeSi) + require.NoError(t, err) + got := semTable.ErrIfFkDependentColumnUpdated(stmt.(*sqlparser.Update).Exprs) + if tt.updatedErr == "" { + require.NoError(t, got) + } else { + require.EqualError(t, got, tt.updatedErr) + } + }) + } +} + +func TestHasNonLiteralForeignKeyUpdate(t *testing.T) { + keyspaceName := "ks" + t3Table := &vindexes.Table{ + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + Name: sqlparser.NewIdentifierCS("t3"), + } + tests := []struct { + name string + query string + fakeSi *FakeSI + hasNonLiteral bool + }{ + { + name: "non literal child foreign key update", + query: "update t1 set col = id + 1 where foo = 3", + fakeSi: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + keyspaceName: vschemapb.Keyspace_managed, + }, + Tables: map[string]*vindexes.Table{ + "t1": { + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + ChildForeignKeys: []vindexes.ChildFKInfo{ + ckInfo(t3Table, []string{"col"}, []string{"col"}, sqlparser.Cascade), + }, + }, + }, + }, + hasNonLiteral: true, + }, { + name: "non literal parent foreign key update", + query: "update t1 set col = id + 1 where foo = 3", + fakeSi: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + keyspaceName: vschemapb.Keyspace_managed, + }, + Tables: map[string]*vindexes.Table{ + "t1": { + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + ParentForeignKeys: []vindexes.ParentFKInfo{ + pkInfo(t3Table, []string{"col"}, []string{"col"}), + }, + }, + }, + }, + hasNonLiteral: true, + }, { + name: "literal updates only", + query: "update t1 set col = 1 where foo = 3", + fakeSi: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + keyspaceName: vschemapb.Keyspace_managed, + }, + Tables: map[string]*vindexes.Table{ + "t1": { + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + ParentForeignKeys: []vindexes.ParentFKInfo{ + pkInfo(t3Table, []string{"col"}, []string{"col"}), + }, + }, + }, + }, + hasNonLiteral: false, + }, { + name: "self-referenced foreign key", + query: "update t1 set col = col + 1 where foo = 3", + fakeSi: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + keyspaceName: vschemapb.Keyspace_managed, + }, + Tables: map[string]*vindexes.Table{ + "t1": { + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + ParentForeignKeys: []vindexes.ParentFKInfo{ + pkInfo(t3Table, []string{"col"}, []string{"col"}), + }, + }, + }, + }, + hasNonLiteral: true, + }, { + name: "no foreign keys", + query: "update t1 set col = id + 1 where foo = 3", + fakeSi: &FakeSI{ + KsForeignKeyMode: map[string]vschemapb.Keyspace_ForeignKeyMode{ + keyspaceName: vschemapb.Keyspace_managed, + }, + Tables: map[string]*vindexes.Table{ + "t1": { + Name: sqlparser.NewIdentifierCS("t1"), + Keyspace: &vindexes.Keyspace{Name: keyspaceName}, + }, + }, + }, + hasNonLiteral: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + stmt, err := sqlparser.Parse(tt.query) + require.NoError(t, err) + semTable, err := Analyze(stmt, keyspaceName, tt.fakeSi) + require.NoError(t, err) + got := semTable.HasNonLiteralForeignKeyUpdate(stmt.(*sqlparser.Update).Exprs) + require.EqualValues(t, tt.hasNonLiteral, got) + }) + } +} diff --git a/go/vt/vtgate/vindexes/foreign_keys.go b/go/vt/vtgate/vindexes/foreign_keys.go index db984462b25..74f9ce74844 100644 --- a/go/vt/vtgate/vindexes/foreign_keys.go +++ b/go/vt/vtgate/vindexes/foreign_keys.go @@ -46,13 +46,13 @@ func (fk *ParentFKInfo) MarshalJSON() ([]byte, error) { func (fk *ParentFKInfo) String(childTable *Table) string { var str strings.Builder - str.WriteString(childTable.String()) + str.WriteString(sqlparser.String(childTable.GetTableName())) for _, column := range fk.ChildColumns { - str.WriteString(column.String()) + str.WriteString("|" + sqlparser.String(column)) } - str.WriteString(fk.Table.String()) + str.WriteString("||" + sqlparser.String(fk.Table.GetTableName())) for _, column := range fk.ParentColumns { - str.WriteString(column.String()) + str.WriteString("|" + sqlparser.String(column)) } return str.String() } @@ -91,13 +91,13 @@ func (fk *ChildFKInfo) MarshalJSON() ([]byte, error) { func (fk *ChildFKInfo) String(parentTable *Table) string { var str strings.Builder - str.WriteString(fk.Table.String()) + str.WriteString(sqlparser.String(fk.Table.GetTableName())) for _, column := range fk.ChildColumns { - str.WriteString(column.String()) + str.WriteString("|" + sqlparser.String(column)) } - str.WriteString(parentTable.String()) + str.WriteString("||" + sqlparser.String(parentTable.GetTableName())) for _, column := range fk.ParentColumns { - str.WriteString(column.String()) + str.WriteString("|" + sqlparser.String(column)) } return str.String() } From 817c24e9428d832ae61527c79182cc1a7a9b6672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Taylor?= Date: Fri, 10 Nov 2023 08:56:15 +0100 Subject: [PATCH 20/39] planbuilder bugfix: expose columns through derived tables (#14501) Signed-off-by: Andres Taylor --- .../informationschema_test.go | 29 +++++++++++ .../planbuilder/operators/aggregator.go | 8 +++- go/vt/vtgate/planbuilder/operators/horizon.go | 8 +++- .../planbuilder/operators/route_planning.go | 6 +-- .../planbuilder/testdata/aggr_cases.json | 48 +++++++++++++++++++ .../testdata/info_schema57_cases.json | 42 ++++++++++++++++ .../testdata/info_schema80_cases.json | 42 ++++++++++++++++ .../planbuilder/testdata/select_cases.json | 45 +++++++++++++++++ .../testdata/unsupported_cases.json | 4 +- 9 files changed, 225 insertions(+), 7 deletions(-) diff --git a/go/test/endtoend/vtgate/queries/informationschema/informationschema_test.go b/go/test/endtoend/vtgate/queries/informationschema/informationschema_test.go index e33daf061bc..0be8a50b328 100644 --- a/go/test/endtoend/vtgate/queries/informationschema/informationschema_test.go +++ b/go/test/endtoend/vtgate/queries/informationschema/informationschema_test.go @@ -257,3 +257,32 @@ FROM (SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME `[[VARCHAR("t1") VARCHAR("id1") BLOB("bigint")] [VARCHAR("t7_xxhash") VARCHAR("uid") BLOB("varchar")]]`, ) } + +func TestJoinWithSingleShardQueryOnRHS(t *testing.T) { + // This test checks that we can run queries like this, where the RHS is a single shard query + mcmp, closer := start(t) + defer closer() + + query := `SELECT + c.column_name as column_name, + c.data_type as data_type, + c.table_name as table_name, + c.table_schema as table_schema +FROM + information_schema.columns c + JOIN ( + SELECT + table_name + FROM + information_schema.tables + WHERE + table_schema != 'information_schema' + LIMIT + 1 + ) AS tables ON tables.table_name = c.table_name +ORDER BY + c.table_name` + + res := utils.Exec(t, mcmp.VtConn, query) + require.NotEmpty(t, res.Rows) +} diff --git a/go/vt/vtgate/planbuilder/operators/aggregator.go b/go/vt/vtgate/planbuilder/operators/aggregator.go index 45ccb041ddd..33846f83365 100644 --- a/go/vt/vtgate/planbuilder/operators/aggregator.go +++ b/go/vt/vtgate/planbuilder/operators/aggregator.go @@ -121,7 +121,13 @@ func (a *Aggregator) isDerived() bool { return a.DT != nil } -func (a *Aggregator) FindCol(ctx *plancontext.PlanningContext, in sqlparser.Expr, _ bool) int { +func (a *Aggregator) FindCol(ctx *plancontext.PlanningContext, in sqlparser.Expr, underRoute bool) int { + if underRoute && a.isDerived() { + // We don't want to use columns on this operator if it's a derived table under a route. + // In this case, we need to add a Projection on top of this operator to make the column available + return -1 + } + expr := a.DT.RewriteExpression(ctx, in) if offset, found := canReuseColumn(ctx, a.Columns, expr, extractExpr); found { return offset diff --git a/go/vt/vtgate/planbuilder/operators/horizon.go b/go/vt/vtgate/planbuilder/operators/horizon.go index 919767d550f..c58db4f3964 100644 --- a/go/vt/vtgate/planbuilder/operators/horizon.go +++ b/go/vt/vtgate/planbuilder/operators/horizon.go @@ -145,7 +145,13 @@ func canReuseColumn[T any]( return } -func (h *Horizon) FindCol(ctx *plancontext.PlanningContext, expr sqlparser.Expr, _ bool) int { +func (h *Horizon) FindCol(ctx *plancontext.PlanningContext, expr sqlparser.Expr, underRoute bool) int { + if underRoute && h.IsDerived() { + // We don't want to use columns on this operator if it's a derived table under a route. + // In this case, we need to add a Projection on top of this operator to make the column available + return -1 + } + for idx, se := range sqlparser.GetFirstSelect(h.Query).SelectExprs { ae, ok := se.(*sqlparser.AliasedExpr) if !ok { diff --git a/go/vt/vtgate/planbuilder/operators/route_planning.go b/go/vt/vtgate/planbuilder/operators/route_planning.go index 079813388b3..306158a06da 100644 --- a/go/vt/vtgate/planbuilder/operators/route_planning.go +++ b/go/vt/vtgate/planbuilder/operators/route_planning.go @@ -370,11 +370,11 @@ func mergeOrJoin(ctx *plancontext.PlanningContext, lhs, rhs ops.Operator, joinPr if len(joinPredicates) > 0 && requiresSwitchingSides(ctx, rhs) { if !inner { - return nil, nil, vterrors.VT12001("LEFT JOIN with derived tables") + return nil, nil, vterrors.VT12001("LEFT JOIN with LIMIT on the outer side") } if requiresSwitchingSides(ctx, lhs) { - return nil, nil, vterrors.VT12001("JOIN between derived tables") + return nil, nil, vterrors.VT12001("JOIN between derived tables with LIMIT") } join := NewApplyJoin(Clone(rhs), Clone(lhs), nil, !inner) @@ -382,7 +382,7 @@ func mergeOrJoin(ctx *plancontext.PlanningContext, lhs, rhs ops.Operator, joinPr if err != nil { return nil, nil, err } - return newOp, rewrite.NewTree("logical join to applyJoin, switching side because derived table", newOp), nil + return newOp, rewrite.NewTree("logical join to applyJoin, switching side because LIMIT", newOp), nil } join := NewApplyJoin(Clone(lhs), Clone(rhs), nil, !inner) diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json index 827c64464f8..3302ca09fc7 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.json @@ -6249,5 +6249,53 @@ "user.user" ] } + }, + { + "comment": "GROUP BY inside derived table on the RHS should not be a problem", + "query": "SELECT c.column_name FROM user c JOIN (SELECT table_name FROM user WHERE id = 143 GROUP BY 1) AS tables ON tables.table_name = c.table_name", + "plan": { + "QueryType": "SELECT", + "Original": "SELECT c.column_name FROM user c JOIN (SELECT table_name FROM user WHERE id = 143 GROUP BY 1) AS tables ON tables.table_name = c.table_name", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "R:0", + "JoinVars": { + "tables_table_name": 0 + }, + "TableName": "`user`_`user`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "EqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select table_name from (select table_name from `user` where 1 != 1 group by table_name) as `tables` where 1 != 1", + "Query": "select table_name from (select table_name from `user` where id = 143 group by table_name) as `tables`", + "Table": "`user`", + "Values": [ + "143" + ], + "Vindex": "user_index" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select c.column_name from `user` as c where 1 != 1", + "Query": "select c.column_name from `user` as c where c.table_name = :tables_table_name", + "Table": "`user`" + } + ] + }, + "TablesUsed": [ + "user.user" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json b/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json index 50234d5ed73..2084d1a6e91 100644 --- a/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/info_schema57_cases.json @@ -1139,5 +1139,47 @@ "Table": "information_schema.apa" } } + }, + { + "comment": "LIMIT 1 inside derived table on the RHS should not be a problem", + "query": "SELECT c.column_name FROM information_schema.columns c JOIN ( SELECT table_name FROM information_schema.tables WHERE table_schema != 'information_schema' LIMIT 1 ) AS tables ON tables.table_name = c.table_name", + "plan": { + "QueryType": "SELECT", + "Original": "SELECT c.column_name FROM information_schema.columns c JOIN ( SELECT table_name FROM information_schema.tables WHERE table_schema != 'information_schema' LIMIT 1 ) AS tables ON tables.table_name = c.table_name", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "R:0", + "JoinVars": { + "tables_table_name": 0 + }, + "TableName": "information_schema.`tables`_information_schema.`columns`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select table_name from information_schema.`tables` where 1 != 1) as `tables` where 1 != 1", + "Query": "select table_name from (select table_name from information_schema.`tables` where table_schema != 'information_schema' limit 1) as `tables`", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select c.column_name from information_schema.`columns` as c where 1 != 1", + "Query": "select c.column_name from information_schema.`columns` as c where c.table_name = :c_table_name /* VARCHAR */", + "SysTableTableName": "[c_table_name::tables_table_name]", + "Table": "information_schema.`columns`" + } + ] + } + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json b/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json index b37804b9584..66449a2cc8c 100644 --- a/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/info_schema80_cases.json @@ -1261,5 +1261,47 @@ "Table": "information_schema.apa" } } + }, + { + "comment": "LIMIT 1 inside derived table on the RHS should not be a problem", + "query": "SELECT c.column_name FROM information_schema.columns c JOIN ( SELECT table_name FROM information_schema.tables WHERE table_schema != 'information_schema' LIMIT 1 ) AS tables ON tables.table_name = c.table_name", + "plan": { + "QueryType": "SELECT", + "Original": "SELECT c.column_name FROM information_schema.columns c JOIN ( SELECT table_name FROM information_schema.tables WHERE table_schema != 'information_schema' LIMIT 1 ) AS tables ON tables.table_name = c.table_name", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "R:0", + "JoinVars": { + "tables_table_name": 0 + }, + "TableName": "information_schema.`tables`_information_schema.`columns`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select table_name from information_schema.`tables` where 1 != 1) as `tables` where 1 != 1", + "Query": "select table_name from (select table_name from information_schema.`tables` where table_schema != 'information_schema' limit 1) as `tables`", + "Table": "information_schema.`tables`" + }, + { + "OperatorType": "Route", + "Variant": "DBA", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select c.column_name from information_schema.`columns` as c where 1 != 1", + "Query": "select c.column_name from information_schema.`columns` as c where c.table_name = :c_table_name /* VARCHAR */", + "SysTableTableName": "[c_table_name::tables_table_name]", + "Table": "information_schema.`columns`" + } + ] + } + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.json b/go/vt/vtgate/planbuilder/testdata/select_cases.json index f26cfc4f065..f5090e40880 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.json @@ -4830,5 +4830,50 @@ "user.user_extra" ] } + }, + { + "comment": "Derived tables going to a single shard still need to expand derived table columns", + "query": "SELECT c.column_name FROM user c JOIN (SELECT table_name FROM unsharded LIMIT 1) AS tables ON tables.table_name = c.table_name", + "plan": { + "QueryType": "SELECT", + "Original": "SELECT c.column_name FROM user c JOIN (SELECT table_name FROM unsharded LIMIT 1) AS tables ON tables.table_name = c.table_name", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "R:0", + "JoinVars": { + "tables_table_name": 0 + }, + "TableName": "unsharded_`user`", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select table_name from (select table_name from unsharded where 1 != 1) as `tables` where 1 != 1", + "Query": "select table_name from (select table_name from unsharded limit 1) as `tables`", + "Table": "unsharded" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select c.column_name from `user` as c where 1 != 1", + "Query": "select c.column_name from `user` as c where c.table_name = :tables_table_name", + "Table": "`user`" + } + ] + }, + "TablesUsed": [ + "main.unsharded", + "user.user" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json index 6fb4e6d36ab..1ea07455486 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json @@ -332,12 +332,12 @@ { "comment": "cant switch sides for outer joins", "query": "select id from user left join (select user_id from user_extra limit 10) ue on user.id = ue.user_id", - "plan": "VT12001: unsupported: LEFT JOIN with derived tables" + "plan": "VT12001: unsupported: LEFT JOIN with LIMIT on the outer side" }, { "comment": "limit on both sides means that we can't evaluate this at all", "query": "select id from (select id from user limit 10) u join (select user_id from user_extra limit 10) ue on u.id = ue.user_id", - "plan": "VT12001: unsupported: JOIN between derived tables" + "plan": "VT12001: unsupported: JOIN between derived tables with LIMIT" }, { "comment": "multi-shard union", From d964876800287b93877409ae501469dd273e928f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 17:50:34 +0530 Subject: [PATCH 21/39] [main] Upgrade the Golang version to `go1.21.4` (#14488) Signed-off-by: GitHub Signed-off-by: Harshit Gangal Co-authored-by: frouioui Co-authored-by: Harshit Gangal --- .github/workflows/assign_milestone.yml | 2 +- .github/workflows/check_make_vtadmin_authz_testgen.yml | 2 +- .github/workflows/check_make_vtadmin_web_proto.yml | 2 +- .github/workflows/cluster_endtoend_12.yml | 2 +- .github/workflows/cluster_endtoend_13.yml | 2 +- .github/workflows/cluster_endtoend_15.yml | 2 +- .github/workflows/cluster_endtoend_18.yml | 2 +- .github/workflows/cluster_endtoend_21.yml | 2 +- .github/workflows/cluster_endtoend_22.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr.yml | 2 +- .github/workflows/cluster_endtoend_backup_pitr_mysql57.yml | 2 +- .../workflows/cluster_endtoend_backup_pitr_xtrabackup.yml | 2 +- .../cluster_endtoend_backup_pitr_xtrabackup_mysql57.yml | 2 +- .../cluster_endtoend_ers_prs_newfeatures_heavy.yml | 2 +- .github/workflows/cluster_endtoend_mysql80.yml | 2 +- .github/workflows/cluster_endtoend_mysql_server_vault.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_ghost.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_revert.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_revert_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_scheduler.yml | 2 +- .../cluster_endtoend_onlineddl_scheduler_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_onlineddl_vrepl.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_stress.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_stress_suite.yml | 2 +- ...luster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml | 2 +- .../workflows/cluster_endtoend_onlineddl_vrepl_suite.yml | 2 +- .../cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_schemadiff_vrepl.yml | 2 +- .../workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_tabletmanager_consul.yml | 2 +- .../workflows/cluster_endtoend_tabletmanager_tablegc.yml | 2 +- .../cluster_endtoend_tabletmanager_tablegc_mysql57.yml | 2 +- .../cluster_endtoend_tabletmanager_throttler_topo.yml | 2 +- .../workflows/cluster_endtoend_topo_connection_cache.yml | 2 +- .../cluster_endtoend_vreplication_across_db_versions.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_basic.yml | 2 +- .../workflows/cluster_endtoend_vreplication_cellalias.yml | 2 +- ...ster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml | 2 +- .../workflows/cluster_endtoend_vreplication_multicell.yml | 2 +- ...uster_endtoend_vreplication_partial_movetables_basic.yml | 2 +- ...r_endtoend_vreplication_partial_movetables_sequences.yml | 2 +- .github/workflows/cluster_endtoend_vreplication_v2.yml | 2 +- .github/workflows/cluster_endtoend_vstream_failover.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_false.yml | 2 +- .../cluster_endtoend_vstream_stoponreshard_true.yml | 2 +- .../cluster_endtoend_vstream_with_keyspaces_to_watch.yml | 2 +- .github/workflows/cluster_endtoend_vtbackup.yml | 2 +- ...uster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_concurrentdml.yml | 2 +- .../workflows/cluster_endtoend_vtgate_foreignkey_stress.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_gen4.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_general_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_godriver.yml | 2 +- .../workflows/cluster_endtoend_vtgate_partial_keyspace.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_queries.yml | 2 +- .../workflows/cluster_endtoend_vtgate_readafterwrite.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_reservedconn.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_schema.yml | 2 +- .../workflows/cluster_endtoend_vtgate_schema_tracker.yml | 2 +- .../cluster_endtoend_vtgate_tablet_healthcheck_cache.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_consul.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_topo_etcd.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_transaction.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_unsharded.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml | 2 +- .github/workflows/cluster_endtoend_vtgate_vschema.yml | 2 +- .github/workflows/cluster_endtoend_vtorc.yml | 2 +- .github/workflows/cluster_endtoend_vtorc_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_vttablet_prscomplex.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup.yml | 2 +- .github/workflows/cluster_endtoend_xb_backup_mysql57.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery.yml | 2 +- .github/workflows/cluster_endtoend_xb_recovery_mysql57.yml | 2 +- .github/workflows/codeql_analysis.yml | 2 +- .github/workflows/create_release.yml | 2 +- .github/workflows/docker_test_cluster_10.yml | 2 +- .github/workflows/docker_test_cluster_25.yml | 2 +- .github/workflows/e2e_race.yml | 2 +- .github/workflows/endtoend.yml | 2 +- .github/workflows/local_example.yml | 2 +- .github/workflows/region_example.yml | 2 +- .github/workflows/static_checks_etc.yml | 2 +- .github/workflows/unit_race.yml | 2 +- .github/workflows/unit_test_mysql57.yml | 2 +- .github/workflows/unit_test_mysql80.yml | 2 +- .github/workflows/update_golang_version.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_e2e.yml | 2 +- .../upgrade_downgrade_test_backups_e2e_next_release.yml | 2 +- .github/workflows/upgrade_downgrade_test_backups_manual.yml | 2 +- .../upgrade_downgrade_test_backups_manual_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_queries.yml | 2 +- ...de_downgrade_test_query_serving_queries_next_release.yml | 2 +- .../upgrade_downgrade_test_query_serving_schema.yml | 2 +- ...ade_downgrade_test_query_serving_schema_next_release.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_new_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_new_vttablet.yml | 2 +- .../workflows/upgrade_downgrade_test_reparent_old_vtctl.yml | 2 +- .../upgrade_downgrade_test_reparent_old_vttablet.yml | 2 +- Makefile | 2 +- build.env | 2 +- docker/base/Dockerfile | 2 +- docker/base/Dockerfile.mysql57 | 2 +- docker/base/Dockerfile.percona57 | 2 +- docker/base/Dockerfile.percona80 | 2 +- docker/bootstrap/CHANGELOG.md | 6 +++++- docker/bootstrap/Dockerfile.common | 2 +- docker/lite/Dockerfile.mysql57 | 2 +- docker/lite/Dockerfile.mysql80 | 2 +- docker/lite/Dockerfile.percona57 | 2 +- docker/lite/Dockerfile.percona80 | 2 +- docker/lite/Dockerfile.testing | 2 +- docker/lite/Dockerfile.ubi7.mysql57 | 2 +- docker/lite/Dockerfile.ubi7.mysql80 | 2 +- docker/lite/Dockerfile.ubi7.percona57 | 2 +- docker/lite/Dockerfile.ubi7.percona80 | 2 +- docker/lite/Dockerfile.ubi8.arm64.mysql80 | 2 +- docker/lite/Dockerfile.ubi8.mysql80 | 2 +- docker/local/Dockerfile | 2 +- docker/vttestserver/Dockerfile.mysql57 | 2 +- docker/vttestserver/Dockerfile.mysql80 | 2 +- test.go | 2 +- test/templates/cluster_endtoend_test.tpl | 2 +- test/templates/cluster_endtoend_test_docker.tpl | 2 +- test/templates/cluster_endtoend_test_mysql57.tpl | 2 +- test/templates/dockerfile.tpl | 2 +- test/templates/unit_test.tpl | 2 +- 130 files changed, 134 insertions(+), 130 deletions(-) diff --git a/.github/workflows/assign_milestone.yml b/.github/workflows/assign_milestone.yml index 7c56f45728f..686655b9284 100644 --- a/.github/workflows/assign_milestone.yml +++ b/.github/workflows/assign_milestone.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/check_make_vtadmin_authz_testgen.yml b/.github/workflows/check_make_vtadmin_authz_testgen.yml index 8f9199e7658..064a700d833 100644 --- a/.github/workflows/check_make_vtadmin_authz_testgen.yml +++ b/.github/workflows/check_make_vtadmin_authz_testgen.yml @@ -50,7 +50,7 @@ jobs: uses: actions/setup-go@v4 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.vtadmin_changes == 'true' diff --git a/.github/workflows/check_make_vtadmin_web_proto.yml b/.github/workflows/check_make_vtadmin_web_proto.yml index 5f3302fc97c..7db6bceeeeb 100644 --- a/.github/workflows/check_make_vtadmin_web_proto.yml +++ b/.github/workflows/check_make_vtadmin_web_proto.yml @@ -52,7 +52,7 @@ jobs: uses: actions/setup-go@v4 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Setup Node if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.proto_changes == 'true' diff --git a/.github/workflows/cluster_endtoend_12.yml b/.github/workflows/cluster_endtoend_12.yml index 5ce650f1ea6..7496577ef0d 100644 --- a/.github/workflows/cluster_endtoend_12.yml +++ b/.github/workflows/cluster_endtoend_12.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_13.yml b/.github/workflows/cluster_endtoend_13.yml index fa98916736f..c93f7e5526d 100644 --- a/.github/workflows/cluster_endtoend_13.yml +++ b/.github/workflows/cluster_endtoend_13.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_15.yml b/.github/workflows/cluster_endtoend_15.yml index 2501f26ab58..469cfaf3080 100644 --- a/.github/workflows/cluster_endtoend_15.yml +++ b/.github/workflows/cluster_endtoend_15.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_18.yml b/.github/workflows/cluster_endtoend_18.yml index 234e672afb0..d76a5ada83d 100644 --- a/.github/workflows/cluster_endtoend_18.yml +++ b/.github/workflows/cluster_endtoend_18.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_21.yml b/.github/workflows/cluster_endtoend_21.yml index feeedcd46b8..23d570a2b98 100644 --- a/.github/workflows/cluster_endtoend_21.yml +++ b/.github/workflows/cluster_endtoend_21.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_22.yml b/.github/workflows/cluster_endtoend_22.yml index f4cee992fb2..9cba996f309 100644 --- a/.github/workflows/cluster_endtoend_22.yml +++ b/.github/workflows/cluster_endtoend_22.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr.yml b/.github/workflows/cluster_endtoend_backup_pitr.yml index b3b6e0d56f6..75e0c552d84 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml index fb9946fdb0b..d5a0f529d80 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_mysql57.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml index 6cad7922321..e1f66a29eb9 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup_mysql57.yml b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup_mysql57.yml index b895a19a8d0..e9ae31c02c9 100644 --- a/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_backup_pitr_xtrabackup_mysql57.yml @@ -75,7 +75,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml index f65d2625c28..5c0e1e3a012 100644 --- a/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml +++ b/.github/workflows/cluster_endtoend_ers_prs_newfeatures_heavy.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_mysql80.yml b/.github/workflows/cluster_endtoend_mysql80.yml index 5c3739aafd0..ea82738337d 100644 --- a/.github/workflows/cluster_endtoend_mysql80.yml +++ b/.github/workflows/cluster_endtoend_mysql80.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_mysql_server_vault.yml b/.github/workflows/cluster_endtoend_mysql_server_vault.yml index 793e7372309..5d14faee1af 100644 --- a/.github/workflows/cluster_endtoend_mysql_server_vault.yml +++ b/.github/workflows/cluster_endtoend_mysql_server_vault.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml index af61a6a5059..f51032f2a34 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml index 43dc184c204..d69865221e0 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_ghost_mysql57.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert.yml b/.github/workflows/cluster_endtoend_onlineddl_revert.yml index d2c6e23ee86..42fcb0ac100 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml index ac93c1ac532..e3b4e0960dc 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_revert_mysql57.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml index 38031f4441e..087d33bf9b6 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml index 0a205266c4f..5e21df5ac38 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_scheduler_mysql57.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml index d83fb7010b8..fb1b980793e 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml index a941c9faef0..1fc42939924 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_mysql57.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml index a51cb6c33fe..38f09912b51 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml index 77626919a89..dbd670e82b5 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_mysql57.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml index 1230fcd3518..86f22cf8610 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml index 86ef8eec019..f0c8d0b7bda 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_stress_suite_mysql57.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml index 34e521d648f..b20cc1f901d 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml index a400ea99677..8568b13288b 100644 --- a/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml +++ b/.github/workflows/cluster_endtoend_onlineddl_vrepl_suite_mysql57.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml index 68a25ee46ec..b937e72ef82 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml index ba57948d162..2dae908d301 100644 --- a/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml +++ b/.github/workflows/cluster_endtoend_schemadiff_vrepl_mysql57.yml @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml index 0fe0d4e18da..341eae60951 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_consul.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_consul.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml index 5af0e2ff852..13c3ae789ed 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml index e1ae8eeb69c..3d6b40bd8a7 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_tablegc_mysql57.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml index 8b6826f257c..cc6b02e2324 100644 --- a/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml +++ b/.github/workflows/cluster_endtoend_tabletmanager_throttler_topo.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_topo_connection_cache.yml b/.github/workflows/cluster_endtoend_topo_connection_cache.yml index bb59336df48..142d2358b47 100644 --- a/.github/workflows/cluster_endtoend_topo_connection_cache.yml +++ b/.github/workflows/cluster_endtoend_topo_connection_cache.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml index ec3d101629e..965c29d6bad 100644 --- a/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml +++ b/.github/workflows/cluster_endtoend_vreplication_across_db_versions.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_basic.yml b/.github/workflows/cluster_endtoend_vreplication_basic.yml index ea6219bf869..7f77747477f 100644 --- a/.github/workflows/cluster_endtoend_vreplication_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_basic.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml index 5ef46750668..7dddf5f34d1 100644 --- a/.github/workflows/cluster_endtoend_vreplication_cellalias.yml +++ b/.github/workflows/cluster_endtoend_vreplication_cellalias.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml index d8961314a46..412113b055f 100644 --- a/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml +++ b/.github/workflows/cluster_endtoend_vreplication_migrate_vdiff2_convert_tz.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_multicell.yml b/.github/workflows/cluster_endtoend_vreplication_multicell.yml index 328c062e1d0..01b1c242b91 100644 --- a/.github/workflows/cluster_endtoend_vreplication_multicell.yml +++ b/.github/workflows/cluster_endtoend_vreplication_multicell.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_basic.yml b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_basic.yml index 28dca240332..c9d8f74c5ce 100644 --- a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_basic.yml +++ b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_basic.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_sequences.yml b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_sequences.yml index c002a72d1e7..501cd17ca62 100644 --- a/.github/workflows/cluster_endtoend_vreplication_partial_movetables_sequences.yml +++ b/.github/workflows/cluster_endtoend_vreplication_partial_movetables_sequences.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vreplication_v2.yml b/.github/workflows/cluster_endtoend_vreplication_v2.yml index 9229b34a5bf..61fb9971f0b 100644 --- a/.github/workflows/cluster_endtoend_vreplication_v2.yml +++ b/.github/workflows/cluster_endtoend_vreplication_v2.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_failover.yml b/.github/workflows/cluster_endtoend_vstream_failover.yml index a620b8caad9..23c384fb5dc 100644 --- a/.github/workflows/cluster_endtoend_vstream_failover.yml +++ b/.github/workflows/cluster_endtoend_vstream_failover.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml index 5db27dad710..36e4cec2f6b 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_false.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml index 32e7685bf8f..fc9bea5efe8 100644 --- a/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml +++ b/.github/workflows/cluster_endtoend_vstream_stoponreshard_true.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml index 27620919d99..5135354ee13 100644 --- a/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml +++ b/.github/workflows/cluster_endtoend_vstream_with_keyspaces_to_watch.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtbackup.yml b/.github/workflows/cluster_endtoend_vtbackup.yml index 8f2dcd3768b..4b954911a5f 100644 --- a/.github/workflows/cluster_endtoend_vtbackup.yml +++ b/.github/workflows/cluster_endtoend_vtbackup.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml index aad84a910c6..c1137849dd2 100644 --- a/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtctlbackup_sharded_clustertest_heavy.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml index 19bb9efe86c..070936647e2 100644 --- a/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml +++ b/.github/workflows/cluster_endtoend_vtgate_concurrentdml.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml b/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml index e2824c5844d..ff6688e1878 100644 --- a/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml +++ b/.github/workflows/cluster_endtoend_vtgate_foreignkey_stress.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_gen4.yml b/.github/workflows/cluster_endtoend_vtgate_gen4.yml index 205de4b5e68..8a12094028b 100644 --- a/.github/workflows/cluster_endtoend_vtgate_gen4.yml +++ b/.github/workflows/cluster_endtoend_vtgate_gen4.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml index 98d59d60aee..a076b7b0a1a 100644 --- a/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_general_heavy.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_godriver.yml b/.github/workflows/cluster_endtoend_vtgate_godriver.yml index 2f4082d10d4..8b652338b51 100644 --- a/.github/workflows/cluster_endtoend_vtgate_godriver.yml +++ b/.github/workflows/cluster_endtoend_vtgate_godriver.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml index 4a9f6e227fb..e8cbcf61a83 100644 --- a/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml +++ b/.github/workflows/cluster_endtoend_vtgate_partial_keyspace.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_queries.yml b/.github/workflows/cluster_endtoend_vtgate_queries.yml index 6d41d922fc4..d908a13fe23 100644 --- a/.github/workflows/cluster_endtoend_vtgate_queries.yml +++ b/.github/workflows/cluster_endtoend_vtgate_queries.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml index 028e1492029..6a027d039cf 100644 --- a/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml +++ b/.github/workflows/cluster_endtoend_vtgate_readafterwrite.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml index 5972472402e..b0278160979 100644 --- a/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml +++ b/.github/workflows/cluster_endtoend_vtgate_reservedconn.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_schema.yml b/.github/workflows/cluster_endtoend_vtgate_schema.yml index 68a2bd697be..3d99a03cace 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml index 1c5d1e675f8..edbd27f3bf6 100644 --- a/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml +++ b/.github/workflows/cluster_endtoend_vtgate_schema_tracker.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml index 26adb43fd74..2ab51d691c2 100644 --- a/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml +++ b/.github/workflows/cluster_endtoend_vtgate_tablet_healthcheck_cache.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo.yml b/.github/workflows/cluster_endtoend_vtgate_topo.yml index 49945a607d8..ce316847045 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml index ee72650dcbd..eac4ada3249 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_consul.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml index 4051373d9aa..7b108e5cbad 100644 --- a/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml +++ b/.github/workflows/cluster_endtoend_vtgate_topo_etcd.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_transaction.yml b/.github/workflows/cluster_endtoend_vtgate_transaction.yml index b7cc848692f..bbef397dea9 100644 --- a/.github/workflows/cluster_endtoend_vtgate_transaction.yml +++ b/.github/workflows/cluster_endtoend_vtgate_transaction.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml index b6359682993..23151270d1e 100644 --- a/.github/workflows/cluster_endtoend_vtgate_unsharded.yml +++ b/.github/workflows/cluster_endtoend_vtgate_unsharded.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml index 83fb2b2d829..ead14d0fd63 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vindex_heavy.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtgate_vschema.yml b/.github/workflows/cluster_endtoend_vtgate_vschema.yml index 4c2f3b2637d..9c6abdc0ad2 100644 --- a/.github/workflows/cluster_endtoend_vtgate_vschema.yml +++ b/.github/workflows/cluster_endtoend_vtgate_vschema.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtorc.yml b/.github/workflows/cluster_endtoend_vtorc.yml index 872576ab8b5..631bac6fda1 100644 --- a/.github/workflows/cluster_endtoend_vtorc.yml +++ b/.github/workflows/cluster_endtoend_vtorc.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml index 72baf7940b6..04248744a26 100644 --- a/.github/workflows/cluster_endtoend_vtorc_mysql57.yml +++ b/.github/workflows/cluster_endtoend_vtorc_mysql57.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml index b56d4dc61a5..48b336a6c11 100644 --- a/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml +++ b/.github/workflows/cluster_endtoend_vttablet_prscomplex.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_backup.yml b/.github/workflows/cluster_endtoend_xb_backup.yml index f24baaf31af..8a3158fadd9 100644 --- a/.github/workflows/cluster_endtoend_xb_backup.yml +++ b/.github/workflows/cluster_endtoend_xb_backup.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml index b85628a0dbe..e34ce3e1e8a 100644 --- a/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_backup_mysql57.yml @@ -75,7 +75,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_recovery.yml b/.github/workflows/cluster_endtoend_xb_recovery.yml index 3fbe34b0569..6f62db39ce8 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml index aaa2b034105..2a9fe0eba92 100644 --- a/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml +++ b/.github/workflows/cluster_endtoend_xb_recovery_mysql57.yml @@ -75,7 +75,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/codeql_analysis.yml b/.github/workflows/codeql_analysis.yml index 8bafc62213a..2ec63e4fe5c 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -44,7 +44,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Get base dependencies run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 52c90038680..86bd5b686a0 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Setup node uses: actions/setup-node@v3 diff --git a/.github/workflows/docker_test_cluster_10.yml b/.github/workflows/docker_test_cluster_10.yml index 3ff9a2a6e74..8b9d2e278ae 100644 --- a/.github/workflows/docker_test_cluster_10.yml +++ b/.github/workflows/docker_test_cluster_10.yml @@ -54,7 +54,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/docker_test_cluster_25.yml b/.github/workflows/docker_test_cluster_25.yml index e01caf200b1..007035b6e71 100644 --- a/.github/workflows/docker_test_cluster_25.yml +++ b/.github/workflows/docker_test_cluster_25.yml @@ -54,7 +54,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/e2e_race.yml b/.github/workflows/e2e_race.yml index 0d773d936e4..55b84fb378a 100644 --- a/.github/workflows/e2e_race.yml +++ b/.github/workflows/e2e_race.yml @@ -52,7 +52,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/endtoend.yml b/.github/workflows/endtoend.yml index 1c0b5f00342..57802c676a9 100644 --- a/.github/workflows/endtoend.yml +++ b/.github/workflows/endtoend.yml @@ -52,7 +52,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/local_example.yml b/.github/workflows/local_example.yml index 348e191abff..30ab7e3e335 100644 --- a/.github/workflows/local_example.yml +++ b/.github/workflows/local_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - uses: actions/setup-node@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/region_example.yml b/.github/workflows/region_example.yml index 5d58a6bb5bf..6a87d0de54f 100644 --- a/.github/workflows/region_example.yml +++ b/.github/workflows/region_example.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - uses: actions/setup-node@v3 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.examples == 'true' diff --git a/.github/workflows/static_checks_etc.yml b/.github/workflows/static_checks_etc.yml index 34714d00256..1854e8f052a 100644 --- a/.github/workflows/static_checks_etc.yml +++ b/.github/workflows/static_checks_etc.yml @@ -102,7 +102,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && (steps.changes.outputs.go_files == 'true' || steps.changes.outputs.parser_changes == 'true' || steps.changes.outputs.proto_changes == 'true') uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.go_files == 'true' diff --git a/.github/workflows/unit_race.yml b/.github/workflows/unit_race.yml index 80121299139..fe7fa7e684e 100644 --- a/.github/workflows/unit_race.yml +++ b/.github/workflows/unit_race.yml @@ -57,7 +57,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql57.yml b/.github/workflows/unit_test_mysql57.yml index 5c5b9c2a206..a1bb1653775 100644 --- a/.github/workflows/unit_test_mysql57.yml +++ b/.github/workflows/unit_test_mysql57.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/unit_test_mysql80.yml b/.github/workflows/unit_test_mysql80.yml index 0427ef18158..6c9416be543 100644 --- a/.github/workflows/unit_test_mysql80.yml +++ b/.github/workflows/unit_test_mysql80.yml @@ -71,7 +71,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' diff --git a/.github/workflows/update_golang_version.yml b/.github/workflows/update_golang_version.yml index a30ba27a5a7..4eddbf9841b 100644 --- a/.github/workflows/update_golang_version.yml +++ b/.github/workflows/update_golang_version.yml @@ -22,7 +22,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Check out code uses: actions/checkout@v3 diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml index 9532995d49c..4ebca519d18 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e.yml @@ -85,7 +85,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml index cc8e3afb42a..09b5a80ce16 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_e2e_next_release.yml @@ -88,7 +88,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual.yml b/.github/workflows/upgrade_downgrade_test_backups_manual.yml index 6789dda2067..cd806eb3c4f 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual.yml @@ -87,7 +87,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml index 0120571a78e..5806fb83891 100644 --- a/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_backups_manual_next_release.yml @@ -90,7 +90,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml index a3dc81f3723..9ddc8c44da3 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries.yml @@ -87,7 +87,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml index 923c766e377..4d9db1b6776 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_queries_next_release.yml @@ -90,7 +90,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml index 14c8afaf87f..2b666e4cdb5 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema.yml @@ -87,7 +87,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml index f22ece10010..d4e05e32967 100644 --- a/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml +++ b/.github/workflows/upgrade_downgrade_test_query_serving_schema_next_release.yml @@ -90,7 +90,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml index 82d6f267856..09468aaf325 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vtctl.yml @@ -90,7 +90,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml index c5b6c964124..9e65388c10c 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_new_vttablet.yml @@ -90,7 +90,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml index c4391efdef5..a2cf8dbce38 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vtctl.yml @@ -87,7 +87,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml index f3ffcaa2d17..1a1173ff5eb 100644 --- a/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml +++ b/.github/workflows/upgrade_downgrade_test_reparent_old_vttablet.yml @@ -87,7 +87,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/Makefile b/Makefile index 625a28baac0..2b662f7aa34 100644 --- a/Makefile +++ b/Makefile @@ -278,7 +278,7 @@ $(PROTO_GO_OUTS): minimaltools install_protoc-gen-go proto/*.proto # This rule builds the bootstrap images for all flavors. DOCKER_IMAGES_FOR_TEST = mysql57 mysql80 percona57 percona80 DOCKER_IMAGES = common $(DOCKER_IMAGES_FOR_TEST) -BOOTSTRAP_VERSION=24 +BOOTSTRAP_VERSION=25 ensure_bootstrap_version: find docker/ -type f -exec sed -i "s/^\(ARG bootstrap_version\)=.*/\1=${BOOTSTRAP_VERSION}/" {} \; sed -i 's/\(^.*flag.String(\"bootstrap-version\",\) *\"[^\"]\+\"/\1 \"${BOOTSTRAP_VERSION}\"/' test.go diff --git a/build.env b/build.env index 5986ee247b0..bcc6180814c 100755 --- a/build.env +++ b/build.env @@ -17,7 +17,7 @@ source ./tools/shell_functions.inc go version >/dev/null 2>&1 || fail "Go is not installed or is not in \$PATH. See https://vitess.io/contributing/build-from-source for install instructions." -goversion_min 1.21.3 || echo "Go version reported: `go version`. Version 1.21.3+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." +goversion_min 1.21.4 || echo "Go version reported: `go version`. Version 1.21.4+ recommended. See https://vitess.io/contributing/build-from-source for install instructions." mkdir -p dist mkdir -p bin diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 75c51b4ad1b..f53b73ec372 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" diff --git a/docker/base/Dockerfile.mysql57 b/docker/base/Dockerfile.mysql57 index 586cf1d94da..b416553f5c0 100644 --- a/docker/base/Dockerfile.mysql57 +++ b/docker/base/Dockerfile.mysql57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona57 b/docker/base/Dockerfile.percona57 index fce0412250b..971d021efaa 100644 --- a/docker/base/Dockerfile.percona57 +++ b/docker/base/Dockerfile.percona57 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" diff --git a/docker/base/Dockerfile.percona80 b/docker/base/Dockerfile.percona80 index a236035c511..2f600ad5f79 100644 --- a/docker/base/Dockerfile.percona80 +++ b/docker/base/Dockerfile.percona80 @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index e363dfc0ded..6fed662b8be 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -92,4 +92,8 @@ List of changes between bootstrap image versions. ## [24] - 2023-10-10 ### Changes -- Update build to golang 1.21.3 \ No newline at end of file +- Update build to golang 1.21.3 + +## [25] - 2023-11-08 +### Changes +- Update build to golang 1.21.4 \ No newline at end of file diff --git a/docker/bootstrap/Dockerfile.common b/docker/bootstrap/Dockerfile.common index 39b0c16566a..69186240fbc 100644 --- a/docker/bootstrap/Dockerfile.common +++ b/docker/bootstrap/Dockerfile.common @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 golang:1.21.3-bullseye +FROM --platform=linux/amd64 golang:1.21.4-bullseye # Install Vitess build dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ diff --git a/docker/lite/Dockerfile.mysql57 b/docker/lite/Dockerfile.mysql57 index 8c07b1a4411..a10cdefd1a2 100644 --- a/docker/lite/Dockerfile.mysql57 +++ b/docker/lite/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.mysql80 b/docker/lite/Dockerfile.mysql80 index bc4ad7861c8..98254bf3cdd 100644 --- a/docker/lite/Dockerfile.mysql80 +++ b/docker/lite/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona57 b/docker/lite/Dockerfile.percona57 index 39d31542fe8..e4c3db5fff1 100644 --- a/docker/lite/Dockerfile.percona57 +++ b/docker/lite/Dockerfile.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.percona80 b/docker/lite/Dockerfile.percona80 index e20359ea300..cb9e34d834d 100644 --- a/docker/lite/Dockerfile.percona80 +++ b/docker/lite/Dockerfile.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.testing b/docker/lite/Dockerfile.testing index 118db24699b..3aa24a1334b 100644 --- a/docker/lite/Dockerfile.testing +++ b/docker/lite/Dockerfile.testing @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql57 b/docker/lite/Dockerfile.ubi7.mysql57 index 08ae84cfeb0..c1a20afe589 100644 --- a/docker/lite/Dockerfile.ubi7.mysql57 +++ b/docker/lite/Dockerfile.ubi7.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.mysql80 b/docker/lite/Dockerfile.ubi7.mysql80 index c11ac4a6ed4..2e1dd80cdc1 100644 --- a/docker/lite/Dockerfile.ubi7.mysql80 +++ b/docker/lite/Dockerfile.ubi7.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona57 b/docker/lite/Dockerfile.ubi7.percona57 index ef55a6b527a..1e3af0a686d 100644 --- a/docker/lite/Dockerfile.ubi7.percona57 +++ b/docker/lite/Dockerfile.ubi7.percona57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-percona57" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi7.percona80 b/docker/lite/Dockerfile.ubi7.percona80 index 61092685177..32f3cf8b0f4 100644 --- a/docker/lite/Dockerfile.ubi7.percona80 +++ b/docker/lite/Dockerfile.ubi7.percona80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-percona80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.arm64.mysql80 b/docker/lite/Dockerfile.ubi8.arm64.mysql80 index 5c2e99c3b51..c4124a7f468 100644 --- a/docker/lite/Dockerfile.ubi8.arm64.mysql80 +++ b/docker/lite/Dockerfile.ubi8.arm64.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/lite/Dockerfile.ubi8.mysql80 b/docker/lite/Dockerfile.ubi8.mysql80 index 094dc8fa712..38c85b8778d 100644 --- a/docker/lite/Dockerfile.ubi8.mysql80 +++ b/docker/lite/Dockerfile.ubi8.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/docker/local/Dockerfile b/docker/local/Dockerfile index 6643799842d..24e79eb90bd 100644 --- a/docker/local/Dockerfile +++ b/docker/local/Dockerfile @@ -1,4 +1,4 @@ -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-common" FROM "${image}" diff --git a/docker/vttestserver/Dockerfile.mysql57 b/docker/vttestserver/Dockerfile.mysql57 index 195f0cd62e4..2eca5377d76 100644 --- a/docker/vttestserver/Dockerfile.mysql57 +++ b/docker/vttestserver/Dockerfile.mysql57 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-mysql57" FROM "${image}" AS builder diff --git a/docker/vttestserver/Dockerfile.mysql80 b/docker/vttestserver/Dockerfile.mysql80 index 2dcc190a957..5bbd7584eba 100644 --- a/docker/vttestserver/Dockerfile.mysql80 +++ b/docker/vttestserver/Dockerfile.mysql80 @@ -17,7 +17,7 @@ # ensure images contain the right binaries. # Use a temporary layer for the build stage. -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-mysql80" FROM "${image}" AS builder diff --git a/test.go b/test.go index c7594557161..a9528c1ddd9 100755 --- a/test.go +++ b/test.go @@ -77,7 +77,7 @@ For example: // Flags var ( flavor = flag.String("flavor", "mysql57", "comma-separated bootstrap flavor(s) to run against (when using Docker mode). Available flavors: all,"+flavors) - bootstrapVersion = flag.String("bootstrap-version", "24", "the version identifier to use for the docker images") + bootstrapVersion = flag.String("bootstrap-version", "25", "the version identifier to use for the docker images") runCount = flag.Int("runs", 1, "run each test this many times") retryMax = flag.Int("retry", 3, "max number of retries, to detect flaky tests") logPass = flag.Bool("log-pass", false, "log test output even if it passes") diff --git a/test/templates/cluster_endtoend_test.tpl b/test/templates/cluster_endtoend_test.tpl index b5c409d8f51..f1c825a0c12 100644 --- a/test/templates/cluster_endtoend_test.tpl +++ b/test/templates/cluster_endtoend_test.tpl @@ -72,7 +72,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/cluster_endtoend_test_docker.tpl b/test/templates/cluster_endtoend_test_docker.tpl index f53c705e2c1..e42116fed69 100644 --- a/test/templates/cluster_endtoend_test_docker.tpl +++ b/test/templates/cluster_endtoend_test_docker.tpl @@ -54,7 +54,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Tune the OS if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/cluster_endtoend_test_mysql57.tpl b/test/templates/cluster_endtoend_test_mysql57.tpl index f5bc482cda9..69a6028b316 100644 --- a/test/templates/cluster_endtoend_test_mysql57.tpl +++ b/test/templates/cluster_endtoend_test_mysql57.tpl @@ -77,7 +77,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' diff --git a/test/templates/dockerfile.tpl b/test/templates/dockerfile.tpl index 16ea54e724b..060dde341cd 100644 --- a/test/templates/dockerfile.tpl +++ b/test/templates/dockerfile.tpl @@ -1,4 +1,4 @@ -ARG bootstrap_version=24 +ARG bootstrap_version=25 ARG image="vitess/bootstrap:${bootstrap_version}-{{.Platform}}" FROM "${image}" diff --git a/test/templates/unit_test.tpl b/test/templates/unit_test.tpl index 7dffd83267b..73ce4737fcd 100644 --- a/test/templates/unit_test.tpl +++ b/test/templates/unit_test.tpl @@ -69,7 +69,7 @@ jobs: if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' uses: actions/setup-go@v4 with: - go-version: 1.21.3 + go-version: 1.21.4 - name: Set up python if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.unit_tests == 'true' From a0ee6c1a05346905385c10512d19d366eebcb80f Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Mon, 13 Nov 2023 13:58:33 +0530 Subject: [PATCH 22/39] move over 16.0.6 and 17.0.4 release notes to main (#14508) Signed-off-by: Harshit Gangal --- changelog/16.0/16.0.6/changelog.md | 43 +++++++++++++++++++++++ changelog/16.0/16.0.6/release_notes.md | 7 ++++ changelog/16.0/README.md | 4 +++ changelog/17.0/17.0.4/changelog.md | 48 ++++++++++++++++++++++++++ changelog/17.0/17.0.4/release_notes.md | 7 ++++ changelog/17.0/README.md | 4 +++ 6 files changed, 113 insertions(+) create mode 100644 changelog/16.0/16.0.6/changelog.md create mode 100644 changelog/16.0/16.0.6/release_notes.md create mode 100644 changelog/17.0/17.0.4/changelog.md create mode 100644 changelog/17.0/17.0.4/release_notes.md diff --git a/changelog/16.0/16.0.6/changelog.md b/changelog/16.0/16.0.6/changelog.md new file mode 100644 index 00000000000..959bf2bd570 --- /dev/null +++ b/changelog/16.0/16.0.6/changelog.md @@ -0,0 +1,43 @@ +# Changelog of Vitess v16.0.6 + +### Bug fixes +#### CLI + * [release-16.0] Fix anonymous paths in cobra code-gen (#14185) [#14236](https://github.com/vitessio/vitess/pull/14236) +#### Examples + * [release-16.0] examples: fix flag syntax for zkctl (#14469) [#14485](https://github.com/vitessio/vitess/pull/14485) +#### Online DDL + * [Release 16.0]: Online DDL: timeouts for all gRPC calls (#14182) [#14191](https://github.com/vitessio/vitess/pull/14191) + * [release-16.0] schemadiff: fix missing `DROP CONSTRAINT` in duplicate/redundant constraints scenario. (#14387) [#14389](https://github.com/vitessio/vitess/pull/14389) +#### Query Serving + * [release-16.0] Rewrite `USING` to `ON` condition for joins (#13931) [#13940](https://github.com/vitessio/vitess/pull/13940) + * [release-16.0] Make column resolution closer to MySQL (#14426) [#14428](https://github.com/vitessio/vitess/pull/14428) + * [release-16.0] vtgate/engine: Fix race condition in join logic (#14435) [#14439](https://github.com/vitessio/vitess/pull/14439) + * [release-16.0] Ensure hexval and int don't share BindVar after Normalization (#14451) [#14477](https://github.com/vitessio/vitess/pull/14477) +#### Throttler + * [release-16.0] Tablet throttler: fix race condition by removing goroutine call (#14179) [#14200](https://github.com/vitessio/vitess/pull/14200) +#### VReplication + * [release-16.0] VDiff: wait for shard streams of one table diff to complete for before starting that of the next table (#14345) [#14380](https://github.com/vitessio/vitess/pull/14380) +### CI/Build +#### General + * [release-16.0] Upgrade the Golang version to `go1.20.9` [#14194](https://github.com/vitessio/vitess/pull/14194) + * [release-16.0] Upgrade the Golang version to `go1.20.10` [#14228](https://github.com/vitessio/vitess/pull/14228) +#### Online DDL + * [release-16.0] OnlineDDL: reduce vrepl_stress workload in forks (#14302) [#14347](https://github.com/vitessio/vitess/pull/14347) +### Dependabot +#### General + * [release-16.0] Bump github.com/cyphar/filepath-securejoin from 0.2.3 to 0.2.4 (#14239) [#14251](https://github.com/vitessio/vitess/pull/14251) + * [release-16.0] Bump golang.org/x/net from 0.14.0 to 0.17.0 (#14260) [#14262](https://github.com/vitessio/vitess/pull/14262) + * [release-16.0] Bump google.golang.org/grpc from 1.55.0-dev to 1.59.0 (#14364) [#14496](https://github.com/vitessio/vitess/pull/14496) +#### VTAdmin + * [release-16.0] Bump postcss from 8.4.21 to 8.4.31 in /web/vtadmin (#14173) [#14256](https://github.com/vitessio/vitess/pull/14256) + * [release-16.0] Bump @babel/traverse from 7.21.4 to 7.23.2 in /web/vtadmin (#14304) [#14306](https://github.com/vitessio/vitess/pull/14306) +### Enhancement +#### Build/CI + * [release-16.0] Automatic approval of `vitess-bot` clean backports (#14352) [#14355](https://github.com/vitessio/vitess/pull/14355) +### Release +#### General + * Code freeze of release-16.0 [#14409](https://github.com/vitessio/vitess/pull/14409) +### Testing +#### Query Serving + * [release-16.0] vtgate: Allow additional errors in warnings test (#14461) [#14463](https://github.com/vitessio/vitess/pull/14463) + diff --git a/changelog/16.0/16.0.6/release_notes.md b/changelog/16.0/16.0.6/release_notes.md new file mode 100644 index 00000000000..881ed26b348 --- /dev/null +++ b/changelog/16.0/16.0.6/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v16.0.6 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/16.0/16.0.6/changelog.md). + +The release includes 21 merged Pull Requests. + +Thanks to all our contributors: @app/github-actions, @app/vitess-bot, @harshit-gangal, @shlomi-noach + diff --git a/changelog/16.0/README.md b/changelog/16.0/README.md index d45a817ad48..2b25b22c476 100644 --- a/changelog/16.0/README.md +++ b/changelog/16.0/README.md @@ -1,5 +1,9 @@ ## v16.0 The dedicated team for this release can be found [here](team.md). +* **[16.0.6](16.0.6)** + * [Changelog](16.0.6/changelog.md) + * [Release Notes](16.0.6/release_notes.md) + * **[16.0.5](16.0.5)** * [Changelog](16.0.5/changelog.md) * [Release Notes](16.0.5/release_notes.md) diff --git a/changelog/17.0/17.0.4/changelog.md b/changelog/17.0/17.0.4/changelog.md new file mode 100644 index 00000000000..3aba7b735f9 --- /dev/null +++ b/changelog/17.0/17.0.4/changelog.md @@ -0,0 +1,48 @@ +# Changelog of Vitess v17.0.4 + +### Bug fixes +#### CLI + * [release-17.0] Fix anonymous paths in cobra code-gen (#14185) [#14237](https://github.com/vitessio/vitess/pull/14237) +#### Evalengine + * [release-17.0] evalengine: Misc bugs (#14351) [#14353](https://github.com/vitessio/vitess/pull/14353) +#### Examples + * [release-17.0] examples: fix flag syntax for zkctl (#14469) [#14486](https://github.com/vitessio/vitess/pull/14486) +#### General + * [release-17.0] viper: register dynamic config with both disk and live (#14453) [#14454](https://github.com/vitessio/vitess/pull/14454) +#### Online DDL + * [Release 17.0]: Online DDL: timeouts for all gRPC calls (#14182) [#14190](https://github.com/vitessio/vitess/pull/14190) + * [release-17.0] schemadiff: fix missing `DROP CONSTRAINT` in duplicate/redundant constraints scenario. (#14387) [#14390](https://github.com/vitessio/vitess/pull/14390) +#### Query Serving + * [release-17.0] Make column resolution closer to MySQL (#14426) [#14429](https://github.com/vitessio/vitess/pull/14429) + * [release-17.0] vtgate/engine: Fix race condition in join logic (#14435) [#14440](https://github.com/vitessio/vitess/pull/14440) + * [release-17.0] Ensure hexval and int don't share BindVar after Normalization (#14451) [#14478](https://github.com/vitessio/vitess/pull/14478) +#### Throttler + * [release-17.0] Tablet throttler: fix race condition by removing goroutine call (#14179) [#14199](https://github.com/vitessio/vitess/pull/14199) +#### VReplication + * [release-17.0] VDiff: wait for shard streams of one table diff to complete for before starting that of the next table (#14345) [#14381](https://github.com/vitessio/vitess/pull/14381) +### CI/Build +#### General + * [release-17.0] Upgrade the Golang version to `go1.20.9` [#14196](https://github.com/vitessio/vitess/pull/14196) + * [release-17.0] Upgrade the Golang version to `go1.20.10` [#14229](https://github.com/vitessio/vitess/pull/14229) +#### Online DDL + * [release-17.0] OnlineDDL: reduce vrepl_stress workload in forks (#14302) [#14348](https://github.com/vitessio/vitess/pull/14348) +### Dependabot +#### General + * [release-17.0] Bump github.com/cyphar/filepath-securejoin from 0.2.3 to 0.2.4 (#14239) [#14252](https://github.com/vitessio/vitess/pull/14252) + * [release-17.0] Bump golang.org/x/net from 0.14.0 to 0.17.0 (#14260) [#14263](https://github.com/vitessio/vitess/pull/14263) + * [release-17.0] Bump google.golang.org/grpc from 1.55.0-dev to 1.59.0 (#14364) [#14497](https://github.com/vitessio/vitess/pull/14497) +#### VTAdmin + * [release-17.0] Bump postcss from 8.4.21 to 8.4.31 in /web/vtadmin (#14173) [#14257](https://github.com/vitessio/vitess/pull/14257) + * [release-17.0] Bump @babel/traverse from 7.21.4 to 7.23.2 in /web/vtadmin (#14304) [#14307](https://github.com/vitessio/vitess/pull/14307) +### Enhancement +#### Build/CI + * [release-17.0] Automatic approval of `vitess-bot` clean backports (#14352) [#14356](https://github.com/vitessio/vitess/pull/14356) +### Release +#### General + * Code freeze of release-17.0 [#14407](https://github.com/vitessio/vitess/pull/14407) +### Testing +#### Cluster management + * Fix Upgrade downgrade reparent tests in release-17.0 [#14507](https://github.com/vitessio/vitess/pull/14507) +#### Query Serving + * [release-17.0] vtgate: Allow more errors for the warning check (#14421) [#14422](https://github.com/vitessio/vitess/pull/14422) + diff --git a/changelog/17.0/17.0.4/release_notes.md b/changelog/17.0/17.0.4/release_notes.md new file mode 100644 index 00000000000..30d3c9274e9 --- /dev/null +++ b/changelog/17.0/17.0.4/release_notes.md @@ -0,0 +1,7 @@ +# Release of Vitess v17.0.4 +The entire changelog for this release can be found [here](https://github.com/vitessio/vitess/blob/main/changelog/17.0/17.0.4/changelog.md). + +The release includes 23 merged Pull Requests. + +Thanks to all our contributors: @GuptaManan100, @app/github-actions, @app/vitess-bot, @mattlord, @shlomi-noach + diff --git a/changelog/17.0/README.md b/changelog/17.0/README.md index dcbba316bdd..655e9ac9349 100644 --- a/changelog/17.0/README.md +++ b/changelog/17.0/README.md @@ -1,4 +1,8 @@ ## v17.0 +* **[17.0.4](17.0.4)** + * [Changelog](17.0.4/changelog.md) + * [Release Notes](17.0.4/release_notes.md) + * **[17.0.3](17.0.3)** * [Changelog](17.0.3/changelog.md) * [Release Notes](17.0.3/release_notes.md) From 0fd0b361c8ff5fd095f5101a8eb8126fec2151aa Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Mon, 13 Nov 2023 14:09:57 +0530 Subject: [PATCH 23/39] Add `SHOW VSCHEMA KEYSPACES` query (#14505) Signed-off-by: Manan Gupta --- changelog/19.0/19.0.0/summary.md | 22 + go/test/endtoend/vtgate/foreignkey/fk_test.go | 13 + .../restarttablet/schema_restart_test.go | 2 + .../schematracker/sharded/st_sharded_test.go | 6 + go/vt/sqlparser/ast_funcs.go | 2 + go/vt/sqlparser/constants.go | 2 + go/vt/sqlparser/parse_test.go | 2 + go/vt/sqlparser/sql.go | 14716 ++++++++-------- go/vt/sqlparser/sql.y | 4 + go/vt/vtgate/planbuilder/show.go | 23 + .../planbuilder/testdata/show_cases.json | 18 + 11 files changed, 7482 insertions(+), 7328 deletions(-) diff --git a/changelog/19.0/19.0.0/summary.md b/changelog/19.0/19.0.0/summary.md index 5d413c25cae..aa0d1a90227 100644 --- a/changelog/19.0/19.0.0/summary.md +++ b/changelog/19.0/19.0.0/summary.md @@ -6,6 +6,8 @@ - **[Deprecations and Deletions](#deprecations-and-deletions)** - **[Docker](#docker)** - [New MySQL Image](#mysql-image) + - **[Query Compatibility](#query-compatibility)** + - [`SHOW VSCHEMA KEYSPACES` Query](#show-vschema-keyspaces) ## Major Changes @@ -21,3 +23,23 @@ In `v19.0` the Vitess team is shipping a new image: `vitess/mysql`. This lightweight image is a replacement of `vitess/lite` to only run `mysqld`. Several tags are available to let you choose what version of MySQL you want to use: `vitess/mysql:8.0.30`, `vitess/mysql:8.0.34`. + +### Query Compatibility + +#### `SHOW VSCHEMA KEYSPACES` Query + +A SQL query, `SHOW VSCHEMA KEYSPACES` is now supported in Vitess. This query prints the vschema information +for all the keyspaces. It is useful for seeing the foreign key mode, whether the keyspace is sharded, and if there is an +error in the VSchema for the keyspace. + +An example output of the query looks like - +```sql +mysql> show vschema keyspaces; ++---------------+---------+------------------+-------+ +| Keyspace Name | Sharded | Foreign Key Mode | Error | ++---------------+---------+------------------+-------+ +| uks | false | managed | | +| ks | true | managed | | ++---------------+---------+------------------+-------+ +2 rows in set (0.00 sec) +``` diff --git a/go/test/endtoend/vtgate/foreignkey/fk_test.go b/go/test/endtoend/vtgate/foreignkey/fk_test.go index ff7ddef66ff..afd04679066 100644 --- a/go/test/endtoend/vtgate/foreignkey/fk_test.go +++ b/go/test/endtoend/vtgate/foreignkey/fk_test.go @@ -18,6 +18,7 @@ package foreignkey import ( "context" + "fmt" "io" "testing" "time" @@ -907,6 +908,18 @@ func TestFkQueries(t *testing.T) { } } +// TestShowVschemaKeyspaces verifies the show vschema keyspaces query output for the keyspaces where the foreign keys are +func TestShowVschemaKeyspaces(t *testing.T) { + mcmp, closer := start(t) + conn := mcmp.VtConn + defer closer() + + res := utils.Exec(t, conn, "SHOW VSCHEMA KEYSPACES") + resStr := fmt.Sprintf("%v", res.Rows) + require.Contains(t, resStr, `[VARCHAR("uks") VARCHAR("false") VARCHAR("managed") VARCHAR("")]`) + require.Contains(t, resStr, `[VARCHAR("ks") VARCHAR("true") VARCHAR("managed") VARCHAR("")]`) +} + // TestFkOneCase is for testing a specific set of queries. On the CI this test won't run since we'll keep the queries empty. func TestFkOneCase(t *testing.T) { queries := []string{} diff --git a/go/test/endtoend/vtgate/schematracker/restarttablet/schema_restart_test.go b/go/test/endtoend/vtgate/schematracker/restarttablet/schema_restart_test.go index b89b0916e37..3bb4f6dfd9f 100644 --- a/go/test/endtoend/vtgate/schematracker/restarttablet/schema_restart_test.go +++ b/go/test/endtoend/vtgate/schematracker/restarttablet/schema_restart_test.go @@ -129,6 +129,8 @@ func TestVSchemaTrackerInit(t *testing.T) { 100*time.Millisecond, 60*time.Second, "initial table list not complete") + + utils.AssertMatches(t, conn, "SHOW VSCHEMA KEYSPACES", `[[VARCHAR("ks") VARCHAR("false") VARCHAR("unmanaged") VARCHAR("")]]`) } // TestVSchemaTrackerKeyspaceReInit tests that the vschema tracker diff --git a/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go b/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go index 1c9f4b0b6e2..8f8050bebe1 100644 --- a/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go +++ b/go/test/endtoend/vtgate/schematracker/sharded/st_sharded_test.go @@ -192,6 +192,12 @@ func TestInitAndUpdate(t *testing.T) { 30*time.Second, "initial table list not complete") + if vtgateVersion >= 19 { + utils.AssertMatches(t, conn, + "SHOW VSCHEMA KEYSPACES", + `[[VARCHAR("ks") VARCHAR("true") VARCHAR("unmanaged") VARCHAR("")]]`) + } + // Init _ = utils.Exec(t, conn, "create table test_sc (id bigint primary key)") expected = `[[VARCHAR("dual")] [VARCHAR("t2")] [VARCHAR("t2_id4_idx")] [VARCHAR("t8")] [VARCHAR("test_sc")]]` diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 6a1d5600740..4885f33ccec 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -1939,6 +1939,8 @@ func (ty ShowCommandType) ToString() string { return VitessVariablesStr case VschemaTables: return VschemaTablesStr + case VschemaKeyspaces: + return VschemaKeyspacesStr case VschemaVindexes: return VschemaVindexesStr case Warnings: diff --git a/go/vt/sqlparser/constants.go b/go/vt/sqlparser/constants.go index 3848c53f3e0..30effe51586 100644 --- a/go/vt/sqlparser/constants.go +++ b/go/vt/sqlparser/constants.go @@ -309,6 +309,7 @@ const ( VitessTargetStr = " vitess_target" VitessVariablesStr = " vitess_metadata variables" VschemaTablesStr = " vschema tables" + VschemaKeyspacesStr = " vschema keyspaces" VschemaVindexesStr = " vschema vindexes" WarningsStr = " warnings" @@ -881,6 +882,7 @@ const ( VitessTarget VitessVariables VschemaTables + VschemaKeyspaces VschemaVindexes Warnings Keyspace diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 1837a104e4c..ce5a5e14a3a 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -2369,6 +2369,8 @@ var ( input: "show vitess_targets", }, { input: "show vschema tables", + }, { + input: "show vschema keyspaces", }, { input: "show vschema vindexes", }, { diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index d837b38da7a..d4949c76839 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -1505,17 +1505,17 @@ var yyExca = [...]int{ 347, 167, -2, 523, -1, 61, - 36, 774, - 241, 774, - 252, 774, - 287, 788, - 288, 788, - -2, 776, + 36, 775, + 241, 775, + 252, 775, + 287, 789, + 288, 789, + -2, 777, -1, 66, - 243, 812, - -2, 810, + 243, 813, + -2, 811, -1, 122, - 240, 1587, + 240, 1588, -2, 133, -1, 124, 1, 160, @@ -1534,18 +1534,18 @@ var yyExca = [...]int{ 164, 41, -2, 45, -1, 939, - 87, 1604, - -2, 1458, - -1, 940, 87, 1605, - 223, 1609, -2, 1459, + -1, 940, + 87, 1606, + 223, 1610, + -2, 1460, -1, 941, - 223, 1608, + 223, 1609, -2, 42, -1, 1024, - 60, 886, - -2, 901, + 60, 887, + -2, 902, -1, 1111, 251, 43, 256, 43, @@ -1554,56 +1554,56 @@ var yyExca = [...]int{ 1, 580, 732, 580, -2, 167, - -1, 1498, - 223, 1609, - -2, 1459, - -1, 1707, - 60, 887, - -2, 906, + -1, 1499, + 223, 1610, + -2, 1460, -1, 1708, 60, 888, -2, 907, - -1, 1759, + -1, 1709, + 60, 889, + -2, 908, + -1, 1760, 136, 167, 178, 167, 347, 167, -2, 458, - -1, 1840, + -1, 1841, 137, 408, 246, 408, -2, 512, - -1, 1849, + -1, 1850, 251, 44, 256, 44, -2, 420, - -1, 2287, - 223, 1613, - -2, 1607, -1, 2288, - 223, 1609, - -2, 1605, - -1, 2388, + 223, 1614, + -2, 1608, + -1, 2289, + 223, 1610, + -2, 1606, + -1, 2389, 136, 167, 178, 167, 347, 167, -2, 459, - -1, 2395, + -1, 2396, 26, 188, -2, 190, - -1, 2849, + -1, 2850, 78, 98, 88, 98, - -2, 965, - -1, 2918, + -2, 966, + -1, 2919, 707, 698, -2, 672, - -1, 3126, - 50, 1555, - -2, 1549, - -1, 3941, + -1, 3127, + 50, 1556, + -2, 1550, + -1, 3942, 707, 698, -2, 686, - -1, 4028, + -1, 4029, 90, 630, 95, 630, 105, 630, @@ -1649,383 +1649,383 @@ var yyExca = [...]int{ 219, 630, 220, 630, 221, 630, - -2, 1976, + -2, 1977, } const yyPrivate = 57344 -const yyLast = 54976 +const yyLast = 55495 var yyAct = [...]int{ - 955, 3603, 3604, 87, 3602, 4026, 4103, 3922, 943, 3278, - 4116, 4007, 4070, 1263, 950, 3554, 942, 2081, 4071, 2385, - 1968, 3995, 3906, 3831, 2316, 3178, 3407, 3185, 3227, 2093, - 3236, 3241, 3238, 3237, 3235, 3240, 1762, 1261, 3139, 2024, - 3904, 3239, 5, 3541, 2745, 2318, 3256, 3079, 2459, 737, - 3193, 3255, 3143, 3140, 3452, 3446, 3641, 2982, 2340, 3127, - 2809, 731, 3438, 764, 904, 2356, 903, 2422, 908, 3972, - 3258, 42, 1818, 732, 2883, 3285, 2964, 2915, 2447, 1722, - 3472, 2427, 2885, 2884, 2359, 2373, 1022, 1073, 87, 2490, - 2360, 1041, 163, 1143, 1019, 2834, 1865, 2815, 2361, 41, - 3137, 2271, 2785, 1709, 2801, 2239, 43, 1022, 2283, 2238, - 2077, 2116, 2468, 2956, 2446, 2032, 149, 2348, 2429, 1847, - 1106, 1101, 1083, 2507, 2876, 1751, 2851, 1731, 2363, 1119, - 100, 2822, 1688, 1510, 104, 2120, 2336, 105, 2052, 1437, - 1422, 1964, 1854, 747, 3142, 1077, 1080, 2444, 1109, 1112, - 1946, 1081, 2418, 2419, 1021, 1107, 1025, 1108, 1750, 1058, - 1736, 1060, 2189, 735, 3636, 2128, 1031, 2147, 1040, 742, - 3894, 2783, 2341, 107, 1470, 1043, 1028, 2023, 1252, 85, - 1976, 1813, 167, 127, 125, 126, 99, 1026, 1192, 905, - 1494, 1017, 1839, 132, 1027, 133, 1053, 741, 1029, 734, - 98, 4104, 1259, 3542, 1238, 2284, 106, 1514, 2461, 2462, - 2463, 84, 1519, 93, 3224, 3957, 2461, 724, 2938, 2937, - 2505, 2906, 3534, 1048, 1052, 4053, 1016, 2972, 2973, 3953, - 1034, 3952, 2313, 2314, 669, 128, 2039, 3497, 2038, 2037, - 1074, 3958, 2036, 2035, 2034, 1145, 134, 1148, 2007, 1208, - 666, 1684, 667, 4047, 2553, 2781, 3123, 4074, 1162, 1163, - 1164, 1931, 1167, 1168, 1169, 1170, 1123, 3083, 1173, 1174, + 955, 3604, 3605, 87, 3603, 4027, 4104, 3923, 943, 3279, + 4117, 4008, 4071, 1264, 950, 3555, 942, 2082, 4072, 2386, + 1969, 3996, 3907, 3832, 2317, 3179, 3408, 3186, 3228, 2094, + 3237, 3242, 3239, 3238, 3236, 3241, 1763, 1262, 3140, 2025, + 3905, 3240, 5, 3542, 2746, 2319, 3257, 3080, 2460, 737, + 3194, 3256, 3144, 3141, 3453, 3447, 3642, 2983, 2341, 3128, + 2810, 731, 3439, 764, 904, 2357, 903, 2423, 908, 3973, + 3259, 42, 1819, 732, 2884, 3286, 2965, 2916, 2448, 1723, + 3473, 2428, 2886, 2885, 2360, 2374, 1022, 1073, 87, 2491, + 2361, 1041, 163, 1143, 1019, 2835, 1866, 2816, 2362, 41, + 3138, 2272, 2786, 1710, 2802, 2240, 43, 1022, 2284, 2239, + 2078, 2117, 2469, 2957, 2447, 2033, 149, 2349, 2430, 1848, + 1106, 1101, 1083, 2508, 2877, 1752, 2852, 1732, 2364, 1119, + 100, 2823, 1689, 1511, 104, 2121, 2337, 105, 2053, 1438, + 1423, 1965, 1855, 747, 3143, 1077, 1080, 2445, 1109, 1112, + 1947, 1081, 2419, 2420, 1021, 1107, 1025, 1108, 1751, 1058, + 1737, 1060, 2190, 735, 3637, 2129, 1031, 2148, 1040, 742, + 3895, 2784, 2342, 107, 1471, 1043, 1028, 2024, 1252, 85, + 1977, 1814, 167, 127, 125, 126, 99, 1026, 1192, 905, + 1495, 1017, 1840, 132, 1027, 133, 1053, 741, 1029, 734, + 98, 4105, 1260, 3543, 84, 1238, 106, 1515, 2462, 2463, + 2464, 3958, 1520, 93, 3225, 2285, 2462, 2939, 2938, 2506, + 2907, 3535, 1016, 1048, 1052, 4054, 2973, 2974, 3954, 2040, + 1034, 3953, 2314, 2315, 669, 128, 3608, 3959, 724, 2039, + 1074, 3498, 2038, 2037, 2036, 1145, 134, 1148, 2035, 2008, + 1208, 1685, 666, 2554, 667, 2782, 4048, 1434, 1162, 1163, + 1164, 1932, 1167, 1168, 1169, 1170, 1123, 3124, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1122, 1067, 1035, 1156, 1068, - 725, 1018, 2811, 95, 1209, 3607, 2, 1020, 1090, 1085, - 709, 1098, 3931, 2908, 1149, 1152, 1153, 128, 1097, 1096, - 1095, 95, 3246, 4126, 1433, 4069, 4094, 1454, 2494, 4109, - 1042, 4057, 4055, 3412, 3411, 709, 727, 2931, 3907, 2928, - 2055, 2746, 3953, 2044, 95, 3607, 3304, 909, 3827, 3246, - 1165, 111, 112, 113, 4108, 116, 4056, 4054, 122, 190, - 1015, 191, 3243, 3826, 661, 703, 1066, 1070, 907, 1066, - 1070, 907, 2493, 1147, 1146, 4084, 722, 723, 3244, 190, - 703, 3547, 3837, 129, 3548, 128, 1010, 1011, 1012, 1013, - 4051, 95, 3606, 1024, 3566, 3555, 172, 959, 960, 961, - 3996, 4004, 1716, 129, 3250, 3244, 2487, 1099, 1424, 3836, - 2086, 703, 4031, 3324, 703, 1828, 172, 3175, 3176, 86, - 2782, 1055, 1056, 700, 959, 960, 961, 86, 3174, 2945, - 2946, 3250, 3606, 1245, 2860, 1247, 2971, 2859, 86, 2865, - 2861, 2559, 2562, 2825, 2380, 2381, 1752, 4008, 1753, 4036, - 2379, 2955, 169, 2016, 2017, 170, 1256, 1228, 2492, 1094, - 1008, 1201, 1202, 1451, 1007, 1452, 1453, 4034, 2826, 3923, - 1972, 685, 169, 1244, 1246, 170, 4040, 4041, 189, 1229, - 2872, 1222, 3282, 1216, 683, 3195, 3196, 3654, 1217, 2398, - 2397, 3936, 4035, 1204, 1233, 1234, 3565, 95, 189, 86, - 1191, 3017, 88, 703, 2438, 95, 703, 2560, 3280, 2818, - 2819, 703, 3312, 2315, 3310, 1216, 95, 1092, 3247, 4075, - 1217, 2551, 2015, 4012, 680, 717, 2019, 2432, 1215, 721, - 1214, 1748, 1692, 695, 715, 1471, 3286, 2957, 1434, 2983, - 4076, 3878, 703, 3879, 2916, 3247, 2344, 2469, 690, 2941, - 4012, 2508, 4106, 1921, 2344, 1947, 1249, 3301, 693, 1472, - 1473, 1474, 1475, 1476, 1477, 1478, 1480, 1479, 1481, 1482, - 1423, 1255, 3273, 1230, 3283, 1223, 704, 95, 1254, 1242, - 3274, 1231, 1232, 1243, 1166, 2512, 2554, 2555, 2557, 2556, - 1237, 704, 173, 1248, 3194, 1059, 1197, 1922, 1235, 1923, - 3281, 179, 2959, 2514, 3536, 3535, 3197, 1973, 1236, 2529, - 2532, 2530, 173, 2531, 1172, 1171, 2510, 1121, 1241, 3811, - 2472, 179, 704, 2985, 1832, 704, 670, 2511, 672, 686, - 3611, 706, 2357, 705, 676, 3449, 674, 678, 687, 679, - 2513, 673, 1103, 684, 3532, 1093, 675, 688, 689, 692, - 696, 697, 698, 694, 691, 1141, 682, 707, 2515, 4048, - 1102, 1140, 1139, 1138, 1103, 1137, 3018, 2521, 2517, 2519, - 2520, 2518, 2522, 2523, 1136, 1135, 2431, 1134, 1129, 1142, - 1695, 3197, 4081, 4127, 1485, 3082, 1069, 1063, 1061, 1069, - 1063, 1061, 1078, 2995, 2994, 2993, 1078, 1115, 2987, 1078, - 2991, 1151, 2986, 1076, 2984, 1114, 1965, 1114, 2445, 2989, - 1260, 1150, 1260, 1260, 704, 2909, 1054, 704, 2988, 2960, - 1120, 2498, 704, 2497, 3217, 164, 1114, 1117, 1118, 1961, - 1078, 1425, 1159, 2940, 1111, 1115, 2990, 2992, 2342, 2343, - 1826, 1825, 1824, 2926, 1962, 164, 2342, 2343, 1822, 1207, - 660, 2954, 4049, 704, 2953, 1110, 3919, 1749, 3486, 3531, - 1022, 1495, 1500, 1501, 3468, 1504, 1506, 1507, 1508, 1509, - 2976, 1512, 1513, 1515, 1515, 2943, 1515, 1515, 1520, 1520, - 1520, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, - 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, - 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, - 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, - 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, - 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, - 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, - 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, - 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, - 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, - 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, - 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, - 1642, 1643, 1644, 1492, 1250, 3930, 2907, 1645, 1415, 1647, - 1648, 1649, 1650, 1651, 1416, 1417, 956, 1488, 1489, 1490, - 1491, 1520, 1520, 1520, 1520, 1520, 1520, 1502, 3495, 3496, - 708, 2491, 2930, 3450, 956, 1100, 1658, 1659, 1660, 1661, - 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, - 1496, 701, 1933, 1932, 1934, 1935, 1936, 956, 1438, 89, - 2874, 1062, 165, 3605, 1062, 1505, 702, 1685, 4010, 177, - 1203, 1200, 3302, 4039, 1213, 1212, 2929, 1218, 1219, 1220, - 1221, 1516, 165, 1517, 1518, 1432, 3248, 3249, 94, 177, - 1438, 1521, 1522, 3395, 1195, 4010, 94, 2561, 3564, 3252, - 4009, 1257, 1258, 3605, 2435, 1132, 1853, 94, 1130, 2560, - 185, 2910, 2963, 3248, 3249, 1715, 1485, 4038, 1121, 1226, - 1691, 2786, 2788, 2856, 2489, 2821, 3252, 4009, 2758, 1022, - 185, 2089, 1951, 1022, 1682, 1486, 1487, 1089, 1740, 1022, - 1091, 1646, 1206, 3091, 2436, 3090, 2816, 1121, 1482, 668, - 124, 2434, 2386, 166, 171, 168, 174, 175, 176, 178, - 180, 181, 182, 183, 1485, 1683, 1448, 3173, 94, 184, + 1020, 1018, 2812, 1717, 1209, 3608, 2, 4075, 1090, 1085, + 2495, 1098, 3084, 3932, 1149, 1152, 1153, 128, 1097, 1096, + 1095, 725, 3247, 2909, 1455, 4127, 4070, 4095, 3413, 3412, + 1042, 709, 4110, 3607, 2932, 709, 727, 3908, 4058, 1066, + 1070, 907, 3954, 4056, 95, 2747, 95, 909, 95, 3247, + 1165, 111, 112, 113, 2494, 116, 1015, 4109, 122, 190, + 2045, 191, 3244, 4057, 661, 703, 3305, 2056, 4055, 1066, + 1070, 907, 3828, 3827, 1147, 1146, 722, 723, 3245, 190, + 703, 4085, 3838, 129, 703, 128, 1010, 1011, 1012, 1013, + 4052, 95, 3607, 1024, 3567, 2929, 172, 959, 960, 961, + 1425, 3556, 3997, 129, 3251, 3245, 3548, 1099, 4005, 3549, + 2488, 3837, 2087, 4032, 703, 3325, 172, 2563, 1829, 3176, + 3177, 1055, 1056, 700, 959, 960, 961, 2783, 86, 3566, + 1094, 3251, 1201, 1202, 3175, 2493, 2381, 2382, 86, 2866, + 1089, 2972, 86, 1091, 1753, 2861, 1754, 4009, 2860, 4037, + 2560, 2862, 169, 2017, 2018, 170, 2380, 2956, 1228, 1257, + 1452, 1008, 1453, 1454, 1204, 1007, 2826, 4035, 1233, 1234, + 3924, 685, 169, 1229, 1216, 170, 4041, 4042, 189, 1217, + 1973, 1435, 2561, 1222, 683, 3196, 3197, 3655, 1092, 1216, + 2873, 2827, 4036, 3018, 1217, 2399, 2398, 703, 189, 3313, + 1191, 3311, 1215, 2439, 1214, 3283, 95, 3281, 2819, 2820, + 703, 703, 2552, 2316, 717, 703, 95, 2016, 3248, 2020, + 95, 721, 1749, 4013, 680, 715, 2433, 2942, 3287, 2958, + 1693, 2470, 3937, 695, 2917, 1953, 86, 1922, 3274, 88, + 2345, 4107, 1094, 2509, 1086, 3248, 3275, 3879, 690, 3880, + 4013, 1088, 1087, 2515, 2345, 1948, 2513, 1166, 693, 4076, + 1249, 1254, 1424, 1231, 1232, 1059, 1237, 1230, 1256, 1245, + 1197, 1247, 1235, 2960, 1255, 2511, 704, 1223, 3537, 3536, + 4077, 1923, 1236, 1924, 2533, 2555, 2556, 2558, 2557, 1172, + 1171, 704, 173, 1132, 3195, 704, 3812, 3284, 2512, 3282, + 1092, 179, 3533, 2530, 1696, 2531, 3198, 2532, 2516, 1244, + 1246, 2514, 173, 2473, 95, 1130, 1093, 1974, 1102, 3612, + 2358, 179, 1103, 1103, 1833, 704, 670, 4082, 672, 686, + 1141, 706, 1140, 705, 676, 1139, 674, 678, 687, 679, + 1138, 673, 1137, 684, 1136, 1135, 675, 688, 689, 692, + 696, 697, 698, 694, 691, 1142, 682, 707, 3019, 1069, + 1063, 1061, 4049, 2946, 2947, 1134, 1129, 3198, 4128, 1078, + 1114, 1472, 1486, 1486, 1115, 2432, 1151, 1078, 1078, 1966, + 2910, 1076, 1114, 2446, 1054, 2961, 1150, 3450, 3218, 1069, + 1063, 1061, 2499, 3302, 2498, 1473, 1474, 1475, 1476, 1477, + 1478, 1479, 1481, 1480, 1482, 1483, 1962, 1426, 704, 2941, + 1261, 1159, 1261, 1261, 1827, 1242, 1826, 3532, 1825, 1243, + 3083, 704, 704, 2927, 1963, 164, 704, 1823, 1093, 1248, + 1207, 660, 2343, 2344, 4050, 2522, 2518, 2520, 2521, 2519, + 2523, 2524, 1133, 1487, 1488, 164, 2343, 2344, 1750, 3920, + 1956, 3487, 1954, 1955, 1241, 1957, 1958, 3469, 2977, 2575, + 1022, 1496, 1501, 1502, 1131, 1505, 1507, 1508, 1509, 1510, + 2857, 1513, 1514, 1516, 1516, 2822, 1516, 1516, 1521, 1521, + 1521, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, + 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, + 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, + 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, + 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, + 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, + 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, + 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, + 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, + 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, + 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, + 1643, 1644, 1645, 1493, 3606, 1250, 3931, 1646, 2492, 1648, + 1649, 1650, 1651, 1652, 1417, 1418, 2908, 1489, 1490, 1491, + 1492, 1521, 1521, 1521, 1521, 1521, 1521, 1503, 1433, 1416, + 708, 3565, 3496, 3497, 1062, 1100, 1659, 1660, 1661, 1662, + 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, + 1497, 701, 1934, 1933, 1935, 1936, 1937, 956, 1439, 956, + 2875, 956, 165, 3606, 1062, 1506, 702, 1686, 4011, 177, + 1203, 1200, 2562, 4040, 1213, 1212, 2911, 1218, 1219, 1220, + 1221, 1517, 165, 1518, 1519, 3451, 3249, 3250, 2931, 177, + 3396, 1522, 1523, 1121, 2759, 4011, 89, 94, 1195, 3253, + 4010, 1258, 1259, 2436, 1158, 2561, 1854, 94, 1226, 2944, + 185, 94, 2964, 3249, 3250, 1716, 1121, 4039, 2787, 2789, + 1692, 2955, 2490, 2090, 2954, 1741, 3253, 4010, 1647, 1022, + 185, 1206, 2930, 1022, 1683, 3092, 1439, 3091, 1952, 1022, + 124, 2817, 668, 2437, 1121, 2387, 1486, 1483, 2586, 3174, + 2435, 1121, 1239, 166, 171, 168, 174, 175, 176, 178, + 180, 181, 182, 183, 4121, 1684, 1449, 1466, 1978, 184, 186, 187, 188, 166, 171, 168, 174, 175, 176, 178, - 180, 181, 182, 183, 1716, 2437, 2585, 1465, 1037, 184, - 186, 187, 188, 1253, 1952, 2433, 3944, 1699, 1448, 119, - 1144, 1703, 2574, 4120, 1239, 1977, 3527, 1021, 1121, 1477, - 1478, 1480, 1479, 1481, 1482, 1852, 1211, 3462, 2509, 2028, - 1958, 1120, 3003, 1701, 1754, 2121, 1702, 104, 2129, 2121, - 105, 2594, 1683, 1652, 1653, 1654, 1655, 1656, 1657, 1094, - 2899, 1086, 2130, 1454, 1158, 4085, 1689, 3650, 1088, 1087, - 1120, 1094, 1190, 2057, 1133, 1124, 1114, 1131, 1676, 1453, - 1126, 1452, 1453, 2585, 1127, 1125, 107, 2058, 1483, 1484, - 2056, 3502, 120, 3501, 1444, 2966, 2476, 1436, 2966, 1862, - 2965, 1454, 1948, 2965, 1949, 1128, 2113, 1950, 1861, 1851, - 2787, 2486, 2484, 1132, 1130, 1454, 1697, 1092, 2566, 2567, - 2568, 4077, 1829, 1830, 1831, 3487, 1444, 1845, 1033, 3974, - 3912, 1120, 4122, 3561, 3319, 3562, 1194, 1114, 1117, 1118, - 2488, 1078, 1700, 1718, 1225, 1111, 1115, 4090, 1716, 2481, - 1970, 1916, 1838, 1454, 1686, 1227, 1867, 1018, 1868, 1721, - 1870, 1872, 1698, 1196, 1876, 1878, 1880, 1882, 1884, 1857, - 1020, 1898, 1240, 1978, 3975, 3913, 1121, 1855, 1855, 1260, - 1210, 3819, 1745, 1746, 1454, 1121, 2481, 3818, 2485, 1906, - 1907, 1856, 1941, 2127, 709, 1912, 1913, 3809, 3577, 1451, - 1716, 1452, 1453, 1821, 2105, 2094, 2095, 2096, 2097, 2107, - 2098, 2099, 2100, 2112, 2108, 2101, 2102, 2109, 2110, 2111, - 2103, 2104, 2106, 1848, 3576, 2483, 1716, 1835, 1836, 1955, - 1834, 1953, 1954, 2126, 1956, 1957, 3509, 1451, 1716, 1452, - 1453, 1193, 1859, 1939, 4118, 1093, 3005, 4119, 1454, 4117, - 1704, 1451, 1928, 1452, 1453, 2276, 1940, 1093, 86, 44, - 45, 88, 1902, 1454, 4128, 2046, 2048, 2049, 3840, 1894, - 2621, 3508, 1897, 3498, 1899, 1966, 1748, 3225, 92, 1120, - 3213, 1157, 48, 76, 77, 1154, 74, 78, 1120, 1451, - 2047, 1452, 1453, 1124, 1114, 75, 3277, 2881, 1126, 959, - 960, 961, 1127, 1125, 2880, 1454, 2879, 1938, 2441, 128, - 1097, 1096, 1095, 1454, 1942, 1926, 1927, 1827, 1925, 1924, - 1451, 1914, 1452, 1453, 62, 1473, 1474, 1475, 1476, 1477, - 1478, 1480, 1479, 1481, 1482, 1983, 95, 1475, 1476, 1477, - 1478, 1480, 1479, 1481, 1482, 1260, 1260, 4088, 1716, 1979, - 1980, 4129, 1908, 1905, 1904, 1419, 1903, 1874, 2005, 87, - 1696, 4078, 87, 1984, 3939, 1454, 3492, 709, 2863, 709, - 1991, 1992, 1993, 1458, 1459, 1460, 1461, 1462, 1463, 1464, - 1456, 2004, 83, 1471, 1451, 2975, 1452, 1453, 1443, 1440, - 1441, 1442, 1447, 1449, 1446, 3938, 1445, 4018, 1716, 1451, - 3916, 1452, 1453, 2457, 2456, 3915, 1439, 1472, 1473, 1474, - 1475, 1476, 1477, 1478, 1480, 1479, 1481, 1482, 2455, 2454, - 1443, 1440, 1441, 1442, 1447, 1449, 1446, 42, 1445, 3914, - 42, 2084, 2084, 2082, 2082, 2085, 3814, 1454, 1439, 3798, - 1471, 1451, 3797, 1452, 1453, 2453, 2452, 1981, 2591, 1451, - 4079, 1452, 1453, 1454, 1985, 3649, 1987, 1988, 1989, 1990, - 3647, 2050, 2633, 1994, 1472, 1473, 1474, 1475, 1476, 1477, - 1478, 1480, 1479, 1481, 1482, 2006, 51, 54, 57, 56, - 59, 3573, 73, 2807, 4105, 82, 79, 1472, 1473, 1474, - 1475, 1476, 1477, 1478, 1480, 1479, 1481, 1482, 1725, 1454, - 1471, 1451, 2167, 1452, 1453, 1682, 110, 4065, 1716, 61, - 91, 90, 3181, 1681, 71, 72, 58, 109, 1680, 108, - 1679, 2590, 80, 81, 1472, 1473, 1474, 1475, 1476, 1477, - 1478, 1480, 1479, 1481, 1482, 85, 1683, 3481, 85, 2029, - 2054, 1454, 2631, 2156, 1726, 1450, 1716, 2012, 2013, 2807, - 4003, 1716, 1450, 1716, 3932, 2807, 3982, 3182, 2276, 2807, - 3978, 3845, 2273, 2061, 63, 64, 110, 65, 66, 67, - 68, 2275, 2059, 1451, 3506, 1452, 1453, 109, 3491, 108, - 3287, 3184, 101, 4016, 1716, 954, 3284, 1716, 103, 1451, - 2287, 1452, 1453, 102, 3965, 1716, 3844, 2286, 2060, 3179, - 2062, 2063, 2064, 2065, 2066, 2067, 2069, 2071, 2072, 2073, - 2074, 2075, 2076, 3216, 2285, 1496, 2088, 3195, 3196, 3215, - 2131, 2132, 2133, 2134, 3180, 4014, 1716, 103, 60, 2890, - 2274, 2877, 2122, 2272, 2145, 1451, 1678, 1452, 1453, 2166, - 2542, 2148, 2541, 2115, 2117, 2503, 2150, 1716, 1716, 3802, - 2155, 2151, 3545, 3929, 2152, 2153, 2154, 2502, 3186, 2149, - 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 1471, - 1454, 2573, 3822, 1716, 101, 2339, 2365, 1451, 2321, 1452, - 1453, 103, 2181, 1454, 2287, 102, 1716, 2290, 2291, 2807, - 3810, 2354, 2008, 1472, 1473, 1474, 1475, 1476, 1477, 1478, - 1480, 1479, 1481, 1482, 104, 3545, 1716, 105, 2285, 2807, - 3543, 3801, 2395, 1454, 2481, 1716, 3466, 1716, 89, 1454, - 2713, 1716, 3206, 3205, 2823, 104, 3194, 1974, 105, 3203, - 3204, 3553, 2179, 1454, 2053, 3201, 3202, 2917, 3197, 1937, - 1716, 2895, 2190, 2332, 2367, 1454, 3201, 3200, 1083, 1454, - 2831, 1716, 2560, 2939, 3891, 1716, 2394, 2349, 2350, 1454, - 1817, 2920, 2404, 2405, 2406, 2407, 1929, 3889, 1716, 3461, - 2399, 1454, 2400, 2401, 2402, 2403, 2913, 2914, 2390, 1034, - 1454, 1083, 2389, 2289, 2320, 1919, 2292, 2293, 2410, 2411, - 2412, 2413, 2371, 1454, 2807, 2806, 2831, 3886, 1716, 2326, - 2308, 2327, 1915, 3868, 1716, 2482, 1451, 1911, 1452, 1453, - 2424, 2393, 2263, 2264, 2265, 2266, 2267, 2334, 1910, 1451, - 1909, 1452, 1453, 2470, 1727, 2430, 1251, 94, 2352, 3437, - 1716, 2587, 1716, 3430, 1716, 2087, 1716, 2376, 2377, 2375, - 2823, 1454, 2331, 3427, 1716, 109, 2392, 1067, 2391, 1451, - 1068, 1452, 1453, 1454, 3183, 1451, 3927, 1452, 1453, 1729, - 1817, 1816, 2467, 2481, 3425, 1716, 2440, 2310, 1454, 1451, - 1450, 1452, 1453, 2190, 1454, 3463, 2852, 3387, 1716, 3970, - 1454, 1451, 2852, 1452, 1453, 1451, 1454, 1452, 1453, 2425, - 2414, 2416, 2417, 2421, 3943, 1451, 2803, 1452, 1453, 2439, - 2807, 2475, 2443, 1123, 2478, 2451, 2479, 1451, 2581, 1452, - 1453, 103, 3461, 1855, 1450, 2495, 1451, 2831, 1452, 1453, - 1760, 1759, 1122, 3138, 2425, 1728, 2477, 2474, 2473, 1451, - 3168, 1452, 1453, 70, 3461, 3510, 3416, 3385, 1716, 2853, - 2560, 2496, 2830, 2499, 3203, 2853, 190, 2500, 2501, 2855, - 3111, 1454, 3381, 1716, 2378, 2560, 2587, 2911, 3378, 1716, - 2713, 2618, 1717, 1719, 3376, 1716, 2617, 2481, 2464, 2587, - 129, 1454, 151, 2347, 1720, 2565, 1454, 1451, 2311, 1452, - 1453, 2087, 2030, 172, 2014, 1960, 3511, 3512, 3513, 1451, - 2506, 1452, 1453, 1747, 3228, 1105, 1104, 2831, 1454, 1506, - 95, 1506, 4044, 3985, 1451, 3833, 1452, 1453, 1023, 1723, - 1451, 3799, 1452, 1453, 162, 1454, 1451, 2577, 1452, 1453, - 150, 3661, 1451, 1454, 1452, 1453, 3526, 3523, 3504, 3329, - 3328, 1819, 2423, 2287, 2535, 3374, 1716, 3275, 1454, 169, - 2286, 3230, 170, 3226, 1454, 2921, 2420, 1471, 2415, 2409, - 1467, 2408, 1468, 1944, 3514, 3372, 1716, 2580, 1454, 2887, - 3432, 1841, 1842, 161, 160, 189, 1469, 1483, 1484, 1466, - 1850, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1480, 1479, - 1481, 1482, 3370, 1716, 1846, 2550, 95, 1451, 1815, 1452, - 1453, 121, 1195, 2886, 3187, 1890, 3279, 1454, 3191, 3428, - 2558, 3515, 3516, 3517, 3834, 3190, 1454, 1451, 3806, 1452, - 1453, 2438, 1451, 2324, 1452, 1453, 2010, 1454, 3473, 3474, - 4100, 1454, 3368, 1716, 4098, 2569, 1454, 4072, 3366, 1716, - 2054, 3479, 2629, 3951, 1451, 1454, 1452, 1453, 3873, 3192, - 1454, 2887, 3364, 1716, 3188, 1454, 1891, 1892, 1893, 3189, - 3476, 1451, 2571, 1452, 1453, 1454, 3222, 3221, 3220, 1451, - 3138, 1452, 1453, 2900, 2536, 1454, 155, 1843, 158, 665, - 1840, 2583, 156, 157, 1451, 3478, 1452, 1453, 2011, 173, - 1451, 2582, 1452, 1453, 3631, 2593, 3630, 2570, 179, 2572, - 3362, 1716, 3157, 3156, 1451, 3947, 1452, 1453, 2575, 1724, - 2576, 3360, 1716, 3835, 2544, 2545, 1716, 2578, 2330, 2547, - 3358, 1716, 3160, 1454, 3467, 2338, 2757, 3161, 2548, 3356, - 1716, 1454, 3158, 3116, 3354, 1716, 3115, 3159, 3911, 3352, - 1716, 3640, 3642, 1451, 3629, 1452, 1453, 1454, 2627, 3350, - 1716, 3457, 1451, 726, 1452, 1453, 1454, 3125, 2789, 3348, - 1716, 1959, 1006, 1451, 3199, 1452, 1453, 1451, 1454, 1452, - 1453, 2870, 1451, 1454, 1452, 1453, 1022, 2084, 1454, 2082, - 2792, 1451, 3454, 1452, 1453, 2891, 1451, 1038, 1452, 1453, - 3453, 1451, 1161, 1452, 1453, 1039, 1160, 2828, 2829, 3295, - 2886, 1451, 1886, 1452, 1453, 2790, 2365, 3334, 1716, 1022, - 2848, 1451, 101, 1452, 1453, 3317, 1716, 2969, 1418, 2129, - 2600, 3459, 164, 102, 2793, 3162, 2795, 2840, 2841, 103, - 2927, 2778, 1716, 2130, 2053, 129, 2827, 2615, 2808, 4114, - 2776, 1716, 3218, 1454, 2539, 3128, 3130, 1454, 4023, 1887, - 1888, 1889, 2751, 1716, 3131, 3928, 1454, 2728, 1716, 1451, - 3829, 1452, 1453, 3528, 101, 42, 3198, 1451, 2844, 1452, - 1453, 103, 1454, 2335, 2845, 102, 2804, 2847, 2528, 1454, - 1689, 2817, 2527, 1451, 2780, 1452, 1453, 2349, 2350, 1454, - 2846, 2526, 1451, 3114, 1452, 1453, 1046, 1047, 2525, 2873, - 2875, 3113, 2800, 2524, 1451, 1683, 1452, 1453, 3899, 1451, - 3439, 1452, 1453, 1454, 1451, 2820, 1452, 1453, 159, 2805, - 2564, 2866, 108, 2925, 3898, 110, 2850, 2720, 1716, 3637, - 3876, 2711, 1716, 3648, 3646, 1454, 109, 109, 108, 2854, - 2709, 1716, 3645, 3638, 2857, 3524, 3458, 2430, 3456, 2864, - 1454, 2867, 3231, 2465, 1454, 1833, 2696, 1716, 1045, 2936, - 1454, 2124, 3447, 2694, 1716, 2889, 2125, 110, 2823, 3615, - 2892, 2893, 1454, 3393, 2878, 4102, 4101, 1454, 109, 1451, - 108, 1452, 1453, 1451, 1454, 1452, 1453, 2888, 4101, 103, - 110, 2803, 1451, 3019, 1452, 1453, 2619, 2692, 1716, 1454, - 2896, 109, 2185, 2901, 2902, 2903, 2322, 2897, 1451, 1741, - 1452, 1453, 1733, 4102, 2933, 1451, 3917, 1452, 1453, 2690, - 1716, 1838, 114, 115, 3490, 1451, 152, 1452, 1453, 153, - 1036, 3, 97, 1, 2688, 1716, 2922, 2923, 2686, 1716, - 2027, 1454, 2912, 10, 3389, 2979, 2980, 1454, 2932, 1451, - 2025, 1452, 1453, 9, 1014, 1421, 2684, 1716, 1454, 165, - 1420, 2682, 1716, 1454, 2026, 3494, 177, 8, 2680, 1716, - 4033, 1451, 681, 1452, 1453, 2312, 1687, 1454, 4073, 4029, - 2996, 2958, 2269, 2678, 1716, 1454, 1451, 2977, 1452, 1453, - 1451, 2961, 1452, 1453, 4030, 1930, 1451, 1920, 1452, 1453, - 3556, 2237, 3830, 3234, 2471, 3522, 2428, 185, 1451, 1113, - 1452, 1453, 2302, 1451, 154, 1452, 1453, 2387, 2388, 1454, - 1451, 3998, 1452, 1453, 1454, 2676, 1716, 2934, 118, 1717, - 2309, 2674, 1716, 1071, 2997, 1451, 117, 1452, 1453, 3000, - 1116, 1224, 2672, 1716, 2466, 3546, 2871, 2670, 1716, 2396, - 166, 171, 168, 174, 175, 176, 178, 180, 181, 182, - 183, 2668, 1716, 1766, 2333, 1454, 184, 186, 187, 188, - 2882, 1764, 1765, 1763, 1768, 1767, 3303, 1451, 2978, 1452, - 1453, 2620, 3021, 1451, 3394, 1452, 1453, 3077, 2967, 2018, - 716, 2968, 2843, 710, 1451, 192, 1452, 1453, 1755, 1451, - 1454, 1452, 1453, 2666, 1716, 1734, 3408, 1155, 2664, 1716, - 671, 3207, 2504, 1451, 677, 1452, 1453, 2981, 1503, 2009, - 3112, 1451, 2858, 1452, 1453, 2998, 1065, 1057, 2323, 2794, - 1064, 3807, 3146, 3084, 3451, 3124, 3095, 3126, 3086, 2810, - 3129, 3122, 3910, 3639, 2365, 3983, 1454, 3012, 2868, 2662, - 1716, 2274, 1730, 2274, 2272, 1451, 2272, 1452, 1453, 3057, - 1451, 3415, 1452, 1453, 2592, 2119, 2442, 3145, 1493, 87, - 2364, 3610, 2365, 2365, 2365, 2365, 2365, 1454, 2999, 3067, - 3068, 3069, 3070, 3071, 2657, 1716, 1454, 2045, 739, 738, - 736, 3085, 2365, 3087, 2796, 2365, 2824, 1457, 944, 3095, - 2784, 1451, 1742, 1452, 1453, 2835, 3094, 1454, 2833, 3150, - 1970, 2832, 2367, 2537, 3167, 1454, 2372, 3475, 3471, 4025, - 1454, 2366, 2362, 2802, 895, 894, 3110, 3106, 3119, 748, - 2653, 1716, 740, 1454, 730, 893, 1451, 1025, 1452, 1453, - 2367, 2367, 2367, 2367, 2367, 3117, 1454, 892, 3120, 3261, - 3132, 3133, 1454, 3262, 2942, 3276, 3107, 3108, 3109, 3251, - 2367, 3326, 3151, 2367, 2944, 3154, 3149, 2869, 1026, 3259, - 3325, 3152, 3153, 3118, 3155, 1027, 3169, 104, 3163, 3170, - 105, 3171, 1451, 1454, 1452, 1453, 3272, 1435, 1706, 1084, - 3300, 2651, 1716, 3934, 2563, 3323, 1705, 3941, 3177, 2644, - 1716, 3242, 3540, 1454, 2642, 1716, 3223, 3209, 3059, 3210, - 3061, 2918, 3208, 1451, 2458, 1452, 1453, 3322, 69, 46, - 3211, 3212, 1451, 3905, 1452, 1453, 3072, 3073, 3074, 3075, - 2774, 3135, 3260, 3263, 3971, 3264, 2773, 887, 884, 2430, - 1454, 3232, 3253, 1451, 3612, 1452, 1453, 3613, 3614, 3080, - 3270, 1451, 3081, 1452, 1453, 3141, 1451, 3954, 1452, 1453, - 3141, 1454, 3955, 883, 3956, 2174, 1431, 2769, 1428, 1451, - 4046, 1452, 1453, 2020, 3288, 96, 36, 3291, 3290, 35, - 34, 33, 1451, 32, 1452, 1453, 26, 2768, 1451, 3298, - 1452, 1453, 25, 24, 23, 3308, 3305, 3306, 3254, 3307, - 22, 29, 3309, 19, 3311, 21, 3313, 2836, 2839, 2840, - 2841, 2837, 20, 2838, 2842, 18, 3245, 3473, 3474, 1451, - 4068, 1452, 1453, 4113, 2767, 1471, 123, 55, 52, 1506, - 50, 131, 130, 1506, 2579, 53, 49, 1198, 2584, 1451, - 47, 1452, 1453, 31, 30, 2766, 3233, 17, 16, 1472, - 1473, 1474, 1475, 1476, 1477, 1478, 1480, 1479, 1481, 1482, - 15, 2588, 14, 2589, 3410, 13, 12, 11, 2596, 7, - 6, 3414, 2598, 2599, 39, 38, 1451, 37, 1452, 1453, - 3299, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, - 2614, 28, 2616, 27, 40, 4, 2905, 1451, 2460, 1452, - 1453, 0, 0, 0, 3144, 0, 0, 0, 0, 2365, - 0, 3440, 3441, 3443, 0, 2622, 2623, 2624, 2625, 2626, - 0, 2628, 3488, 3448, 0, 2630, 3455, 0, 0, 2635, - 2636, 728, 2637, 0, 1454, 2640, 0, 2641, 2643, 2645, - 2646, 2647, 2648, 2649, 2650, 2652, 2654, 2655, 2656, 2658, - 1454, 2660, 2661, 2663, 2665, 2667, 2669, 2671, 2673, 2675, - 2677, 2679, 2681, 2683, 2685, 2687, 2689, 2691, 2693, 2695, - 2697, 2698, 2699, 3482, 2701, 3477, 2703, 2367, 2705, 2706, - 3460, 2708, 2710, 2712, 3480, 3260, 3263, 2715, 3264, 3445, - 0, 2719, 3489, 3483, 0, 2724, 2725, 2726, 2727, 3505, - 0, 3507, 3293, 3294, 0, 0, 0, 0, 2738, 2739, - 2740, 2741, 2742, 2743, 3550, 3551, 2747, 2748, 2765, 1454, - 0, 0, 3470, 0, 2750, 3499, 3500, 2113, 3417, 2756, - 3419, 3420, 3421, 1454, 2764, 2759, 2760, 2761, 2762, 2763, - 1044, 3484, 3485, 1050, 1050, 0, 2770, 2771, 0, 2772, - 0, 0, 2775, 2777, 2333, 0, 2779, 0, 0, 0, - 1454, 0, 0, 0, 1454, 0, 2791, 0, 0, 0, - 1451, 0, 1452, 1453, 0, 1454, 0, 0, 3533, 1454, - 0, 0, 3537, 3538, 3539, 0, 1451, 0, 1452, 1453, - 1454, 3552, 2836, 2839, 2840, 2841, 2837, 0, 2838, 2842, - 0, 0, 0, 2755, 1454, 3568, 0, 3529, 3530, 0, - 0, 0, 0, 1454, 0, 0, 0, 2754, 0, 0, - 0, 1454, 0, 0, 0, 2105, 2094, 2095, 2096, 2097, - 2107, 2098, 2099, 2100, 2112, 2108, 2101, 2102, 2109, 2110, - 2111, 2103, 2104, 2106, 2753, 0, 1454, 0, 2752, 0, - 1454, 0, 0, 0, 0, 1451, 0, 1452, 1453, 2749, - 1454, 0, 0, 2744, 1454, 0, 0, 0, 0, 1451, - 1454, 1452, 1453, 0, 2737, 0, 0, 0, 1454, 3628, - 0, 3632, 3633, 1454, 0, 0, 0, 3618, 2736, 3619, - 3620, 3621, 1454, 3608, 0, 0, 1451, 2735, 1452, 1453, - 1451, 0, 1452, 1453, 3145, 2734, 87, 3634, 3145, 0, - 0, 1451, 0, 1452, 1453, 1451, 0, 1452, 1453, 0, - 1454, 0, 0, 0, 0, 0, 1451, 0, 1452, 1453, - 2733, 0, 3572, 0, 2732, 0, 2084, 0, 2082, 3663, - 1451, 3635, 1452, 1453, 2731, 3655, 3644, 3643, 2730, 1451, - 0, 1452, 1453, 0, 2729, 3651, 3653, 1451, 1454, 1452, - 1453, 0, 2723, 0, 0, 0, 0, 2722, 0, 1454, - 0, 0, 0, 3813, 42, 0, 2721, 0, 0, 0, - 3667, 0, 1451, 0, 1452, 1453, 1451, 0, 1452, 1453, - 0, 0, 0, 0, 0, 0, 1451, 0, 1452, 1453, - 1451, 0, 1452, 1453, 2718, 0, 1451, 0, 1452, 1453, - 0, 0, 0, 3805, 1451, 3804, 1452, 1453, 0, 1451, - 0, 1452, 1453, 0, 0, 3820, 0, 0, 1451, 0, - 1452, 1453, 3825, 3832, 3824, 0, 1714, 1710, 3803, 0, - 0, 0, 2717, 0, 3870, 3871, 3007, 3008, 3009, 3010, - 3011, 1711, 3657, 2716, 3664, 3665, 1451, 0, 1452, 1453, - 0, 0, 2084, 0, 2082, 3874, 3016, 0, 3815, 3816, - 3817, 0, 0, 0, 0, 0, 2328, 2329, 1713, 0, - 1712, 3599, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3141, 0, 0, 1451, 3145, 1452, 1453, 0, 0, - 3877, 0, 3659, 3808, 3880, 1451, 0, 1452, 1453, 1523, + 180, 181, 182, 183, 2438, 1037, 1717, 1253, 1121, 184, + 186, 187, 188, 3945, 2434, 3004, 1120, 1700, 1144, 119, + 3528, 1704, 1114, 1117, 1118, 94, 1078, 1021, 3303, 1211, + 1111, 1115, 3463, 2900, 2510, 1853, 1121, 2029, 1959, 1120, + 1755, 2122, 2122, 1702, 2595, 4086, 1703, 104, 2130, 1454, + 105, 1110, 1684, 1653, 1654, 1655, 1656, 1657, 1658, 3651, + 1453, 1454, 2131, 3503, 1449, 3502, 1690, 1120, 2047, 2049, + 2050, 2477, 1124, 1114, 1120, 1094, 1190, 1126, 1677, 1124, + 1114, 1127, 1125, 1863, 1126, 2586, 107, 2487, 1127, 1125, + 1862, 2967, 120, 2048, 1445, 2482, 2966, 1437, 2967, 1852, + 4078, 2485, 1128, 2966, 1132, 1130, 3488, 2788, 1949, 2482, + 1950, 1120, 1033, 1951, 2058, 4123, 1698, 1114, 1117, 1118, + 1240, 1078, 1830, 1831, 1832, 1111, 1115, 1846, 2059, 1484, + 1485, 2057, 1455, 1225, 2486, 3182, 1979, 4129, 2489, 1120, + 1194, 1157, 1701, 1719, 1227, 1154, 3820, 3975, 2484, 3913, + 1971, 1917, 1839, 1196, 3819, 3810, 1868, 1018, 1869, 1722, + 1871, 1873, 1699, 1020, 1877, 1879, 1881, 1883, 1885, 1858, + 3578, 1899, 1445, 1210, 3562, 1687, 3563, 1856, 1856, 1261, + 3183, 2157, 1746, 1747, 2567, 2568, 2569, 1472, 3577, 1907, + 1908, 1857, 3976, 2128, 3914, 1913, 1914, 1478, 1479, 1481, + 1480, 1482, 1483, 1822, 3185, 4119, 3510, 3509, 4120, 2634, + 4118, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, + 1482, 1483, 3180, 1849, 4130, 3499, 1942, 1836, 1837, 1455, + 1835, 1476, 1477, 1478, 1479, 1481, 1480, 1482, 1483, 3226, + 3196, 3197, 1860, 1940, 3214, 1193, 1455, 3181, 2882, 2881, + 1705, 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, 1482, + 1483, 1093, 1903, 1455, 959, 960, 961, 2880, 1452, 1895, + 1453, 1454, 1898, 2442, 1900, 1967, 1717, 3006, 1943, 2149, + 1929, 3187, 3320, 2127, 2151, 2984, 1455, 1927, 2156, 2152, + 1941, 1455, 2153, 2154, 2155, 1472, 1926, 2150, 2158, 2159, + 2160, 2161, 2162, 2163, 2164, 2165, 2166, 1939, 2622, 128, + 1097, 1096, 1095, 4091, 1717, 1925, 1915, 1828, 1909, 1473, + 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, 1482, 1483, + 4089, 1717, 1906, 1905, 1904, 1984, 1459, 1460, 1461, 1462, + 1463, 1464, 1465, 1457, 1928, 1875, 1261, 1261, 1717, 3195, + 1980, 1981, 1697, 1455, 3493, 709, 4079, 2277, 2006, 1455, + 87, 3198, 3278, 87, 1985, 1452, 1455, 1453, 1454, 2986, + 2592, 1992, 1993, 1994, 709, 4019, 1717, 2630, 2864, 709, + 1749, 2005, 1452, 1420, 1453, 1454, 2458, 2457, 1444, 1441, + 1442, 1443, 1448, 1450, 1447, 1455, 1446, 2456, 2455, 1452, + 3940, 1453, 1454, 2454, 2453, 3939, 1440, 3917, 1455, 2114, + 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, 1482, + 1483, 3916, 1452, 3915, 1453, 1454, 3815, 1452, 42, 1453, + 1454, 42, 2085, 2085, 2083, 2083, 2086, 4017, 1717, 2996, + 2995, 2994, 2632, 2591, 2988, 1717, 2992, 1982, 2987, 1455, + 2985, 1717, 1451, 1717, 1986, 2990, 1988, 1989, 1990, 1991, + 2808, 4106, 2051, 1995, 2989, 3799, 1444, 1441, 1442, 1443, + 1448, 1450, 1447, 3798, 1446, 2007, 3650, 3184, 3648, 4015, + 1717, 1726, 2991, 2993, 1440, 101, 4066, 1717, 3933, 1452, + 3574, 1453, 1454, 1717, 3846, 1452, 102, 1453, 1454, 1451, + 1717, 3845, 1452, 2168, 1453, 1454, 1683, 2106, 2095, 2096, + 2097, 2098, 2108, 2099, 2100, 2101, 2113, 2109, 2102, 2103, + 2110, 2111, 2112, 2104, 2105, 2107, 1682, 1727, 2808, 4004, + 3803, 1452, 1681, 1453, 1454, 1455, 85, 1684, 1680, 85, + 2030, 2055, 1455, 3507, 1452, 3492, 1453, 1454, 2013, 2014, + 1472, 1717, 3802, 1468, 3288, 1469, 3285, 1455, 3217, 2350, + 2351, 2808, 3983, 3554, 2062, 3216, 2808, 3979, 2918, 1470, + 1484, 1485, 1467, 2060, 1473, 1474, 1475, 1476, 1477, 1478, + 1479, 1481, 1480, 1482, 1483, 1452, 2891, 1453, 1454, 3966, + 1717, 2288, 3546, 3930, 3823, 1717, 2808, 3811, 2287, 2061, + 2878, 2063, 2064, 2065, 2066, 2067, 2068, 2070, 2072, 2073, + 2074, 2075, 2076, 2077, 1455, 2286, 1497, 2089, 1472, 1455, + 2976, 2132, 2133, 2134, 2135, 1679, 3892, 1717, 3546, 1717, + 2896, 2275, 2543, 2123, 2273, 2146, 1472, 2542, 2574, 2504, + 2167, 3841, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1481, + 1480, 1482, 1483, 2503, 2116, 2118, 2808, 3544, 2482, 1717, + 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, 1482, + 1483, 1452, 2340, 1453, 1454, 101, 2322, 2366, 1452, 2009, + 1453, 1454, 103, 2182, 1455, 2288, 102, 2277, 2291, 2292, + 1975, 2274, 2355, 1452, 1938, 1453, 1454, 2804, 3890, 1717, + 2276, 3467, 1717, 3887, 1717, 104, 1930, 110, 105, 2286, + 2714, 1717, 103, 2396, 954, 3207, 3206, 3188, 109, 1920, + 108, 3192, 3204, 3205, 2395, 110, 104, 1916, 3191, 105, + 3202, 3203, 3169, 2180, 1912, 2054, 109, 103, 108, 3202, + 3201, 1717, 2561, 2191, 2333, 2368, 1455, 103, 1911, 1083, + 1452, 1910, 1453, 1454, 1728, 1452, 1251, 1453, 1454, 2832, + 1717, 2483, 3193, 2405, 2406, 2407, 2408, 3189, 3869, 1717, + 2588, 2400, 3190, 2401, 2402, 2403, 2404, 2561, 2940, 2391, + 1034, 1455, 1083, 2390, 3462, 2321, 1818, 2921, 1717, 2411, + 2412, 2413, 2414, 2372, 2290, 1455, 1717, 2293, 2294, 2853, + 2327, 2309, 2328, 2914, 2915, 95, 1717, 109, 2853, 2808, + 2807, 2425, 2394, 2264, 2265, 2266, 2267, 2268, 2335, 2482, + 1452, 1451, 1453, 1454, 2471, 2824, 2431, 2824, 1455, 2353, + 3438, 1717, 86, 44, 45, 88, 1455, 3464, 2377, 2378, + 2376, 1455, 2588, 1717, 2088, 1717, 2831, 2393, 1067, 2392, + 3971, 1068, 92, 2332, 1455, 3944, 48, 76, 77, 1455, + 74, 78, 2854, 2468, 2808, 3431, 1717, 2441, 2311, 75, + 1455, 2854, 2856, 2832, 2191, 1455, 1451, 1730, 3417, 3428, + 1717, 2561, 1452, 3204, 1453, 1454, 1818, 1817, 1761, 1760, + 2426, 2415, 2417, 2418, 2422, 3112, 2379, 2832, 62, 3462, + 2440, 2832, 2476, 2444, 1123, 2479, 2452, 2480, 1455, 2588, + 95, 3139, 3426, 1717, 1856, 2714, 2496, 1452, 2619, 1453, + 1454, 4080, 3462, 1122, 2618, 2426, 3928, 2478, 2475, 2474, + 2582, 1452, 1455, 1453, 1454, 3511, 2482, 2465, 3388, 1717, + 1455, 2348, 2497, 1729, 2500, 1721, 2312, 190, 2501, 2502, + 2088, 2031, 2015, 1961, 3386, 1717, 83, 1748, 2912, 3382, + 1717, 1105, 1718, 1720, 1452, 1104, 1453, 1454, 4045, 3986, + 1023, 129, 1452, 151, 1453, 1454, 2566, 1452, 1891, 1453, + 1454, 3834, 1455, 1724, 172, 3800, 3512, 3513, 3514, 1455, + 1452, 2507, 1453, 1454, 3662, 1452, 1455, 1453, 1454, 3527, + 1507, 3524, 1507, 3505, 3330, 3329, 1452, 1820, 1453, 1454, + 1455, 1452, 2424, 1453, 1454, 162, 3379, 1717, 2578, 1455, + 3276, 150, 3231, 1455, 3377, 1717, 3229, 1455, 3227, 1892, + 1893, 1894, 2922, 4101, 2288, 2536, 2421, 2416, 2410, 1455, + 169, 2287, 2409, 170, 1452, 1455, 1453, 1454, 95, 1945, + 51, 54, 57, 56, 59, 1851, 73, 1847, 2581, 82, + 79, 1816, 1842, 1843, 161, 160, 189, 3807, 1452, 121, + 1453, 1454, 2888, 3375, 1717, 1195, 1452, 3280, 1453, 1454, + 3373, 1717, 3835, 61, 91, 90, 2551, 2439, 71, 72, + 58, 3474, 3475, 4099, 3371, 1717, 80, 81, 1455, 2887, + 2325, 2559, 2011, 3369, 1717, 4073, 3952, 3367, 1717, 1455, + 3874, 3365, 1717, 3477, 3223, 1455, 3222, 3221, 1452, 1455, + 1453, 1454, 3139, 3363, 1717, 1452, 2570, 1453, 1454, 3361, + 1717, 2055, 1452, 2901, 1453, 1454, 1455, 2537, 63, 64, + 1455, 65, 66, 67, 68, 1455, 1452, 2888, 1453, 1454, + 3480, 3161, 3479, 2572, 3948, 1452, 3162, 1453, 1454, 1452, + 3158, 1453, 1454, 1452, 2012, 1453, 1454, 155, 1844, 158, + 3157, 1841, 2584, 156, 157, 1452, 3836, 1453, 1454, 3515, + 173, 1452, 2583, 1453, 1454, 665, 2594, 3159, 2571, 179, + 2573, 2339, 3160, 3359, 1717, 1887, 1725, 2331, 3468, 2576, + 3529, 2577, 60, 3357, 1717, 2545, 2546, 3117, 2579, 1455, + 2548, 3116, 3912, 3163, 1455, 2841, 2842, 2758, 3641, 2549, + 3355, 1717, 1455, 3643, 3353, 1717, 3516, 3517, 3518, 3351, + 1717, 3129, 3131, 3455, 1452, 3126, 1453, 1454, 1455, 2628, + 3132, 3454, 1888, 1889, 1890, 1452, 1455, 1453, 1454, 2790, + 1455, 1452, 3458, 1453, 1454, 1452, 1455, 1453, 1454, 726, + 3632, 1455, 3631, 2892, 1960, 1038, 1006, 1022, 2085, 3200, + 2083, 2793, 1452, 1039, 1453, 1454, 1452, 2871, 1453, 1454, + 1455, 1452, 3296, 1453, 1454, 1455, 1161, 1160, 2829, 2830, + 2130, 101, 89, 3349, 1717, 1455, 2791, 2366, 3335, 1717, + 1022, 2849, 102, 2887, 2131, 101, 3318, 1717, 2970, 2928, + 3630, 2601, 103, 164, 3460, 2794, 102, 2796, 1419, 129, + 2350, 2351, 2779, 1717, 103, 2054, 4115, 2828, 2616, 2809, + 2777, 1717, 3219, 2540, 2752, 1717, 4024, 3929, 3830, 3199, + 2729, 1717, 2845, 1455, 110, 1452, 2883, 1453, 1454, 2336, + 1452, 2529, 1453, 1454, 2528, 109, 42, 108, 1452, 2527, + 1453, 1454, 2526, 1455, 3482, 2846, 103, 2805, 2848, 2721, + 1717, 1690, 2818, 2525, 1452, 2781, 1453, 1454, 3440, 2712, + 1717, 2847, 1452, 1455, 1453, 1454, 1452, 1455, 1453, 1454, + 2874, 2876, 1452, 2801, 1453, 1454, 1684, 1452, 2565, 1453, + 1454, 94, 1455, 3115, 1046, 1047, 2821, 108, 109, 159, + 2806, 3114, 2867, 3900, 2926, 3899, 1452, 2851, 1453, 1454, + 3877, 1452, 3649, 1453, 1454, 1455, 110, 2710, 1717, 1455, + 2855, 1452, 3647, 1453, 1454, 2858, 3646, 109, 2431, 108, + 2865, 4102, 2868, 3639, 3525, 1455, 3459, 2697, 1717, 3457, + 2937, 1455, 2125, 3232, 2466, 1834, 2890, 2126, 1455, 110, + 1045, 2893, 2894, 1455, 3638, 2879, 3448, 2695, 1717, 1455, + 109, 2693, 1717, 2824, 1455, 4103, 4102, 4103, 2889, 1452, + 3918, 1453, 1454, 3616, 2804, 3491, 2691, 1717, 3020, 2620, + 1455, 2897, 2323, 2186, 2902, 2903, 2904, 1742, 2898, 1452, + 1734, 1453, 1454, 114, 115, 2934, 1036, 70, 2028, 2689, + 1717, 10, 1839, 2687, 1717, 2026, 3, 152, 9, 1452, + 153, 1453, 1454, 1452, 97, 1453, 1454, 2923, 2924, 2685, + 1717, 2027, 1455, 2913, 8, 3433, 2980, 2981, 1452, 2933, + 1453, 1454, 2683, 1717, 1, 1014, 1422, 2681, 1717, 1455, + 165, 1421, 3495, 2679, 1717, 1455, 4034, 177, 2677, 1717, + 681, 1452, 2313, 1453, 1454, 1452, 1688, 1453, 1454, 4074, + 4030, 2997, 2959, 2270, 2675, 1717, 4031, 1931, 2978, 1455, + 1921, 1452, 2962, 1453, 1454, 3557, 2238, 1452, 3831, 1453, + 1454, 3235, 1455, 2472, 1452, 3523, 1453, 1454, 185, 1452, + 2429, 1453, 1454, 2303, 1113, 1452, 154, 1453, 1454, 2388, + 1452, 2389, 1453, 1454, 3999, 1455, 2673, 1717, 2935, 118, + 1718, 2310, 1071, 1455, 117, 2998, 1452, 1116, 1453, 1454, + 3001, 1224, 2467, 2671, 1717, 3547, 2872, 2397, 1767, 2669, + 1717, 166, 171, 168, 174, 175, 176, 178, 180, 181, + 182, 183, 1765, 1766, 1764, 2334, 1455, 184, 186, 187, + 188, 1769, 1768, 2667, 1717, 3304, 2621, 3395, 1452, 2979, + 1453, 1454, 2019, 3022, 716, 2844, 2665, 1717, 3078, 710, + 2968, 1715, 1711, 2969, 192, 1452, 1756, 1453, 1454, 1735, + 3409, 1452, 1155, 1453, 1454, 671, 1712, 3208, 2505, 2663, + 1717, 677, 1504, 2010, 3113, 2859, 1065, 3429, 2982, 1057, + 2324, 2795, 1064, 3808, 3147, 1452, 2999, 1453, 1454, 3452, + 3125, 2329, 2330, 1714, 3085, 1713, 3127, 3096, 1452, 3087, + 1453, 1454, 2811, 3130, 3123, 2366, 3911, 1455, 3013, 3640, + 2658, 1717, 2275, 3984, 2275, 2273, 2869, 2273, 1731, 3416, + 3058, 1452, 2593, 1453, 1454, 2120, 1494, 2443, 3146, 1452, + 87, 1453, 1454, 2366, 2366, 2366, 2366, 2366, 1455, 3000, + 3068, 3069, 3070, 3071, 3072, 2365, 3611, 1455, 2046, 739, + 738, 736, 3086, 2366, 3088, 2797, 2366, 2825, 1458, 944, + 3096, 2785, 1452, 1743, 1453, 1454, 2836, 3095, 1455, 2834, + 3151, 1971, 2833, 2368, 2538, 3168, 1455, 2373, 3476, 3472, + 4026, 1455, 2367, 2363, 2803, 895, 894, 3111, 3107, 3120, + 748, 2654, 1717, 740, 1455, 730, 893, 892, 1025, 3262, + 3263, 2368, 2368, 2368, 2368, 2368, 3118, 1455, 2943, 3121, + 3277, 3133, 3134, 1455, 2945, 2870, 3273, 3108, 3109, 3110, + 3252, 2368, 3394, 3152, 2368, 1436, 3155, 3150, 1707, 1026, + 3260, 3390, 3153, 3154, 3119, 3156, 1027, 3170, 104, 3164, + 3171, 105, 3172, 1452, 1455, 1453, 1454, 1084, 3301, 3935, + 2564, 3324, 2652, 1717, 1706, 3942, 3243, 3541, 3224, 3178, + 2645, 1717, 2919, 2459, 1455, 2643, 1717, 69, 3210, 3060, + 3211, 3062, 46, 3209, 1452, 3906, 1453, 1454, 3327, 3972, + 887, 3212, 3213, 1452, 884, 1453, 1454, 3073, 3074, 3075, + 3076, 3326, 3136, 3261, 3264, 3613, 3265, 3323, 3614, 3615, + 2431, 1455, 3233, 3254, 1452, 3081, 1453, 1454, 3082, 3955, + 3956, 3271, 1452, 883, 1453, 1454, 3142, 1452, 3957, 1453, + 1454, 3142, 1455, 2175, 1432, 1429, 4047, 2021, 2775, 96, + 1452, 36, 1453, 1454, 35, 3289, 34, 33, 3292, 3291, + 32, 26, 25, 1452, 24, 1453, 1454, 23, 2774, 1452, + 3299, 1453, 1454, 22, 29, 19, 3309, 3306, 3307, 3255, + 3308, 21, 20, 3310, 18, 3312, 3246, 3314, 2837, 2840, + 2841, 2842, 2838, 4069, 2839, 2843, 4114, 123, 3474, 3475, + 1452, 55, 1453, 1454, 52, 2770, 1472, 50, 131, 130, + 1507, 53, 49, 1198, 1507, 2580, 47, 31, 30, 2585, + 1452, 17, 1453, 1454, 16, 15, 2769, 3234, 14, 13, + 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, 1482, + 1483, 12, 2589, 11, 2590, 3411, 7, 6, 39, 2597, + 38, 37, 3415, 2599, 2600, 28, 27, 1452, 40, 1453, + 1454, 3300, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, + 2614, 2615, 4, 2617, 2906, 2461, 0, 0, 1452, 0, + 1453, 1454, 0, 0, 0, 3145, 0, 0, 0, 0, + 2366, 0, 3441, 3442, 3444, 0, 2623, 2624, 2625, 2626, + 2627, 0, 2629, 3489, 3449, 0, 2631, 3456, 0, 0, + 2636, 2637, 728, 2638, 0, 1455, 2641, 0, 2642, 2644, + 2646, 2647, 2648, 2649, 2650, 2651, 2653, 2655, 2656, 2657, + 2659, 1455, 2661, 2662, 2664, 2666, 2668, 2670, 2672, 2674, + 2676, 2678, 2680, 2682, 2684, 2686, 2688, 2690, 2692, 2694, + 2696, 2698, 2699, 2700, 3483, 2702, 3478, 2704, 2368, 2706, + 2707, 3461, 2709, 2711, 2713, 3481, 3261, 3264, 2716, 3265, + 3446, 0, 2720, 3490, 3484, 0, 2725, 2726, 2727, 2728, + 3506, 0, 3508, 3294, 3295, 0, 0, 0, 0, 2739, + 2740, 2741, 2742, 2743, 2744, 3551, 3552, 2748, 2749, 2768, + 1455, 0, 0, 3471, 0, 2751, 3500, 3501, 2114, 3418, + 2757, 3420, 3421, 3422, 1455, 2767, 2760, 2761, 2762, 2763, + 2764, 1044, 3485, 3486, 1050, 1050, 0, 2771, 2772, 0, + 2773, 0, 0, 2776, 2778, 2334, 0, 2780, 0, 0, + 0, 1455, 0, 0, 0, 1455, 0, 2792, 0, 0, + 0, 1452, 0, 1453, 1454, 0, 1455, 0, 0, 3534, + 1455, 0, 0, 3538, 3539, 3540, 0, 1452, 0, 1453, + 1454, 1455, 3553, 2837, 2840, 2841, 2842, 2838, 0, 2839, + 2843, 0, 0, 0, 2766, 1455, 3569, 0, 3530, 3531, + 0, 0, 0, 0, 1455, 0, 0, 0, 2765, 0, + 0, 0, 1455, 0, 0, 0, 2106, 2095, 2096, 2097, + 2098, 2108, 2099, 2100, 2101, 2113, 2109, 2102, 2103, 2110, + 2111, 2112, 2104, 2105, 2107, 2756, 0, 1455, 0, 2755, + 0, 1455, 0, 0, 0, 0, 1452, 0, 1453, 1454, + 2754, 1455, 0, 0, 2753, 1455, 0, 0, 0, 0, + 1452, 1455, 1453, 1454, 0, 2750, 0, 0, 0, 1455, + 3629, 0, 3633, 3634, 1455, 0, 0, 0, 3619, 2745, + 3620, 3621, 3622, 1455, 3609, 0, 0, 1452, 2738, 1453, + 1454, 1452, 0, 1453, 1454, 3146, 2737, 87, 3635, 3146, + 0, 0, 1452, 0, 1453, 1454, 1452, 0, 1453, 1454, + 0, 1455, 0, 0, 0, 0, 0, 1452, 0, 1453, + 1454, 2736, 0, 3573, 0, 2735, 0, 2085, 0, 2083, + 3664, 1452, 3636, 1453, 1454, 2734, 3656, 3645, 3644, 2733, + 1452, 0, 1453, 1454, 0, 2732, 3652, 3654, 1452, 1455, + 1453, 1454, 0, 2731, 0, 0, 0, 0, 2730, 0, + 1455, 0, 0, 0, 3814, 42, 0, 2724, 0, 0, + 0, 3668, 0, 1452, 0, 1453, 1454, 1452, 0, 1453, + 1454, 0, 0, 0, 0, 0, 0, 1452, 0, 1453, + 1454, 1452, 0, 1453, 1454, 2723, 0, 1452, 0, 1453, + 1454, 0, 0, 0, 3806, 1452, 3805, 1453, 1454, 0, + 1452, 0, 1453, 1454, 0, 0, 3821, 0, 0, 1452, + 0, 1453, 1454, 3826, 3833, 3825, 0, 1715, 1711, 3804, + 0, 0, 0, 2722, 0, 3871, 3872, 3008, 3009, 3010, + 3011, 3012, 1712, 3658, 2719, 3665, 3666, 1452, 0, 1453, + 1454, 0, 0, 2085, 0, 2083, 3875, 3017, 0, 3816, + 3817, 3818, 0, 0, 0, 0, 0, 1708, 1709, 1714, + 0, 1713, 3600, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3142, 0, 0, 1452, 3146, 1453, 1454, 0, + 0, 3878, 0, 3660, 3809, 3881, 1452, 0, 1453, 1454, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, - 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1543, 1544, + 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, @@ -2033,651 +2033,659 @@ var yyAct = [...]int{ 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, - 1615, 1616, 1617, 1618, 1620, 1621, 1622, 1623, 1624, 1625, + 1615, 1616, 1617, 1618, 1619, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, - 1641, 1642, 1643, 1644, 1658, 1659, 1660, 1661, 1662, 1663, - 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 3921, 3918, - 3903, 3144, 3875, 3900, 3901, 3144, 3902, 1454, 0, 1714, - 1710, 1454, 3935, 0, 0, 0, 1454, 0, 0, 0, - 0, 0, 0, 1454, 1711, 0, 0, 0, 3920, 0, - 87, 0, 0, 0, 3147, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1454, 1707, - 1708, 1713, 3165, 1712, 0, 0, 3924, 0, 0, 0, - 0, 3937, 0, 0, 0, 0, 3940, 0, 0, 3942, - 3812, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1454, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3909, 2714, 0, 0, 0, 2707, 0, 0, 42, 0, - 2704, 0, 0, 0, 0, 0, 0, 2702, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1455, 3960, 0, 3980, 3961, 0, 0, 0, 87, - 0, 0, 2700, 0, 0, 0, 3926, 0, 0, 0, - 0, 0, 0, 1451, 3969, 1452, 1453, 1451, 0, 1452, - 1453, 1511, 1451, 0, 1452, 1453, 3976, 0, 0, 1451, - 3986, 1452, 1453, 0, 2659, 4011, 0, 3997, 3984, 0, - 3945, 0, 3989, 3994, 3991, 3990, 3988, 3993, 0, 0, - 3297, 3832, 4000, 3992, 1451, 0, 1452, 1453, 0, 0, - 0, 0, 3144, 4021, 0, 0, 0, 42, 0, 0, - 0, 0, 3314, 3315, 4024, 3316, 4042, 3318, 3320, 4032, - 0, 4037, 4066, 4050, 0, 0, 1451, 4011, 1452, 1453, - 4052, 3327, 1783, 0, 4063, 0, 3331, 3332, 3333, 3335, + 1636, 1642, 1643, 1644, 1645, 1659, 1660, 1661, 1662, 1663, + 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 3922, + 3919, 3904, 3145, 3876, 3901, 3902, 3145, 3903, 1455, 0, + 0, 0, 1455, 3936, 0, 0, 0, 1455, 0, 0, + 0, 0, 0, 0, 1455, 0, 0, 0, 0, 3921, + 0, 87, 0, 0, 0, 3148, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1455, + 0, 0, 0, 3166, 0, 0, 0, 3925, 0, 0, + 0, 0, 3938, 0, 0, 0, 0, 3941, 0, 0, + 3943, 3813, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1455, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3910, 2718, 0, 0, 0, 2717, 0, 0, 42, + 0, 2715, 0, 0, 0, 0, 0, 0, 2708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1456, 3961, 0, 3981, 3962, 0, 0, 0, + 87, 0, 0, 2705, 0, 0, 0, 3927, 0, 0, + 0, 0, 0, 0, 1452, 3970, 1453, 1454, 1452, 0, + 1453, 1454, 1512, 1452, 0, 1453, 1454, 3977, 0, 0, + 1452, 3987, 1453, 1454, 0, 2703, 4012, 0, 3998, 3985, + 0, 3946, 0, 3990, 3995, 3992, 3991, 3989, 3994, 0, + 0, 3298, 3833, 4001, 3993, 1452, 0, 1453, 1454, 0, + 0, 0, 0, 3145, 4022, 0, 0, 0, 42, 0, + 0, 0, 0, 3315, 3316, 4025, 3317, 4043, 3319, 3321, + 4033, 0, 4038, 0, 4051, 0, 0, 1452, 4012, 1453, + 1454, 4053, 3328, 0, 0, 4064, 0, 3332, 3333, 3334, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, 3345, - 3346, 3347, 3349, 3351, 3353, 3355, 3357, 3359, 3361, 3363, - 3365, 3367, 3369, 3371, 3373, 3375, 3377, 3379, 3380, 3382, - 3383, 3384, 3386, 1970, 4067, 3388, 4083, 3390, 3391, 3392, - 4082, 4093, 3396, 3397, 3398, 3399, 3400, 3401, 3402, 3403, - 3404, 3405, 3406, 2084, 4099, 2082, 4096, 4095, 4086, 4097, - 4092, 3413, 4062, 3981, 4011, 3418, 1454, 4107, 0, 3422, - 3423, 0, 3424, 3426, 4115, 3429, 3431, 3141, 3433, 3434, - 3435, 3436, 4123, 4121, 0, 1454, 3442, 0, 0, 1454, - 3949, 0, 0, 0, 1454, 0, 0, 0, 3959, 1454, - 0, 0, 4132, 4133, 3871, 4131, 0, 0, 1454, 0, - 0, 2084, 0, 2082, 4130, 0, 0, 0, 0, 3933, - 0, 3464, 3465, 0, 0, 3469, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1771, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2639, 4080, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2638, - 0, 0, 0, 2634, 0, 0, 0, 0, 2632, 0, - 0, 0, 4058, 2597, 0, 0, 0, 0, 0, 0, - 0, 0, 2586, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1451, 0, 1452, 1453, 0, 1732, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1451, 1784, 1452, 1453, 1451, 0, 1452, 1453, 0, - 1451, 3544, 1452, 1453, 0, 1451, 0, 1452, 1453, 0, - 0, 0, 0, 0, 1451, 1820, 1452, 1453, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3563, 0, 0, 3567, - 0, 0, 0, 0, 1797, 1800, 1801, 1802, 1803, 1804, - 1805, 0, 1806, 1807, 1809, 1810, 1808, 1811, 1812, 1785, - 1786, 1787, 1788, 1769, 1770, 1798, 3578, 1772, 0, 1773, - 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 0, 0, - 1782, 1789, 1790, 1791, 1792, 0, 1793, 1794, 1795, 1796, - 0, 0, 0, 1690, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 940, 0, 0, 0, 0, 0, 0, 0, 0, - 3601, 0, 0, 1975, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3609, 0, 0, 0, 0, 0, 0, - 0, 3616, 663, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1009, 0, 0, 0, 0, 195, 0, 0, - 195, 0, 0, 0, 714, 0, 0, 0, 0, 720, + 3346, 3347, 3348, 3350, 3352, 3354, 3356, 3358, 3360, 3362, + 3364, 3366, 3368, 3370, 3372, 3374, 3376, 3378, 3380, 3381, + 3383, 3384, 3385, 3387, 1971, 4068, 3389, 4084, 3391, 3392, + 3393, 4083, 4094, 3397, 3398, 3399, 3400, 3401, 3402, 3403, + 3404, 3405, 3406, 3407, 2085, 4100, 2083, 4097, 4096, 4087, + 4098, 4093, 3414, 4063, 3982, 4012, 3419, 1455, 4108, 0, + 3423, 3424, 0, 3425, 3427, 4116, 3430, 3432, 3142, 3434, + 3435, 3436, 3437, 4124, 4122, 0, 1455, 3443, 0, 0, + 1455, 3950, 0, 0, 0, 0, 0, 0, 0, 3960, + 1455, 0, 0, 4133, 4134, 3872, 4132, 0, 0, 1455, + 0, 0, 2085, 1455, 2083, 4131, 0, 1455, 0, 0, + 3934, 0, 3465, 3466, 0, 1455, 3470, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2701, 4081, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2660, 0, 0, 0, 2640, 1691, 0, 0, 0, 0, + 0, 0, 0, 4059, 2639, 0, 0, 0, 0, 0, + 0, 0, 0, 2635, 0, 0, 0, 2633, 0, 0, + 0, 2598, 0, 1452, 0, 1453, 1454, 0, 1733, 2587, + 0, 0, 0, 0, 0, 0, 0, 0, 957, 0, + 2277, 0, 1452, 958, 1453, 1454, 1452, 0, 1453, 1454, + 0, 0, 3545, 2084, 663, 0, 1452, 0, 1453, 1454, + 0, 0, 0, 0, 0, 1452, 1821, 1453, 1454, 1452, + 0, 1453, 1454, 1452, 1009, 1453, 1454, 0, 0, 0, + 0, 1452, 0, 1453, 1454, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3564, 0, 0, + 3568, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1079, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3579, 964, 965, + 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, + 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, + 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, + 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 940, 0, 0, 0, 0, 0, 0, 0, + 0, 3602, 0, 0, 1976, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3610, 0, 0, 0, 0, 0, + 0, 0, 3617, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, + 0, 195, 0, 0, 0, 714, 0, 0, 0, 0, + 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1079, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 720, 195, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 720, 195, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3822, 0, 0, + 0, 0, 0, 0, 0, 0, 3829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3821, 0, 0, 0, - 0, 0, 0, 0, 0, 3828, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1799, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3838, 3839, 0, 3841, 0, - 3842, 3843, 0, 0, 0, 3846, 3847, 3848, 3849, 3850, + 0, 0, 0, 0, 0, 0, 3839, 3840, 0, 3842, + 0, 3843, 3844, 0, 0, 0, 3847, 3848, 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3859, 3860, - 3861, 3862, 3863, 3864, 3865, 3866, 3867, 0, 3869, 3872, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3881, 3882, 3883, 3884, 3885, 3887, - 3888, 3890, 3892, 3893, 3895, 0, 0, 0, 0, 0, - 0, 0, 2040, 2041, 2042, 2043, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2051, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3925, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2090, 2091, 0, 0, 0, 0, 2114, 1050, - 1050, 2118, 0, 0, 0, 2123, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, - 0, 2146, 0, 0, 0, 2168, 2169, 2170, 2171, 2172, - 2173, 2175, 0, 2180, 0, 2182, 2183, 2184, 0, 2186, - 2187, 2188, 0, 2191, 2192, 2193, 2194, 2195, 2196, 2197, - 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, - 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, - 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, - 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2240, - 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, - 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, - 2261, 2262, 0, 0, 0, 0, 1783, 2268, 0, 2270, - 0, 2277, 2278, 2279, 2280, 2281, 2282, 1050, 0, 1050, - 1050, 1050, 1050, 1050, 0, 0, 0, 0, 0, 0, - 2294, 2295, 2296, 2297, 2298, 2299, 2300, 2301, 0, 2303, - 2304, 2305, 2306, 2307, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3950, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1050, 0, - 3966, 0, 0, 0, 0, 0, 3967, 3968, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2345, 2346, 0, 0, 0, 0, 0, 0, 3979, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2384, 0, 0, 0, - 0, 0, 0, 0, 4005, 4006, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 190, 0, 0, 4013, 4015, - 4017, 0, 1771, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, - 0, 151, 0, 4045, 0, 0, 0, 0, 0, 0, - 0, 0, 172, 0, 0, 0, 0, 2426, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1199, 0, 1205, 0, 0, 0, - 0, 4064, 0, 162, 0, 0, 0, 0, 0, 150, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 195, 0, 195, 0, 1784, 0, 169, 0, - 0, 170, 0, 0, 0, 4087, 4089, 4091, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 138, 139, 161, 160, 189, 0, 1427, 0, 0, 0, - 0, 720, 0, 720, 720, 0, 0, 0, 4112, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 720, 195, 0, 4124, 4125, 1797, 1800, - 1801, 1802, 1803, 1804, 1805, 0, 1806, 1807, 1809, 1810, - 1808, 1811, 1812, 1785, 1786, 1787, 1788, 1769, 1770, 1798, - 0, 1772, 1498, 1773, 1774, 1775, 1776, 1777, 1778, 1779, - 1780, 1781, 0, 0, 1782, 1789, 1790, 1791, 1792, 0, - 1793, 1794, 1795, 1796, 957, 0, 2276, 0, 0, 958, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2083, - 0, 0, 0, 0, 0, 155, 136, 158, 143, 135, - 0, 156, 157, 0, 0, 0, 0, 0, 173, 0, - 0, 0, 0, 0, 0, 0, 0, 179, 144, 0, + 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 0, 3870, + 3873, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3882, 3883, 3884, 3885, 3886, + 3888, 3889, 3891, 3893, 3894, 3896, 0, 0, 0, 0, + 0, 0, 0, 0, 2041, 2042, 2043, 2044, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2052, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3926, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2091, 2092, 0, 0, 0, 0, + 2115, 1050, 1050, 2119, 0, 0, 0, 2124, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, + 2144, 2145, 0, 2147, 0, 0, 0, 2169, 2170, 2171, + 2172, 2173, 2174, 2176, 0, 2181, 0, 2183, 2184, 2185, + 0, 2187, 2188, 2189, 0, 2192, 2193, 2194, 2195, 2196, + 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, + 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, + 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, + 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, + 2237, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, + 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, + 2260, 2261, 2262, 2263, 0, 0, 0, 0, 0, 2269, + 0, 2271, 0, 2278, 2279, 2280, 2281, 2282, 2283, 1050, + 0, 1050, 1050, 1050, 1050, 1050, 0, 0, 0, 0, + 0, 0, 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, + 0, 2304, 2305, 2306, 2307, 2308, 1199, 0, 1205, 0, + 0, 0, 0, 0, 0, 0, 0, 3951, 0, 0, + 0, 0, 0, 0, 0, 0, 4067, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1784, 0, 0, 0, + 1050, 3967, 0, 0, 0, 0, 0, 3968, 3969, 190, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2346, 2347, 0, 0, 0, 0, 1428, 3980, + 0, 0, 0, 129, 0, 151, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 172, 0, 2385, 0, + 0, 0, 0, 0, 0, 4006, 4007, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4014, + 4016, 4018, 0, 0, 0, 0, 0, 162, 0, 0, + 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4046, 0, 0, 0, 0, 0, + 0, 0, 169, 0, 0, 170, 0, 0, 0, 2427, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 138, 139, 161, 160, 189, 0, + 0, 0, 4065, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1772, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 195, 0, 195, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4088, 4090, 4092, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 720, 0, 720, 720, 0, 0, 0, 4113, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 720, 195, 0, 4125, 4126, 0, + 0, 0, 0, 0, 0, 0, 1785, 0, 0, 155, + 136, 158, 143, 135, 0, 156, 157, 0, 0, 0, + 0, 0, 173, 1499, 0, 0, 0, 0, 0, 0, + 0, 179, 144, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 147, 145, 140, 141, + 142, 146, 0, 0, 0, 0, 0, 0, 137, 0, + 0, 0, 0, 0, 0, 0, 0, 148, 1798, 1801, + 1802, 1803, 1804, 1805, 1806, 0, 1807, 1808, 1810, 1811, + 1809, 1812, 1813, 1786, 1787, 1788, 1789, 1770, 1771, 1799, + 0, 1773, 0, 1774, 1775, 1776, 1777, 1778, 1779, 1780, + 1781, 1782, 0, 0, 1783, 1790, 1791, 1792, 1793, 0, + 1794, 1795, 1796, 1797, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1745, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 164, 0, 0, 1762, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2596, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2602, 2603, 2604, 2605, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1499, 0, 0, 0, 0, 0, 0, + 0, 0, 1784, 0, 0, 0, 0, 0, 0, 0, + 0, 1901, 0, 0, 0, 0, 0, 0, 1512, 0, + 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1946, 0, 0, 0, + 195, 0, 0, 0, 720, 720, 0, 0, 0, 0, + 0, 0, 0, 1972, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 195, 0, 0, 0, 0, 0, 1983, + 0, 0, 0, 0, 0, 0, 1987, 0, 0, 1800, + 0, 0, 0, 720, 0, 0, 195, 1998, 1999, 2000, + 2001, 2002, 2003, 2004, 0, 0, 0, 0, 720, 0, + 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, + 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1772, 0, + 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 165, 0, 0, 1499, 0, 0, 0, 177, + 0, 720, 720, 0, 720, 0, 720, 720, 0, 720, + 720, 720, 720, 720, 720, 0, 0, 0, 0, 0, + 0, 1733, 1499, 0, 0, 1499, 720, 1499, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 147, 145, 140, 141, 142, 146, 0, 0, - 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, - 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 964, 965, 966, 967, 968, 969, - 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, - 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, - 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 0, 0, 0, 0, + 185, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2595, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2601, 2602, 2603, 2604, 0, 0, 0, - 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1498, 0, 0, 0, 0, 0, 0, 0, + 0, 720, 1785, 195, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 720, 0, 195, + 195, 0, 0, 166, 171, 168, 174, 175, 176, 178, + 180, 181, 182, 183, 0, 0, 195, 0, 0, 184, + 186, 187, 188, 195, 0, 0, 0, 0, 0, 0, + 0, 0, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 720, 0, 2034, 1798, 1801, 1802, 1803, 1804, 1805, + 1806, 0, 1807, 1808, 1810, 1811, 1809, 1812, 1813, 1786, + 1787, 1788, 1789, 1770, 1771, 1799, 0, 1773, 0, 1774, + 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 0, 0, + 1783, 1790, 1791, 1792, 1793, 0, 1794, 1795, 1796, 1797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1511, 0, 0, 1799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, - 0, 0, 0, 720, 720, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1744, 0, 0, - 0, 0, 195, 0, 0, 0, 0, 159, 0, 0, - 0, 0, 0, 0, 0, 0, 1761, 0, 0, 0, - 0, 0, 720, 0, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 720, 0, 0, - 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1498, 0, 0, 0, 0, 1900, - 720, 720, 0, 720, 0, 720, 720, 0, 720, 720, - 720, 720, 720, 720, 0, 152, 0, 0, 153, 1732, - 0, 1498, 0, 0, 1498, 720, 1498, 195, 0, 0, - 0, 0, 0, 0, 1945, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 195, 165, 0, - 0, 1971, 0, 0, 0, 177, 0, 0, 0, 0, - 720, 0, 195, 0, 0, 0, 0, 1982, 0, 0, - 0, 0, 0, 0, 1986, 0, 720, 0, 195, 195, - 0, 0, 0, 0, 0, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 0, 0, 0, 195, 185, 0, 0, 0, - 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 720, 0, 0, 0, 0, 0, 0, 0, 939, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, - 171, 168, 174, 175, 176, 178, 180, 181, 182, 183, - 0, 0, 0, 0, 0, 184, 186, 187, 188, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1050, 0, 0, 3002, 3003, 0, 0, 3005, 0, + 0, 3007, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 720, 720, + 0, 3014, 3015, 3016, 0, 0, 0, 0, 0, 0, + 0, 720, 0, 3021, 0, 0, 3023, 3024, 3025, 0, + 195, 0, 3026, 3027, 0, 0, 3028, 0, 3029, 0, + 0, 0, 0, 0, 0, 3030, 0, 3031, 0, 0, + 0, 3032, 0, 3033, 0, 0, 3034, 0, 3035, 0, + 3036, 0, 3037, 0, 3038, 0, 3039, 0, 3040, 0, + 3041, 0, 3042, 0, 3043, 0, 3044, 0, 3045, 720, + 3046, 0, 3047, 0, 3048, 0, 3049, 0, 3050, 1499, + 3051, 0, 0, 0, 3052, 1800, 3053, 0, 3054, 0, + 0, 3055, 0, 3056, 0, 3057, 1499, 2241, 3059, 0, + 0, 3061, 0, 0, 3063, 3064, 3065, 3066, 0, 0, + 0, 0, 3067, 2241, 2241, 2241, 2241, 2241, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3077, 0, + 2352, 0, 0, 0, 0, 0, 3090, 0, 2356, 3094, + 2359, 1050, 0, 2034, 0, 0, 0, 0, 3097, 3098, + 3099, 3100, 3101, 3102, 0, 0, 0, 3103, 3104, 0, + 3105, 0, 3106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 699, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2974, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, - 719, 0, 0, 0, 0, 0, 0, 0, 0, 1050, - 0, 0, 3001, 3002, 0, 0, 3004, 0, 0, 3006, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2033, 0, 0, 0, 0, 0, 720, 720, 0, 3013, - 3014, 3015, 0, 0, 0, 0, 0, 0, 0, 720, - 0, 3020, 0, 0, 3022, 3023, 3024, 0, 195, 0, - 3025, 3026, 0, 0, 3027, 0, 3028, 0, 0, 0, - 0, 0, 0, 3029, 0, 3030, 0, 0, 0, 3031, - 0, 3032, 0, 0, 3033, 0, 3034, 0, 3035, 0, - 3036, 0, 3037, 0, 3038, 0, 3039, 0, 3040, 0, - 3041, 0, 3042, 0, 3043, 0, 3044, 720, 3045, 0, - 3046, 0, 3047, 0, 3048, 0, 3049, 1498, 3050, 0, - 0, 0, 3051, 0, 3052, 0, 3053, 0, 0, 3054, - 0, 3055, 0, 3056, 1498, 2240, 3058, 0, 0, 3060, - 0, 0, 3062, 3063, 3064, 3065, 0, 0, 0, 0, - 3066, 2240, 2240, 2240, 2240, 2240, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3076, 0, 0, 0, - 0, 0, 0, 0, 3089, 0, 0, 3093, 0, 1050, - 0, 0, 0, 0, 0, 0, 3096, 3097, 3098, 3099, - 3100, 3101, 0, 0, 0, 3102, 3103, 0, 3104, 0, - 3105, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3136, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2288, 0, - 3166, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 957, 0, 0, 0, 0, 958, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2083, 0, - 0, 0, 195, 0, 0, 0, 0, 720, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2351, 0, 0, - 0, 3229, 0, 0, 0, 2355, 0, 2358, 0, 0, - 2033, 0, 195, 0, 0, 720, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 195, 0, 0, 0, 720, - 0, 0, 2288, 195, 0, 195, 0, 195, 195, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 720, 964, 965, 966, 967, 968, 969, 970, - 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, - 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, - 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, - 1001, 1002, 1003, 1004, 1005, 0, 0, 3321, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 720, - 0, 3330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 720, 0, 0, 0, - 0, 0, 720, 0, 0, 190, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1837, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, - 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 172, 0, 0, 0, 0, 0, 0, 720, - 0, 0, 0, 0, 720, 0, 0, 0, 720, 720, - 0, 0, 0, 0, 0, 0, 0, 0, 2033, 0, - 0, 0, 0, 162, 0, 2516, 0, 0, 0, 150, - 0, 0, 0, 0, 2533, 2534, 0, 0, 2538, 0, - 0, 0, 0, 0, 0, 0, 195, 0, 169, 0, - 2543, 170, 0, 195, 0, 0, 0, 2546, 719, 1414, - 719, 719, 195, 195, 0, 0, 195, 0, 195, 0, - 1841, 1842, 161, 160, 189, 0, 0, 0, 195, 0, - 719, 0, 0, 2549, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1497, - 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, - 720, 0, 0, 0, 0, 0, 0, 0, 3525, 0, + 2289, 0, 3167, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 195, 190, 0, 0, 0, 720, + 0, 0, 0, 0, 0, 0, 1838, 0, 0, 0, + 0, 0, 0, 3230, 0, 0, 0, 0, 0, 129, + 0, 151, 0, 0, 195, 0, 0, 720, 0, 0, + 0, 0, 172, 0, 0, 0, 0, 195, 0, 0, + 0, 720, 0, 0, 2289, 195, 0, 195, 0, 195, + 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2034, 0, 162, 720, 0, 0, 0, 2517, 150, + 0, 0, 0, 0, 0, 0, 0, 2534, 2535, 0, + 0, 2539, 0, 0, 0, 0, 0, 0, 169, 0, + 0, 170, 0, 2544, 0, 0, 0, 0, 0, 0, + 2547, 0, 0, 0, 0, 0, 0, 0, 0, 3322, + 1842, 1843, 161, 160, 189, 0, 0, 0, 0, 0, + 0, 720, 0, 3331, 0, 0, 2550, 0, 0, 0, + 0, 939, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 720, 0, + 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 699, 0, 0, 0, 0, 0, 719, + 0, 720, 0, 0, 0, 0, 720, 0, 0, 0, + 720, 720, 0, 0, 0, 155, 1844, 158, 0, 1841, + 0, 156, 157, 0, 0, 0, 0, 0, 173, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, + 0, 719, 0, 719, 0, 195, 0, 0, 0, 0, + 0, 0, 0, 0, 195, 195, 0, 0, 195, 0, + 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 195, 0, 0, 0, 0, 0, 0, 195, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, + 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, + 3526, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3549, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 155, 1843, 158, 0, 1840, - 0, 156, 157, 0, 0, 0, 0, 0, 173, 1498, - 0, 2288, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 164, 0, 3550, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3569, - 0, 3570, 0, 0, 3571, 0, 0, 3574, 3575, 0, - 0, 0, 0, 0, 0, 0, 3579, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 897, 0, 0, - 3580, 0, 3581, 0, 3582, 0, 3583, 0, 3584, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1499, 0, 2289, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3570, 0, 3571, 0, 0, 3572, 0, 0, 3575, + 3576, 0, 0, 0, 0, 0, 0, 0, 3580, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3581, 0, 3582, 0, 3583, 159, 3584, 0, 3585, 0, 3586, 0, 3587, 0, 3588, 0, 3589, 0, 3590, 0, 3591, 0, 3592, 0, 3593, 0, 3594, 0, - 3595, 0, 0, 3596, 0, 0, 0, 3597, 0, 3598, - 0, 0, 0, 0, 0, 3600, 0, 0, 0, 0, - 0, 0, 0, 193, 0, 0, 664, 0, 0, 1497, - 0, 0, 0, 0, 0, 0, 0, 0, 3617, 0, - 0, 164, 0, 0, 0, 0, 664, 3622, 0, 3623, - 3624, 0, 3625, 0, 3626, 0, 0, 0, 0, 3627, - 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1051, - 1051, 0, 0, 0, 3652, 0, 0, 0, 664, 0, - 719, 719, 0, 0, 0, 3660, 0, 0, 3662, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3666, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3800, 0, 0, 719, - 0, 0, 0, 195, 0, 0, 0, 159, 0, 0, - 0, 195, 0, 0, 719, 0, 0, 0, 0, 0, - 0, 0, 720, 0, 0, 1814, 0, 0, 0, 0, - 0, 0, 0, 720, 2849, 1823, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 195, 719, 0, - 1849, 0, 195, 0, 0, 0, 0, 0, 1858, 0, - 0, 1497, 1860, 0, 0, 1863, 1864, 719, 719, 0, - 719, 0, 719, 719, 0, 719, 719, 719, 719, 719, - 719, 0, 0, 0, 0, 0, 0, 0, 1497, 1895, - 1896, 1497, 719, 1497, 0, 1901, 0, 0, 2898, 0, - 0, 0, 0, 0, 896, 152, 0, 0, 153, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3908, - 720, 0, 0, 0, 0, 0, 195, 719, 0, 0, - 0, 0, 0, 195, 0, 0, 0, 0, 165, 0, - 1963, 0, 0, 719, 0, 177, 0, 720, 0, 0, - 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, - 0, 0, 0, 720, 2947, 2948, 2949, 2950, 2951, 2952, - 0, 0, 718, 0, 0, 0, 0, 0, 0, 1498, - 0, 0, 0, 0, 0, 0, 185, 719, 0, 2033, - 2962, 0, 195, 195, 195, 195, 195, 195, 0, 0, + 3595, 0, 3596, 0, 0, 3597, 0, 2850, 0, 3598, + 0, 3599, 0, 0, 0, 0, 0, 3601, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2970, 0, 0, 195, 195, 0, - 0, 0, 0, 0, 1075, 0, 1082, 0, 0, 166, + 3618, 0, 0, 0, 0, 0, 0, 0, 0, 3623, + 0, 3624, 3625, 0, 3626, 0, 3627, 0, 0, 0, + 0, 3628, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2899, 0, 0, 0, 152, 3653, 0, 153, 0, + 0, 0, 0, 0, 0, 0, 0, 3661, 0, 0, + 3663, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3667, 0, 0, 0, 0, 0, 165, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 3801, 0, + 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, + 0, 0, 0, 195, 0, 0, 0, 2948, 2949, 2950, + 2951, 2952, 2953, 0, 720, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 720, 185, 0, 0, 0, + 0, 0, 2034, 2963, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, + 0, 0, 0, 0, 195, 0, 0, 2971, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 171, 168, 174, 175, 176, 178, 180, 181, 182, 183, - 0, 0, 195, 0, 0, 184, 186, 187, 188, 0, + 0, 0, 0, 0, 0, 184, 186, 187, 188, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3909, 720, 0, 0, 0, 0, 0, 195, 0, + 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 720, + 0, 0, 0, 0, 0, 0, 720, 0, 0, 0, + 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 957, 0, + 0, 1499, 0, 958, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2084, 195, 195, 195, 195, 195, 195, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 719, 1415, 719, 719, 0, 0, 0, 0, 195, + 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1498, 0, 0, 0, 0, 720, 964, 965, + 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, + 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, + 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, + 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, + 897, 0, 0, 0, 3949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3963, 0, 0, 3964, 0, 3965, 193, 0, 0, 664, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3220, 0, 664, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, + 0, 0, 0, 3258, 0, 0, 0, 0, 0, 0, + 720, 0, 1051, 1051, 0, 0, 0, 3272, 0, 0, + 0, 664, 720, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3290, 0, 0, + 3293, 0, 1498, 0, 0, 0, 0, 0, 0, 4044, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, - 0, 0, 3948, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, + 0, 720, 0, 0, 0, 0, 0, 0, 4060, 0, + 4061, 0, 4062, 0, 0, 720, 0, 0, 0, 1499, + 0, 0, 720, 720, 1499, 195, 195, 195, 195, 195, + 0, 0, 0, 719, 719, 0, 0, 195, 0, 0, + 0, 0, 0, 195, 0, 195, 0, 0, 195, 195, + 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4111, 0, 4112, 0, 0, 719, 0, 0, + 0, 0, 0, 0, 195, 0, 0, 0, 1815, 0, + 0, 0, 0, 0, 0, 0, 0, 720, 1824, 0, + 1499, 0, 0, 0, 0, 720, 0, 0, 0, 3445, + 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 719, 896, 1850, 195, 0, 0, 0, 0, 0, + 0, 1859, 0, 0, 1498, 1861, 0, 0, 1864, 1865, + 719, 719, 0, 719, 195, 719, 719, 195, 719, 719, + 719, 719, 719, 719, 0, 0, 0, 0, 0, 0, + 0, 1498, 1896, 1897, 1498, 719, 1498, 0, 1902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 719, 719, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 719, 0, 3962, 0, - 0, 3963, 0, 3964, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 718, 0, 0, 0, 3504, 0, 0, 0, 0, 0, + 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1964, 3519, 0, 719, 3520, 3521, 3522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1075, 0, 1082, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 719, 720, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 719, 0, 0, 0, 720, 0, - 0, 0, 0, 0, 1497, 0, 0, 0, 0, 0, - 720, 0, 0, 2092, 0, 0, 0, 0, 0, 0, - 0, 1497, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4043, 0, 0, - 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 195, 0, 0, 664, 720, - 664, 0, 0, 0, 0, 0, 4059, 0, 4060, 0, - 4061, 0, 0, 720, 0, 0, 0, 1498, 0, 0, - 720, 720, 1498, 195, 195, 195, 195, 195, 0, 0, - 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, - 0, 195, 0, 195, 0, 0, 195, 195, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 664, 0, 0, 0, 3219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4110, 0, 4111, 0, 0, 0, 0, 0, 1499, 0, - 3257, 0, 195, 0, 0, 719, 0, 0, 0, 0, - 0, 0, 0, 0, 3271, 720, 0, 0, 1498, 0, - 0, 0, 0, 720, 0, 0, 0, 0, 195, 0, - 0, 0, 0, 0, 3289, 0, 0, 3292, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, - 0, 0, 195, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 719, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 719, + 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 195, 0, 0, 195, 195, 195, 0, 0, 0, + 0, 0, 0, 0, 720, 720, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 720, 720, 720, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 664, 0, 664, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1498, 0, + 0, 0, 0, 0, 0, 0, 0, 2093, 0, 0, + 0, 0, 0, 0, 0, 1498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 719, 0, 0, 720, - 0, 0, 0, 2448, 2449, 2450, 3444, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1499, 0, - 0, 0, 0, 719, 0, 0, 0, 0, 0, 719, - 1858, 0, 0, 1858, 195, 1858, 0, 0, 0, 0, - 0, 2480, 0, 0, 1262, 0, 1262, 1262, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1426, 0, 0, 0, - 0, 0, 0, 0, 0, 664, 719, 0, 0, 0, - 0, 719, 0, 0, 0, 719, 719, 0, 0, 0, - 195, 3503, 0, 0, 0, 0, 0, 0, 1032, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3518, 0, 0, 3519, 3520, 3521, 0, 0, 195, - 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, - 664, 0, 195, 195, 195, 0, 0, 0, 0, 0, - 0, 0, 720, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1499, 0, 0, 0, 0, 0, 0, 719, 0, 0, - 0, 720, 720, 720, 720, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1499, 0, 0, - 1499, 0, 1499, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1917, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, - 0, 0, 0, 0, 0, 0, 1497, 0, 719, 0, - 0, 0, 0, 0, 1969, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 664, 0, 0, 0, 0, 0, 0, 664, 0, - 0, 0, 0, 0, 0, 0, 0, 1995, 1996, 664, - 664, 664, 664, 664, 664, 664, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1499, 0, 0, 0, 0, + 720, 0, 720, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1693, 1694, 0, 0, - 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1498, 0, 0, 0, 0, 720, 0, - 720, 0, 0, 0, 0, 1738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1756, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, + 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 195, 0, 0, 720, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 719, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 719, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 720, 0, - 0, 0, 0, 0, 1075, 0, 0, 0, 0, 0, - 0, 195, 0, 0, 720, 0, 0, 0, 0, 0, - 0, 0, 0, 1866, 1866, 0, 1866, 720, 1866, 1866, - 0, 1875, 1866, 1866, 1866, 1866, 1866, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1075, 0, - 0, 0, 0, 0, 664, 0, 0, 0, 0, 719, + 0, 1500, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1943, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1967, - 720, 0, 0, 0, 720, 720, 0, 0, 0, 0, - 0, 0, 0, 1499, 0, 2862, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1051, 1051, 0, 0, 0, - 1499, 0, 0, 720, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 720, 0, 0, 0, 720, 720, 0, 0, + 0, 0, 1263, 0, 1263, 1263, 0, 0, 664, 0, + 719, 3947, 0, 0, 0, 0, 0, 2449, 2450, 2451, + 0, 0, 0, 0, 1427, 720, 0, 0, 0, 0, + 0, 1032, 0, 0, 0, 0, 0, 719, 0, 0, + 0, 0, 0, 719, 1859, 0, 0, 1859, 0, 1859, + 0, 0, 0, 0, 664, 2481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, - 0, 719, 0, 0, 0, 1858, 1858, 0, 0, 0, + 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 719, 0, 0, 0, 0, 719, 0, 0, 0, 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1497, 2935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1051, 1969, 1051, 1051, 1051, 1051, 1051, - 0, 720, 0, 0, 0, 0, 0, 0, 3946, 0, - 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, + 1500, 0, 0, 1500, 0, 1500, 664, 0, 0, 0, + 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1918, 0, 0, 195, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 664, 0, 0, 0, 0, 0, 720, 195, 0, + 0, 0, 0, 0, 0, 0, 0, 1970, 664, 0, + 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, + 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, + 1996, 1997, 664, 664, 664, 664, 664, 664, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 720, 195, 0, 1917, 1262, - 1262, 0, 719, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2021, 0, 1051, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 664, 0, 0, 0, 0, 0, 0, 1969, 664, - 719, 664, 0, 664, 2374, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 720, - 2078, 0, 0, 0, 0, 0, 0, 0, 0, 1498, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, + 1498, 1499, 719, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 720, 2288, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 720, 2289, 0, + 0, 0, 0, 0, 1694, 1695, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 720, 0, 0, + 0, 0, 0, 195, 720, 0, 0, 0, 0, 0, + 0, 0, 0, 1739, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 720, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, - 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 720, 0, + 0, 0, 1075, 195, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 720, 0, 720, + 0, 1867, 1867, 0, 1867, 0, 1867, 1867, 664, 1876, + 1867, 1867, 1867, 1867, 1867, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1075, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 720, 0, 719, 0, - 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 720, 719, 720, 0, 0, - 0, 1262, 0, 0, 0, 0, 0, 0, 0, 0, - 719, 0, 0, 0, 1497, 0, 0, 719, 719, 1497, - 0, 0, 664, 0, 0, 0, 0, 0, 0, 664, - 0, 0, 0, 0, 0, 0, 0, 0, 664, 664, - 0, 0, 664, 0, 2540, 0, 0, 0, 0, 0, - 2325, 0, 0, 0, 664, 0, 0, 0, 0, 0, - 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2337, 0, - 3214, 0, 0, 0, 0, 0, 0, 664, 0, 0, - 0, 0, 1738, 0, 0, 1262, 0, 0, 0, 0, - 0, 0, 719, 0, 0, 1497, 0, 0, 0, 0, - 719, 0, 0, 95, 0, 1075, 957, 0, 0, 0, - 945, 958, 959, 960, 961, 946, 0, 0, 947, 948, - 0, 949, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 954, 962, 963, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3296, 0, 0, 1499, 0, 1969, 0, 0, - 0, 0, 1082, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3265, 3266, 0, 0, 0, 1075, - 0, 0, 0, 0, 0, 1082, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, - 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, - 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, - 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 0, 0, - 0, 0, 1075, 0, 0, 0, 0, 2078, 0, 0, - 0, 2078, 2078, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1944, 0, 0, 0, 0, 0, 1500, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1968, 0, 1051, + 1051, 0, 0, 0, 1500, 0, 0, 0, 0, 0, + 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3268, 3269, 0, 0, - 0, 0, 0, 2552, 0, 3493, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 664, - 0, 0, 0, 0, 0, 0, 0, 1917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1051, 1970, 1051, + 1051, 1051, 1051, 1051, 0, 0, 0, 0, 719, 0, + 0, 0, 0, 0, 0, 719, 0, 0, 0, 1859, + 1859, 0, 0, 0, 719, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1498, 2936, 1918, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1051, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1263, 1263, + 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, + 0, 2022, 0, 0, 0, 664, 0, 0, 0, 0, + 0, 0, 1970, 664, 0, 664, 0, 664, 2375, 95, + 0, 0, 957, 0, 0, 0, 945, 958, 959, 960, + 961, 946, 0, 0, 947, 948, 0, 949, 0, 0, + 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, + 0, 954, 962, 963, 0, 0, 0, 0, 0, 2079, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, + 3266, 3267, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 964, 965, 966, 967, 968, 969, 970, 971, + 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, + 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 719, - 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, + 1263, 719, 0, 664, 0, 0, 0, 0, 0, 0, + 0, 0, 664, 664, 0, 0, 664, 0, 2541, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, + 0, 0, 719, 0, 0, 664, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2326, + 719, 0, 3269, 3270, 0, 0, 0, 0, 0, 0, + 0, 664, 0, 0, 719, 0, 0, 0, 1498, 0, + 0, 719, 719, 1498, 0, 0, 0, 2338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 664, 1262, 0, 0, 0, 664, 0, - 910, 0, 0, 0, 0, 0, 914, 0, 0, 0, - 911, 912, 0, 0, 0, 913, 915, 0, 719, 719, - 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1739, 0, 0, 1263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1075, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3215, 0, 910, 0, 0, 1500, + 0, 1970, 914, 0, 0, 0, 911, 912, 0, 0, + 0, 913, 915, 0, 0, 0, 719, 0, 0, 1498, + 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, + 0, 1082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1075, 0, + 0, 0, 0, 0, 1082, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 664, 0, 0, 0, 0, 0, 0, 2904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1075, 0, 0, 0, 0, 2079, 0, 0, 0, + 2079, 2079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1499, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 664, 664, - 664, 664, 664, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 664, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1497, 0, 0, 0, 0, 719, 0, 719, 0, 0, - 0, 0, 0, 0, 0, 1051, 0, 0, 0, 0, + 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2797, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, + 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, + 0, 1918, 2553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, + 0, 0, 664, 0, 0, 0, 0, 0, 0, 3494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2894, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, - 2337, 719, 719, 0, 0, 0, 0, 2919, 0, 0, - 0, 0, 0, 0, 0, 1051, 2924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, + 0, 0, 0, 2905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 719, 719, 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1499, 0, 0, 0, 0, 1499, 664, - 664, 664, 664, 664, 0, 0, 0, 0, 0, 0, - 0, 3164, 0, 0, 0, 0, 0, 1917, 0, 664, - 0, 0, 664, 3172, 1969, 0, 0, 0, 2078, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 664, 664, 664, 664, 664, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3688, 3690, 3689, 3753, 3754, 3755, 3756, 3757, - 3758, 3759, 789, 0, 0, 0, 0, 0, 664, 0, - 0, 0, 0, 0, 0, 0, 2078, 0, 719, 0, - 0, 0, 0, 0, 1499, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, - 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, - 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 664, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, - 0, 3078, 0, 0, 0, 0, 1497, 0, 719, 0, - 0, 0, 0, 1262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 719, 719, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1866, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, - 0, 0, 3121, 0, 0, 0, 0, 0, 0, 719, - 0, 0, 0, 0, 0, 0, 1262, 0, 0, 0, - 0, 0, 0, 3148, 1866, 0, 0, 0, 0, 0, - 664, 0, 0, 0, 0, 0, 0, 0, 3694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 719, 0, 3702, 3703, 0, 0, 3778, 3777, 3776, - 0, 0, 3774, 3775, 3773, 0, 0, 0, 0, 0, - 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, - 0, 0, 719, 0, 719, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1075, 0, - 0, 0, 0, 0, 0, 664, 2337, 3779, 910, 0, - 765, 766, 3780, 3781, 914, 3782, 768, 769, 911, 912, - 0, 763, 767, 913, 915, 664, 0, 0, 664, 664, - 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3685, - 3686, 3687, 3691, 3692, 3693, 3704, 3751, 3752, 3760, 3762, - 866, 3761, 3763, 3764, 3765, 3768, 3769, 3770, 3771, 3766, - 3767, 3772, 3668, 3672, 3669, 3670, 3671, 3683, 3673, 3674, - 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 3684, 3783, - 3784, 3785, 3786, 3787, 3788, 3697, 3701, 3700, 3698, 3699, - 3695, 3696, 3723, 3722, 3724, 3725, 3726, 3727, 3728, 3729, - 3731, 3730, 3732, 3733, 3734, 3735, 3736, 3737, 3705, 3706, - 3709, 3710, 3708, 3707, 3711, 3720, 3721, 3712, 3713, 3714, - 3715, 3716, 3717, 3719, 3718, 3738, 3739, 3740, 3741, 3742, - 3744, 3743, 3747, 3748, 3746, 3745, 3750, 3749, 0, 0, - 0, 0, 3409, 0, 0, 0, 0, 0, 0, 0, - 916, 0, 917, 0, 0, 921, 0, 0, 0, 923, - 922, 0, 924, 886, 885, 0, 0, 918, 919, 0, - 920, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2798, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2813, 0, 0, 0, 0, + 0, 0, 0, 0, 1498, 0, 0, 0, 0, 719, + 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1917, 0, 0, 0, 0, 3789, 3790, 3791, 3792, 3793, - 3794, 3795, 3796, 0, 0, 0, 0, 0, 0, 1499, + 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, + 0, 0, 2895, 0, 0, 0, 0, 0, 719, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1051, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2338, + 0, 0, 0, 0, 0, 0, 2920, 0, 0, 0, + 0, 0, 0, 0, 0, 2925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 719, 0, 0, 0, 719, 719, 1500, 0, 0, + 0, 0, 1500, 664, 664, 664, 664, 664, 0, 0, + 0, 0, 0, 0, 0, 3165, 0, 0, 0, 0, + 0, 1918, 0, 664, 719, 0, 664, 3173, 1970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2337, 2337, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1500, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, + 0, 0, 0, 0, 0, 2079, 0, 0, 0, 0, + 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1917, 0, 0, + 0, 0, 664, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3557, 3558, 3559, 3560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3079, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1867, 0, 0, 0, 0, 0, 0, + 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1498, 3122, 719, 0, 664, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1263, 0, 0, 0, 0, + 0, 0, 3149, 1867, 0, 0, 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 664, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 719, 0, 1075, 0, 664, + 0, 0, 664, 664, 664, 2338, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 719, 3689, 3691, + 3690, 3754, 3755, 3756, 3757, 3758, 3759, 3760, 789, 0, + 0, 0, 0, 0, 0, 0, 719, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2685,1299 +2693,693 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3656, 0, 3658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2337, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1917, 0, 0, 0, 3823, 0, 0, + 0, 3410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1262, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1500, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3695, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3703, + 3704, 0, 0, 3779, 3778, 3777, 0, 0, 3775, 3776, + 3774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3896, 0, 0, 0, 3896, 3896, 0, - 0, 0, 0, 0, 0, 1499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2337, 0, 0, 0, - 0, 0, 3999, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2338, 2338, 0, 0, 0, 0, + 0, 1918, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3780, 910, 0, 765, 766, 3781, 3782, + 914, 3783, 768, 769, 911, 912, 0, 763, 767, 913, + 915, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3558, 3559, 3560, 3561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3686, 3687, 3688, 3692, 3693, + 3694, 3705, 3752, 3753, 3761, 3763, 866, 3762, 3764, 3765, + 3766, 3769, 3770, 3771, 3772, 3767, 3768, 3773, 3669, 3673, + 3670, 3671, 3672, 3684, 3674, 3675, 3676, 3677, 3678, 3679, + 3680, 3681, 3682, 3683, 3685, 3784, 3785, 3786, 3787, 3788, + 3789, 3698, 3702, 3701, 3699, 3700, 3696, 3697, 3724, 3723, + 3725, 3726, 3727, 3728, 3729, 3730, 3732, 3731, 3733, 3734, + 3735, 3736, 3737, 3738, 3706, 3707, 3710, 3711, 3709, 3708, + 3712, 3721, 3722, 3713, 3714, 3715, 3716, 3717, 3718, 3720, + 3719, 3739, 3740, 3741, 3742, 3743, 3745, 3744, 3748, 3749, + 3747, 3746, 3751, 3750, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 916, 0, 917, 0, + 0, 921, 0, 0, 0, 923, 922, 0, 924, 886, + 885, 0, 0, 918, 919, 0, 920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3657, 0, 3659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, 0, + 0, 0, 0, 0, 0, 0, 0, 1918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2338, 0, 0, 0, 0, 0, 664, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3824, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2337, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3897, 0, 0, 0, 3897, 3897, 0, 0, + 0, 0, 0, 0, 0, 0, 4000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3973, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1262, 1262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4019, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4027, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3973, 0, 0, + 0, 0, 0, 2338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 392, 3409, 0, - 4027, 1397, 1383, 520, 0, 1325, 1400, 1294, 1313, 1410, - 1316, 1319, 1362, 1272, 1340, 411, 1310, 1265, 1298, 1267, - 1305, 1268, 1296, 1327, 269, 1293, 1385, 1344, 1399, 362, - 266, 1274, 1299, 425, 1315, 203, 1364, 481, 251, 373, - 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, - 417, 1406, 366, 1350, 0, 491, 396, 0, 0, 0, - 1329, 1389, 1338, 1376, 1324, 1363, 1282, 1349, 1401, 1311, - 1359, 1402, 321, 247, 323, 202, 408, 492, 285, 0, - 0, 0, 0, 4001, 941, 0, 0, 0, 0, 4002, - 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, - 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, - 359, 1307, 1356, 1396, 1308, 1358, 264, 319, 271, 263, - 572, 1407, 1388, 1271, 1337, 1395, 1332, 0, 0, 228, - 1398, 1331, 0, 1361, 0, 1413, 1266, 1352, 0, 1269, - 1273, 1409, 1393, 1302, 274, 0, 0, 0, 0, 0, - 0, 0, 1328, 1339, 1373, 1377, 1322, 0, 0, 0, - 0, 0, 0, 0, 0, 1300, 0, 1348, 0, 0, - 0, 1278, 1270, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1326, 0, 0, 0, 0, - 1281, 0, 1301, 1374, 0, 1264, 296, 1275, 397, 256, - 0, 448, 1381, 1392, 1323, 616, 1394, 1321, 1320, 1368, - 1279, 1387, 1314, 361, 1277, 328, 197, 224, 0, 1312, - 407, 456, 468, 1386, 1297, 1306, 252, 1304, 466, 421, - 594, 232, 283, 453, 427, 464, 435, 286, 1347, 1366, - 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, - 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, - 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, - 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, - 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, - 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, - 1276, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, - 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, - 599, 640, 447, 211, 233, 234, 236, 1292, 278, 282, - 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, - 1382, 571, 592, 604, 615, 621, 622, 624, 625, 626, - 627, 628, 631, 629, 402, 309, 489, 331, 369, 1371, - 1412, 420, 467, 239, 596, 490, 199, 1286, 1291, 1284, - 0, 253, 254, 1353, 567, 1287, 1285, 1342, 1343, 1288, - 1403, 1404, 1405, 1390, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 1375, 1280, 0, 1289, 1290, 1384, 583, 584, - 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, - 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, - 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, - 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, - 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, - 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, - 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, - 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, - 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, - 536, 547, 558, 542, 530, 523, 531, 1346, 196, 220, - 364, 1408, 449, 287, 637, 606, 601, 205, 222, 1283, - 261, 1295, 1303, 0, 1309, 1317, 1318, 1330, 1333, 1334, - 1335, 1336, 1354, 1355, 1357, 1365, 1367, 1370, 1372, 1379, - 1391, 1411, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, - 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, - 1345, 1351, 377, 280, 303, 318, 1360, 605, 496, 226, - 461, 289, 250, 1378, 1380, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 1341, - 1369, 372, 568, 569, 314, 392, 0, 0, 0, 1397, - 1383, 520, 0, 1325, 1400, 1294, 1313, 1410, 1316, 1319, - 1362, 1272, 1340, 411, 1310, 1265, 1298, 1267, 1305, 1268, - 1296, 1327, 269, 1293, 1385, 1344, 1399, 362, 266, 1274, - 1299, 425, 1315, 203, 1364, 481, 251, 373, 370, 575, - 281, 272, 268, 249, 315, 381, 423, 510, 417, 1406, - 366, 1350, 0, 491, 396, 0, 0, 0, 1329, 1389, - 1338, 1376, 1324, 1363, 1282, 1349, 1401, 1311, 1359, 1402, - 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, - 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, - 356, 355, 336, 337, 339, 341, 346, 353, 359, 1307, - 1356, 1396, 1308, 1358, 264, 319, 271, 263, 572, 1407, - 1388, 1271, 1337, 1395, 1332, 0, 0, 228, 1398, 1331, - 0, 1361, 0, 1413, 1266, 1352, 0, 1269, 1273, 1409, - 1393, 1302, 274, 0, 0, 0, 0, 0, 0, 0, - 1328, 1339, 1373, 1377, 1322, 0, 0, 0, 0, 0, - 0, 3173, 0, 1300, 0, 1348, 0, 0, 0, 1278, - 1270, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1326, 0, 0, 0, 0, 1281, 0, - 1301, 1374, 0, 1264, 296, 1275, 397, 256, 0, 448, - 1381, 1392, 1323, 616, 1394, 1321, 1320, 1368, 1279, 1387, - 1314, 361, 1277, 328, 197, 224, 0, 1312, 407, 456, - 468, 1386, 1297, 1306, 252, 1304, 466, 421, 594, 232, - 283, 453, 427, 464, 435, 286, 1347, 1366, 465, 368, - 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, - 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, - 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, - 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, - 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, - 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, - 410, 581, 582, 255, 639, 227, 610, 219, 1276, 609, - 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, - 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, - 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, - 447, 211, 233, 234, 236, 1292, 278, 282, 290, 293, - 301, 302, 311, 363, 414, 441, 437, 446, 1382, 571, - 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, - 631, 629, 402, 309, 489, 331, 369, 1371, 1412, 420, - 467, 239, 596, 490, 199, 1286, 1291, 1284, 0, 253, - 254, 1353, 567, 1287, 1285, 1342, 1343, 1288, 1403, 1404, - 1405, 1390, 641, 642, 643, 644, 645, 646, 647, 648, - 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, - 1375, 1280, 0, 1289, 1290, 1384, 583, 584, 659, 380, - 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, - 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, - 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, - 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, - 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, - 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, - 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, - 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, - 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, - 558, 542, 530, 523, 531, 1346, 196, 220, 364, 1408, - 449, 287, 637, 606, 601, 205, 222, 1283, 261, 1295, - 1303, 0, 1309, 1317, 1318, 1330, 1333, 1334, 1335, 1336, - 1354, 1355, 1357, 1365, 1367, 1370, 1372, 1379, 1391, 1411, - 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, - 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, - 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, - 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, - 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, - 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, - 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, - 298, 590, 620, 588, 632, 614, 433, 374, 1345, 1351, - 377, 280, 303, 318, 1360, 605, 496, 226, 461, 289, - 250, 1378, 1380, 210, 245, 229, 258, 273, 276, 322, - 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 1341, 1369, 372, - 568, 569, 314, 392, 0, 0, 0, 1397, 1383, 520, - 0, 1325, 1400, 1294, 1313, 1410, 1316, 1319, 1362, 1272, - 1340, 411, 1310, 1265, 1298, 1267, 1305, 1268, 1296, 1327, - 269, 1293, 1385, 1344, 1399, 362, 266, 1274, 1299, 425, - 1315, 203, 1364, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 1406, 366, 1350, - 0, 491, 396, 0, 0, 0, 1329, 1389, 1338, 1376, - 1324, 1363, 1282, 1349, 1401, 1311, 1359, 1402, 321, 247, - 323, 202, 408, 492, 285, 0, 0, 0, 0, 0, - 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, - 336, 337, 339, 341, 346, 353, 359, 1307, 1356, 1396, - 1308, 1358, 264, 319, 271, 263, 572, 1407, 1388, 1271, - 1337, 1395, 1332, 0, 0, 228, 1398, 1331, 0, 1361, - 0, 1413, 1266, 1352, 0, 1269, 1273, 1409, 1393, 1302, - 274, 0, 0, 0, 0, 0, 0, 0, 1328, 1339, - 1373, 1377, 1322, 0, 0, 0, 0, 0, 0, 3134, - 0, 1300, 0, 1348, 0, 0, 0, 1278, 1270, 0, + 0, 0, 0, 0, 0, 0, 0, 2338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1326, 0, 0, 0, 0, 1281, 0, 1301, 1374, - 0, 1264, 296, 1275, 397, 256, 0, 448, 1381, 1392, - 1323, 616, 1394, 1321, 1320, 1368, 1279, 1387, 1314, 361, - 1277, 328, 197, 224, 0, 1312, 407, 456, 468, 1386, - 1297, 1306, 252, 1304, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 1347, 1366, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, - 582, 255, 639, 227, 610, 219, 1276, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, - 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 1292, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 1382, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 1371, 1412, 420, 467, 239, - 596, 490, 199, 1286, 1291, 1284, 0, 253, 254, 1353, - 567, 1287, 1285, 1342, 1343, 1288, 1403, 1404, 1405, 1390, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 1375, 1280, - 0, 1289, 1290, 1384, 583, 584, 659, 380, 480, 593, - 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, - 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, - 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, - 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, - 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, - 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, - 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, - 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, - 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, - 530, 523, 531, 1346, 196, 220, 364, 1408, 449, 287, - 637, 606, 601, 205, 222, 1283, 261, 1295, 1303, 0, - 1309, 1317, 1318, 1330, 1333, 1334, 1335, 1336, 1354, 1355, - 1357, 1365, 1367, 1370, 1372, 1379, 1391, 1411, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, - 620, 588, 632, 614, 433, 374, 1345, 1351, 377, 280, - 303, 318, 1360, 605, 496, 226, 461, 289, 250, 1378, - 1380, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 1341, 1369, 372, 568, 569, - 314, 392, 0, 0, 0, 1397, 1383, 520, 0, 1325, - 1400, 1294, 1313, 1410, 1316, 1319, 1362, 1272, 1340, 411, - 1310, 1265, 1298, 1267, 1305, 1268, 1296, 1327, 269, 1293, - 1385, 1344, 1399, 362, 266, 1274, 1299, 425, 1315, 203, - 1364, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 1406, 366, 1350, 0, 491, - 396, 0, 0, 0, 1329, 1389, 1338, 1376, 1324, 1363, - 1282, 1349, 1401, 1311, 1359, 1402, 321, 247, 323, 202, - 408, 492, 285, 0, 0, 0, 0, 0, 941, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, - 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, - 339, 341, 346, 353, 359, 1307, 1356, 1396, 1308, 1358, - 264, 319, 271, 263, 572, 1407, 1388, 1271, 1337, 1395, - 1332, 0, 0, 228, 1398, 1331, 0, 1361, 0, 1413, - 1266, 1352, 0, 1269, 1273, 1409, 1393, 1302, 274, 0, - 0, 0, 0, 0, 0, 0, 1328, 1339, 1373, 1377, - 1322, 0, 0, 0, 0, 0, 0, 2353, 0, 1300, - 0, 1348, 0, 0, 0, 1278, 1270, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1326, - 0, 0, 0, 0, 1281, 0, 1301, 1374, 0, 1264, - 296, 1275, 397, 256, 0, 448, 1381, 1392, 1323, 616, - 1394, 1321, 1320, 1368, 1279, 1387, 1314, 361, 1277, 328, - 197, 224, 0, 1312, 407, 456, 468, 1386, 1297, 1306, - 252, 1304, 466, 421, 594, 232, 283, 453, 427, 464, - 435, 286, 1347, 1366, 465, 368, 577, 445, 591, 617, - 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, - 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, - 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, - 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, - 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, - 639, 227, 610, 219, 1276, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, - 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, - 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, - 236, 1292, 278, 282, 290, 293, 301, 302, 311, 363, - 414, 441, 437, 446, 1382, 571, 592, 604, 615, 621, - 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, - 489, 331, 369, 1371, 1412, 420, 467, 239, 596, 490, - 199, 1286, 1291, 1284, 0, 253, 254, 1353, 567, 1287, - 1285, 1342, 1343, 1288, 1403, 1404, 1405, 1390, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 1375, 1280, 0, 1289, - 1290, 1384, 583, 584, 659, 380, 480, 593, 333, 345, - 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, - 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, - 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, - 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, - 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, - 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, - 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, - 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, - 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, - 531, 1346, 196, 220, 364, 1408, 449, 287, 637, 606, - 601, 205, 222, 1283, 261, 1295, 1303, 0, 1309, 1317, - 1318, 1330, 1333, 1334, 1335, 1336, 1354, 1355, 1357, 1365, - 1367, 1370, 1372, 1379, 1391, 1411, 198, 200, 208, 221, - 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, - 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, - 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, - 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, - 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, - 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, - 632, 614, 433, 374, 1345, 1351, 377, 280, 303, 318, - 1360, 605, 496, 226, 461, 289, 250, 1378, 1380, 210, - 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, - 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 1341, 1369, 372, 568, 569, 314, 392, - 0, 0, 0, 1397, 1383, 520, 0, 1325, 1400, 1294, - 1313, 1410, 1316, 1319, 1362, 1272, 1340, 411, 1310, 1265, - 1298, 1267, 1305, 1268, 1296, 1327, 269, 1293, 1385, 1344, - 1399, 362, 266, 1274, 1299, 425, 1315, 203, 1364, 481, - 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, - 423, 510, 417, 1406, 366, 1350, 0, 491, 396, 0, - 0, 0, 1329, 1389, 1338, 1376, 1324, 1363, 1282, 1349, - 1401, 1311, 1359, 1402, 321, 247, 323, 202, 408, 492, - 285, 0, 95, 0, 0, 0, 709, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, - 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, - 346, 353, 359, 1307, 1356, 1396, 1308, 1358, 264, 319, - 271, 263, 572, 1407, 1388, 1271, 1337, 1395, 1332, 0, - 0, 228, 1398, 1331, 0, 1361, 0, 1413, 1266, 1352, - 0, 1269, 1273, 1409, 1393, 1302, 274, 0, 0, 0, - 0, 0, 0, 0, 1328, 1339, 1373, 1377, 1322, 0, - 0, 0, 0, 0, 0, 0, 0, 1300, 0, 1348, - 0, 0, 0, 1278, 1270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1326, 0, 0, - 0, 0, 1281, 0, 1301, 1374, 0, 1264, 296, 1275, - 397, 256, 0, 448, 1381, 1392, 1323, 616, 1394, 1321, - 1320, 1368, 1279, 1387, 1314, 361, 1277, 328, 197, 224, - 0, 1312, 407, 456, 468, 1386, 1297, 1306, 252, 1304, - 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, - 1347, 1366, 465, 368, 577, 445, 591, 617, 618, 262, - 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, - 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, - 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, - 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, - 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, - 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, - 610, 219, 1276, 609, 403, 576, 587, 390, 379, 218, - 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, - 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, - 0, 493, 599, 640, 447, 211, 233, 234, 236, 1292, - 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, - 437, 446, 1382, 571, 592, 604, 615, 621, 622, 624, - 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, - 369, 1371, 1412, 420, 467, 239, 596, 490, 199, 1286, - 1291, 1284, 0, 253, 254, 1353, 567, 1287, 1285, 1342, - 1343, 1288, 1403, 1404, 1405, 1390, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, - 504, 505, 0, 507, 1375, 1280, 0, 1289, 1290, 1384, - 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, - 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, - 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, - 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, - 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, - 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, - 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, - 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, - 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, - 556, 555, 536, 547, 558, 542, 530, 523, 531, 1346, - 196, 220, 364, 1408, 449, 287, 637, 606, 601, 205, - 222, 1283, 261, 1295, 1303, 0, 1309, 1317, 1318, 1330, - 1333, 1334, 1335, 1336, 1354, 1355, 1357, 1365, 1367, 1370, - 1372, 1379, 1391, 1411, 198, 200, 208, 221, 231, 235, - 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, - 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, - 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, - 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, - 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, - 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, - 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, - 433, 374, 1345, 1351, 377, 280, 303, 318, 1360, 605, - 496, 226, 461, 289, 250, 1378, 1380, 210, 245, 229, - 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, - 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, - 428, 1341, 1369, 372, 568, 569, 314, 392, 0, 0, - 0, 1397, 1383, 520, 0, 1325, 1400, 1294, 1313, 1410, - 1316, 1319, 1362, 1272, 1340, 411, 1310, 1265, 1298, 1267, - 1305, 1268, 1296, 1327, 269, 1293, 1385, 1344, 1399, 362, - 266, 1274, 1299, 425, 1315, 203, 1364, 481, 251, 373, - 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, - 417, 1406, 366, 1350, 0, 491, 396, 0, 0, 0, - 1329, 1389, 1338, 1376, 1324, 1363, 1282, 1349, 1401, 1311, - 1359, 1402, 321, 247, 323, 202, 408, 492, 285, 0, - 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, - 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, - 359, 1307, 1356, 1396, 1308, 1358, 264, 319, 271, 263, - 572, 1407, 1388, 1271, 1337, 1395, 1332, 0, 0, 228, - 1398, 1331, 0, 1361, 0, 1413, 1266, 1352, 0, 1269, - 1273, 1409, 1393, 1302, 274, 0, 0, 0, 0, 0, - 0, 0, 1328, 1339, 1373, 1377, 1322, 0, 0, 0, - 0, 0, 0, 0, 0, 1300, 0, 1348, 0, 0, - 0, 1278, 1270, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1326, 0, 0, 0, 0, - 1281, 0, 1301, 1374, 0, 1264, 296, 1275, 397, 256, - 0, 448, 1381, 1392, 1323, 616, 1394, 1321, 1320, 1368, - 1279, 1387, 1314, 361, 1277, 328, 197, 224, 0, 1312, - 407, 456, 468, 1386, 1297, 1306, 252, 1304, 466, 421, - 594, 232, 283, 453, 427, 464, 435, 286, 1347, 1366, - 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, - 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, - 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, - 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, - 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, - 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, - 1276, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, - 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, - 599, 640, 447, 211, 233, 234, 236, 1292, 278, 282, - 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, - 1382, 571, 592, 604, 615, 621, 622, 624, 625, 626, - 627, 628, 631, 629, 402, 309, 489, 331, 369, 1371, - 1412, 420, 467, 239, 596, 490, 199, 1286, 1291, 1284, - 0, 253, 254, 1353, 567, 1287, 1285, 1342, 1343, 1288, - 1403, 1404, 1405, 1390, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 1375, 1280, 0, 1289, 1290, 1384, 583, 584, - 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, - 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, - 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, - 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, - 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, - 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, - 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, - 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, - 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, - 536, 547, 558, 542, 530, 523, 531, 1346, 196, 220, - 364, 1408, 449, 287, 637, 606, 601, 205, 222, 1283, - 261, 1295, 1303, 0, 1309, 1317, 1318, 1330, 1333, 1334, - 1335, 1336, 1354, 1355, 1357, 1365, 1367, 1370, 1372, 1379, - 1391, 1411, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, - 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, - 1345, 1351, 377, 280, 303, 318, 1360, 605, 496, 226, - 461, 289, 250, 1378, 1380, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 1341, - 1369, 372, 568, 569, 314, 392, 0, 0, 0, 1397, - 1383, 520, 0, 1325, 1400, 1294, 1313, 1410, 1316, 1319, - 1362, 1272, 1340, 411, 1310, 1265, 1298, 1267, 1305, 1268, - 1296, 1327, 269, 1293, 1385, 1344, 1399, 362, 266, 1274, - 1299, 425, 1315, 203, 1364, 481, 251, 373, 370, 575, - 281, 272, 268, 249, 315, 381, 423, 510, 417, 1406, - 366, 1350, 0, 491, 396, 0, 0, 0, 1329, 1389, - 1338, 1376, 1324, 1363, 1282, 1349, 1401, 1311, 1359, 1402, - 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, - 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, - 356, 355, 336, 337, 339, 341, 346, 353, 359, 1307, - 1356, 1396, 1308, 1358, 264, 319, 271, 263, 572, 1407, - 1388, 1271, 1337, 1395, 1332, 0, 0, 228, 1398, 1331, - 0, 1361, 0, 1413, 1266, 1352, 0, 1269, 1273, 1409, - 1393, 1302, 274, 0, 0, 0, 0, 0, 0, 0, - 1328, 1339, 1373, 1377, 1322, 0, 0, 0, 0, 0, - 0, 0, 0, 1300, 0, 1348, 0, 0, 0, 1278, - 1270, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1326, 0, 0, 0, 0, 1281, 0, - 1301, 1374, 0, 1264, 296, 1275, 397, 256, 0, 448, - 1381, 1392, 1323, 616, 1394, 1321, 1320, 1368, 1279, 1387, - 1314, 361, 1277, 328, 197, 224, 0, 1312, 407, 456, - 468, 1386, 1297, 1306, 252, 1304, 466, 421, 594, 232, - 283, 453, 427, 464, 435, 286, 1347, 1366, 465, 368, - 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, - 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, - 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, - 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, - 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, - 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, - 410, 581, 582, 255, 639, 227, 610, 219, 1276, 609, - 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, - 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, - 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, - 447, 211, 233, 234, 236, 1292, 278, 282, 290, 293, - 301, 302, 311, 363, 414, 441, 437, 446, 1382, 571, - 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, - 631, 629, 402, 309, 489, 331, 369, 1371, 1412, 420, - 467, 239, 596, 490, 199, 1286, 1291, 1284, 0, 253, - 254, 1353, 567, 1287, 1285, 1342, 1343, 1288, 1403, 1404, - 1405, 1390, 641, 642, 643, 644, 645, 646, 647, 648, - 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, - 1375, 1280, 0, 1289, 1290, 1384, 583, 584, 659, 380, - 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, - 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, - 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, - 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, - 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, - 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, - 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, - 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, - 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, - 558, 542, 530, 523, 531, 1346, 196, 220, 364, 1408, - 449, 287, 637, 606, 601, 205, 222, 1283, 261, 1295, - 1303, 0, 1309, 1317, 1318, 1330, 1333, 1334, 1335, 1336, - 1354, 1355, 1357, 1365, 1367, 1370, 1372, 1379, 1391, 1411, - 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, - 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, - 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, - 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, - 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, - 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, - 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, - 298, 590, 620, 588, 632, 614, 433, 374, 1345, 1351, - 377, 280, 303, 318, 1360, 605, 496, 226, 461, 289, - 250, 1378, 1380, 210, 245, 229, 258, 273, 276, 322, - 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 1341, 1369, 372, - 568, 569, 314, 392, 0, 0, 0, 1397, 1383, 520, - 0, 1325, 1400, 1294, 1313, 1410, 1316, 1319, 1362, 1272, - 1340, 411, 1310, 1265, 1298, 1267, 1305, 1268, 1296, 1327, - 269, 1293, 1385, 1344, 1399, 362, 266, 1274, 1299, 425, - 1315, 203, 1364, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 1406, 366, 1350, - 0, 491, 396, 0, 0, 0, 1329, 1389, 1338, 1376, - 1324, 1363, 1282, 1349, 1401, 1311, 1359, 1402, 321, 247, - 323, 202, 408, 492, 285, 0, 0, 0, 0, 0, - 941, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, - 336, 337, 339, 341, 346, 353, 359, 1307, 1356, 1396, - 1308, 1358, 264, 319, 271, 263, 572, 1407, 1388, 1271, - 1337, 1395, 1332, 0, 0, 228, 1398, 1331, 0, 1361, - 0, 1413, 1266, 1352, 0, 1269, 1273, 1409, 1393, 1302, - 274, 0, 0, 0, 0, 0, 0, 0, 1328, 1339, - 1373, 1377, 1322, 0, 0, 0, 0, 0, 0, 0, - 0, 1300, 0, 1348, 0, 0, 0, 1278, 1270, 0, + 0, 3974, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3978, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1263, 1263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4020, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4028, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1326, 0, 0, 0, 0, 1281, 0, 1301, 1374, - 0, 1264, 296, 1275, 397, 256, 0, 448, 1381, 1392, - 1323, 616, 1394, 1321, 1320, 1368, 1279, 1387, 1314, 361, - 1277, 328, 197, 224, 0, 1312, 407, 456, 468, 1386, - 1297, 1306, 252, 1304, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 1347, 1366, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, - 582, 255, 639, 227, 610, 219, 1276, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, - 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 1292, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 1382, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 1371, 1412, 420, 467, 239, - 596, 490, 199, 1286, 1291, 1284, 0, 253, 254, 1353, - 567, 1287, 1285, 1342, 1343, 1288, 1403, 1404, 1405, 1390, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 1375, 1280, - 0, 1289, 1290, 1384, 583, 584, 659, 380, 480, 593, - 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, - 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, - 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, - 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, - 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, - 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, - 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, - 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, - 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, - 530, 523, 531, 1346, 196, 220, 364, 1408, 449, 287, - 637, 606, 601, 205, 222, 1283, 261, 1295, 1303, 0, - 1309, 1317, 1318, 1330, 1333, 1334, 1335, 1336, 1354, 1355, - 1357, 1365, 1367, 1370, 1372, 1379, 1391, 1411, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, - 620, 588, 632, 614, 433, 374, 1345, 1351, 377, 280, - 303, 318, 1360, 605, 496, 226, 461, 289, 250, 1378, - 1380, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 1341, 1369, 372, 568, 569, - 314, 392, 0, 0, 0, 0, 0, 520, 0, 761, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, - 0, 0, 0, 0, 749, 0, 0, 0, 269, 754, - 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, - 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 760, 366, 0, 0, 491, - 396, 0, 0, 0, 0, 0, 756, 757, 0, 0, - 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, - 408, 492, 285, 0, 95, 0, 0, 957, 941, 733, - 907, 945, 958, 959, 960, 961, 946, 0, 237, 947, - 948, 244, 949, 0, 906, 791, 793, 792, 856, 857, - 858, 859, 860, 861, 862, 789, 954, 962, 963, 0, - 264, 319, 271, 263, 572, 0, 0, 2176, 2177, 2178, - 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 729, 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 743, 744, 0, 0, 0, - 0, 901, 0, 745, 0, 0, 753, 964, 965, 966, - 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, - 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 296, 0, 397, 256, 0, 448, 900, 0, 0, 616, - 0, 0, 898, 0, 0, 0, 0, 361, 0, 328, - 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, - 951, 0, 466, 421, 594, 232, 283, 453, 427, 464, - 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, - 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, - 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, - 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, - 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, - 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 952, 953, 255, - 639, 797, 610, 219, 0, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 805, 806, 279, 305, - 882, 881, 880, 304, 306, 878, 879, 877, 206, 598, - 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, - 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, - 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, - 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, - 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, - 888, 910, 899, 765, 766, 889, 890, 914, 891, 768, - 769, 911, 912, 762, 763, 767, 913, 915, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 902, 752, 751, 0, - 758, 0, 787, 788, 790, 794, 795, 796, 807, 854, - 855, 863, 865, 866, 864, 867, 868, 869, 872, 873, - 874, 875, 870, 871, 876, 770, 774, 771, 772, 773, - 785, 775, 776, 777, 778, 779, 780, 781, 782, 783, - 784, 786, 925, 926, 927, 928, 929, 930, 800, 804, - 803, 801, 802, 798, 799, 826, 825, 827, 828, 829, - 830, 831, 832, 834, 833, 835, 836, 837, 838, 839, - 840, 808, 809, 812, 813, 811, 810, 814, 823, 824, - 815, 816, 817, 818, 819, 820, 822, 821, 841, 842, - 843, 844, 845, 847, 846, 850, 851, 849, 848, 853, - 852, 750, 196, 220, 364, 0, 449, 287, 637, 606, - 601, 205, 222, 916, 261, 917, 0, 0, 921, 0, - 0, 0, 923, 922, 0, 924, 886, 885, 0, 0, - 918, 919, 0, 920, 0, 0, 198, 200, 208, 221, - 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, - 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, - 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, - 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, - 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 931, 932, - 933, 934, 935, 936, 937, 938, 298, 590, 620, 588, - 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, - 0, 605, 496, 226, 461, 289, 250, 956, 0, 210, - 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, - 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, - 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 411, 0, 0, 0, 0, 749, 0, 0, 0, - 269, 754, 0, 0, 0, 362, 266, 0, 0, 425, - 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 760, 366, 0, - 0, 491, 396, 0, 0, 0, 0, 0, 756, 757, - 0, 0, 0, 0, 0, 0, 2382, 0, 321, 247, - 323, 202, 408, 492, 285, 0, 95, 0, 0, 957, - 941, 733, 907, 945, 958, 959, 960, 961, 946, 0, - 237, 947, 948, 244, 949, 0, 906, 791, 793, 792, - 856, 857, 858, 859, 860, 861, 862, 789, 954, 962, - 963, 2383, 264, 319, 271, 263, 572, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, - 0, 0, 0, 729, 746, 0, 759, 0, 0, 0, - 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 743, 744, 0, - 0, 0, 0, 901, 0, 745, 0, 0, 753, 964, - 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, - 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, - 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, - 1005, 755, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 397, 256, 0, 448, 900, 0, - 0, 616, 0, 0, 898, 0, 0, 0, 0, 361, - 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, - 0, 0, 951, 0, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 952, - 953, 255, 639, 797, 610, 219, 0, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 805, 806, - 279, 305, 882, 881, 880, 304, 306, 878, 879, 877, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, - 596, 490, 888, 910, 899, 765, 766, 889, 890, 914, - 891, 768, 769, 911, 912, 762, 763, 767, 913, 915, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 902, 752, - 751, 0, 758, 0, 787, 788, 790, 794, 795, 796, - 807, 854, 855, 863, 865, 866, 864, 867, 868, 869, - 872, 873, 874, 875, 870, 871, 876, 770, 774, 771, - 772, 773, 785, 775, 776, 777, 778, 779, 780, 781, - 782, 783, 784, 786, 925, 926, 927, 928, 929, 930, - 800, 804, 803, 801, 802, 798, 799, 826, 825, 827, - 828, 829, 830, 831, 832, 834, 833, 835, 836, 837, - 838, 839, 840, 808, 809, 812, 813, 811, 810, 814, - 823, 824, 815, 816, 817, 818, 819, 820, 822, 821, - 841, 842, 843, 844, 845, 847, 846, 850, 851, 849, - 848, 853, 852, 750, 196, 220, 364, 0, 449, 287, - 637, 606, 601, 205, 222, 916, 261, 917, 0, 0, - 921, 0, 0, 0, 923, 922, 0, 924, 886, 885, - 0, 0, 918, 919, 0, 920, 0, 0, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 931, 932, 933, 934, 935, 936, 937, 938, 298, 590, - 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, - 303, 318, 0, 605, 496, 226, 461, 289, 250, 956, - 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 0, 392, 372, 568, 569, - 314, 86, 520, 0, 761, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 749, - 0, 0, 0, 269, 754, 0, 0, 0, 362, 266, - 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, + 0, 0, 0, 0, 0, 0, 3974, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2338, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 392, 3410, 0, 4028, + 1398, 1384, 520, 0, 1326, 1401, 1295, 1314, 1411, 1317, + 1320, 1363, 1273, 1341, 411, 1311, 1266, 1299, 1268, 1306, + 1269, 1297, 1328, 269, 1294, 1386, 1345, 1400, 362, 266, + 1275, 1300, 425, 1316, 203, 1365, 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 760, 366, 0, 0, 491, 396, 0, 0, 0, 0, - 0, 756, 757, 0, 0, 0, 0, 0, 0, 0, - 0, 321, 247, 323, 202, 408, 492, 285, 0, 95, - 0, 0, 957, 941, 733, 907, 945, 958, 959, 960, - 961, 946, 0, 237, 947, 948, 244, 949, 0, 906, - 791, 793, 792, 856, 857, 858, 859, 860, 861, 862, - 789, 954, 962, 963, 0, 264, 319, 271, 263, 572, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, - 0, 0, 0, 0, 0, 0, 729, 746, 0, 759, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 743, 744, 0, 0, 0, 0, 901, 0, 745, 0, - 0, 753, 964, 965, 966, 967, 968, 969, 970, 971, - 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, - 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, - 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, - 1002, 1003, 1004, 1005, 755, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, - 448, 900, 0, 0, 616, 0, 0, 898, 0, 0, - 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, - 456, 468, 0, 0, 0, 951, 0, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, + 1407, 366, 1351, 0, 491, 396, 0, 0, 0, 1330, + 1390, 1339, 1377, 1325, 1364, 1283, 1350, 1402, 1312, 1360, + 1403, 321, 247, 323, 202, 408, 492, 285, 0, 0, + 0, 0, 4002, 941, 0, 0, 0, 0, 4003, 0, + 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, + 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, + 1308, 1357, 1397, 1309, 1359, 264, 319, 271, 263, 572, + 1408, 1389, 1272, 1338, 1396, 1333, 0, 0, 228, 1399, + 1332, 0, 1362, 0, 1414, 1267, 1353, 0, 1270, 1274, + 1410, 1394, 1303, 274, 0, 0, 0, 0, 0, 0, + 0, 1329, 1340, 1374, 1378, 1323, 0, 0, 0, 0, + 0, 0, 0, 0, 1301, 0, 1349, 0, 0, 0, + 1279, 1271, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1327, 0, 0, 0, 0, 1282, + 0, 1302, 1375, 0, 1265, 296, 1276, 397, 256, 0, + 448, 1382, 1393, 1324, 616, 1395, 1322, 1321, 1369, 1280, + 1388, 1315, 361, 1278, 328, 197, 224, 0, 1313, 407, + 456, 468, 1387, 1298, 1307, 252, 1305, 466, 421, 594, + 232, 283, 453, 427, 464, 435, 286, 1348, 1367, 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 952, 953, 255, 639, 797, 610, 219, 0, + 257, 410, 581, 582, 255, 639, 227, 610, 219, 1277, 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 805, 806, 279, 305, 882, 881, 880, 304, 306, - 878, 879, 877, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, + 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, + 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, + 640, 447, 211, 233, 234, 236, 1293, 278, 282, 290, + 293, 301, 302, 311, 363, 414, 441, 437, 446, 1383, 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, - 420, 467, 239, 596, 490, 888, 910, 899, 765, 766, - 889, 890, 914, 891, 768, 769, 911, 912, 762, 763, - 767, 913, 915, 641, 642, 643, 644, 645, 646, 647, + 628, 631, 629, 402, 309, 489, 331, 369, 1372, 1413, + 420, 467, 239, 596, 490, 199, 1287, 1292, 1285, 0, + 253, 254, 1354, 567, 1288, 1286, 1343, 1344, 1289, 1404, + 1405, 1406, 1391, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 902, 752, 751, 0, 758, 0, 787, 788, 790, - 794, 795, 796, 807, 854, 855, 863, 865, 866, 864, - 867, 868, 869, 872, 873, 874, 875, 870, 871, 876, - 770, 774, 771, 772, 773, 785, 775, 776, 777, 778, - 779, 780, 781, 782, 783, 784, 786, 925, 926, 927, - 928, 929, 930, 800, 804, 803, 801, 802, 798, 799, - 826, 825, 827, 828, 829, 830, 831, 832, 834, 833, - 835, 836, 837, 838, 839, 840, 808, 809, 812, 813, - 811, 810, 814, 823, 824, 815, 816, 817, 818, 819, - 820, 822, 821, 841, 842, 843, 844, 845, 847, 846, - 850, 851, 849, 848, 853, 852, 750, 196, 220, 364, - 94, 449, 287, 637, 606, 601, 205, 222, 916, 261, - 917, 0, 0, 921, 0, 0, 0, 923, 922, 0, - 924, 886, 885, 0, 0, 918, 919, 0, 920, 0, - 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, + 507, 1376, 1281, 0, 1290, 1291, 1385, 583, 584, 659, + 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, + 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, + 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, + 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, + 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, + 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, + 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, + 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, + 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, + 547, 558, 542, 530, 523, 531, 1347, 196, 220, 364, + 1409, 449, 287, 637, 606, 601, 205, 222, 1284, 261, + 1296, 1304, 0, 1310, 1318, 1319, 1331, 1334, 1335, 1336, + 1337, 1355, 1356, 1358, 1366, 1368, 1371, 1373, 1380, 1392, + 1412, 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 931, 932, 933, 934, 935, 936, 937, - 938, 298, 590, 620, 588, 632, 614, 433, 374, 0, - 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, - 289, 250, 956, 0, 210, 245, 229, 258, 273, 276, + 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, + 634, 298, 590, 620, 588, 632, 614, 433, 374, 1346, + 1352, 377, 280, 303, 318, 1361, 605, 496, 226, 461, + 289, 250, 1379, 1381, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, - 372, 568, 569, 314, 520, 0, 761, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 749, 0, 0, 0, 269, 754, 0, 0, 0, - 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, + 479, 511, 512, 513, 515, 391, 265, 428, 1342, 1370, + 372, 568, 569, 314, 392, 0, 0, 0, 1398, 1384, + 520, 0, 1326, 1401, 1295, 1314, 1411, 1317, 1320, 1363, + 1273, 1341, 411, 1311, 1266, 1299, 1268, 1306, 1269, 1297, + 1328, 269, 1294, 1386, 1345, 1400, 362, 266, 1275, 1300, + 425, 1316, 203, 1365, 481, 251, 373, 370, 575, 281, + 272, 268, 249, 315, 381, 423, 510, 417, 1407, 366, + 1351, 0, 491, 396, 0, 0, 0, 1330, 1390, 1339, + 1377, 1325, 1364, 1283, 1350, 1402, 1312, 1360, 1403, 321, + 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, + 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, + 355, 336, 337, 339, 341, 346, 353, 359, 1308, 1357, + 1397, 1309, 1359, 264, 319, 271, 263, 572, 1408, 1389, + 1272, 1338, 1396, 1333, 0, 0, 228, 1399, 1332, 0, + 1362, 0, 1414, 1267, 1353, 0, 1270, 1274, 1410, 1394, + 1303, 274, 0, 0, 0, 0, 0, 0, 0, 1329, + 1340, 1374, 1378, 1323, 0, 0, 0, 0, 0, 0, + 3174, 0, 1301, 0, 1349, 0, 0, 0, 1279, 1271, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1327, 0, 0, 0, 0, 1282, 0, 1302, + 1375, 0, 1265, 296, 1276, 397, 256, 0, 448, 1382, + 1393, 1324, 616, 1395, 1322, 1321, 1369, 1280, 1388, 1315, + 361, 1278, 328, 197, 224, 0, 1313, 407, 456, 468, + 1387, 1298, 1307, 252, 1305, 466, 421, 594, 232, 283, + 453, 427, 464, 435, 286, 1348, 1367, 465, 368, 577, + 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, + 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, + 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, + 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, + 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, + 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, + 581, 582, 255, 639, 227, 610, 219, 1277, 609, 403, + 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, + 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, + 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, + 211, 233, 234, 236, 1293, 278, 282, 290, 293, 301, + 302, 311, 363, 414, 441, 437, 446, 1383, 571, 592, + 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, + 629, 402, 309, 489, 331, 369, 1372, 1413, 420, 467, + 239, 596, 490, 199, 1287, 1292, 1285, 0, 253, 254, + 1354, 567, 1288, 1286, 1343, 1344, 1289, 1404, 1405, 1406, + 1391, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, + 500, 506, 501, 502, 503, 504, 505, 0, 507, 1376, + 1281, 0, 1290, 1291, 1385, 583, 584, 659, 380, 480, + 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, + 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, + 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, + 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, + 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, + 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, + 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, + 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, + 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, + 542, 530, 523, 531, 1347, 196, 220, 364, 1409, 449, + 287, 637, 606, 601, 205, 222, 1284, 261, 1296, 1304, + 0, 1310, 1318, 1319, 1331, 1334, 1335, 1336, 1337, 1355, + 1356, 1358, 1366, 1368, 1371, 1373, 1380, 1392, 1412, 198, + 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, + 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, + 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, + 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, + 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, + 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, + 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, + 590, 620, 588, 632, 614, 433, 374, 1346, 1352, 377, + 280, 303, 318, 1361, 605, 496, 226, 461, 289, 250, + 1379, 1381, 210, 245, 229, 258, 273, 276, 322, 387, + 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, + 512, 513, 515, 391, 265, 428, 1342, 1370, 372, 568, + 569, 314, 392, 0, 0, 0, 1398, 1384, 520, 0, + 1326, 1401, 1295, 1314, 1411, 1317, 1320, 1363, 1273, 1341, + 411, 1311, 1266, 1299, 1268, 1306, 1269, 1297, 1328, 269, + 1294, 1386, 1345, 1400, 362, 266, 1275, 1300, 425, 1316, + 203, 1365, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 1407, 366, 1351, 0, + 491, 396, 0, 0, 0, 1330, 1390, 1339, 1377, 1325, + 1364, 1283, 1350, 1402, 1312, 1360, 1403, 321, 247, 323, + 202, 408, 492, 285, 0, 0, 0, 0, 0, 709, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, + 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, + 337, 339, 341, 346, 353, 359, 1308, 1357, 1397, 1309, + 1359, 264, 319, 271, 263, 572, 1408, 1389, 1272, 1338, + 1396, 1333, 0, 0, 228, 1399, 1332, 0, 1362, 0, + 1414, 1267, 1353, 0, 1270, 1274, 1410, 1394, 1303, 274, + 0, 0, 0, 0, 0, 0, 0, 1329, 1340, 1374, + 1378, 1323, 0, 0, 0, 0, 0, 0, 3135, 0, + 1301, 0, 1349, 0, 0, 0, 1279, 1271, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1327, 0, 0, 0, 0, 1282, 0, 1302, 1375, 0, + 1265, 296, 1276, 397, 256, 0, 448, 1382, 1393, 1324, + 616, 1395, 1322, 1321, 1369, 1280, 1388, 1315, 361, 1278, + 328, 197, 224, 0, 1313, 407, 456, 468, 1387, 1298, + 1307, 252, 1305, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 1348, 1367, 465, 368, 577, 445, 591, + 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, + 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, + 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, + 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, + 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, + 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, + 255, 639, 227, 610, 219, 1277, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, + 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, + 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, + 234, 236, 1293, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 1383, 571, 592, 604, 615, + 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, + 309, 489, 331, 369, 1372, 1413, 420, 467, 239, 596, + 490, 199, 1287, 1292, 1285, 0, 253, 254, 1354, 567, + 1288, 1286, 1343, 1344, 1289, 1404, 1405, 1406, 1391, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, + 501, 502, 503, 504, 505, 0, 507, 1376, 1281, 0, + 1290, 1291, 1385, 583, 584, 659, 380, 480, 593, 333, + 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, + 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, + 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, + 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, + 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, + 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, + 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, + 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, + 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, + 523, 531, 1347, 196, 220, 364, 1409, 449, 287, 637, + 606, 601, 205, 222, 1284, 261, 1296, 1304, 0, 1310, + 1318, 1319, 1331, 1334, 1335, 1336, 1337, 1355, 1356, 1358, + 1366, 1368, 1371, 1373, 1380, 1392, 1412, 198, 200, 208, + 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, + 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, + 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, + 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, + 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, + 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, + 588, 632, 614, 433, 374, 1346, 1352, 377, 280, 303, + 318, 1361, 605, 496, 226, 461, 289, 250, 1379, 1381, + 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, + 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, + 515, 391, 265, 428, 1342, 1370, 372, 568, 569, 314, + 392, 0, 0, 0, 1398, 1384, 520, 0, 1326, 1401, + 1295, 1314, 1411, 1317, 1320, 1363, 1273, 1341, 411, 1311, + 1266, 1299, 1268, 1306, 1269, 1297, 1328, 269, 1294, 1386, + 1345, 1400, 362, 266, 1275, 1300, 425, 1316, 203, 1365, + 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, + 381, 423, 510, 417, 1407, 366, 1351, 0, 491, 396, + 0, 0, 0, 1330, 1390, 1339, 1377, 1325, 1364, 1283, + 1350, 1402, 1312, 1360, 1403, 321, 247, 323, 202, 408, + 492, 285, 0, 0, 0, 0, 0, 941, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, + 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, + 341, 346, 353, 359, 1308, 1357, 1397, 1309, 1359, 264, + 319, 271, 263, 572, 1408, 1389, 1272, 1338, 1396, 1333, + 0, 0, 228, 1399, 1332, 0, 1362, 0, 1414, 1267, + 1353, 0, 1270, 1274, 1410, 1394, 1303, 274, 0, 0, + 0, 0, 0, 0, 0, 1329, 1340, 1374, 1378, 1323, + 0, 0, 0, 0, 0, 0, 2354, 0, 1301, 0, + 1349, 0, 0, 0, 1279, 1271, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1327, 0, + 0, 0, 0, 1282, 0, 1302, 1375, 0, 1265, 296, + 1276, 397, 256, 0, 448, 1382, 1393, 1324, 616, 1395, + 1322, 1321, 1369, 1280, 1388, 1315, 361, 1278, 328, 197, + 224, 0, 1313, 407, 456, 468, 1387, 1298, 1307, 252, + 1305, 466, 421, 594, 232, 283, 453, 427, 464, 435, + 286, 1348, 1367, 465, 368, 577, 445, 591, 617, 618, + 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, + 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, + 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, + 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, + 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, + 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, + 227, 610, 219, 1277, 609, 403, 576, 587, 390, 379, + 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, + 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, + 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, + 1293, 278, 282, 290, 293, 301, 302, 311, 363, 414, + 441, 437, 446, 1383, 571, 592, 604, 615, 621, 622, + 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, + 331, 369, 1372, 1413, 420, 467, 239, 596, 490, 199, + 1287, 1292, 1285, 0, 253, 254, 1354, 567, 1288, 1286, + 1343, 1344, 1289, 1404, 1405, 1406, 1391, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, + 503, 504, 505, 0, 507, 1376, 1281, 0, 1290, 1291, + 1385, 583, 584, 659, 380, 480, 593, 333, 345, 348, + 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, + 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, + 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, + 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, + 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, + 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, + 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, + 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, + 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, + 1347, 196, 220, 364, 1409, 449, 287, 637, 606, 601, + 205, 222, 1284, 261, 1296, 1304, 0, 1310, 1318, 1319, + 1331, 1334, 1335, 1336, 1337, 1355, 1356, 1358, 1366, 1368, + 1371, 1373, 1380, 1392, 1412, 198, 200, 208, 221, 231, + 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, + 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, + 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, + 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, + 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, + 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, + 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, + 614, 433, 374, 1346, 1352, 377, 280, 303, 318, 1361, + 605, 496, 226, 461, 289, 250, 1379, 1381, 210, 245, + 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, + 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, + 265, 428, 1342, 1370, 372, 568, 569, 314, 392, 0, + 0, 0, 1398, 1384, 520, 0, 1326, 1401, 1295, 1314, + 1411, 1317, 1320, 1363, 1273, 1341, 411, 1311, 1266, 1299, + 1268, 1306, 1269, 1297, 1328, 269, 1294, 1386, 1345, 1400, + 362, 266, 1275, 1300, 425, 1316, 203, 1365, 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 760, 366, 0, 0, 491, 396, 0, 0, - 0, 0, 0, 756, 757, 0, 0, 0, 0, 0, - 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, - 0, 95, 0, 0, 957, 941, 733, 907, 945, 958, - 959, 960, 961, 946, 0, 237, 947, 948, 244, 949, - 0, 906, 791, 793, 792, 856, 857, 858, 859, 860, - 861, 862, 789, 954, 962, 963, 0, 264, 319, 271, - 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 729, 746, - 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 743, 744, 0, 0, 0, 0, 901, 0, - 745, 0, 0, 753, 964, 965, 966, 967, 968, 969, - 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, - 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, - 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 755, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, - 256, 0, 448, 900, 0, 0, 616, 0, 0, 898, - 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, - 0, 407, 456, 468, 0, 0, 0, 951, 0, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 3987, - 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, + 510, 417, 1407, 366, 1351, 0, 491, 396, 0, 0, + 0, 1330, 1390, 1339, 1377, 1325, 1364, 1283, 1350, 1402, + 1312, 1360, 1403, 321, 247, 323, 202, 408, 492, 285, + 0, 95, 0, 0, 0, 709, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, + 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, + 353, 359, 1308, 1357, 1397, 1309, 1359, 264, 319, 271, + 263, 572, 1408, 1389, 1272, 1338, 1396, 1333, 0, 0, + 228, 1399, 1332, 0, 1362, 0, 1414, 1267, 1353, 0, + 1270, 1274, 1410, 1394, 1303, 274, 0, 0, 0, 0, + 0, 0, 0, 1329, 1340, 1374, 1378, 1323, 0, 0, + 0, 0, 0, 0, 0, 0, 1301, 0, 1349, 0, + 0, 0, 1279, 1271, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1327, 0, 0, 0, + 0, 1282, 0, 1302, 1375, 0, 1265, 296, 1276, 397, + 256, 0, 448, 1382, 1393, 1324, 616, 1395, 1322, 1321, + 1369, 1280, 1388, 1315, 361, 1278, 328, 197, 224, 0, + 1313, 407, 456, 468, 1387, 1298, 1307, 252, 1305, 466, + 421, 594, 232, 283, 453, 427, 464, 435, 286, 1348, + 1367, 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 952, 953, 255, 639, 797, 610, - 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 805, 806, 279, 305, 882, 881, 880, - 304, 306, 878, 879, 877, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, + 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, + 219, 1277, 609, 403, 576, 587, 390, 379, 218, 585, + 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, + 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, + 493, 599, 640, 447, 211, 233, 234, 236, 1293, 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, + 446, 1383, 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 0, 0, 420, 467, 239, 596, 490, 888, 910, 899, - 765, 766, 889, 890, 914, 891, 768, 769, 911, 912, - 762, 763, 767, 913, 915, 641, 642, 643, 644, 645, + 1372, 1413, 420, 467, 239, 596, 490, 199, 1287, 1292, + 1285, 0, 253, 254, 1354, 567, 1288, 1286, 1343, 1344, + 1289, 1404, 1405, 1406, 1391, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 902, 752, 751, 0, 758, 0, 787, - 788, 790, 794, 795, 796, 807, 854, 855, 863, 865, - 866, 864, 867, 868, 869, 872, 873, 874, 875, 870, - 871, 876, 770, 774, 771, 772, 773, 785, 775, 776, - 777, 778, 779, 780, 781, 782, 783, 784, 786, 925, - 926, 927, 928, 929, 930, 800, 804, 803, 801, 802, - 798, 799, 826, 825, 827, 828, 829, 830, 831, 832, - 834, 833, 835, 836, 837, 838, 839, 840, 808, 809, - 812, 813, 811, 810, 814, 823, 824, 815, 816, 817, - 818, 819, 820, 822, 821, 841, 842, 843, 844, 845, - 847, 846, 850, 851, 849, 848, 853, 852, 750, 196, - 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, - 916, 261, 917, 0, 0, 921, 0, 0, 0, 923, - 922, 0, 924, 886, 885, 0, 0, 918, 919, 0, - 920, 0, 0, 198, 200, 208, 221, 231, 235, 242, + 505, 0, 507, 1376, 1281, 0, 1290, 1291, 1385, 583, + 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, + 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, + 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, + 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, + 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, + 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, + 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, + 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, + 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, + 555, 536, 547, 558, 542, 530, 523, 531, 1347, 196, + 220, 364, 1409, 449, 287, 637, 606, 601, 205, 222, + 1284, 261, 1296, 1304, 0, 1310, 1318, 1319, 1331, 1334, + 1335, 1336, 1337, 1355, 1356, 1358, 1366, 1368, 1371, 1373, + 1380, 1392, 1412, 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 931, 932, 933, 934, 935, - 936, 937, 938, 298, 590, 620, 588, 632, 614, 433, - 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, - 226, 461, 289, 250, 956, 0, 210, 245, 229, 258, + 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, + 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, + 374, 1346, 1352, 377, 280, 303, 318, 1361, 605, 496, + 226, 461, 289, 250, 1379, 1381, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 392, 0, 372, 568, 569, 314, 520, 0, 761, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 0, 749, 0, 0, 0, 269, 754, 0, - 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, - 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, - 381, 423, 510, 417, 760, 366, 0, 0, 491, 396, - 0, 0, 0, 0, 0, 756, 757, 0, 0, 0, - 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, - 492, 285, 0, 95, 0, 1716, 957, 941, 733, 907, - 945, 958, 959, 960, 961, 946, 0, 237, 947, 948, - 244, 949, 0, 906, 791, 793, 792, 856, 857, 858, - 859, 860, 861, 862, 789, 954, 962, 963, 0, 264, - 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, - 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, - 729, 746, 0, 759, 0, 0, 0, 274, 0, 0, + 1342, 1370, 372, 568, 569, 314, 392, 0, 0, 0, + 1398, 1384, 520, 0, 1326, 1401, 1295, 1314, 1411, 1317, + 1320, 1363, 1273, 1341, 411, 1311, 1266, 1299, 1268, 1306, + 1269, 1297, 1328, 269, 1294, 1386, 1345, 1400, 362, 266, + 1275, 1300, 425, 1316, 203, 1365, 481, 251, 373, 370, + 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, + 1407, 366, 1351, 0, 491, 396, 0, 0, 0, 1330, + 1390, 1339, 1377, 1325, 1364, 1283, 1350, 1402, 1312, 1360, + 1403, 321, 247, 323, 202, 408, 492, 285, 0, 0, + 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, + 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, + 1308, 1357, 1397, 1309, 1359, 264, 319, 271, 263, 572, + 1408, 1389, 1272, 1338, 1396, 1333, 0, 0, 228, 1399, + 1332, 0, 1362, 0, 1414, 1267, 1353, 0, 1270, 1274, + 1410, 1394, 1303, 274, 0, 0, 0, 0, 0, 0, + 0, 1329, 1340, 1374, 1378, 1323, 0, 0, 0, 0, + 0, 0, 0, 0, 1301, 0, 1349, 0, 0, 0, + 1279, 1271, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1327, 0, 0, 0, 0, 1282, + 0, 1302, 1375, 0, 1265, 296, 1276, 397, 256, 0, + 448, 1382, 1393, 1324, 616, 1395, 1322, 1321, 1369, 1280, + 1388, 1315, 361, 1278, 328, 197, 224, 0, 1313, 407, + 456, 468, 1387, 1298, 1307, 252, 1305, 466, 421, 594, + 232, 283, 453, 427, 464, 435, 286, 1348, 1367, 465, + 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, + 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, + 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, + 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, + 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, + 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, + 257, 410, 581, 582, 255, 639, 227, 610, 219, 1277, + 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, + 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, + 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, + 640, 447, 211, 233, 234, 236, 1293, 278, 282, 290, + 293, 301, 302, 311, 363, 414, 441, 437, 446, 1383, + 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, + 628, 631, 629, 402, 309, 489, 331, 369, 1372, 1413, + 420, 467, 239, 596, 490, 199, 1287, 1292, 1285, 0, + 253, 254, 1354, 567, 1288, 1286, 1343, 1344, 1289, 1404, + 1405, 1406, 1391, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, + 507, 1376, 1281, 0, 1290, 1291, 1385, 583, 584, 659, + 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, + 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, + 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, + 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, + 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, + 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, + 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, + 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, + 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, + 547, 558, 542, 530, 523, 531, 1347, 196, 220, 364, + 1409, 449, 287, 637, 606, 601, 205, 222, 1284, 261, + 1296, 1304, 0, 1310, 1318, 1319, 1331, 1334, 1335, 1336, + 1337, 1355, 1356, 1358, 1366, 1368, 1371, 1373, 1380, 1392, + 1412, 198, 200, 208, 221, 231, 235, 242, 260, 275, + 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, + 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, + 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, + 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, + 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, + 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, + 634, 298, 590, 620, 588, 632, 614, 433, 374, 1346, + 1352, 377, 280, 303, 318, 1361, 605, 496, 226, 461, + 289, 250, 1379, 1381, 210, 245, 229, 258, 273, 276, + 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, + 479, 511, 512, 513, 515, 391, 265, 428, 1342, 1370, + 372, 568, 569, 314, 392, 0, 0, 0, 1398, 1384, + 520, 0, 1326, 1401, 1295, 1314, 1411, 1317, 1320, 1363, + 1273, 1341, 411, 1311, 1266, 1299, 1268, 1306, 1269, 1297, + 1328, 269, 1294, 1386, 1345, 1400, 362, 266, 1275, 1300, + 425, 1316, 203, 1365, 481, 251, 373, 370, 575, 281, + 272, 268, 249, 315, 381, 423, 510, 417, 1407, 366, + 1351, 0, 491, 396, 0, 0, 0, 1330, 1390, 1339, + 1377, 1325, 1364, 1283, 1350, 1402, 1312, 1360, 1403, 321, + 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, + 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, + 355, 336, 337, 339, 341, 346, 353, 359, 1308, 1357, + 1397, 1309, 1359, 264, 319, 271, 263, 572, 1408, 1389, + 1272, 1338, 1396, 1333, 0, 0, 228, 1399, 1332, 0, + 1362, 0, 1414, 1267, 1353, 0, 1270, 1274, 1410, 1394, + 1303, 274, 0, 0, 0, 0, 0, 0, 0, 1329, + 1340, 1374, 1378, 1323, 0, 0, 0, 0, 0, 0, + 0, 0, 1301, 0, 1349, 0, 0, 0, 1279, 1271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 743, 744, 0, 0, 0, 0, - 901, 0, 745, 0, 0, 753, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, - 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, - 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, - 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 755, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, - 0, 397, 256, 0, 448, 900, 0, 0, 616, 0, - 0, 898, 0, 0, 0, 0, 361, 0, 328, 197, - 224, 0, 0, 407, 456, 468, 0, 0, 0, 951, - 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, - 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, - 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, - 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, - 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, - 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, - 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, - 267, 292, 0, 0, 257, 410, 952, 953, 255, 639, - 797, 610, 219, 0, 609, 403, 576, 587, 390, 379, - 218, 585, 388, 378, 332, 805, 806, 279, 305, 882, - 881, 880, 304, 306, 878, 879, 877, 206, 598, 0, - 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, - 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, - 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, - 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, - 331, 369, 0, 0, 420, 467, 239, 596, 490, 888, - 910, 899, 765, 766, 889, 890, 914, 891, 768, 769, - 911, 912, 762, 763, 767, 913, 915, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, - 503, 504, 505, 0, 507, 902, 752, 751, 0, 758, - 0, 787, 788, 790, 794, 795, 796, 807, 854, 855, - 863, 865, 866, 864, 867, 868, 869, 872, 873, 874, - 875, 870, 871, 876, 770, 774, 771, 772, 773, 785, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, - 786, 925, 926, 927, 928, 929, 930, 800, 804, 803, - 801, 802, 798, 799, 826, 825, 827, 828, 829, 830, - 831, 832, 834, 833, 835, 836, 837, 838, 839, 840, - 808, 809, 812, 813, 811, 810, 814, 823, 824, 815, - 816, 817, 818, 819, 820, 822, 821, 841, 842, 843, - 844, 845, 847, 846, 850, 851, 849, 848, 853, 852, - 750, 196, 220, 364, 0, 449, 287, 637, 606, 601, - 205, 222, 916, 261, 917, 0, 0, 921, 0, 0, - 0, 923, 922, 0, 924, 886, 885, 0, 0, 918, - 919, 0, 920, 0, 0, 198, 200, 208, 221, 231, - 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, - 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, - 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, - 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, - 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, - 508, 578, 580, 595, 613, 619, 475, 931, 932, 933, - 934, 935, 936, 937, 938, 298, 590, 620, 588, 632, - 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, - 605, 496, 226, 461, 289, 250, 956, 0, 210, 245, - 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, - 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, - 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, - 761, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 749, 0, 0, 0, 269, - 754, 0, 0, 0, 362, 266, 0, 0, 425, 0, - 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, - 249, 315, 381, 423, 510, 417, 760, 366, 0, 0, - 491, 396, 0, 0, 0, 0, 0, 756, 757, 0, - 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, - 202, 408, 492, 285, 0, 95, 0, 0, 957, 941, - 733, 907, 945, 958, 959, 960, 961, 946, 0, 237, - 947, 948, 244, 949, 0, 906, 791, 793, 792, 856, - 857, 858, 859, 860, 861, 862, 789, 954, 962, 963, - 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, - 0, 0, 729, 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 743, 744, 1049, 0, - 0, 0, 901, 0, 745, 0, 0, 753, 964, 965, - 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, - 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, - 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, - 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, - 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 296, 0, 397, 256, 0, 448, 900, 0, 0, - 616, 0, 0, 898, 0, 0, 0, 0, 361, 0, - 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, - 0, 951, 0, 466, 421, 594, 232, 283, 453, 427, - 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1327, 0, 0, 0, 0, 1282, 0, 1302, + 1375, 0, 1265, 296, 1276, 397, 256, 0, 448, 1382, + 1393, 1324, 616, 1395, 1322, 1321, 1369, 1280, 1388, 1315, + 361, 1278, 328, 197, 224, 0, 1313, 407, 456, 468, + 1387, 1298, 1307, 252, 1305, 466, 421, 594, 232, 283, + 453, 427, 464, 435, 286, 1348, 1367, 465, 368, 577, + 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, + 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, + 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, + 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, + 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, + 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, + 581, 582, 255, 639, 227, 610, 219, 1277, 609, 403, + 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, + 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, + 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, + 211, 233, 234, 236, 1293, 278, 282, 290, 293, 301, + 302, 311, 363, 414, 441, 437, 446, 1383, 571, 592, + 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, + 629, 402, 309, 489, 331, 369, 1372, 1413, 420, 467, + 239, 596, 490, 199, 1287, 1292, 1285, 0, 253, 254, + 1354, 567, 1288, 1286, 1343, 1344, 1289, 1404, 1405, 1406, + 1391, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, + 500, 506, 501, 502, 503, 504, 505, 0, 507, 1376, + 1281, 0, 1290, 1291, 1385, 583, 584, 659, 380, 480, + 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, + 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, + 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, + 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, + 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, + 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, + 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, + 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, + 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, + 542, 530, 523, 531, 1347, 196, 220, 364, 1409, 449, + 287, 637, 606, 601, 205, 222, 1284, 261, 1296, 1304, + 0, 1310, 1318, 1319, 1331, 1334, 1335, 1336, 1337, 1355, + 1356, 1358, 1366, 1368, 1371, 1373, 1380, 1392, 1412, 198, + 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, + 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, + 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, + 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, + 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, + 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, + 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, + 590, 620, 588, 632, 614, 433, 374, 1346, 1352, 377, + 280, 303, 318, 1361, 605, 496, 226, 461, 289, 250, + 1379, 1381, 210, 245, 229, 258, 273, 276, 322, 387, + 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, + 512, 513, 515, 391, 265, 428, 1342, 1370, 372, 568, + 569, 314, 392, 0, 0, 0, 1398, 1384, 520, 0, + 1326, 1401, 1295, 1314, 1411, 1317, 1320, 1363, 1273, 1341, + 411, 1311, 1266, 1299, 1268, 1306, 1269, 1297, 1328, 269, + 1294, 1386, 1345, 1400, 362, 266, 1275, 1300, 425, 1316, + 203, 1365, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 1407, 366, 1351, 0, + 491, 396, 0, 0, 0, 1330, 1390, 1339, 1377, 1325, + 1364, 1283, 1350, 1402, 1312, 1360, 1403, 321, 247, 323, + 202, 408, 492, 285, 0, 0, 0, 0, 0, 941, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, + 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, + 337, 339, 341, 346, 353, 359, 1308, 1357, 1397, 1309, + 1359, 264, 319, 271, 263, 572, 1408, 1389, 1272, 1338, + 1396, 1333, 0, 0, 228, 1399, 1332, 0, 1362, 0, + 1414, 1267, 1353, 0, 1270, 1274, 1410, 1394, 1303, 274, + 0, 0, 0, 0, 0, 0, 0, 1329, 1340, 1374, + 1378, 1323, 0, 0, 0, 0, 0, 0, 0, 0, + 1301, 0, 1349, 0, 0, 0, 1279, 1271, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1327, 0, 0, 0, 0, 1282, 0, 1302, 1375, 0, + 1265, 296, 1276, 397, 256, 0, 448, 1382, 1393, 1324, + 616, 1395, 1322, 1321, 1369, 1280, 1388, 1315, 361, 1278, + 328, 197, 224, 0, 1313, 407, 456, 468, 1387, 1298, + 1307, 252, 1305, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 1348, 1367, 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, - 0, 452, 267, 292, 0, 0, 257, 410, 952, 953, - 255, 639, 797, 610, 219, 0, 609, 403, 576, 587, - 390, 379, 218, 585, 388, 378, 332, 805, 806, 279, - 305, 882, 881, 880, 304, 306, 878, 879, 877, 206, + 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, + 255, 639, 227, 610, 219, 1277, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, + 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, - 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, - 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, + 234, 236, 1293, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 1383, 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, - 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, - 490, 888, 910, 899, 765, 766, 889, 890, 914, 891, - 768, 769, 911, 912, 762, 763, 767, 913, 915, 641, + 309, 489, 331, 369, 1372, 1413, 420, 467, 239, 596, + 490, 199, 1287, 1292, 1285, 0, 253, 254, 1354, 567, + 1288, 1286, 1343, 1344, 1289, 1404, 1405, 1406, 1391, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, - 501, 502, 503, 504, 505, 0, 507, 902, 752, 751, - 0, 758, 0, 787, 788, 790, 794, 795, 796, 807, - 854, 855, 863, 865, 866, 864, 867, 868, 869, 872, - 873, 874, 875, 870, 871, 876, 770, 774, 771, 772, - 773, 785, 775, 776, 777, 778, 779, 780, 781, 782, - 783, 784, 786, 925, 926, 927, 928, 929, 930, 800, - 804, 803, 801, 802, 798, 799, 826, 825, 827, 828, - 829, 830, 831, 832, 834, 833, 835, 836, 837, 838, - 839, 840, 808, 809, 812, 813, 811, 810, 814, 823, - 824, 815, 816, 817, 818, 819, 820, 822, 821, 841, - 842, 843, 844, 845, 847, 846, 850, 851, 849, 848, - 853, 852, 750, 196, 220, 364, 0, 449, 287, 637, - 606, 601, 205, 222, 916, 261, 917, 0, 0, 921, - 0, 0, 0, 923, 922, 0, 924, 886, 885, 0, - 0, 918, 919, 0, 920, 0, 0, 198, 200, 208, + 501, 502, 503, 504, 505, 0, 507, 1376, 1281, 0, + 1290, 1291, 1385, 583, 584, 659, 380, 480, 593, 333, + 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, + 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, + 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, + 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, + 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, + 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, + 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, + 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, + 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, + 523, 531, 1347, 196, 220, 364, 1409, 449, 287, 637, + 606, 601, 205, 222, 1284, 261, 1296, 1304, 0, 1310, + 1318, 1319, 1331, 1334, 1335, 1336, 1337, 1355, 1356, 1358, + 1366, 1368, 1371, 1373, 1380, 1392, 1412, 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, - 494, 495, 508, 578, 580, 595, 613, 619, 475, 931, - 932, 933, 934, 935, 936, 937, 938, 298, 590, 620, - 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, - 318, 0, 605, 496, 226, 461, 289, 250, 956, 0, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, + 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, + 588, 632, 614, 433, 374, 1346, 1352, 377, 280, 303, + 318, 1361, 605, 496, 226, 461, 289, 250, 1379, 1381, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, - 520, 0, 761, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 0, 0, 0, 749, 0, 0, - 0, 269, 754, 0, 0, 0, 362, 266, 0, 0, - 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, - 272, 268, 249, 315, 381, 423, 510, 417, 760, 366, - 0, 0, 491, 396, 0, 0, 0, 0, 0, 756, - 757, 0, 0, 0, 0, 0, 0, 0, 0, 321, - 247, 323, 202, 408, 492, 285, 0, 95, 0, 0, - 957, 941, 733, 907, 945, 958, 959, 960, 961, 946, - 0, 237, 947, 948, 244, 949, 0, 906, 791, 793, - 792, 856, 857, 858, 859, 860, 861, 862, 789, 954, - 962, 963, 0, 264, 319, 271, 263, 572, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, - 0, 0, 0, 0, 729, 746, 0, 759, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 743, 744, - 0, 0, 0, 0, 901, 0, 745, 0, 0, 753, - 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, - 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, - 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, - 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, - 1004, 1005, 755, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 296, 0, 397, 256, 0, 448, 900, - 0, 0, 616, 0, 0, 898, 0, 0, 0, 0, - 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, - 0, 0, 0, 951, 0, 466, 421, 594, 232, 283, - 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, - 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, - 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, - 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, - 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, - 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, - 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, - 952, 953, 255, 639, 797, 610, 219, 0, 609, 403, - 576, 587, 390, 379, 218, 585, 388, 378, 332, 805, - 806, 279, 305, 882, 881, 880, 304, 306, 878, 879, - 877, 206, 598, 0, 207, 0, 493, 599, 640, 447, - 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, - 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, - 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, - 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, - 239, 596, 490, 888, 910, 899, 765, 766, 889, 890, - 914, 891, 768, 769, 911, 912, 762, 763, 767, 913, - 915, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, - 500, 506, 501, 502, 503, 504, 505, 0, 507, 902, - 752, 751, 0, 758, 0, 787, 788, 790, 794, 795, - 796, 807, 854, 855, 863, 865, 866, 864, 867, 868, - 869, 872, 873, 874, 875, 870, 871, 876, 770, 774, - 771, 772, 773, 785, 775, 776, 777, 778, 779, 780, - 781, 782, 783, 784, 786, 925, 926, 927, 928, 929, - 930, 800, 804, 803, 801, 802, 798, 799, 826, 825, - 827, 828, 829, 830, 831, 832, 834, 833, 835, 836, - 837, 838, 839, 840, 808, 809, 812, 813, 811, 810, - 814, 823, 824, 815, 816, 817, 818, 819, 820, 822, - 821, 841, 842, 843, 844, 845, 847, 846, 850, 851, - 849, 848, 853, 852, 750, 196, 220, 364, 0, 449, - 287, 637, 606, 601, 205, 222, 916, 261, 917, 0, - 0, 921, 0, 0, 0, 923, 922, 0, 924, 886, - 885, 0, 0, 918, 919, 0, 920, 0, 0, 198, - 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, - 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, - 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, - 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, - 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, - 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, - 475, 931, 932, 933, 934, 935, 936, 937, 938, 298, - 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, - 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, - 956, 0, 210, 245, 229, 258, 273, 276, 322, 387, - 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, - 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, - 569, 314, 520, 0, 761, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 749, - 0, 0, 0, 269, 754, 0, 0, 0, 362, 266, - 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 760, 366, 0, 0, 491, 396, 0, 0, 0, 0, - 0, 756, 757, 0, 0, 0, 0, 0, 0, 0, - 0, 321, 247, 323, 202, 408, 492, 285, 0, 95, - 0, 0, 957, 941, 733, 907, 945, 958, 959, 960, - 961, 946, 0, 237, 947, 948, 244, 949, 0, 906, - 791, 793, 792, 856, 857, 858, 859, 860, 861, 862, - 789, 954, 962, 963, 0, 264, 319, 271, 263, 572, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, - 0, 0, 0, 0, 0, 0, 729, 746, 0, 759, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 743, 744, 0, 0, 0, 0, 901, 0, 745, 0, - 0, 753, 964, 965, 966, 967, 968, 969, 970, 971, - 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, - 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, - 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, - 1002, 1003, 1004, 1005, 3092, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, - 448, 900, 0, 0, 616, 0, 0, 898, 0, 0, - 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, - 456, 468, 0, 0, 0, 951, 0, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 952, 953, 255, 639, 797, 610, 219, 0, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 805, 806, 279, 305, 882, 881, 880, 304, 306, - 878, 879, 877, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, - 420, 467, 239, 596, 490, 888, 910, 899, 765, 766, - 889, 890, 914, 891, 768, 769, 911, 912, 762, 763, - 767, 913, 915, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 902, 752, 751, 0, 758, 0, 787, 788, 790, - 794, 795, 796, 807, 854, 855, 863, 865, 866, 864, - 867, 868, 869, 872, 873, 874, 875, 870, 871, 876, - 770, 774, 771, 772, 773, 785, 775, 776, 777, 778, - 779, 780, 781, 782, 783, 784, 786, 925, 926, 927, - 928, 929, 930, 800, 804, 803, 801, 802, 798, 799, - 826, 825, 827, 828, 829, 830, 831, 832, 834, 833, - 835, 836, 837, 838, 839, 840, 808, 809, 812, 813, - 811, 810, 814, 823, 824, 815, 816, 817, 818, 819, - 820, 822, 821, 841, 842, 843, 844, 845, 847, 846, - 850, 851, 849, 848, 853, 852, 750, 196, 220, 364, - 0, 449, 287, 637, 606, 601, 205, 222, 916, 261, - 917, 0, 0, 921, 0, 0, 0, 923, 922, 0, - 924, 886, 885, 0, 0, 918, 919, 0, 920, 0, - 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 931, 932, 933, 934, 935, 936, 937, - 938, 298, 590, 620, 588, 632, 614, 433, 374, 0, - 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, - 289, 250, 956, 0, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, - 372, 568, 569, 314, 520, 0, 761, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 749, 0, 0, 0, 269, 754, 0, 0, 0, - 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, - 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 760, 366, 0, 0, 491, 396, 0, 0, - 0, 0, 0, 756, 757, 0, 0, 0, 0, 0, - 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, - 0, 95, 0, 0, 957, 941, 733, 907, 945, 958, - 959, 960, 961, 946, 0, 237, 947, 948, 244, 949, - 0, 906, 791, 793, 792, 856, 857, 858, 859, 860, - 861, 862, 789, 954, 962, 963, 0, 264, 319, 271, - 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 729, 746, - 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 743, 744, 0, 0, 0, 0, 901, 0, - 745, 0, 0, 753, 964, 965, 966, 967, 968, 969, - 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, - 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, - 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, - 1000, 1001, 1002, 1003, 1004, 1005, 3088, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, - 256, 0, 448, 900, 0, 0, 616, 0, 0, 898, - 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, - 0, 407, 456, 468, 0, 0, 0, 951, 0, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, - 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, - 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, - 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, - 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, - 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, - 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 952, 953, 255, 639, 797, 610, - 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 805, 806, 279, 305, 882, 881, 880, - 304, 306, 878, 879, 877, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, - 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, - 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 0, 0, 420, 467, 239, 596, 490, 888, 910, 899, - 765, 766, 889, 890, 914, 891, 768, 769, 911, 912, - 762, 763, 767, 913, 915, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 902, 752, 751, 0, 758, 0, 787, - 788, 790, 794, 795, 796, 807, 854, 855, 863, 865, - 866, 864, 867, 868, 869, 872, 873, 874, 875, 870, - 871, 876, 770, 774, 771, 772, 773, 785, 775, 776, - 777, 778, 779, 780, 781, 782, 783, 784, 786, 925, - 926, 927, 928, 929, 930, 800, 804, 803, 801, 802, - 798, 799, 826, 825, 827, 828, 829, 830, 831, 832, - 834, 833, 835, 836, 837, 838, 839, 840, 808, 809, - 812, 813, 811, 810, 814, 823, 824, 815, 816, 817, - 818, 819, 820, 822, 821, 841, 842, 843, 844, 845, - 847, 846, 850, 851, 849, 848, 853, 852, 750, 196, - 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, - 916, 261, 917, 0, 0, 921, 0, 0, 0, 923, - 922, 0, 924, 886, 885, 0, 0, 918, 919, 0, - 920, 0, 0, 198, 200, 208, 221, 231, 235, 242, - 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, - 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, - 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, - 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, - 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 931, 932, 933, 934, 935, - 936, 937, 938, 298, 590, 620, 588, 632, 614, 433, - 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, - 226, 461, 289, 250, 956, 0, 210, 245, 229, 258, - 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, - 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 392, 0, 372, 568, 569, 314, 520, 0, 761, 0, + 515, 391, 265, 428, 1342, 1370, 372, 568, 569, 314, + 392, 0, 0, 0, 0, 0, 520, 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 749, 0, 0, 0, 269, 754, 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, @@ -3985,13 +3387,13 @@ var yyAct = [...]int{ 381, 423, 510, 417, 760, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 756, 757, 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, - 492, 285, 0, 95, 0, 0, 957, 941, 1070, 907, + 492, 285, 0, 95, 0, 0, 957, 941, 733, 907, 945, 958, 959, 960, 961, 946, 0, 237, 947, 948, 244, 949, 0, 906, 791, 793, 792, 856, 857, 858, 859, 860, 861, 862, 789, 954, 962, 963, 0, 264, - 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, + 319, 271, 263, 572, 0, 0, 2177, 2178, 2179, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, - 0, 746, 0, 759, 0, 0, 0, 274, 0, 0, + 729, 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 743, 744, 0, 0, 0, 0, 901, 0, 745, 0, 0, 753, 964, 965, 966, 967, @@ -4056,14 +3458,14 @@ var yyAct = [...]int{ 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, 760, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 756, 757, 0, - 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, + 0, 0, 0, 0, 0, 2383, 0, 321, 247, 323, 202, 408, 492, 285, 0, 95, 0, 0, 957, 941, - 1070, 907, 945, 958, 959, 960, 961, 946, 0, 237, + 733, 907, 945, 958, 959, 960, 961, 946, 0, 237, 947, 948, 244, 949, 0, 906, 791, 793, 792, 856, 857, 858, 859, 860, 861, 862, 789, 954, 962, 963, - 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, + 2384, 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, - 0, 0, 0, 746, 0, 759, 0, 0, 0, 274, + 0, 0, 729, 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 743, 744, 0, 0, 0, 0, 901, 0, 745, 0, 0, 753, 964, 965, @@ -4071,7 +3473,7 @@ var yyAct = [...]int{ 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, - 2070, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, 900, 0, 0, 616, 0, 0, 898, 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, @@ -4121,521 +3523,882 @@ var yyAct = [...]int{ 318, 0, 605, 496, 226, 461, 289, 250, 956, 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, - 520, 0, 761, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 0, 0, 0, 749, 0, 0, - 0, 269, 754, 0, 0, 0, 362, 266, 0, 0, - 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, - 272, 268, 249, 315, 381, 423, 510, 417, 760, 366, - 0, 0, 491, 396, 0, 0, 0, 0, 0, 756, - 757, 0, 0, 0, 0, 0, 0, 0, 0, 321, - 247, 323, 202, 408, 492, 285, 0, 95, 0, 0, - 957, 941, 1070, 907, 945, 958, 959, 960, 961, 946, - 0, 237, 947, 948, 244, 949, 0, 906, 791, 793, - 792, 856, 857, 858, 859, 860, 861, 862, 789, 954, - 962, 963, 0, 264, 319, 271, 263, 572, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, - 0, 0, 0, 0, 0, 746, 0, 759, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 743, 744, - 0, 0, 0, 0, 901, 0, 745, 0, 0, 753, - 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, - 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, - 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, - 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, - 1004, 1005, 2068, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 296, 0, 397, 256, 0, 448, 900, - 0, 0, 616, 0, 0, 898, 0, 0, 0, 0, - 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, - 0, 0, 0, 951, 0, 466, 421, 594, 232, 283, - 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, - 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, - 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, - 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, - 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, - 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, - 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, - 952, 953, 255, 639, 797, 610, 219, 0, 609, 403, - 576, 587, 390, 379, 218, 585, 388, 378, 332, 805, - 806, 279, 305, 882, 881, 880, 304, 306, 878, 879, - 877, 206, 598, 0, 207, 0, 493, 599, 640, 447, - 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, - 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, - 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, - 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, - 239, 596, 490, 888, 910, 899, 765, 766, 889, 890, - 914, 891, 768, 769, 911, 912, 762, 763, 767, 913, - 915, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, - 500, 506, 501, 502, 503, 504, 505, 0, 507, 902, - 752, 751, 0, 758, 0, 787, 788, 790, 794, 795, - 796, 807, 854, 855, 863, 865, 866, 864, 867, 868, - 869, 872, 873, 874, 875, 870, 871, 876, 770, 774, - 771, 772, 773, 785, 775, 776, 777, 778, 779, 780, - 781, 782, 783, 784, 786, 925, 926, 927, 928, 929, - 930, 800, 804, 803, 801, 802, 798, 799, 826, 825, - 827, 828, 829, 830, 831, 832, 834, 833, 835, 836, - 837, 838, 839, 840, 808, 809, 812, 813, 811, 810, - 814, 823, 824, 815, 816, 817, 818, 819, 820, 822, - 821, 841, 842, 843, 844, 845, 847, 846, 850, 851, - 849, 848, 853, 852, 750, 196, 220, 364, 0, 449, - 287, 637, 606, 601, 205, 222, 916, 261, 917, 0, - 0, 921, 0, 0, 0, 923, 922, 0, 924, 886, - 885, 0, 0, 918, 919, 0, 920, 0, 0, 198, - 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, - 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, - 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, - 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, - 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, - 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, - 475, 931, 932, 933, 934, 935, 936, 937, 938, 298, - 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, - 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, - 956, 0, 210, 245, 229, 258, 273, 276, 322, 387, - 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, - 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, - 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, - 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, - 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, - 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, - 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, - 1121, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, - 448, 0, 0, 1120, 616, 0, 0, 0, 0, 0, - 1117, 1118, 361, 1078, 328, 197, 224, 1111, 1115, 407, - 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, - 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, - 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, - 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, - 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, - 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, - 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, - 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, - 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, - 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, - 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, - 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, - 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, - 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, - 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, - 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, - 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, - 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, - 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, - 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, - 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, - 0, 0, 0, 0, 1678, 941, 0, 0, 1675, 0, - 0, 0, 0, 1673, 0, 237, 1674, 1672, 244, 1677, - 0, 906, 347, 356, 355, 336, 337, 339, 341, 346, - 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, - 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 515, 391, 265, 428, 0, 392, 372, 568, 569, 314, + 86, 520, 0, 761, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 749, 0, + 0, 0, 269, 754, 0, 0, 0, 362, 266, 0, + 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 760, + 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, + 756, 757, 0, 0, 0, 0, 0, 0, 0, 0, + 321, 247, 323, 202, 408, 492, 285, 0, 95, 0, + 0, 957, 941, 733, 907, 945, 958, 959, 960, 961, + 946, 0, 237, 947, 948, 244, 949, 0, 906, 791, + 793, 792, 856, 857, 858, 859, 860, 861, 862, 789, + 954, 962, 963, 0, 264, 319, 271, 263, 572, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, + 0, 0, 0, 0, 0, 729, 746, 0, 759, 0, + 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 743, + 744, 0, 0, 0, 0, 901, 0, 745, 0, 0, + 753, 964, 965, 966, 967, 968, 969, 970, 971, 972, + 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, + 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, + 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, + 1003, 1004, 1005, 755, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, + 900, 0, 0, 616, 0, 0, 898, 0, 0, 0, + 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, + 468, 0, 0, 0, 951, 0, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, + 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, + 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, + 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, + 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, + 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, + 410, 952, 953, 255, 639, 797, 610, 219, 0, 609, + 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, + 805, 806, 279, 305, 882, 881, 880, 304, 306, 878, + 879, 877, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, + 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, + 467, 239, 596, 490, 888, 910, 899, 765, 766, 889, + 890, 914, 891, 768, 769, 911, 912, 762, 763, 767, + 913, 915, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, + 902, 752, 751, 0, 758, 0, 787, 788, 790, 794, + 795, 796, 807, 854, 855, 863, 865, 866, 864, 867, + 868, 869, 872, 873, 874, 875, 870, 871, 876, 770, + 774, 771, 772, 773, 785, 775, 776, 777, 778, 779, + 780, 781, 782, 783, 784, 786, 925, 926, 927, 928, + 929, 930, 800, 804, 803, 801, 802, 798, 799, 826, + 825, 827, 828, 829, 830, 831, 832, 834, 833, 835, + 836, 837, 838, 839, 840, 808, 809, 812, 813, 811, + 810, 814, 823, 824, 815, 816, 817, 818, 819, 820, + 822, 821, 841, 842, 843, 844, 845, 847, 846, 850, + 851, 849, 848, 853, 852, 750, 196, 220, 364, 94, + 449, 287, 637, 606, 601, 205, 222, 916, 261, 917, + 0, 0, 921, 0, 0, 0, 923, 922, 0, 924, + 886, 885, 0, 0, 918, 919, 0, 920, 0, 0, + 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, + 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, + 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, + 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, + 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, + 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, + 619, 475, 931, 932, 933, 934, 935, 936, 937, 938, + 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, + 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, + 250, 956, 0, 210, 245, 229, 258, 273, 276, 322, + 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, + 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 568, 569, 314, 520, 0, 761, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 749, 0, 0, 0, 269, 754, 0, 0, 0, 362, + 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 760, 366, 0, 0, 491, 396, 0, 0, 0, + 0, 0, 756, 757, 0, 0, 0, 0, 0, 0, + 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 95, 0, 0, 957, 941, 733, 907, 945, 958, 959, + 960, 961, 946, 0, 237, 947, 948, 244, 949, 0, + 906, 791, 793, 792, 856, 857, 858, 859, 860, 861, + 862, 789, 954, 962, 963, 0, 264, 319, 271, 263, + 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, + 0, 0, 0, 0, 0, 0, 0, 729, 746, 0, + 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 743, 744, 0, 0, 0, 0, 901, 0, 745, + 0, 0, 753, 964, 965, 966, 967, 968, 969, 970, + 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, + 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, + 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, + 1001, 1002, 1003, 1004, 1005, 755, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, + 0, 448, 900, 0, 0, 616, 0, 0, 898, 0, + 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, + 407, 456, 468, 0, 0, 0, 951, 0, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 3988, 0, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 952, 953, 255, 639, 797, 610, 219, + 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 805, 806, 279, 305, 882, 881, 880, 304, + 306, 878, 879, 877, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, + 0, 420, 467, 239, 596, 490, 888, 910, 899, 765, + 766, 889, 890, 914, 891, 768, 769, 911, 912, 762, + 763, 767, 913, 915, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 902, 752, 751, 0, 758, 0, 787, 788, + 790, 794, 795, 796, 807, 854, 855, 863, 865, 866, + 864, 867, 868, 869, 872, 873, 874, 875, 870, 871, + 876, 770, 774, 771, 772, 773, 785, 775, 776, 777, + 778, 779, 780, 781, 782, 783, 784, 786, 925, 926, + 927, 928, 929, 930, 800, 804, 803, 801, 802, 798, + 799, 826, 825, 827, 828, 829, 830, 831, 832, 834, + 833, 835, 836, 837, 838, 839, 840, 808, 809, 812, + 813, 811, 810, 814, 823, 824, 815, 816, 817, 818, + 819, 820, 822, 821, 841, 842, 843, 844, 845, 847, + 846, 850, 851, 849, 848, 853, 852, 750, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 916, + 261, 917, 0, 0, 921, 0, 0, 0, 923, 922, + 0, 924, 886, 885, 0, 0, 918, 919, 0, 920, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 931, 932, 933, 934, 935, 936, + 937, 938, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 956, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, + 0, 372, 568, 569, 314, 520, 0, 761, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, + 0, 0, 749, 0, 0, 0, 269, 754, 0, 0, + 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, + 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, + 423, 510, 417, 760, 366, 0, 0, 491, 396, 0, + 0, 0, 0, 0, 756, 757, 0, 0, 0, 0, + 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, + 285, 0, 95, 0, 1717, 957, 941, 733, 907, 945, + 958, 959, 960, 961, 946, 0, 237, 947, 948, 244, + 949, 0, 906, 791, 793, 792, 856, 857, 858, 859, + 860, 861, 862, 789, 954, 962, 963, 0, 264, 319, + 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 729, + 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 743, 744, 0, 0, 0, 0, 901, + 0, 745, 0, 0, 753, 964, 965, 966, 967, 968, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, + 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, + 999, 1000, 1001, 1002, 1003, 1004, 1005, 755, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, + 397, 256, 0, 448, 900, 0, 0, 616, 0, 0, + 898, 0, 0, 0, 0, 361, 0, 328, 197, 224, + 0, 0, 407, 456, 468, 0, 0, 0, 951, 0, + 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, + 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, + 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, + 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, + 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, + 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, + 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, + 292, 0, 0, 257, 410, 952, 953, 255, 639, 797, + 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, + 585, 388, 378, 332, 805, 806, 279, 305, 882, 881, + 880, 304, 306, 878, 879, 877, 206, 598, 0, 207, + 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, + 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, + 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, + 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, + 369, 0, 0, 420, 467, 239, 596, 490, 888, 910, + 899, 765, 766, 889, 890, 914, 891, 768, 769, 911, + 912, 762, 763, 767, 913, 915, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, + 504, 505, 0, 507, 902, 752, 751, 0, 758, 0, + 787, 788, 790, 794, 795, 796, 807, 854, 855, 863, + 865, 866, 864, 867, 868, 869, 872, 873, 874, 875, + 870, 871, 876, 770, 774, 771, 772, 773, 785, 775, + 776, 777, 778, 779, 780, 781, 782, 783, 784, 786, + 925, 926, 927, 928, 929, 930, 800, 804, 803, 801, + 802, 798, 799, 826, 825, 827, 828, 829, 830, 831, + 832, 834, 833, 835, 836, 837, 838, 839, 840, 808, + 809, 812, 813, 811, 810, 814, 823, 824, 815, 816, + 817, 818, 819, 820, 822, 821, 841, 842, 843, 844, + 845, 847, 846, 850, 851, 849, 848, 853, 852, 750, + 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, + 222, 916, 261, 917, 0, 0, 921, 0, 0, 0, + 923, 922, 0, 924, 886, 885, 0, 0, 918, 919, + 0, 920, 0, 0, 198, 200, 208, 221, 231, 235, + 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, + 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, + 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, + 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, + 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, + 578, 580, 595, 613, 619, 475, 931, 932, 933, 934, + 935, 936, 937, 938, 298, 590, 620, 588, 632, 614, + 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, + 496, 226, 461, 289, 250, 956, 0, 210, 245, 229, + 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, + 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, + 428, 392, 0, 372, 568, 569, 314, 520, 0, 761, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 749, 0, 0, 0, 269, 754, + 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, + 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, + 315, 381, 423, 510, 417, 760, 366, 0, 0, 491, + 396, 0, 0, 0, 0, 0, 756, 757, 0, 0, + 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, + 408, 492, 285, 0, 95, 0, 0, 957, 941, 733, + 907, 945, 958, 959, 960, 961, 946, 0, 237, 947, + 948, 244, 949, 0, 906, 791, 793, 792, 856, 857, + 858, 859, 860, 861, 862, 789, 954, 962, 963, 0, + 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, + 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, + 0, 729, 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, - 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, - 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, - 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, - 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, - 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, - 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, - 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, - 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, - 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, - 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, - 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, - 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, - 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, - 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, - 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, - 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, - 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, - 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, - 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, - 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, - 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, - 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, - 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, - 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, - 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, - 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 743, 744, 1049, 0, 0, + 0, 901, 0, 745, 0, 0, 753, 964, 965, 966, + 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, + 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, + 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, + 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, - 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, - 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, - 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, - 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, - 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, - 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, - 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, - 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, - 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, - 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 0, 392, 372, 568, 569, 314, 86, 520, 0, 0, + 296, 0, 397, 256, 0, 448, 900, 0, 0, 616, + 0, 0, 898, 0, 0, 0, 0, 361, 0, 328, + 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, + 951, 0, 466, 421, 594, 232, 283, 453, 427, 464, + 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, + 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, + 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, + 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, + 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, + 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, + 452, 267, 292, 0, 0, 257, 410, 952, 953, 255, + 639, 797, 610, 219, 0, 609, 403, 576, 587, 390, + 379, 218, 585, 388, 378, 332, 805, 806, 279, 305, + 882, 881, 880, 304, 306, 878, 879, 877, 206, 598, + 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, + 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, + 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, + 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, + 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, + 888, 910, 899, 765, 766, 889, 890, 914, 891, 768, + 769, 911, 912, 762, 763, 767, 913, 915, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, + 502, 503, 504, 505, 0, 507, 902, 752, 751, 0, + 758, 0, 787, 788, 790, 794, 795, 796, 807, 854, + 855, 863, 865, 866, 864, 867, 868, 869, 872, 873, + 874, 875, 870, 871, 876, 770, 774, 771, 772, 773, + 785, 775, 776, 777, 778, 779, 780, 781, 782, 783, + 784, 786, 925, 926, 927, 928, 929, 930, 800, 804, + 803, 801, 802, 798, 799, 826, 825, 827, 828, 829, + 830, 831, 832, 834, 833, 835, 836, 837, 838, 839, + 840, 808, 809, 812, 813, 811, 810, 814, 823, 824, + 815, 816, 817, 818, 819, 820, 822, 821, 841, 842, + 843, 844, 845, 847, 846, 850, 851, 849, 848, 853, + 852, 750, 196, 220, 364, 0, 449, 287, 637, 606, + 601, 205, 222, 916, 261, 917, 0, 0, 921, 0, + 0, 0, 923, 922, 0, 924, 886, 885, 0, 0, + 918, 919, 0, 920, 0, 0, 198, 200, 208, 221, + 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, + 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, + 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, + 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, + 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, + 495, 508, 578, 580, 595, 613, 619, 475, 931, 932, + 933, 934, 935, 936, 937, 938, 298, 590, 620, 588, + 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, + 0, 605, 496, 226, 461, 289, 250, 956, 0, 210, + 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, + 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, + 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, + 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 411, 0, 0, 0, 0, 749, 0, 0, 0, + 269, 754, 0, 0, 0, 362, 266, 0, 0, 425, + 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, + 268, 249, 315, 381, 423, 510, 417, 760, 366, 0, + 0, 491, 396, 0, 0, 0, 0, 0, 756, 757, + 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, + 323, 202, 408, 492, 285, 0, 95, 0, 0, 957, + 941, 733, 907, 945, 958, 959, 960, 961, 946, 0, + 237, 947, 948, 244, 949, 0, 906, 791, 793, 792, + 856, 857, 858, 859, 860, 861, 862, 789, 954, 962, + 963, 0, 264, 319, 271, 263, 572, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, + 0, 0, 0, 729, 746, 0, 759, 0, 0, 0, + 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 743, 744, 0, + 0, 0, 0, 901, 0, 745, 0, 0, 753, 964, + 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, + 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, + 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, + 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 755, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 296, 0, 397, 256, 0, 448, 900, 0, + 0, 616, 0, 0, 898, 0, 0, 0, 0, 361, + 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, + 0, 0, 951, 0, 466, 421, 594, 232, 283, 453, + 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, + 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, + 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, + 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, + 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, + 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, + 213, 0, 452, 267, 292, 0, 0, 257, 410, 952, + 953, 255, 639, 797, 610, 219, 0, 609, 403, 576, + 587, 390, 379, 218, 585, 388, 378, 332, 805, 806, + 279, 305, 882, 881, 880, 304, 306, 878, 879, 877, + 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, + 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, + 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, + 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, + 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, + 596, 490, 888, 910, 899, 765, 766, 889, 890, 914, + 891, 768, 769, 911, 912, 762, 763, 767, 913, 915, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, + 506, 501, 502, 503, 504, 505, 0, 507, 902, 752, + 751, 0, 758, 0, 787, 788, 790, 794, 795, 796, + 807, 854, 855, 863, 865, 866, 864, 867, 868, 869, + 872, 873, 874, 875, 870, 871, 876, 770, 774, 771, + 772, 773, 785, 775, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 786, 925, 926, 927, 928, 929, 930, + 800, 804, 803, 801, 802, 798, 799, 826, 825, 827, + 828, 829, 830, 831, 832, 834, 833, 835, 836, 837, + 838, 839, 840, 808, 809, 812, 813, 811, 810, 814, + 823, 824, 815, 816, 817, 818, 819, 820, 822, 821, + 841, 842, 843, 844, 845, 847, 846, 850, 851, 849, + 848, 853, 852, 750, 196, 220, 364, 0, 449, 287, + 637, 606, 601, 205, 222, 916, 261, 917, 0, 0, + 921, 0, 0, 0, 923, 922, 0, 924, 886, 885, + 0, 0, 918, 919, 0, 920, 0, 0, 198, 200, + 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, + 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, + 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, + 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, + 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, + 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, + 931, 932, 933, 934, 935, 936, 937, 938, 298, 590, + 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, + 303, 318, 0, 605, 496, 226, 461, 289, 250, 956, + 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, + 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, + 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, + 314, 520, 0, 761, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 749, 0, + 0, 0, 269, 754, 0, 0, 0, 362, 266, 0, + 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 760, + 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, + 756, 757, 0, 0, 0, 0, 0, 0, 0, 0, + 321, 247, 323, 202, 408, 492, 285, 0, 95, 0, + 0, 957, 941, 733, 907, 945, 958, 959, 960, 961, + 946, 0, 237, 947, 948, 244, 949, 0, 906, 791, + 793, 792, 856, 857, 858, 859, 860, 861, 862, 789, + 954, 962, 963, 0, 264, 319, 271, 263, 572, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, + 0, 0, 0, 0, 0, 729, 746, 0, 759, 0, + 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 743, + 744, 0, 0, 0, 0, 901, 0, 745, 0, 0, + 753, 964, 965, 966, 967, 968, 969, 970, 971, 972, + 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, + 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, + 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, + 1003, 1004, 1005, 3093, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, + 900, 0, 0, 616, 0, 0, 898, 0, 0, 0, + 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, + 468, 0, 0, 0, 951, 0, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, + 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, + 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, + 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, + 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, + 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, + 410, 952, 953, 255, 639, 797, 610, 219, 0, 609, + 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, + 805, 806, 279, 305, 882, 881, 880, 304, 306, 878, + 879, 877, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, + 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, + 467, 239, 596, 490, 888, 910, 899, 765, 766, 889, + 890, 914, 891, 768, 769, 911, 912, 762, 763, 767, + 913, 915, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, + 902, 752, 751, 0, 758, 0, 787, 788, 790, 794, + 795, 796, 807, 854, 855, 863, 865, 866, 864, 867, + 868, 869, 872, 873, 874, 875, 870, 871, 876, 770, + 774, 771, 772, 773, 785, 775, 776, 777, 778, 779, + 780, 781, 782, 783, 784, 786, 925, 926, 927, 928, + 929, 930, 800, 804, 803, 801, 802, 798, 799, 826, + 825, 827, 828, 829, 830, 831, 832, 834, 833, 835, + 836, 837, 838, 839, 840, 808, 809, 812, 813, 811, + 810, 814, 823, 824, 815, 816, 817, 818, 819, 820, + 822, 821, 841, 842, 843, 844, 845, 847, 846, 850, + 851, 849, 848, 853, 852, 750, 196, 220, 364, 0, + 449, 287, 637, 606, 601, 205, 222, 916, 261, 917, + 0, 0, 921, 0, 0, 0, 923, 922, 0, 924, + 886, 885, 0, 0, 918, 919, 0, 920, 0, 0, + 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, + 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, + 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, + 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, + 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, + 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, + 619, 475, 931, 932, 933, 934, 935, 936, 937, 938, + 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, + 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, + 250, 956, 0, 210, 245, 229, 258, 273, 276, 322, + 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, + 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 568, 569, 314, 520, 0, 761, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 749, 0, 0, 0, 269, 754, 0, 0, 0, 362, + 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 760, 366, 0, 0, 491, 396, 0, 0, 0, + 0, 0, 756, 757, 0, 0, 0, 0, 0, 0, + 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 95, 0, 0, 957, 941, 733, 907, 945, 958, 959, + 960, 961, 946, 0, 237, 947, 948, 244, 949, 0, + 906, 791, 793, 792, 856, 857, 858, 859, 860, 861, + 862, 789, 954, 962, 963, 0, 264, 319, 271, 263, + 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, + 0, 0, 0, 0, 0, 0, 0, 729, 746, 0, + 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 743, 744, 0, 0, 0, 0, 901, 0, 745, + 0, 0, 753, 964, 965, 966, 967, 968, 969, 970, + 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, + 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, + 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, + 1001, 1002, 1003, 1004, 1005, 3089, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, + 0, 448, 900, 0, 0, 616, 0, 0, 898, 0, + 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, + 407, 456, 468, 0, 0, 0, 951, 0, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 952, 953, 255, 639, 797, 610, 219, + 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 805, 806, 279, 305, 882, 881, 880, 304, + 306, 878, 879, 877, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, + 0, 420, 467, 239, 596, 490, 888, 910, 899, 765, + 766, 889, 890, 914, 891, 768, 769, 911, 912, 762, + 763, 767, 913, 915, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 902, 752, 751, 0, 758, 0, 787, 788, + 790, 794, 795, 796, 807, 854, 855, 863, 865, 866, + 864, 867, 868, 869, 872, 873, 874, 875, 870, 871, + 876, 770, 774, 771, 772, 773, 785, 775, 776, 777, + 778, 779, 780, 781, 782, 783, 784, 786, 925, 926, + 927, 928, 929, 930, 800, 804, 803, 801, 802, 798, + 799, 826, 825, 827, 828, 829, 830, 831, 832, 834, + 833, 835, 836, 837, 838, 839, 840, 808, 809, 812, + 813, 811, 810, 814, 823, 824, 815, 816, 817, 818, + 819, 820, 822, 821, 841, 842, 843, 844, 845, 847, + 846, 850, 851, 849, 848, 853, 852, 750, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 916, + 261, 917, 0, 0, 921, 0, 0, 0, 923, 922, + 0, 924, 886, 885, 0, 0, 918, 919, 0, 920, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 931, 932, 933, 934, 935, 936, + 937, 938, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 956, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, + 0, 372, 568, 569, 314, 520, 0, 761, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, + 0, 0, 749, 0, 0, 0, 269, 754, 0, 0, + 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, + 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, + 423, 510, 417, 760, 366, 0, 0, 491, 396, 0, + 0, 0, 0, 0, 756, 757, 0, 0, 0, 0, + 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, + 285, 0, 95, 0, 0, 957, 941, 1070, 907, 945, + 958, 959, 960, 961, 946, 0, 237, 947, 948, 244, + 949, 0, 906, 791, 793, 792, 856, 857, 858, 859, + 860, 861, 862, 789, 954, 962, 963, 0, 264, 319, + 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, + 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 743, 744, 0, 0, 0, 0, 901, + 0, 745, 0, 0, 753, 964, 965, 966, 967, 968, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, + 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, + 999, 1000, 1001, 1002, 1003, 1004, 1005, 755, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, + 397, 256, 0, 448, 900, 0, 0, 616, 0, 0, + 898, 0, 0, 0, 0, 361, 0, 328, 197, 224, + 0, 0, 407, 456, 468, 0, 0, 0, 951, 0, + 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, + 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, + 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, + 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, + 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, + 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, + 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, + 292, 0, 0, 257, 410, 952, 953, 255, 639, 797, + 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, + 585, 388, 378, 332, 805, 806, 279, 305, 882, 881, + 880, 304, 306, 878, 879, 877, 206, 598, 0, 207, + 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, + 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, + 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, + 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, + 369, 0, 0, 420, 467, 239, 596, 490, 888, 910, + 899, 765, 766, 889, 890, 914, 891, 768, 769, 911, + 912, 762, 763, 767, 913, 915, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, + 504, 505, 0, 507, 902, 752, 751, 0, 758, 0, + 787, 788, 790, 794, 795, 796, 807, 854, 855, 863, + 865, 866, 864, 867, 868, 869, 872, 873, 874, 875, + 870, 871, 876, 770, 774, 771, 772, 773, 785, 775, + 776, 777, 778, 779, 780, 781, 782, 783, 784, 786, + 925, 926, 927, 928, 929, 930, 800, 804, 803, 801, + 802, 798, 799, 826, 825, 827, 828, 829, 830, 831, + 832, 834, 833, 835, 836, 837, 838, 839, 840, 808, + 809, 812, 813, 811, 810, 814, 823, 824, 815, 816, + 817, 818, 819, 820, 822, 821, 841, 842, 843, 844, + 845, 847, 846, 850, 851, 849, 848, 853, 852, 750, + 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, + 222, 916, 261, 917, 0, 0, 921, 0, 0, 0, + 923, 922, 0, 924, 886, 885, 0, 0, 918, 919, + 0, 920, 0, 0, 198, 200, 208, 221, 231, 235, + 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, + 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, + 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, + 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, + 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, + 578, 580, 595, 613, 619, 475, 931, 932, 933, 934, + 935, 936, 937, 938, 298, 590, 620, 588, 632, 614, + 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, + 496, 226, 461, 289, 250, 956, 0, 210, 245, 229, + 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, + 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, + 428, 392, 0, 372, 568, 569, 314, 520, 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, - 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, + 0, 0, 0, 0, 749, 0, 0, 0, 269, 754, 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, - 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 315, 381, 423, 510, 417, 760, 366, 0, 0, 491, + 396, 0, 0, 0, 0, 0, 756, 757, 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, - 408, 492, 285, 0, 95, 0, 0, 0, 194, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, - 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, - 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, + 408, 492, 285, 0, 95, 0, 0, 957, 941, 1070, + 907, 945, 958, 959, 960, 961, 946, 0, 237, 947, + 948, 244, 949, 0, 906, 791, 793, 792, 856, 857, + 858, 859, 860, 861, 862, 789, 954, 962, 963, 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 743, 744, 0, 0, 0, + 0, 901, 0, 745, 0, 0, 753, 964, 965, 966, + 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, + 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, + 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, + 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 2071, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, - 0, 0, 0, 0, 0, 0, 0, 361, 0, 328, + 296, 0, 397, 256, 0, 448, 900, 0, 0, 616, + 0, 0, 898, 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, - 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, + 951, 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, - 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, - 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, + 452, 267, 292, 0, 0, 257, 410, 952, 953, 255, + 639, 797, 610, 219, 0, 609, 403, 576, 587, 390, + 379, 218, 585, 388, 378, 332, 805, 806, 279, 305, + 882, 881, 880, 304, 306, 878, 879, 877, 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, - 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, + 888, 910, 899, 765, 766, 889, 890, 914, 891, 768, + 769, 911, 912, 762, 763, 767, 913, 915, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, - 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, - 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, - 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, - 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, - 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, - 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, - 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, - 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, - 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, - 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, - 531, 0, 196, 220, 364, 94, 449, 287, 637, 606, - 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, - 0, 2369, 0, 0, 2368, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, + 502, 503, 504, 505, 0, 507, 902, 752, 751, 0, + 758, 0, 787, 788, 790, 794, 795, 796, 807, 854, + 855, 863, 865, 866, 864, 867, 868, 869, 872, 873, + 874, 875, 870, 871, 876, 770, 774, 771, 772, 773, + 785, 775, 776, 777, 778, 779, 780, 781, 782, 783, + 784, 786, 925, 926, 927, 928, 929, 930, 800, 804, + 803, 801, 802, 798, 799, 826, 825, 827, 828, 829, + 830, 831, 832, 834, 833, 835, 836, 837, 838, 839, + 840, 808, 809, 812, 813, 811, 810, 814, 823, 824, + 815, 816, 817, 818, 819, 820, 822, 821, 841, 842, + 843, 844, 845, 847, 846, 850, 851, 849, 848, 853, + 852, 750, 196, 220, 364, 0, 449, 287, 637, 606, + 601, 205, 222, 916, 261, 917, 0, 0, 921, 0, + 0, 0, 923, 922, 0, 924, 886, 885, 0, 0, + 918, 919, 0, 920, 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, - 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, + 495, 508, 578, 580, 595, 613, 619, 475, 931, 932, + 933, 934, 935, 936, 937, 938, 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, - 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, + 0, 605, 496, 226, 461, 289, 250, 956, 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 1735, 0, 372, 568, 569, 314, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 411, 0, 0, 0, 1737, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, + 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, + 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 411, 0, 0, 0, 0, 749, 0, 0, 0, + 269, 754, 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, - 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, + 268, 249, 315, 381, 423, 510, 417, 760, 366, 0, + 0, 491, 396, 0, 0, 0, 0, 0, 756, 757, 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, - 323, 202, 408, 492, 285, 0, 0, 0, 0, 1739, - 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, - 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, - 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 1451, - 0, 1452, 1453, 0, 0, 0, 0, 0, 0, 0, + 323, 202, 408, 492, 285, 0, 95, 0, 0, 957, + 941, 1070, 907, 945, 958, 959, 960, 961, 946, 0, + 237, 947, 948, 244, 949, 0, 906, 791, 793, 792, + 856, 857, 858, 859, 860, 861, 862, 789, 954, 962, + 963, 0, 264, 319, 271, 263, 572, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, + 0, 0, 0, 0, 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, - 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, + 0, 0, 0, 0, 0, 0, 0, 743, 744, 0, + 0, 0, 0, 901, 0, 745, 0, 0, 753, 964, + 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, + 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, + 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, + 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 2069, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 296, 0, 397, 256, 0, 448, 900, 0, + 0, 616, 0, 0, 898, 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, - 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, + 0, 0, 951, 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, - 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, - 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, + 213, 0, 452, 267, 292, 0, 0, 257, 410, 952, + 953, 255, 639, 797, 610, 219, 0, 609, 403, 576, + 587, 390, 379, 218, 585, 388, 378, 332, 805, 806, + 279, 305, 882, 881, 880, 304, 306, 878, 879, 877, 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, - 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, - 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 490, 888, 910, 899, 765, 766, 889, 890, 914, + 891, 768, 769, 911, 912, 762, 763, 767, 913, 915, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, - 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, - 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, - 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, - 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, - 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, - 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, - 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, - 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, - 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, - 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, - 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, - 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 506, 501, 502, 503, 504, 505, 0, 507, 902, 752, + 751, 0, 758, 0, 787, 788, 790, 794, 795, 796, + 807, 854, 855, 863, 865, 866, 864, 867, 868, 869, + 872, 873, 874, 875, 870, 871, 876, 770, 774, 771, + 772, 773, 785, 775, 776, 777, 778, 779, 780, 781, + 782, 783, 784, 786, 925, 926, 927, 928, 929, 930, + 800, 804, 803, 801, 802, 798, 799, 826, 825, 827, + 828, 829, 830, 831, 832, 834, 833, 835, 836, 837, + 838, 839, 840, 808, 809, 812, 813, 811, 810, 814, + 823, 824, 815, 816, 817, 818, 819, 820, 822, 821, + 841, 842, 843, 844, 845, 847, 846, 850, 851, 849, + 848, 853, 852, 750, 196, 220, 364, 0, 449, 287, + 637, 606, 601, 205, 222, 916, 261, 917, 0, 0, + 921, 0, 0, 0, 923, 922, 0, 924, 886, 885, + 0, 0, 918, 919, 0, 920, 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, + 931, 932, 933, 934, 935, 936, 937, 938, 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, - 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, + 303, 318, 0, 605, 496, 226, 461, 289, 250, 956, 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 0, 392, 372, 568, 569, - 314, 86, 520, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, - 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 321, 247, 323, 202, 408, 492, 285, 0, 95, - 0, 1716, 0, 709, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, - 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, - 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, + 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, + 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, + 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, + 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, + 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, + 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, + 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 1121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, - 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, - 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, - 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, - 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, - 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, - 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, - 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, - 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, - 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, - 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, - 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, - 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, - 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, - 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, - 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, - 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, - 94, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, - 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, - 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, - 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, - 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, - 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, - 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, - 0, 95, 0, 0, 0, 194, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, - 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, - 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, - 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, + 0, 0, 1120, 616, 0, 0, 0, 0, 0, 1117, + 1118, 361, 1078, 328, 197, 224, 1111, 1115, 407, 456, + 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, + 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, + 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, + 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, + 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, + 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, + 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, + 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, + 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, + 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, + 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, + 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, + 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, + 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, + 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, + 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, + 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, + 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, + 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, + 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, + 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, + 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, + 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, + 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, + 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, + 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, + 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, + 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, + 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, + 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, + 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, + 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, + 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, + 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, + 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, + 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, + 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 0, 0, 0, 1679, 941, 0, 0, 1676, 0, 0, + 0, 0, 1674, 0, 237, 1675, 1673, 244, 1678, 0, + 906, 347, 356, 355, 336, 337, 339, 341, 346, 353, + 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, + 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, - 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, - 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, - 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, - 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, - 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, - 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, - 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, - 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, - 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, - 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, - 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, - 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, - 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, - 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, - 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, - 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, - 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, - 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, - 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, - 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, - 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, - 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, - 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, - 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, - 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, - 0, 261, 0, 0, 0, 0, 0, 0, 2369, 0, - 0, 2368, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, - 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, - 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, - 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, - 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, - 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, - 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, - 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, - 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, - 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, - 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, + 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, + 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, + 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, + 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, + 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, + 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, + 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, + 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, + 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, + 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, + 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, + 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, + 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, + 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, + 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, + 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, + 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, + 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, + 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 0, + 392, 372, 568, 569, 314, 86, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 2319, 0, 0, 0, 0, 269, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, - 492, 285, 0, 0, 0, 0, 1918, 194, 0, 0, + 492, 285, 0, 95, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, @@ -4654,7 +4417,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, - 286, 0, 2317, 465, 368, 577, 445, 591, 617, 618, + 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, @@ -4684,9 +4447,9 @@ var yyAct = [...]int{ 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, - 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, + 0, 196, 220, 364, 94, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2370, 0, 0, 2369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, @@ -4699,22 +4462,22 @@ var yyAct = [...]int{ 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, - 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, + 265, 428, 1736, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, + 411, 0, 0, 0, 1738, 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, - 202, 408, 492, 285, 0, 0, 0, 0, 0, 709, + 202, 408, 492, 285, 0, 0, 0, 0, 1740, 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, - 0, 0, 0, 0, 0, 0, 0, 0, 1072, 0, + 0, 0, 0, 0, 228, 0, 0, 0, 1452, 0, + 1453, 1454, 0, 0, 0, 0, 0, 0, 0, 274, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4723,8 +4486,8 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, - 616, 0, 0, 0, 0, 0, 0, 0, 361, 1078, - 328, 197, 224, 1076, 0, 407, 456, 468, 0, 0, + 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, + 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, @@ -4771,888 +4534,1177 @@ var yyAct = [...]int{ 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, - 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 0, 0, 2319, 0, 0, 0, - 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, - 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, - 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, - 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, - 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, - 1918, 194, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, - 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, - 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, + 515, 391, 265, 428, 0, 392, 372, 568, 569, 314, + 86, 520, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, + 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, + 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, + 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 321, 247, 323, 202, 408, 492, 285, 0, 95, 0, + 1717, 0, 709, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, + 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, + 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, + 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, + 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, + 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, + 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, + 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, + 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, + 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, + 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, + 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, + 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, + 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, + 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, + 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, + 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, + 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, + 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, + 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, + 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, + 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, + 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, + 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, + 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, + 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, + 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, + 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, + 558, 542, 530, 523, 531, 0, 196, 220, 364, 94, + 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, + 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, + 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, + 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, + 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, + 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, + 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, + 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, + 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, + 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, + 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, + 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, + 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 95, 0, 0, 0, 194, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, + 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, + 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, + 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, + 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, + 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, + 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, + 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, + 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, + 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, + 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, + 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, + 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, + 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, + 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, + 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, + 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, + 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, + 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, + 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, + 261, 0, 0, 0, 0, 0, 0, 2370, 0, 0, + 2369, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, + 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, + 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, + 0, 2320, 0, 0, 0, 0, 269, 0, 0, 0, + 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, + 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, + 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, + 285, 0, 0, 0, 0, 1919, 194, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, + 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, + 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, + 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, + 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, + 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, + 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, + 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, + 0, 2318, 465, 368, 577, 445, 591, 617, 618, 262, + 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, + 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, + 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, + 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, + 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, + 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, + 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, + 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, + 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, + 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, + 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, + 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, + 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, + 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, + 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, + 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, + 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, + 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, + 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, + 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, + 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, + 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, + 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, + 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, + 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, + 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, + 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, + 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, + 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, + 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, + 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, + 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, + 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, + 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, + 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, + 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, + 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, + 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, + 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, + 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, + 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, + 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, + 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, + 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, + 408, 492, 285, 0, 0, 0, 0, 0, 709, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, + 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, + 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, + 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, + 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, + 0, 0, 0, 0, 0, 0, 0, 1072, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, + 0, 0, 0, 0, 0, 0, 0, 361, 1078, 328, + 197, 224, 1076, 0, 407, 456, 468, 0, 0, 0, + 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, + 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, + 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, + 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, + 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, + 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, + 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, + 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, + 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, + 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, + 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, + 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, + 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, + 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, + 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, + 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, + 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, + 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, + 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, + 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, + 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, + 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, + 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, + 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, + 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, + 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, + 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, + 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, + 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, + 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, + 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, + 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, + 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, + 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, + 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, + 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, + 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, + 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, + 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, + 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, + 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, + 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 411, 0, 0, 0, 2320, 0, 0, 0, 0, + 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, + 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, + 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, + 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, + 323, 202, 408, 492, 285, 0, 0, 0, 0, 1919, + 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, + 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, + 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, + 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, + 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, + 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, + 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, + 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, + 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, + 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, + 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, + 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, + 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, + 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, + 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, + 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, + 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, + 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, + 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, + 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, + 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, + 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, + 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, + 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, + 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, + 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, + 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, + 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, + 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, + 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, + 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, + 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, + 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, + 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, + 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, + 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, + 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, + 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, + 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, + 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, + 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, + 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, + 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, + 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, + 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, + 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, + 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, + 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, + 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, + 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, + 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, + 1717, 0, 709, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, + 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, + 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, - 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, - 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, - 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, - 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, - 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, - 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, - 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, - 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, - 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, - 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, - 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, - 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, - 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, - 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, - 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, - 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, - 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, - 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, - 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, - 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, - 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, - 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, - 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, - 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, - 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, - 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, - 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, - 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, - 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, - 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, - 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, - 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, - 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, + 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, - 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, - 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, - 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, - 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, - 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, - 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, - 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, - 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, - 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, - 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, - 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, - 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, - 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, - 0, 1716, 0, 709, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, - 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, - 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, + 0, 0, 0, 616, 0, 0, 0, 3898, 0, 0, + 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, + 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, + 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, + 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, + 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, + 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, + 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, + 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, + 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, + 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, + 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, + 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, + 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, + 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, + 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, + 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, + 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, + 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, + 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, + 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, + 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, + 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, + 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, + 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, + 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, + 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, + 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, + 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, + 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, + 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, + 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, + 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, + 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, + 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, + 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, + 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, + 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, + 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, - 448, 0, 0, 0, 616, 0, 0, 0, 3897, 0, - 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, - 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, - 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, - 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, - 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, - 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, - 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, - 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, - 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, - 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, - 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, - 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, - 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, - 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, - 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, - 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, + 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 0, 0, 0, 2080, 709, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, + 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, + 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, + 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, - 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, - 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, - 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, - 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, - 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, - 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, - 0, 0, 0, 0, 2079, 709, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, - 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, - 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, - 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, + 0, 0, 2081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, + 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, + 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, + 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, + 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, + 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, + 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, + 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, + 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, + 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, + 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, + 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, + 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, + 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, + 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, + 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, + 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, + 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, + 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, + 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, + 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, + 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, + 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, + 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, - 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, - 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, - 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, - 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, - 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, - 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, - 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, - 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, - 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, - 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, - 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, - 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, - 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, - 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, - 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, - 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, - 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, - 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, - 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, - 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, - 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, - 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, - 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, - 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, - 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, - 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, + 285, 0, 0, 0, 0, 2814, 709, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, + 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, + 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, + 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, - 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, - 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, - 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, - 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, - 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, - 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, - 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, - 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, - 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, - 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, - 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, - 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, - 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, - 492, 285, 0, 0, 0, 0, 2813, 709, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, - 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, - 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, - 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, - 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, + 0, 0, 0, 0, 2815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2814, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, + 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, + 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, + 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, + 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, + 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, + 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, + 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, + 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, + 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, + 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, + 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, + 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, + 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, + 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, + 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, + 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, + 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, + 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, + 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, + 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, + 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, + 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, + 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, + 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, + 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, + 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, + 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, + 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, + 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, + 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, + 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, + 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, + 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, + 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, + 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, + 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, + 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, + 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, + 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, + 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, + 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, + 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, + 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, + 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, + 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, + 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, + 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, + 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, + 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, + 408, 492, 285, 0, 0, 0, 0, 0, 709, 0, + 0, 0, 0, 2799, 0, 0, 0, 0, 237, 0, + 0, 244, 2800, 0, 0, 347, 356, 355, 336, 337, + 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, + 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, + 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, - 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, - 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, - 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, - 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, - 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, - 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, - 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, - 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, - 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, - 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, - 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, - 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, - 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, - 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, - 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, - 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, - 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, - 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, - 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, - 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, - 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, - 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, - 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, - 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, - 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, - 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, - 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, - 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, - 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, - 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, - 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, - 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, - 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, - 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, - 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, - 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, - 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, - 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, - 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, - 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, - 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, - 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, - 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, - 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, - 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, - 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, - 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, - 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, - 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, - 202, 408, 492, 285, 0, 0, 0, 0, 0, 709, - 0, 0, 0, 0, 2798, 0, 0, 0, 0, 237, - 0, 0, 244, 2799, 0, 0, 347, 356, 355, 336, - 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, - 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, + 0, 0, 0, 0, 0, 0, 0, 361, 0, 328, + 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, + 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, + 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, + 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, + 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, + 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, + 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, + 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, + 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, + 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, + 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, + 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, + 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, + 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, + 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, + 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, + 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, + 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, + 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, + 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, + 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, + 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, + 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, + 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, + 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, + 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, + 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, + 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, + 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, + 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, + 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, + 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, + 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, + 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, + 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, + 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, + 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, + 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, + 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, + 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, + 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, + 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, + 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, + 269, 1759, 0, 0, 0, 362, 266, 0, 0, 425, + 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, + 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, + 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, + 323, 202, 408, 492, 285, 0, 0, 0, 0, 1758, + 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, + 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, + 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, - 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, - 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, - 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, - 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, - 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, - 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, - 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, - 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, - 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, - 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, - 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, - 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, - 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, - 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, - 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, - 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, - 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, - 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, - 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, - 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, - 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, - 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, - 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, - 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, - 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, - 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, - 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, - 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, - 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, - 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, - 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, - 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, - 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, + 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, - 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, - 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, - 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, - 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, - 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, - 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, - 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, - 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, - 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, - 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, - 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, - 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, - 0, 269, 1758, 0, 0, 0, 362, 266, 0, 0, - 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, - 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, - 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, - 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, - 1757, 709, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, - 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, - 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, + 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, + 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, + 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, + 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, + 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, + 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, + 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, + 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, + 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, + 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, + 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, + 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, + 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, + 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, + 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, + 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, + 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, + 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, + 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, + 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, + 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, + 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, + 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, + 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, + 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, + 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, + 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, + 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, + 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, + 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, + 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, + 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, + 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, + 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, + 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, + 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, + 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, + 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, + 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, + 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, + 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, + 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, + 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, + 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, + 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, + 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, + 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, + 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, - 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, - 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, - 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, - 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, - 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, - 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, - 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, - 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, - 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, - 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, - 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, - 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, - 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, - 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, - 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, - 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, - 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, - 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, - 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, - 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, - 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, - 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, - 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, - 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, - 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, - 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, - 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, - 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, - 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, - 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, - 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, - 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, - 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, + 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, + 0, 0, 711, 712, 713, 0, 0, 0, 0, 0, + 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, + 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, + 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, - 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, - 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, - 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, - 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, - 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, - 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, - 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, - 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, - 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, - 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, - 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, - 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, - 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, + 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, - 0, 0, 0, 711, 712, 713, 0, 0, 0, 0, - 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, - 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, - 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, + 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, + 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, + 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, + 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, + 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, + 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, + 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, + 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, + 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, + 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, + 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, + 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, + 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, + 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, + 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, + 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, + 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, + 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, + 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, + 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, + 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, + 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, + 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, + 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, + 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, + 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, + 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, - 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, - 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, - 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, - 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, - 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, - 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, - 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, - 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, - 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, - 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, - 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, - 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, - 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, - 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, - 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, - 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, - 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, + 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, + 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, + 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, + 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, + 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, + 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, + 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, + 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, + 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, + 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, + 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, + 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, + 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, + 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, + 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, + 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, - 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, - 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, - 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, - 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, - 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, - 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, + 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, - 0, 0, 0, 0, 0, 709, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, - 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, - 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, - 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, + 0, 448, 0, 0, 0, 616, 0, 0, 0, 4021, + 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, + 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, + 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, + 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, + 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, + 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, + 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, + 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, + 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, + 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, + 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, + 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, + 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, + 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, + 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, + 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, - 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, - 4020, 0, 0, 0, 361, 0, 328, 197, 224, 0, - 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, - 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, - 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, - 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, - 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, - 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, - 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, - 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, - 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, - 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, - 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, - 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, - 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, - 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, - 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, - 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, - 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, - 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, - 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, - 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, - 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, - 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, - 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, - 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, + 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, + 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, + 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, + 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, + 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, + 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, - 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, - 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, - 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, - 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, - 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, - 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, - 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, - 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, - 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, - 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, - 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, - 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, - 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, + 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, + 285, 0, 0, 0, 0, 1919, 194, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, + 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, + 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, + 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, - 492, 285, 0, 0, 0, 0, 1918, 194, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, - 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, - 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, - 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, - 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, + 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, + 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, + 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, + 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, + 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, + 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, + 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, + 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, + 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, + 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, + 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, + 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, + 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, + 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, + 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, + 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, + 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, + 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, + 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, + 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, + 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, + 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, + 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, + 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, + 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, + 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, + 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, + 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, + 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, + 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, + 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, + 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, + 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, - 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, - 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, - 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, - 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, - 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, - 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, - 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, - 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, - 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, - 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, - 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, - 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, - 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, - 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, - 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, - 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, - 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, - 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, - 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, - 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, - 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, - 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, - 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, - 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, - 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, - 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, - 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, - 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, - 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, - 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, - 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, - 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, - 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, + 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, + 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, + 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, + 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, + 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, + 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, + 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, + 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, + 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, + 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, + 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, + 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, + 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, + 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, + 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, + 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, + 408, 492, 285, 0, 0, 0, 0, 0, 709, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, + 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, + 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, + 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, + 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, - 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, - 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, - 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, - 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, - 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, - 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, - 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, - 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, - 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, - 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, - 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, - 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, - 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, - 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, - 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, - 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, - 202, 408, 492, 285, 0, 0, 0, 0, 0, 709, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, - 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, - 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, - 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, + 0, 0, 0, 3898, 0, 0, 0, 361, 0, 328, + 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, + 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, + 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, + 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, + 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, + 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, + 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, + 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, + 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, + 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, + 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, + 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, + 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, + 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, + 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, + 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, + 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, + 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, + 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, + 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, + 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, + 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, + 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, + 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, + 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, + 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, + 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, + 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, + 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, + 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, + 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, + 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, + 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, + 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, + 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, + 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, + 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, + 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, + 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, + 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, + 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, + 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, + 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, - 616, 0, 0, 0, 3897, 0, 0, 0, 361, 0, - 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, - 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, - 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, - 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, - 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, - 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, - 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, - 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, - 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, - 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, - 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, - 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, - 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, - 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, - 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, - 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, - 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, - 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, - 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, - 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, - 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, - 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, - 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, - 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, - 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, - 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, - 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, - 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, - 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, - 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, - 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, - 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, + 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, + 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, + 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, + 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, + 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, + 323, 202, 408, 492, 285, 0, 95, 0, 0, 0, + 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, + 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, + 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, - 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, - 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, - 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, - 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, - 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, - 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, - 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, - 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, - 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, - 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, - 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, - 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, - 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, - 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, - 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, - 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, - 247, 323, 202, 408, 492, 285, 0, 95, 0, 0, - 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, - 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, - 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, + 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, + 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, + 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, + 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, + 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, + 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, + 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, + 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, + 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, + 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, + 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, + 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, + 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, + 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, + 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, + 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, + 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, + 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, + 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, + 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, + 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, + 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, + 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, + 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, + 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, + 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, + 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, + 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, + 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, + 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, + 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, + 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, + 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, + 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, - 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, - 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, - 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, - 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, - 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, - 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, - 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, - 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, - 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, - 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, - 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, - 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, - 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, - 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, - 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, - 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, - 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, - 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, - 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, - 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, - 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, - 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, - 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, - 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, - 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, - 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, - 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, - 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, - 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, - 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, - 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, - 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, - 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, + 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, + 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, + 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, + 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, + 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, + 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, + 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, + 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, + 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, + 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, + 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, + 314, 520, 0, 0, 0, 0, 2371, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, + 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, + 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, + 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, - 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, - 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, - 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, - 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, - 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, - 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, - 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, - 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, - 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, - 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, - 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, - 569, 314, 520, 0, 0, 0, 0, 2370, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, - 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, + 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, + 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, + 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, + 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, - 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, - 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, - 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, + 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, + 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, + 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, + 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, + 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, + 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, + 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, + 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, + 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, + 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, + 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, + 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, + 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, + 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, + 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, + 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, + 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, + 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, + 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, + 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, + 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, + 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, + 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, + 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, + 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, + 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, + 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, + 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, - 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, - 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, - 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, - 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, - 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, - 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, - 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, - 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, - 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, - 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, - 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, - 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, - 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, - 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, - 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, - 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, - 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, + 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, + 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, + 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, + 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, + 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, + 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, + 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, + 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, + 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, + 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, + 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, + 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, - 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, - 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, - 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, - 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, - 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, - 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, + 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 0, 0, 0, 1740, 709, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, + 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, + 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, + 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, - 0, 0, 0, 0, 1739, 709, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, - 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, - 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, - 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, + 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5660,71 +5712,71 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, - 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, - 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, - 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, - 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, - 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, - 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, - 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, - 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, - 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, - 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, - 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, - 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, - 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, - 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, - 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, - 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, - 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, - 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, - 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, - 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, - 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, - 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, - 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, - 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, - 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, - 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, + 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, + 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, + 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, + 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, + 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, + 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, + 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, + 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, + 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, + 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, + 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, + 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, + 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, + 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, + 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, + 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, + 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, - 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, - 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, - 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, - 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, - 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, - 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, - 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, - 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, - 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, - 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, - 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, - 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, - 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, + 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, + 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, + 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, + 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, + 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, + 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, - 492, 285, 0, 0, 0, 0, 0, 194, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, - 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, - 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, - 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, - 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, + 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, + 285, 0, 0, 0, 0, 0, 194, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, + 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, + 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, + 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5732,71 +5784,72 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, - 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, - 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, - 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, - 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, - 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, - 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, - 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, - 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, - 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, - 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, - 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, - 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, - 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, - 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, - 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, - 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, - 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, - 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, - 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, - 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, - 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, - 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, - 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, - 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, - 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, - 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, - 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, - 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, - 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, - 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, - 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, - 0, 196, 220, 364, 2031, 449, 287, 637, 606, 601, - 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, + 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, + 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, + 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, + 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, + 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, + 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, + 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, + 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, + 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, + 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, + 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, + 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, + 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, + 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, + 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, + 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, + 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, + 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, + 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, + 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, + 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, + 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, + 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, + 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, + 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, + 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, + 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, + 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, + 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, + 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, + 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, + 196, 220, 364, 2032, 449, 287, 637, 606, 601, 205, + 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, - 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, - 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, - 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, - 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, - 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, - 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, - 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, - 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, - 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, - 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, - 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, - 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, + 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, + 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, + 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, + 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, + 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, + 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, + 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, + 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, + 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, + 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, + 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, + 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, + 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, + 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, + 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, + 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, + 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, + 408, 492, 285, 0, 0, 0, 0, 2023, 709, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, + 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, + 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, + 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, + 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, - 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, - 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, - 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, - 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, - 202, 408, 492, 285, 0, 0, 0, 0, 2022, 709, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, - 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, - 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, - 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5804,72 +5857,71 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, + 0, 0, 0, 0, 0, 0, 0, 361, 0, 328, + 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, + 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, + 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, + 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, + 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, + 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, + 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, + 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, + 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, + 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, + 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, + 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, + 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, + 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, + 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, + 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, + 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, + 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, + 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, + 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, + 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, + 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, + 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, + 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, + 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, + 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, + 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, + 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, + 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, + 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, + 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, - 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, - 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, - 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, - 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, - 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, - 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, - 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, - 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, - 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, - 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, - 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, - 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, - 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, - 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, - 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, - 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, - 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, - 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, - 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, - 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, - 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, - 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, - 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, - 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, - 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, - 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, - 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, - 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, - 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, - 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, - 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, - 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, - 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, + 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, + 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, + 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, + 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, + 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, + 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, + 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, + 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, + 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, + 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, + 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, + 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, - 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, - 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, - 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, - 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, - 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, - 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, - 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, - 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, - 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, - 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, - 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, - 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 1885, 0, 0, 0, 0, 0, - 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, - 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, - 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, - 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, - 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, - 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, - 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, - 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, + 0, 411, 0, 1886, 0, 0, 0, 0, 0, 0, + 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, + 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, + 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, + 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, + 323, 202, 408, 492, 285, 0, 0, 0, 0, 0, + 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, + 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, + 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, + 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5877,71 +5929,71 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, - 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, - 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, - 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, - 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, - 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, - 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, - 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, - 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, - 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, - 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, - 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, - 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, - 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, - 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, - 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, - 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, - 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, - 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, - 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, - 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, - 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, - 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, - 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, - 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, - 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, - 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, - 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, - 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, - 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, - 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, - 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, - 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, - 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, + 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, + 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, + 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, + 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, + 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, + 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, + 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, + 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, + 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, + 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, + 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, + 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, + 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, + 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, + 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, + 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, + 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, + 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, + 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, + 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, + 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, + 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, + 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, + 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, + 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, + 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, + 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, + 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, + 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, + 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, + 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, + 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, + 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, + 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, - 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, - 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, - 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, - 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, - 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, - 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, - 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, - 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, - 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, - 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, - 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, - 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 1883, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, - 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, + 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, + 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, + 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, + 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, + 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, + 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, + 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, + 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, + 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, + 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, + 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, + 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 1884, 0, 0, 0, 0, + 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, + 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, + 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, - 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, - 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, - 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, + 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, + 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, + 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, + 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, + 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5949,1154 +6001,1154 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, - 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, - 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, - 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, - 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, - 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, - 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, - 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, - 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, - 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, - 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, - 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, - 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, - 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, - 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, - 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, - 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, - 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, + 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, + 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, + 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, + 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, + 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, + 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, + 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, + 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, + 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, + 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, + 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, + 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, + 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, + 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, + 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, + 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, + 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, + 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, + 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, + 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, + 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, + 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, + 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, + 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, + 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, + 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, + 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, + 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, - 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, - 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, - 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, - 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 1881, 0, - 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, - 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, - 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, + 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, + 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, + 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, + 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, + 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, + 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, + 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, + 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, + 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, + 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, + 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, + 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 1882, 0, 0, + 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, + 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, - 0, 0, 0, 0, 0, 709, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, - 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, - 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, - 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, + 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, + 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, + 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, + 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, - 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, - 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, - 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, - 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, - 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, - 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, - 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, - 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, - 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, - 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, - 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, - 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, - 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, - 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, - 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, - 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, - 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, - 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, - 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, - 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, - 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, - 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, - 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, - 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, - 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, - 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, - 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, - 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, - 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, - 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, - 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, - 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, - 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, - 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, - 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, - 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 1879, 0, 0, 0, 0, 0, 0, 269, 0, 0, - 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, - 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, - 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, + 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, + 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, + 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, + 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, + 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, + 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, + 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, + 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, + 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, + 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, + 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, + 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, + 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, + 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, + 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, + 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, + 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, + 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, + 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, + 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 1880, + 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, + 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, + 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, + 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, + 285, 0, 0, 0, 0, 0, 709, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, + 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, + 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, + 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, - 492, 285, 0, 0, 0, 0, 0, 709, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, - 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, - 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, - 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, - 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, + 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, + 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, + 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, + 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, + 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, + 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, + 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, + 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, + 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, + 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, + 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, + 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, + 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, + 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, + 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, + 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, + 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, + 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, + 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, + 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, + 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, + 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, + 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, + 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, + 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, + 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, + 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, + 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, + 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, + 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, + 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, + 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, + 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, + 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, + 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, + 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, + 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, + 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, + 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, + 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, + 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, + 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, + 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, + 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, + 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 1878, 0, 0, 0, 0, 0, 0, 269, 0, + 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, + 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, + 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, + 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, + 408, 492, 285, 0, 0, 0, 0, 0, 709, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, + 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, + 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, + 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, + 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, - 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, - 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, - 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, - 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, - 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, - 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, - 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, - 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, - 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, - 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, - 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, - 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, - 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, - 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, - 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, - 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, - 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, - 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, - 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, - 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, - 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, - 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, - 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, - 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, - 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, - 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, - 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, - 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, - 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, - 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, - 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, - 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, - 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, - 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, - 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, - 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, - 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, - 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, - 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, - 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, - 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, - 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, - 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, - 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, - 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 1877, 0, 0, 0, 0, 0, 0, 269, - 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, - 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, - 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, - 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, - 202, 408, 492, 285, 0, 0, 0, 0, 0, 709, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, - 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, - 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, - 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, + 0, 0, 0, 0, 0, 0, 0, 361, 0, 328, + 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, + 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, + 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, + 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, + 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, + 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, + 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, + 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, + 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, + 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, + 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, + 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, + 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, + 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, + 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, + 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, + 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, + 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, + 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, + 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, + 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, + 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, + 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, + 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, + 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, + 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, + 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, + 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, + 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, + 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, + 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, + 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, + 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, + 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, + 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, + 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, + 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, + 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, + 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, + 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, + 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, + 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, + 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 411, 0, 1874, 0, 0, 0, 0, 0, 0, + 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, + 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, + 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, + 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, + 323, 202, 408, 492, 285, 0, 0, 0, 0, 0, + 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, + 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, + 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, - 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, - 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, - 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, - 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, - 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, - 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, - 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, - 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, - 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, - 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, - 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, - 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, - 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, - 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, - 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, - 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, - 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, - 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, - 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, - 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, - 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, - 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, - 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, - 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, - 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, - 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, - 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, - 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, - 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, - 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, - 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, - 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, - 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, + 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, - 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, - 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, - 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, - 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, - 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, - 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, - 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, - 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, - 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, - 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, - 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, - 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 1873, 0, 0, 0, 0, 0, - 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, - 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, - 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, - 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, - 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, - 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, - 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, - 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, + 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, + 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, + 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, + 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, + 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, + 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, + 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, + 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, + 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, + 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, + 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, + 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, + 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, + 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, + 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, + 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, + 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, + 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, + 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, + 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, + 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, + 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, + 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, + 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, + 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, + 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, + 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, + 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, + 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, + 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, + 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, + 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, + 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, + 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, + 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, + 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, + 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, + 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, + 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, + 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, + 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, + 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, + 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, + 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, + 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 1872, 0, 0, 0, 0, + 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, + 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, + 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, - 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, - 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, - 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, - 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, - 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, - 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, - 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, - 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, - 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, - 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, - 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, - 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, - 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, - 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, - 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, - 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, - 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, - 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, - 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, - 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, - 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, - 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, - 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, - 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, - 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, - 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, - 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, - 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, - 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, - 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, - 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, - 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, - 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, + 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, + 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, + 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, + 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, - 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, - 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, - 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, - 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, - 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, - 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, - 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, - 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, - 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, - 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, - 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, - 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 1871, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, - 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, + 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, - 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, - 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, - 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, + 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, + 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, + 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, + 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, + 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, + 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, + 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, + 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, + 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, + 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, + 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, + 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, + 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, + 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, + 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, + 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, + 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, + 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, + 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, + 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, + 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, + 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, + 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, + 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, + 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, + 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, + 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, - 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, - 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, - 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, - 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, - 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, - 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, - 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, - 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, - 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, - 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, - 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, - 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, - 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, - 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, - 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, - 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, - 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, + 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, + 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, + 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, + 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, + 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, + 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, + 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, + 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, + 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, + 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, + 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, + 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 1870, 0, 0, + 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, + 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, + 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, + 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, + 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, - 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, - 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, - 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, - 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 1869, 0, - 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, - 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, - 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, + 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, - 0, 0, 0, 0, 0, 709, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, - 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, - 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, - 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, + 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, + 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, + 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, + 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, + 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, + 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, + 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, + 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, + 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, + 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, + 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, + 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, + 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, + 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, + 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, + 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, + 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, - 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, - 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, - 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, - 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, - 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, - 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, - 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, - 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, - 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, - 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, - 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, - 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, - 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, - 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, - 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, - 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, - 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, - 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, - 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, - 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, - 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, - 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, - 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, - 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, - 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, - 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, + 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, + 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, + 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, + 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, + 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, + 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, - 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, - 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, - 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, - 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, - 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, - 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, - 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, - 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, - 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, - 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, - 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, - 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, - 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, + 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, + 285, 0, 1845, 0, 0, 0, 709, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, + 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, + 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, + 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, - 492, 285, 0, 1844, 0, 0, 0, 709, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, - 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, - 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, - 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, - 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, + 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, + 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, + 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, + 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, + 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, + 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, + 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, + 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, + 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, + 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, + 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, + 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, + 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, + 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, + 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, + 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, + 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, + 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, + 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, + 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, + 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, + 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, + 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, + 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, + 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, + 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, + 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, + 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, + 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, + 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, + 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, + 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, + 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, - 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, - 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, - 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, - 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, - 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, - 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, - 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, - 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, - 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, - 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, - 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, - 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, - 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, - 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, - 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, - 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, - 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, - 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, - 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, - 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, - 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, - 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, - 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, - 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, - 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, - 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, - 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, - 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, - 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, - 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, - 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, - 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, - 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, + 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, + 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, + 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, + 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, + 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, + 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, + 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, + 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, + 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, + 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, + 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, + 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 0, 0, 1744, 269, 0, + 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, + 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, + 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, + 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, + 408, 492, 285, 0, 0, 0, 0, 0, 194, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, + 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, + 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, + 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, + 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, - 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, - 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, - 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, - 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, - 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, - 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, - 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, - 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, - 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, - 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, - 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, - 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 0, 0, 1743, 269, - 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, - 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, - 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, - 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, - 202, 408, 492, 285, 0, 0, 0, 0, 0, 194, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, - 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, - 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, - 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, + 0, 0, 0, 0, 0, 0, 0, 361, 0, 328, + 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, + 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, + 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, + 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, + 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, + 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, + 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, + 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, + 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, + 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, + 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, + 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, + 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, + 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, + 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, + 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, + 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, + 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, + 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, + 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, + 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, + 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, + 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, + 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, + 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, + 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, + 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, + 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, + 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, + 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, + 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, + 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, + 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, + 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, + 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, + 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, + 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, + 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, + 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, + 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, + 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, + 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, + 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, + 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, + 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, + 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, + 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, + 323, 202, 408, 492, 285, 0, 95, 0, 0, 0, + 941, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, + 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, + 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, - 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, - 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, - 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, - 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, - 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, - 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, - 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, - 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, - 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, - 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, - 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, - 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, - 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, - 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, - 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, - 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, - 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, - 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, - 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, - 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, - 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, - 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, - 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, - 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, - 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, - 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, - 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, - 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, - 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, - 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, - 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, - 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, - 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, + 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, - 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, - 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, - 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, - 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, - 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, - 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, - 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, - 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, - 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, - 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, - 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, - 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, - 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, - 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, - 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, - 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, - 247, 323, 202, 408, 492, 285, 0, 95, 0, 0, - 0, 941, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, - 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, - 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, + 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, + 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, + 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, + 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, + 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, + 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, + 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, + 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, + 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, + 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, + 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, + 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, + 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, + 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, + 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, + 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, + 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, + 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, + 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, + 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, + 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, + 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, + 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, + 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, + 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, + 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, + 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, + 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, + 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, + 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, + 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, + 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, + 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, + 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, + 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, + 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, + 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, + 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, + 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, + 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, + 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, + 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, + 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, + 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, + 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, + 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, + 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, + 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, - 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, - 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, - 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, - 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, - 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, - 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, - 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, - 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, - 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, - 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, - 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, - 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, - 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, - 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, - 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, - 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, - 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, - 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, - 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, - 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, - 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, - 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, - 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, - 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, - 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, - 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, - 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, - 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, - 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, - 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, - 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, - 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, - 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, + 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, + 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, + 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, + 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, - 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, - 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, - 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, - 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, - 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, - 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, - 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, - 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, - 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, - 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, - 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, - 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, - 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, + 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, - 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, - 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, - 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1431, 0, 296, 0, 397, 256, 0, 448, + 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, + 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, + 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, + 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, + 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, + 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, + 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, + 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, + 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, + 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, + 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, + 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, + 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, + 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, + 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, + 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, + 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, + 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, + 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, + 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, + 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, + 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, + 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, + 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, + 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, + 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, + 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1430, 0, 296, 0, 397, 256, 0, - 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, - 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, - 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, - 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, - 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, - 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, - 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, - 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, - 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, - 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, - 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, - 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, - 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, - 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, - 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, - 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, - 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, + 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, + 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, + 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, + 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, + 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, + 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, + 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, + 1430, 590, 620, 588, 632, 614, 433, 374, 0, 0, + 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, + 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, + 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, + 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, + 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, + 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, + 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, + 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, - 634, 1429, 590, 620, 588, 632, 614, 433, 374, 0, - 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, - 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, - 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, - 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, - 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, + 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, - 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, - 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, - 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, - 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, + 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, + 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, + 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, + 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, + 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, + 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, + 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, + 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, + 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, + 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, + 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, + 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, + 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, + 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, + 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, + 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, + 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1030, 0, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, + 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, + 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, + 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, + 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, + 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, + 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, - 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, - 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, - 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, - 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, - 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, - 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, - 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, - 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, - 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, - 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, - 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, - 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, - 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, - 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, - 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, - 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, - 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, - 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, - 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, - 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, - 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, - 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, - 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, - 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, - 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, - 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1030, - 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, - 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, - 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, - 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, - 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, - 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, - 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, - 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, - 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, - 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, - 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, - 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, - 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, - 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, + 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, + 285, 0, 0, 0, 0, 0, 194, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, + 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, + 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, + 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, - 492, 285, 0, 0, 0, 0, 0, 194, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, - 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, - 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, - 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, - 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, + 397, 256, 0, 448, 0, 662, 0, 616, 0, 0, + 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, + 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, + 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, + 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, + 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, + 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, + 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, + 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, + 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, + 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, + 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, + 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, + 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, + 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, + 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, + 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, + 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, + 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, + 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, + 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, + 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, + 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, + 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, + 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, + 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, + 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, + 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, + 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, + 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, + 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, + 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, + 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, - 0, 397, 256, 0, 448, 0, 662, 0, 616, 0, - 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, - 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, - 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, - 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, - 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, - 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, - 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, - 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, - 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, - 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, - 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, - 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, - 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, - 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, - 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, - 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, - 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, - 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, - 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, - 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, - 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, - 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, - 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, - 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, - 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, - 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, - 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, - 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, - 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, - 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, - 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, - 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, + 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, + 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, + 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, + 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, + 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, + 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, + 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, + 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, + 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, + 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, + 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, + 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, + 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, + 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, + 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, + 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, + 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, + 408, 492, 285, 0, 0, 0, 0, 0, 709, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, + 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, + 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, + 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, + 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, - 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, - 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, - 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, - 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, - 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, - 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, - 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, - 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, - 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, - 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, - 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, - 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, - 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, - 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, - 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, - 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, - 202, 408, 492, 285, 0, 0, 0, 0, 0, 709, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, - 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, - 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, - 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, + 0, 0, 0, 0, 0, 0, 0, 361, 0, 328, + 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, + 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, + 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, + 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, + 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, + 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, + 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, + 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, + 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, + 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, + 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, + 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, + 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, + 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, + 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, + 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, + 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, + 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, + 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, + 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, + 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, + 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, + 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, + 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, + 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, + 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, + 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, + 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, + 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, + 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, + 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, + 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, + 317, 320, 326, 376, 382, 383, 384, 385, 4029, 405, + 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, + 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, + 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, + 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, + 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, + 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, + 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, + 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, + 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, + 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, - 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, - 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, - 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, - 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, - 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, - 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, - 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, - 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, - 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, - 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, - 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, - 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, - 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, - 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, - 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, - 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, - 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, - 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, - 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, - 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, - 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, - 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, - 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, - 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, - 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, - 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, - 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, - 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, - 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, - 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, - 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, - 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, - 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, + 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, + 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, + 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, + 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, + 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, + 323, 202, 408, 492, 285, 0, 0, 0, 0, 0, + 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, + 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, + 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, - 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, - 316, 317, 320, 326, 376, 382, 383, 384, 385, 4028, - 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, - 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, - 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, - 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, - 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, - 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, - 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, - 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, - 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, - 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, - 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, - 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, - 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, - 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, - 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, - 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, - 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, - 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, + 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, + 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, + 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, + 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, + 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, + 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, + 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, + 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, + 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, + 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, + 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, + 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, + 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, + 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, + 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, + 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, + 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, + 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, + 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, + 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, + 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, + 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, + 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, + 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, + 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, + 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, + 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, + 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, + 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, + 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, + 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, + 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, + 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, + 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, - 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, - 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, - 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, - 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, - 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, - 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, - 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, - 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, - 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, - 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, - 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, - 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, - 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, - 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, - 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, - 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, - 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, - 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, - 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, - 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, - 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, - 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, - 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, - 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, - 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, - 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, - 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, - 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, - 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, - 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, - 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, - 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, - 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, + 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, + 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, + 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, + 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, + 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, + 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, + 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, + 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, + 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, + 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, + 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, + 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, + 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, + 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, + 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, + 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, - 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, - 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, - 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, - 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, - 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, - 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, - 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, - 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, - 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, - 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, - 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, - 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, - 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, - 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, + 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, + 0, 0, 941, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, + 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, + 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, - 0, 0, 0, 941, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, - 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, - 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, + 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, + 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, + 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, + 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, + 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, + 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, + 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, + 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, + 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, + 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, + 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, + 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, + 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, + 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, + 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, + 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, + 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, + 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, + 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, + 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, + 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, + 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, + 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, + 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, + 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, + 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, + 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, + 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, - 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, - 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, - 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, - 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, - 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, - 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, - 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, - 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, - 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, - 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, - 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, - 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, - 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, - 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, - 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, - 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, - 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, + 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, + 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, + 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, + 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, + 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, + 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, + 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, + 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, + 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, + 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, + 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, + 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, - 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, - 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, - 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, - 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, - 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, - 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, - 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, + 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, + 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, + 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, + 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, - 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, - 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, - 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, - 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, + 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7104,80 +7156,80 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, - 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, - 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, - 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, - 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, - 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, - 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, - 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, - 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, - 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, - 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, - 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, - 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, - 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, - 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, - 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, - 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, - 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, - 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, - 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, - 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, - 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, - 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, - 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, - 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, - 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, - 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, + 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, + 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, + 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, + 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, + 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, + 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, + 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, + 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, + 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, + 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, + 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, + 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, + 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, + 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, + 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, + 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, + 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, - 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, - 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, - 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, - 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, - 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, - 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, - 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, - 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, - 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, - 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 0, 0, 372, 568, 569, 314, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, + 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 0, + 0, 372, 568, 569, 314, } var yyPact = [...]int{ - -1000, -1000, 1319, -1000, -532, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 1893, -1000, -532, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 2401, 2519, -1000, -1000, -1000, -1000, 2569, -1000, 1002, - 2074, -1000, 2363, 4957, -1000, 54244, 500, -1000, 51356, -436, - 860, 234, 35472, -1000, 207, -1000, 193, 52800, 199, -1000, - -1000, -1000, -1000, -436, 21030, 2277, 56, 52, 54244, -1000, - -1000, -1000, -1000, -353, 2542, 2069, -1000, 408, -1000, -1000, - -1000, -1000, -1000, -1000, 50634, -1000, 1098, -1000, -1000, 2359, - 2349, 2577, 915, 2304, -1000, 2461, 2069, -1000, 21030, 2498, - 2432, 20308, 20308, 462, -1000, -1000, 268, -1000, -1000, 30418, - 54244, 38360, 890, -1000, 2363, -1000, -1000, -1000, 219, -1000, - 378, 1978, -1000, 1977, -1000, 469, 899, 392, 871, 868, - 391, 389, 388, 379, 377, 376, 375, 369, 398, -1000, - 938, 938, -218, -219, 361, 450, 448, 448, 1108, 479, - 2320, 2316, -1000, -1000, 938, 938, 938, 396, 938, 938, - 938, 938, 321, 320, 938, 938, 938, 938, 938, 938, - 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, - 938, 902, 2363, 300, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 2352, 2406, -1000, -1000, -1000, -1000, 2560, -1000, 1002, + 2052, -1000, 2357, 4901, -1000, 54763, 481, -1000, 51875, -434, + 853, 234, 35991, -1000, 198, -1000, 182, 53319, 191, -1000, + -1000, -1000, -1000, -434, 21549, 2291, 57, 53, 54763, -1000, + -1000, -1000, -1000, -357, 2521, 2031, -1000, 409, -1000, -1000, + -1000, -1000, -1000, -1000, 51153, -1000, 1082, -1000, -1000, 2364, + 2338, 2563, 912, 2292, -1000, 2456, 2031, -1000, 21549, 2510, + 2450, 20827, 20827, 430, -1000, -1000, 238, -1000, -1000, 30937, + 54763, 38879, 293, -1000, 2357, -1000, -1000, -1000, 219, -1000, + 336, 1947, -1000, 1943, -1000, 845, 896, 380, 478, 456, + 379, 359, 358, 356, 354, 349, 346, 344, 374, -1000, + 936, 936, -217, -218, 361, 425, 413, 413, 968, 458, + 2321, 2320, -1000, -1000, 936, 936, 936, 369, 936, 936, + 936, 936, 296, 295, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 906, 2357, 274, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7224,66 +7276,66 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 54244, 210, 54244, -1000, 809, 499, -1000, -1000, -440, 1090, - 1090, 122, 1090, 1090, 1090, 1090, 184, 973, 49, -1000, - 182, 284, 197, 293, 1079, 183, -1000, -1000, 258, 1079, - 1806, -1000, 923, 281, 163, -1000, 1090, 1090, -1000, 13785, - 209, 13785, 13785, -1000, 2345, -1000, -1000, -1000, -1000, -1000, - 1333, -1000, -1000, -1000, -1000, -18, 478, -1000, -1000, -1000, - -1000, 52800, 49912, 290, -1000, -1000, 769, 1852, 1371, 21030, - 1291, 913, -1000, -1000, 1976, 876, -1000, -1000, -1000, -1000, - -1000, 800, -1000, 23196, 23196, 23196, 23196, -1000, -1000, 1983, - 49190, 1983, 1983, 23196, 1983, 23196, 1983, 1983, 1983, 21030, - 1983, 1983, 1983, 1983, -1000, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, -1000, -1000, -1000, -1000, 1983, 808, 1983, 1983, - 1983, 1983, 1983, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1983, 1983, 1983, 1983, 1983, 1983, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, -1000, + 54763, 181, 54763, -1000, 798, 480, -1000, -1000, -439, 1083, + 1083, 96, 1083, 1083, 1083, 1083, 186, 962, 50, -1000, + 176, 266, 171, 269, 1027, 319, -1000, -1000, 262, 1027, + 1736, -1000, 917, 264, 166, -1000, 1083, 1083, -1000, 14304, + 230, 14304, 14304, -1000, 2355, -1000, -1000, -1000, -1000, -1000, + 1361, -1000, -1000, -1000, -1000, -26, 454, -1000, -1000, -1000, + -1000, 53319, 50431, 233, -1000, -1000, 769, 1803, 1515, 21549, + 1254, 893, -1000, -1000, 1479, 858, -1000, -1000, -1000, -1000, + -1000, 508, -1000, 23715, 23715, 23715, 23715, -1000, -1000, 1788, + 49709, 1788, 1788, 23715, 1788, 23715, 1788, 1788, 1788, 21549, + 1788, 1788, 1788, 1788, -1000, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, -1000, -1000, -1000, -1000, 1788, 795, 1788, 1788, + 1788, 1788, 1788, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1788, 1788, 1788, 1788, 1788, 1788, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 26084, 1500, 1498, 1493, -1000, 18142, 1983, -1000, -1000, -1000, + 26603, 1518, 1512, 1506, -1000, 18661, 1788, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 54244, -1000, 1983, - 218, 52800, 52800, 397, 1334, -1000, -1000, 2461, 2069, -1000, - 2542, 2477, 408, -1000, 3785, 1628, 1721, 1532, 2069, 1956, - 54244, -1000, 1992, -1000, -1000, -1000, -1000, 2207, 1524, 1804, - -1000, -1000, -1000, -1000, 1907, 21030, -1000, -1000, 2557, -1000, - 27529, 805, 2554, 48468, -1000, 462, 462, 1975, 430, 22, - -1000, -1000, -1000, -1000, 962, 34750, -1000, -1000, -1000, -1000, - -1000, 1902, 54244, -1000, -1000, 4793, 1173, -1000, 2071, -1000, - 1842, -1000, 2014, 21030, 2080, 498, 1173, 491, 490, 489, - -1000, -64, -1000, -1000, -1000, -1000, -1000, -1000, 938, 938, - 938, -1000, 343, 2495, 4957, 6237, -1000, -1000, -1000, 47746, - 2067, 1173, -1000, 2053, -1000, 1041, 859, 870, 870, 1173, - -1000, -1000, 53522, 1173, 1040, 1031, 1173, 1173, 52800, 52800, - -1000, 47024, -1000, 46302, 45580, 1331, 52800, 44858, 44136, 43414, - 42692, 41970, -1000, 2330, -1000, 2133, -1000, -1000, -1000, 53522, - 1173, 1173, 53522, 52800, 53522, 54244, 1173, -1000, -1000, 360, - -1000, -1000, 1330, 1328, 1327, 938, 938, 1326, 1800, 1798, - 1787, 938, 938, 1295, 1782, 36916, 1765, 286, 1293, 1292, - 1289, 1290, 1746, 229, 1719, 1281, 1230, 1288, 52800, 2036, - 54244, -1000, 254, 945, 994, 958, 2363, 2276, 1967, 476, - 494, 1173, 451, 451, 52800, -1000, 14513, 54244, 217, -1000, - 1707, 21030, -1000, 1080, 1079, 1079, -1000, -1000, -1000, -1000, - -1000, -1000, 1090, 54244, 1080, -1000, -1000, -1000, 1079, 1090, - 54244, 1090, 1090, 1090, 1090, 1079, 1079, 1079, 1090, 54244, - 54244, 54244, 54244, 54244, 54244, 54244, 54244, 54244, 13785, 923, - 1090, -441, -1000, 1672, -1000, -1000, 2171, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 54763, -1000, 1788, + 216, 53319, 53319, 321, 1326, -1000, -1000, 2456, 2031, -1000, + 2521, 2488, 409, -1000, 3573, 1787, 1722, 1426, 2031, 1927, + 54763, -1000, 1966, -1000, -1000, -1000, -1000, 2204, 1507, 1734, + -1000, -1000, -1000, -1000, 1925, 21549, -1000, -1000, 2555, -1000, + 28048, 792, 2552, 48987, -1000, 430, 430, 1939, 421, 20, + -1000, -1000, -1000, -1000, 958, 35269, -1000, -1000, -1000, -1000, + -1000, 1870, 54763, -1000, -1000, 5319, 1353, -1000, 2044, -1000, + 1868, -1000, 1990, 21549, 2063, 477, 1353, 467, 465, 463, + -1000, -61, -1000, -1000, -1000, -1000, -1000, -1000, 936, 936, + 936, -1000, 343, 2505, 4901, 6077, -1000, -1000, -1000, 48265, + 2040, 1353, -1000, 2038, -1000, 1031, 859, 868, 868, 1353, + -1000, -1000, 54041, 1353, 1022, 1015, 1353, 1353, 53319, 53319, + -1000, 47543, -1000, 46821, 46099, 1319, 53319, 45377, 44655, 43933, + 43211, 42489, -1000, 2233, -1000, 2016, -1000, -1000, -1000, 54041, + 1353, 1353, 54041, 53319, 54041, 54763, 1353, -1000, -1000, 364, + -1000, -1000, 1308, 1307, 1306, 936, 936, 1292, 1731, 1728, + 1714, 936, 936, 1290, 1707, 37435, 1699, 270, 1289, 1270, + 1261, 1318, 1686, 229, 1674, 1281, 1264, 1252, 53319, 2032, + 54763, -1000, 254, 951, 435, 956, 2357, 2289, 1935, 453, + 474, 1353, 424, 424, 53319, -1000, 15032, 54763, 227, -1000, + 1670, 21549, -1000, 1043, 1027, 1027, -1000, -1000, -1000, -1000, + -1000, -1000, 1083, 54763, 1043, -1000, -1000, -1000, 1027, 1083, + 54763, 1083, 1083, 1083, 1083, 1027, 1027, 1027, 1083, 54763, + 54763, 54763, 54763, 54763, 54763, 54763, 54763, 54763, 14304, 917, + 1083, -440, -1000, 1659, -1000, -1000, -1000, 2157, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7299,327 +7351,327 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 13785, 13785, -1000, -1000, -1000, -1000, - -1000, 1966, -1000, 189, 26, 196, -1000, 41248, 480, 957, - -1000, 480, -1000, -1000, -1000, 1964, 40526, -1000, -445, -446, - -447, -450, -1000, -1000, -1000, -451, -453, -1000, -1000, -1000, - 21030, 21030, 21030, 21030, -268, -1000, 1216, 23196, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 21030, 224, 997, 23196, 23196, - 23196, 23196, 23196, 23196, 23196, 24640, 23918, 23196, 23196, 23196, - 23196, 23196, 23196, -1000, -1000, 32584, 5973, 5973, 876, 876, - 876, 876, -1000, -175, 1963, 53522, -1000, -1000, -1000, 798, - 21030, 21030, 876, -1000, 1173, 2944, 18142, 20308, 20308, 21030, - 967, 1371, 53522, 21030, -1000, 1532, -1000, -1000, -1000, -1000, - 1207, -1000, -1000, 1093, 2354, 2354, 2354, 2354, 21030, 21030, - 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 2354, 21030, - 1270, 1270, 833, 21030, 21030, 21030, 21030, 21030, 21030, 16697, - 21030, 21030, 23196, 21030, 21030, 21030, 1532, 21030, 21030, 21030, - 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, - 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, - 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, - 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, - 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, - 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, - 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, - 21030, 21030, 21030, 21030, 21030, 21030, 1532, 21030, 1536, 21030, - 21030, 21030, 21030, 21030, 21030, 20308, 15969, 20308, 20308, 20308, - 20308, 20308, -1000, -1000, -1000, -1000, -1000, -1000, 21030, 21030, - 21030, 21030, 21030, 21030, 21030, 21030, 1532, 21030, 21030, 21030, - 21030, 21030, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1568, 1629, 1527, 21030, -1000, 1960, -1000, -184, - 29696, 21030, 1658, 2551, 2105, 52800, -1000, -1000, -1000, -1000, - 2461, -1000, 2461, 1568, 3572, 2218, 20308, -1000, -1000, 3572, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1667, -1000, - 54244, 1956, 2407, 52800, 2222, 1655, 357, -1000, 21030, 21030, - 1955, -1000, 1799, 54244, -1000, -268, -1000, 39804, -1000, -1000, - 13057, 54244, 346, 54244, -1000, 28974, 39082, 265, -1000, 22, - 1936, -1000, 25, 17, 17419, 864, -1000, -1000, -1000, 361, - 25362, 1737, 864, 103, -1000, -1000, -1000, 2014, -1000, 2014, - 2014, 2014, 2014, 357, 357, 357, 357, -1000, -1000, -1000, - -1000, -1000, 2034, 2032, -1000, 2014, 2014, 2014, 2014, -1000, + -1000, -1000, -1000, -1000, -1000, 14304, 14304, -1000, -1000, -1000, + -1000, -1000, 1934, -1000, 184, 26, 189, -1000, 41767, 517, + 955, -1000, 517, -1000, -1000, -1000, 1933, 41045, -1000, -441, + -445, -446, -447, -1000, -1000, -1000, -450, -460, -1000, -1000, + -1000, 21549, 21549, 21549, 21549, -251, -1000, 1019, 23715, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 21549, 251, 1038, 23715, + 23715, 23715, 23715, 23715, 23715, 23715, 25159, 24437, 23715, 23715, + 23715, 23715, 23715, 23715, -1000, -1000, 33103, 6798, 6798, 858, + 858, 858, 858, -1000, -173, 1932, 54041, -1000, -1000, -1000, + 790, 21549, 21549, 858, -1000, 1353, 2945, 18661, 20827, 20827, + 21549, 963, 1515, 54041, 21549, -1000, 1426, -1000, -1000, -1000, + -1000, 1257, -1000, -1000, 1093, 2335, 2335, 2335, 2335, 21549, + 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 2335, + 21549, 908, 908, 1136, 21549, 21549, 21549, 21549, 21549, 21549, + 17216, 21549, 21549, 23715, 21549, 21549, 21549, 1426, 21549, 21549, + 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, + 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, + 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, + 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, + 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, + 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, + 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, + 21549, 21549, 21549, 21549, 21549, 21549, 21549, 1426, 21549, 1665, + 21549, 21549, 21549, 21549, 21549, 21549, 20827, 16488, 20827, 20827, + 20827, 20827, 20827, -1000, -1000, -1000, -1000, -1000, -1000, 21549, + 21549, 21549, 21549, 21549, 21549, 21549, 21549, 1426, 21549, 21549, + 21549, 21549, 21549, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1769, 1532, 1481, 21549, -1000, 1928, -1000, + -184, 30215, 21549, 1656, 2547, 2092, 53319, -1000, -1000, -1000, + -1000, 2456, -1000, 2456, 1769, 2727, 2207, 20827, -1000, -1000, + 2727, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1777, + -1000, 54763, 1927, 2393, 53319, 2198, 1652, 351, -1000, 21549, + 21549, 1923, -1000, 1601, 54763, -1000, -251, -1000, 40323, -1000, + -1000, 13576, 54763, 334, 54763, -1000, 29493, 39601, 268, -1000, + 20, 1878, -1000, 31, 9, 17938, 857, -1000, -1000, -1000, + 361, 25881, 1705, 857, 109, -1000, -1000, -1000, 1990, -1000, + 1990, 1990, 1990, 1990, 351, 351, 351, 351, -1000, -1000, + -1000, -1000, -1000, 2025, 2021, -1000, 1990, 1990, 1990, 1990, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 2031, 2031, 2031, 2029, - 2029, 2015, 2015, 435, -1000, 21030, 416, 38360, 2419, 1282, - 1219, 254, 453, 2103, 1173, 1173, 1173, 453, -1000, 1425, - 1398, 1383, -1000, -518, 1950, -1000, -1000, 2493, -1000, -1000, - 960, 1057, 1056, 1117, 52800, 236, 334, -1000, 431, -1000, - 38360, 1173, 1028, 870, 1173, -1000, 1173, -1000, -1000, -1000, - -1000, -1000, 1173, -1000, -1000, 1949, -1000, 1845, 1168, 1055, - 1131, 1054, 1949, -1000, -1000, -182, 1949, -1000, 1949, -1000, - 1949, -1000, 1949, -1000, 1949, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 981, 304, -307, 52800, 236, 470, - -1000, 468, 32584, -1000, -1000, -1000, 32584, 32584, -1000, -1000, - -1000, -1000, 1637, 1625, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2020, 2020, 2020, + 2019, 2019, 1995, 1995, 417, -1000, 21549, 415, 38879, 2362, + 1247, 1474, 254, 428, 2079, 1353, 1353, 1353, 428, -1000, + 1383, 1377, 1366, -1000, -518, 1919, -1000, -1000, 2504, -1000, + -1000, 940, 1048, 1047, 903, 53319, 220, 327, -1000, 408, + -1000, 38879, 1353, 1003, 868, 1353, -1000, 1353, -1000, -1000, + -1000, -1000, -1000, 1353, -1000, -1000, 1918, -1000, 1801, 1091, + 1044, 1077, 1030, 1918, -1000, -1000, -178, 1918, -1000, 1918, + -1000, 1918, -1000, 1918, -1000, 1918, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 979, 281, -325, 53319, 220, + 441, -1000, 439, 33103, -1000, -1000, -1000, 33103, 33103, -1000, + -1000, -1000, -1000, 1633, 1619, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -502, 54244, -1000, 248, 956, 324, 335, - 353, 54244, 352, 2439, 2434, 2427, 2418, 2414, 305, 316, - 54244, 54244, 451, 2157, 54244, 2377, 54244, -1000, -1000, -1000, - -1000, -1000, 1622, 1620, -1000, 1371, 54244, -1000, -1000, 1090, - 1090, -1000, -1000, 54244, 1090, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 1090, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 54244, - -1000, -1000, -1000, -1000, -18, 187, -1000, -1000, 52800, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -104, -1000, - 801, 15, 409, -1000, -1000, -1000, -1000, -1000, 2457, -1000, - 1371, 1009, 1006, -1000, 1983, -1000, -1000, 1069, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 224, 23196, 23196, 23196, - 1598, 828, 1429, 1392, 1229, 1239, 1239, 929, 23196, 929, - 23196, 863, 863, 863, 863, 863, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1616, -1000, 1983, 53522, 1817, 15969, - 1952, 2163, 1532, 908, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -503, 54763, -1000, 240, 952, 283, + 306, 303, 54763, 420, 2419, 2408, 2405, 2400, 2397, 299, + 290, 54763, 54763, 424, 2130, 54763, 2376, 54763, -1000, -1000, + -1000, -1000, -1000, 1617, 1612, -1000, 1515, 54763, -1000, -1000, + 1083, 1083, -1000, -1000, 54763, 1083, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1083, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 4134, 1813, -1000, 1813, 1503, 971, - -1000, 21030, 1532, 4125, -1000, -1000, 1532, 1532, 21030, -1000, - -1000, 21030, 21030, 21030, 21030, 1219, 1219, 1219, 1219, 1219, - 1219, 1219, 1219, 1219, 1219, 21030, 1219, 1948, -1000, -1000, + 54763, -1000, -1000, -1000, -1000, -26, 178, -1000, -1000, 53319, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -105, + -1000, 847, 24, 384, -1000, -1000, -1000, -1000, -1000, 2445, + -1000, 1515, 988, 976, -1000, 1788, -1000, -1000, 1135, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 251, 23715, 23715, + 23715, 1565, 485, 1224, 1315, 1155, 1133, 1133, 1097, 23715, + 1097, 23715, 862, 862, 862, 862, 862, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1605, -1000, 1788, 54041, 1826, + 16488, 1974, 2164, 1426, 870, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1943, 2541, 1314, 1219, - 1219, 1219, 1219, 1219, 21030, 2187, -1000, -1000, -1000, 1534, - 4120, 1369, 4115, 1219, 1219, -1000, 1219, 4111, 4092, 1532, - 1852, 2876, 2871, 1219, 1219, 1219, 1219, 1219, 2863, 2802, - 1219, 1219, 2756, 1219, 3876, 1219, 2721, 2680, 2675, 2633, - 2619, 2614, 2603, 2597, 2555, 2540, 2533, 2528, 2510, 2506, - 2491, 2469, 2435, 2428, 1219, 1219, 1219, 3844, 1219, 3819, - 1219, 3812, 1219, 1219, 3807, 2412, 2403, 1532, 1942, -1000, - 3803, 1219, 3525, 3514, 3476, 2399, 3448, 3439, 3434, 1219, - 1219, 1219, 2329, 3426, 3420, 3416, 3406, 3402, 3377, 3369, - 3360, 3346, 1219, 1527, 1527, 1527, 1527, 1527, 3335, -271, - 1219, 1532, -1000, -1000, -1000, -1000, -1000, 3331, 2324, 3320, - 3316, 3289, 3275, 1532, 1938, 1983, 795, -1000, -1000, 1813, - 1532, 1532, 1813, 1813, 3206, 3190, 3017, 2996, 2959, 2939, - 1219, 1219, -1000, 1219, 2908, 2902, 2312, 2303, 1532, -1000, - 1527, 54244, -1000, -431, -1000, -7, 936, 1983, -1000, 36916, - 1532, -1000, 5074, -1000, 1233, -1000, -1000, -1000, -1000, -1000, - 34028, 1951, 3572, -1000, -1000, 1983, 1776, -1000, -1000, 357, - 90, 33306, 857, 857, 128, 1371, 1371, 21030, -1000, -1000, - -1000, -1000, -1000, -1000, 792, 2512, 400, 1983, -1000, 1979, - 3285, -1000, -1000, -1000, 2402, 26807, -1000, -1000, 1983, 1983, - 54244, 1937, 1931, -1000, 790, -1000, 1255, 1936, 22, 8, - -1000, -1000, -1000, -1000, 1371, -1000, 1348, 356, 341, -1000, - 438, -1000, -1000, -1000, -1000, 2290, 92, -1000, -1000, -1000, - 365, 357, -1000, -1000, -1000, -1000, -1000, -1000, 1611, 1611, - -1000, -1000, -1000, -1000, -1000, 1280, -1000, -1000, -1000, -1000, - 1278, -1000, -1000, 1271, -1000, -1000, 2641, 2129, 416, -1000, - -1000, 938, 1609, -1000, -1000, 2305, 938, 938, 52800, -1000, - -1000, 1722, 2419, 248, 54244, 986, 2156, -1000, 2103, 2103, - 2103, 54244, -1000, -1000, -1000, -1000, -1000, -1000, -504, 165, - 618, -1000, -1000, -1000, 2008, 52800, 1758, -1000, 232, -1000, - 1718, -1000, 52800, -1000, 1742, 2028, 1173, 1173, -1000, -1000, - -1000, 52800, 1983, -1000, -1000, -1000, -1000, 493, 2358, 297, - -1000, -1000, -290, -1000, -1000, 236, 232, 53522, 1173, 864, - -1000, -1000, -1000, -1000, -1000, -505, 1734, 481, 239, 329, - 54244, 54244, 54244, 54244, 54244, 54244, 512, -1000, -1000, 35, - -1000, -1000, 215, -1000, -1000, -1000, -1000, 215, -1000, -1000, - -1000, -1000, 307, 466, -1000, 54244, 54244, 914, -1000, -1000, - -1000, -1000, -1000, 1079, -1000, -1000, 1079, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2343, - 54244, 10, -471, -1000, -468, 21030, -1000, -1000, -1000, -1000, - 1312, 496, 1429, 23196, 23196, 2944, 2944, 23196, -1000, -1000, - -1000, 350, 350, 32584, -1000, 23196, 21030, 20308, -1000, -1000, - 21030, 21030, 961, -1000, 21030, 1167, -1000, 21030, -1000, -1000, - 1527, 1219, 1219, 1219, 1219, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 1896, -1000, 21030, 21030, 21030, - 1532, 312, -1000, -1000, -1000, -1000, -1000, 2538, -1000, 21030, - -1000, 32584, 21030, 21030, 21030, -1000, -1000, -1000, 21030, 21030, - -1000, -1000, 21030, -1000, 21030, -1000, -1000, -1000, -1000, -1000, - -1000, 21030, -1000, 21030, -1000, -1000, -1000, 21030, -1000, 21030, - -1000, -1000, 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, - 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, - 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, - 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, -1000, -1000, - 21030, -1000, 21030, -1000, 21030, -1000, -1000, 21030, -1000, 21030, - -1000, 21030, -1000, 21030, 21030, -1000, 21030, 21030, 21030, -1000, - 21030, 21030, 21030, 21030, -1000, -1000, -1000, -1000, 21030, 21030, - 21030, 21030, 21030, 21030, 21030, 21030, 21030, 21030, -1000, -1000, - -1000, -1000, -1000, -1000, 21030, -1000, 38360, 23, -271, 1536, - 23, 1536, 22474, 813, 811, 21752, -1000, 20308, 15241, -1000, - -1000, -1000, -1000, -1000, 21030, 21030, 21030, 21030, 21030, 21030, - -1000, -1000, -1000, 21030, 21030, -1000, 21030, -1000, 21030, -1000, - -1000, -1000, -1000, -1000, 936, -1000, 870, 870, 870, 52800, - -1000, -1000, -1000, -1000, 1932, -1000, 2438, -1000, 2238, 2235, - 2536, 2512, -1000, 28974, 3572, -1000, -1000, 52800, -423, -1000, - 2270, 2357, 857, 857, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 12329, 2461, 21030, 2153, 53522, 247, -1000, 28252, 52800, - 53522, 28974, 28974, 28974, 28974, 28974, -1000, 2196, 2195, -1000, - 2225, 2215, 2318, 54244, -1000, 1568, 1732, -1000, 21030, 31140, - 1922, 28974, -1000, -1000, 28974, 54244, 11601, -1000, -1000, 2, - -13, -1000, -1000, -1000, -1000, 361, -1000, -1000, 1550, 2400, - 2282, -1000, -1000, -1000, -1000, -1000, 1728, -1000, 1717, 1926, - 1711, 1704, 304, -1000, 2047, 2326, 938, 938, -1000, 1254, - -1000, 1173, 1599, 1593, -1000, -1000, -1000, 472, -1000, 2375, - 54244, 2151, 2150, 2149, -1000, -515, 1251, 2026, 1982, 21030, - 2024, 2492, 1882, 52800, -1000, -1000, 53522, -1000, 294, -1000, - 416, 52800, -1000, -1000, -1000, 334, 54244, -1000, 8486, -1000, - -1000, -1000, 232, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 54244, 271, -1000, 2020, 1274, -1000, -1000, 2088, -1000, -1000, - -1000, -1000, -1000, 216, 190, 1566, 213, 1560, 213, -1000, - 54244, 911, 2129, 54244, -1000, -1000, -1000, 1090, 1090, -1000, - -1000, 2325, -1000, 1173, 1219, 23196, 23196, -1000, 876, -1000, - -1000, 384, -248, 2014, 2014, -1000, 2014, 2015, -1000, 2014, - 174, 2014, 172, 2014, -1000, -1000, 1532, 1532, -1000, 1527, - -1000, 2287, 1181, -1000, 1371, 21030, 2889, -1000, -1000, -1000, - -1000, -1000, -71, 2842, 2833, 1219, -1000, 2013, 2012, 21030, - 1219, 1532, 2279, 1219, 1219, 1219, 1219, 1219, 1219, 1219, - 1219, 1219, 1219, 1219, 1219, 2231, 2221, 2211, 2206, 2201, - 2192, 2183, 2172, 2124, 2110, 2104, 2064, 2037, 2017, 1946, - 1940, 1219, 1219, 1934, 1219, 1919, 1859, -1000, 1371, 1527, - 2516, 1527, 1219, 1219, 2445, 313, 1219, 1702, 1702, 1702, - 1702, 1702, 1527, 1527, 1527, 1527, 1219, 52800, -1000, -271, - -1000, -1000, -310, -311, -1000, 1532, -271, 1918, 23196, 1219, - 23196, 23196, 23196, 1219, 1532, -1000, 1846, 1825, 2081, 1815, - 1219, 2042, 1219, 1219, 1219, 1811, -1000, 2447, 2447, 2447, - 1696, 1233, 54244, -1000, -1000, -1000, -1000, 2512, 2505, 1899, - -1000, -1000, 90, 573, -1000, 2294, 2357, -1000, 2488, 2261, - 2486, -1000, -1000, -1000, -1000, -1000, 1371, -1000, 2350, 1916, - -1000, 955, 1857, -1000, -1000, 19586, 1698, 2226, 531, 1696, - 1894, 3285, 2111, 2143, 3000, -1000, -1000, -1000, -1000, 2178, - -1000, 2134, -1000, -1000, 1992, -1000, 1519, 346, 28974, 1778, - 1778, -1000, 525, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1076, 8486, 2571, -1000, 1558, -1000, 1346, 205, 1247, -1000, - -1000, 938, 938, -1000, 1025, 1023, -1000, 54244, 2011, -1000, - 357, 1554, 357, 1245, -1000, -1000, 1210, -1000, -1000, -1000, - -1000, 1973, 2092, -1000, -1000, -1000, -1000, 54244, -1000, -1000, - 54244, 54244, 54244, 2010, 2485, -1000, 21030, 2009, 944, 2334, - 52800, 52800, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 471, 938, -485, 311, 310, 938, 938, - 938, -526, -1000, -1000, 1691, 1687, -1000, -207, -1000, 21030, - -1000, -1000, -1000, -1000, -1000, 1273, 1273, 1500, 1498, 1493, - -1000, 1992, -1000, -1000, -1000, 1712, -1000, -1000, -193, 52800, - 52800, 52800, 52800, -1000, -1000, -1000, 1107, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 876, - 1532, 412, -195, 1532, -1000, -1000, 357, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21030, -1000, 21030, - -1000, 1371, 21030, 2461, 1461, 21030, 21030, -1000, 1198, 1172, - 1219, -1000, -1000, -1000, 21030, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21030, -1000, - 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, - 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, - 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, 21030, -1000, - -1000, 21030, -1000, -1000, -1000, 21030, -1000, 21030, -1000, 21030, - -1000, -1000, -1000, 21030, 303, 350, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1532, 344, -1000, - -1000, -1000, -1000, 2514, -1000, 1532, 21030, 2944, -1000, 2944, - 2944, 2944, -1000, -1000, -1000, 21030, -1000, 21030, 21030, -1000, - 21030, -1000, 21030, -1000, -1000, -1000, -1000, 21030, 1983, 2237, - 1983, 1983, 31140, -1000, -1000, 2505, 2471, 2483, 2247, 2249, - 2249, 2294, -1000, 2482, 2474, -1000, 1440, 2473, 1435, 999, - -1000, 53522, 21030, 247, -1000, 419, 52800, 247, 52800, -1000, - 2478, -1000, -1000, 21030, 2004, -1000, 21030, -1000, -1000, -1000, - -1000, 5973, 2512, 1778, -1000, -1000, 887, -1000, 21030, -1000, - 9314, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1422, - 1419, -1000, -1000, 1994, 21030, -1000, -1000, -1000, 1692, 1630, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1992, -1000, - -1000, -1000, -1000, 334, -510, 2089, 52800, 1171, -1000, 1671, - 1882, 330, 247, 1416, 938, 938, 938, 1161, 1155, 36916, - 1654, -1000, 52800, 413, -1000, 334, -1000, -229, -244, 1219, - -1000, -1000, 2394, -1000, -1000, 15241, -1000, -1000, 1988, 2096, - -1000, -1000, -1000, -1000, 2210, -178, -208, -1000, -1000, 1219, - 1219, 1250, 1532, -1000, 1219, 1219, 1577, 1542, -1000, 1219, - 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, - 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1527, - 1785, -1000, 303, 1532, 2131, -1000, -1000, 5973, -1000, -1000, - 2478, 2470, 23, -1000, -1000, 230, 23, 1371, 985, 1532, - 1532, 985, 1779, 1219, 1749, 1736, 1219, 1219, 31862, -1000, - 2464, 2448, 37638, 37638, 936, 2471, -280, 21030, 21030, 2243, - 1123, -1000, -1000, -1000, -1000, 1409, 1385, -1000, 1380, -1000, - 2563, -1000, 1371, -1000, 247, -1000, 523, 1857, -1000, 2461, - 1371, 52800, 1371, 76, 2478, -1000, 1219, -1000, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, - 1983, 1983, 1983, 1983, 1983, 1983, 1983, -1000, -1000, 52800, - 1837, -1000, -1000, 2389, 1634, 164, -1000, 1535, 1882, -1000, - -1000, 206, -1000, 21030, -1000, 36916, 1375, 1344, -1000, -1000, - -1000, -1000, -526, -1000, -1000, -1000, -1000, -1000, -1000, 408, - 1876, -1000, 934, 52800, 54244, -1000, 2202, -1000, -1000, -1000, - 21030, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 4151, 1824, -1000, 1824, 1425, + 964, -1000, 21549, 1426, 4143, -1000, -1000, 1426, 1426, 21549, + -1000, -1000, 21549, 21549, 21549, 21549, 1474, 1474, 1474, 1474, + 1474, 1474, 1474, 1474, 1474, 1474, 21549, 1474, 1906, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21030, -1000, - 1532, 2126, -1000, -358, -1000, -486, 21030, -271, -1000, -1000, - -271, -1000, -1000, -1000, -1000, -1000, 21030, -1000, -1000, 21030, - -1000, 21030, -1000, -1000, 1576, -1000, -1000, -1000, -1000, -1000, - 1576, 1576, -1000, -280, -1000, 1861, -1000, 52800, 1371, 1852, - -1000, 1122, -1000, -1000, -1000, -1000, -1000, 53522, 1857, 52800, - -1000, 1541, 1532, 1983, 2461, -1000, 1537, -1000, 408, -1000, - 1986, 1982, -1000, -1000, -1000, 18864, -1000, -1000, -1000, -1000, - -1000, 267, -188, 15241, 10873, 1531, -1000, -187, 1219, 1527, - -1000, -461, -1000, -1000, -1000, -1000, 291, -1000, -1000, 1852, - -1000, -1000, 1607, 1565, 1379, 36194, -1000, -1000, -1000, -1000, - -280, -1000, -1000, 2382, -1000, -1000, 1751, -1000, -1000, 31140, - 52078, -1000, -172, 338, -188, 21030, 1985, 1532, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -37, -1000, -1000, 519, - -1000, -1000, -1000, 2088, -199, -1000, -1000, -1000, 318, -475, - -298, -299, 23196, -1000, 21030, -1000, 21030, -1000, 21030, -1000, - -1000, -1000, 52800, 1983, -1000, 1489, -1000, 3989, -327, 2120, - -1000, -132, -1000, -1000, -1000, 1072, 1341, -1000, -1000, -1000, - -1000, -1000, -1000, 1431, 52800, -1000, 421, -1000, -1000, 14513, - -193, -215, 992, -1000, -1000, -1000, -1000, -1000, 2944, 1329, - 1129, 1219, -1000, 52800, -1000, 52078, -322, 864, 5973, -1000, - 2117, 2113, 2522, -1000, -1000, -1000, -1000, -1000, -1000, -529, - 1465, 250, -1000, -1000, -1000, 318, -301, -1000, 21030, -1000, - 21030, -1000, 1532, -1000, -1000, 2372, 76, -1000, 2560, -1000, - 2534, 1060, 1060, -1000, 1106, -529, -1000, -1000, -1000, -1000, - 1219, 1219, -1000, -329, -1000, -1000, -1000, -1000, -1000, 420, - 1302, -1000, -1000, -1000, -1000, -1000, 5973, -1000, -1000, -1000, - 263, 263, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1900, 2544, 1352, + 1474, 1474, 1474, 1474, 1474, 21549, 1432, -1000, -1000, -1000, + 1434, 4139, 1116, 4135, 1474, 1474, -1000, 1474, 4126, 4116, + 1426, 1803, 2877, 2872, 1474, 1474, 1474, 1474, 1474, 2864, + 2803, 1474, 1474, 2722, 1474, 4112, 1474, 2681, 2658, 2645, + 2621, 2615, 2598, 2556, 2540, 2535, 2529, 2524, 2511, 2495, + 2491, 2468, 2453, 2449, 2429, 1474, 1474, 1474, 4093, 1474, + 3877, 1474, 3845, 1474, 1474, 3820, 2409, 2361, 1426, 1897, + -1000, 3813, 1474, 3808, 3804, 3526, 2351, 3515, 3477, 3449, + 1474, 1474, 1474, 2322, 3440, 3435, 3427, 3421, 3417, 3407, + 3403, 3378, 3370, 1474, 1481, 1481, 1481, 1481, 1481, 3361, + -267, 1474, 1426, -1000, -1000, -1000, -1000, -1000, 3347, 2316, + 3336, 3332, 3321, 3317, 1426, 1891, 1788, 761, -1000, -1000, + 1824, 1426, 1426, 1824, 1824, 3290, 3276, 3207, 3191, 3018, + 2997, 1474, 1474, -1000, 1474, 2960, 2940, 2312, 2304, 1426, + -1000, 1481, 54763, -1000, -431, -1000, 0, 933, 1788, -1000, + 37435, 1426, -1000, 4158, -1000, 1335, -1000, -1000, -1000, -1000, + -1000, 34547, 1752, 2727, -1000, -1000, 1788, 1791, -1000, -1000, + 351, 81, 33825, 852, 852, 127, 1515, 1515, 21549, -1000, + -1000, -1000, -1000, -1000, -1000, 542, 2527, 423, 1788, -1000, + 1883, 3286, -1000, -1000, -1000, 2386, 27326, -1000, -1000, 1788, + 1788, 54763, 1863, 1854, -1000, 537, -1000, 1359, 1878, 20, + 19, -1000, -1000, -1000, -1000, 1515, -1000, 1358, 337, 341, + -1000, 416, -1000, -1000, -1000, -1000, 2306, 102, -1000, -1000, + -1000, 365, 351, -1000, -1000, -1000, -1000, -1000, -1000, 1580, + 1580, -1000, -1000, -1000, -1000, -1000, 1241, -1000, -1000, -1000, + -1000, 1223, -1000, -1000, 1222, -1000, -1000, 2327, 2135, 415, + -1000, -1000, 936, 1566, -1000, -1000, 2293, 936, 936, 53319, + -1000, -1000, 1611, 2362, 240, 54763, 959, 2126, -1000, 2079, + 2079, 2079, 54763, -1000, -1000, -1000, -1000, -1000, -1000, -505, + 175, 583, -1000, -1000, -1000, 2009, 53319, 1785, -1000, 222, + -1000, 1549, -1000, 53319, -1000, 1768, 2015, 1353, 1353, -1000, + -1000, -1000, 53319, 1788, -1000, -1000, -1000, -1000, 473, 2347, + 353, -1000, -1000, -293, -1000, -1000, 220, 222, 54041, 1353, + 857, -1000, -1000, -1000, -1000, -1000, -506, 1759, 457, 217, + 563, 54763, 54763, 54763, 54763, 54763, 54763, 782, -1000, -1000, + 41, -1000, -1000, 207, -1000, -1000, -1000, -1000, 207, -1000, + -1000, -1000, -1000, 278, 432, -1000, 54763, 54763, 914, -1000, + -1000, -1000, -1000, -1000, 1027, -1000, -1000, 1027, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 2344, 54763, 15, -472, -1000, -469, 21549, -1000, -1000, -1000, + -1000, 1547, 484, 1224, 23715, 23715, 2945, 2945, 23715, -1000, + -1000, -1000, 1176, 1176, 33103, -1000, 23715, 21549, 20827, -1000, + -1000, 21549, 21549, 934, -1000, 21549, 1198, -1000, 21549, -1000, + -1000, 1481, 1474, 1474, 1474, 1474, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1858, -1000, 21549, 21549, + 21549, 1426, 304, -1000, -1000, -1000, -1000, -1000, 2543, -1000, + 21549, -1000, 33103, 21549, 21549, 21549, -1000, -1000, -1000, 21549, + 21549, -1000, -1000, 21549, -1000, 21549, -1000, -1000, -1000, -1000, + -1000, -1000, 21549, -1000, 21549, -1000, -1000, -1000, 21549, -1000, + 21549, -1000, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, + -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, + -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, + -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, -1000, + -1000, 21549, -1000, 21549, -1000, 21549, -1000, -1000, 21549, -1000, + 21549, -1000, 21549, -1000, 21549, 21549, -1000, 21549, 21549, 21549, + -1000, 21549, 21549, 21549, 21549, -1000, -1000, -1000, -1000, 21549, + 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, -1000, + -1000, -1000, -1000, -1000, -1000, 21549, -1000, 38879, 58, -267, + 1665, 58, 1665, 22993, 805, 803, 22271, -1000, 20827, 15760, + -1000, -1000, -1000, -1000, -1000, 21549, 21549, 21549, 21549, 21549, + 21549, -1000, -1000, -1000, 21549, 21549, -1000, 21549, -1000, 21549, + -1000, -1000, -1000, -1000, -1000, 933, -1000, 868, 868, 868, + 53319, -1000, -1000, -1000, -1000, 1877, -1000, 2458, -1000, 2223, + 2219, 2539, 2527, -1000, 29493, 2727, -1000, -1000, 53319, -412, + -1000, 2258, 2253, 852, 852, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 12848, 2456, 21549, 2115, 54041, 249, -1000, 28771, + 53319, 54041, 29493, 29493, 29493, 29493, 29493, -1000, 2173, 2163, + -1000, 2190, 2154, 2216, 54763, -1000, 1769, 1741, -1000, 21549, + 31659, 1724, 29493, -1000, -1000, 29493, 54763, 12120, -1000, -1000, + 8, -11, -1000, -1000, -1000, -1000, 361, -1000, -1000, 1173, + 2383, 2297, -1000, -1000, -1000, -1000, -1000, 1721, -1000, 1712, + 1865, 1704, 1697, 281, -1000, 2060, 2339, 936, 936, -1000, + 1218, -1000, 1353, 1545, 1538, -1000, -1000, -1000, 436, -1000, + 2375, 54763, 2110, 2109, 2107, -1000, -515, 1213, 2011, 2014, + 21549, 2005, 2503, 1846, 53319, -1000, -1000, 54041, -1000, 294, + -1000, 415, 53319, -1000, -1000, -1000, 327, 54763, -1000, 8692, + -1000, -1000, -1000, 222, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 54763, 237, -1000, 2003, 1340, -1000, -1000, 2069, -1000, + -1000, -1000, -1000, -1000, 215, 213, 1536, 205, 1534, 205, + -1000, 54763, 907, 2135, 54763, -1000, -1000, -1000, 1083, 1083, + -1000, -1000, 2318, -1000, 1353, 1474, 23715, 23715, -1000, 858, + -1000, -1000, 520, -228, 1990, 1990, -1000, 1990, 1995, -1000, + 1990, 161, 1990, 159, 1990, -1000, -1000, 1426, 1426, -1000, + 1481, -1000, 2288, 1329, -1000, 1515, 21549, 2909, -1000, -1000, + -1000, -1000, -1000, -69, 2903, 2890, 1474, -1000, 1988, 1987, + 21549, 1474, 1426, 2280, 1474, 1474, 1474, 1474, 1474, 1474, + 1474, 1474, 1474, 1474, 1474, 1474, 2275, 2211, 2206, 2202, + 2185, 2175, 2111, 2105, 2093, 2089, 2085, 2076, 2062, 2055, + 2006, 1998, 1474, 1474, 1941, 1474, 1936, 1920, -1000, 1515, + 1481, 2843, 1481, 1474, 1474, 2834, 310, 1474, 1692, 1692, + 1692, 1692, 1692, 1481, 1481, 1481, 1481, 1474, 53319, -1000, + -267, -1000, -1000, -315, -316, -1000, 1426, -267, 1860, 23715, + 1474, 23715, 23715, 23715, 1474, 1426, -1000, 1894, 1861, 2689, + 1847, 1474, 2517, 1474, 1474, 1474, 1812, -1000, 2425, 2425, + 2425, 1640, 1335, 54763, -1000, -1000, -1000, -1000, 2527, 2519, + 1855, -1000, -1000, 81, 625, -1000, 2255, 2253, -1000, 2499, + 2272, 2496, -1000, -1000, -1000, -1000, -1000, 1515, -1000, 2353, + 1904, -1000, 950, 1819, -1000, -1000, 20105, 1683, 2210, 524, + 1640, 1881, 3286, 2084, 2106, 3001, -1000, -1000, -1000, -1000, + 2155, -1000, 2153, -1000, -1000, 1966, -1000, 2346, 334, 29493, + 1879, 1879, -1000, 518, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1057, 8692, 2542, -1000, 1525, -1000, 1334, 209, 1199, + -1000, -1000, 936, 936, -1000, 997, 995, -1000, 54763, 1986, + -1000, 351, 1523, 351, 1181, -1000, -1000, 1180, -1000, -1000, + -1000, -1000, 1973, 2217, -1000, -1000, -1000, -1000, 54763, -1000, + -1000, 54763, 54763, 54763, 1984, 2494, -1000, 21549, 1982, 938, + 2181, 53319, 53319, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 429, 936, -486, 285, 284, 936, + 936, 936, -526, -1000, -1000, 1638, 1610, -1000, -182, -1000, + 21549, -1000, -1000, -1000, -1000, -1000, 1238, 1238, 1518, 1512, + 1506, -1000, 1966, -1000, -1000, -1000, 1544, -1000, -1000, -187, + 53319, 53319, 53319, 53319, -1000, -1000, -1000, 1148, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 858, 1426, 345, -195, 1426, -1000, -1000, 351, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21549, -1000, + 21549, -1000, 1515, 21549, 2456, 1470, 21549, 21549, -1000, 1162, + 1144, 1474, -1000, -1000, -1000, 21549, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21549, + -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, + -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, + -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, + -1000, -1000, 21549, -1000, -1000, -1000, 21549, -1000, 21549, -1000, + 21549, -1000, -1000, -1000, 21549, 204, 1176, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1426, 333, + -1000, -1000, -1000, -1000, 2538, -1000, 1426, 21549, 2945, -1000, + 2945, 2945, 2945, -1000, -1000, -1000, 21549, -1000, 21549, 21549, + -1000, 21549, -1000, 21549, -1000, -1000, -1000, -1000, 21549, 1788, + 2313, 1788, 1788, 31659, -1000, -1000, 2519, 2516, 2493, 2234, + 2240, 2240, 2255, -1000, 2486, 2482, -1000, 1458, 2472, 1456, + 991, -1000, 54041, 21549, 249, -1000, 419, 53319, 249, 53319, + -1000, 2459, -1000, -1000, 21549, 1977, -1000, 21549, -1000, -1000, + -1000, -1000, 6798, 2527, 1879, -1000, -1000, 869, -1000, 21549, + -1000, 10160, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1453, 1445, -1000, -1000, 1968, 21549, -1000, -1000, -1000, 1533, + 1511, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1966, + -1000, -1000, -1000, -1000, 327, -510, 2048, 53319, 1129, -1000, + 1578, 1846, 307, 249, 1406, 936, 936, 936, 1128, 1120, + 37435, 1576, -1000, 53319, 399, -1000, 327, -1000, -219, -220, + 1474, -1000, -1000, 2382, -1000, -1000, 15760, -1000, -1000, 1964, + 2074, -1000, -1000, -1000, -1000, 2183, -176, -208, -1000, -1000, + 1474, 1474, 1623, 1426, -1000, 1474, 1474, 1482, 1475, -1000, + 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, + 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, + 1481, 1750, -1000, 204, 1426, 2103, -1000, -1000, 6798, -1000, + -1000, 2459, 2470, 58, -1000, -1000, 236, 58, 1515, 987, + 1426, 1426, 987, 1685, 1474, 1680, 1608, 1474, 1474, 32381, + -1000, 2465, 2463, 38157, 38157, 933, 2516, -281, 21549, 21549, + 2227, 1142, -1000, -1000, -1000, -1000, 1403, 1401, -1000, 1387, + -1000, 2537, -1000, 1515, -1000, 249, -1000, 516, 1819, -1000, + 2456, 1515, 53319, 1515, 77, 2459, -1000, 1474, -1000, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, + 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, -1000, -1000, + 53319, 1907, -1000, -1000, 2381, 1574, 165, -1000, 1469, 1846, + -1000, -1000, 247, -1000, 21549, -1000, 37435, 1385, 1380, -1000, + -1000, -1000, -1000, -526, -1000, -1000, -1000, -1000, -1000, -1000, + 409, 1837, -1000, 931, 53319, 54763, -1000, 2161, -1000, -1000, + -1000, 21549, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21549, + -1000, 1426, 2099, -1000, -358, -1000, -490, 21549, -267, -1000, + -1000, -267, -1000, -1000, -1000, -1000, -1000, 21549, -1000, -1000, + 21549, -1000, 21549, -1000, -1000, 1571, -1000, -1000, -1000, -1000, + -1000, 1571, 1571, -1000, -281, -1000, 1832, -1000, 53319, 1515, + 1803, -1000, 1140, -1000, -1000, -1000, -1000, -1000, 54041, 1819, + 53319, -1000, 1548, 1426, 1788, 2456, -1000, 1543, -1000, 409, + -1000, 1952, 2014, -1000, -1000, -1000, 19383, -1000, -1000, -1000, + -1000, -1000, 267, -186, 15760, 11392, 1510, -1000, -180, 1474, + 1481, -1000, -462, -1000, -1000, -1000, -1000, 291, -1000, -1000, + 1803, -1000, -1000, 1461, 1419, 1357, 36713, -1000, -1000, -1000, + -1000, -281, -1000, -1000, 2380, -1000, -1000, 1766, -1000, -1000, + 31659, 52597, -1000, -171, 338, -186, 21549, 1951, 1426, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -34, -1000, -1000, + 501, -1000, -1000, -1000, 2069, -199, -1000, -1000, -1000, 318, + -475, -287, -292, 23715, -1000, 21549, -1000, 21549, -1000, 21549, + -1000, -1000, -1000, 53319, 1788, -1000, 1468, -1000, 4863, -326, + 2098, -1000, -92, -1000, -1000, -1000, 1051, 1336, -1000, -1000, + -1000, -1000, -1000, -1000, 1902, 53319, -1000, 366, -1000, -1000, + 15032, -187, -209, 972, -1000, -1000, -1000, -1000, -1000, 2945, + 1312, 1295, 1474, -1000, 53319, -1000, 52597, -321, 857, 6798, + -1000, 2086, 2026, 2532, -1000, -1000, -1000, -1000, -1000, -1000, + -529, 1442, 239, -1000, -1000, -1000, 318, -298, -1000, 21549, + -1000, 21549, -1000, 1426, -1000, -1000, 2369, 77, -1000, 2534, + -1000, 2497, 1021, 1021, -1000, 1089, -529, -1000, -1000, -1000, + -1000, 1474, 1474, -1000, -327, -1000, -1000, -1000, -1000, -1000, + 405, 1175, -1000, -1000, -1000, -1000, -1000, 6798, -1000, -1000, + -1000, 263, 263, -1000, -1000, } var yyPgo = [...]int{ - 0, 3158, 3156, 28, 6, 41, 35, 3155, 3154, 3153, - 177, 3151, 3137, 3135, 3134, 3130, 3129, 2624, 2610, 2600, - 3127, 3126, 3125, 3122, 3120, 3108, 3107, 3104, 3103, 39, - 106, 68, 99, 211, 213, 3100, 176, 166, 198, 3097, - 3096, 3095, 116, 192, 83, 82, 195, 3092, 3091, 74, - 3090, 3088, 3087, 185, 184, 183, 1040, 3086, 182, 112, - 48, 3083, 3080, 3076, 3075, 3072, 3065, 3063, 3061, 3060, - 3054, 3053, 3052, 3046, 3043, 3041, 3040, 3039, 3036, 296, - 3035, 3033, 21, 3030, 76, 3028, 3026, 3025, 3024, 3023, - 11, 3022, 3017, 26, 44, 3012, 3009, 47, 3008, 3007, - 3004, 2998, 2997, 69, 2994, 22, 2983, 40, 2979, 2978, - 121, 2974, 2971, 2966, 43, 2962, 2961, 2957, 29, 167, - 2956, 2955, 139, 2954, 2953, 2950, 165, 206, 2949, 2239, - 205, 108, 111, 2948, 2947, 103, 188, 2946, 123, 2927, - 2924, 2915, 150, 2914, 3191, 2913, 2909, 64, 70, 199, - 2907, 2895, 163, 66, 8, 16, 17, 2894, 2892, 63, - 73, 2889, 101, 2885, 2884, 104, 84, 2883, 90, 98, - 2882, 2881, 5, 7, 2879, 1, 4, 2, 80, 2878, - 2877, 115, 2876, 2873, 2871, 95, 2868, 2865, 4363, 2862, - 85, 128, 102, 62, 2860, 171, 131, 2858, 2857, 2856, - 2854, 2850, 49, 2849, 2848, 2847, 138, 251, 162, 2831, - 144, 337, 52, 143, 2830, 189, 77, 197, 190, 2828, - 2825, 135, 133, 2824, 2821, 55, 164, 191, 2812, 94, - 127, 117, 168, 91, 130, 2808, 2805, 56, 60, 2803, - 2802, 2801, 2800, 174, 2799, 2797, 59, 2795, 54, 2794, - 186, 2792, 136, 79, 2791, 170, 169, 2790, 61, 2789, - 2788, 65, 96, 100, 38, 2787, 158, 161, 125, 172, - 2786, 2782, 53, 2780, 2779, 2778, 196, 292, 2774, 2772, - 294, 178, 141, 147, 89, 2771, 299, 2770, 2767, 13, - 4391, 6814, 2766, 37, 160, 2765, 2758, 6537, 20, 45, - 24, 2755, 204, 2753, 2752, 2750, 2749, 217, 202, 110, - 159, 57, 2744, 2741, 2736, 36, 2735, 2734, 2733, 2732, - 2731, 2723, 72, 34, 33, 32, 212, 58, 19, 97, - 153, 152, 67, 2709, 2706, 2705, 124, 87, 2704, 157, - 155, 120, 129, 2701, 180, 142, 119, 2700, 93, 31, - 2696, 2693, 2688, 2681, 92, 2678, 2677, 2674, 2669, 151, - 146, 118, 78, 2666, 81, 114, 149, 145, 51, 2665, - 46, 2664, 2663, 30, 193, 23, 2662, 15, 105, 109, - 2661, 5648, 181, 2660, 9, 298, 148, 2657, 2655, 10, - 12, 18, 2654, 2639, 2638, 2636, 132, 2635, 2632, 2630, - 2625, 27, 50, 25, 14, 113, 75, 2620, 2615, 140, - 2614, 2593, 2592, 0, 1005, 126, 2591, 207, + 0, 3155, 3154, 28, 6, 41, 35, 3152, 3138, 3136, + 177, 3135, 3131, 3130, 3128, 3127, 3126, 2601, 2585, 2578, + 3123, 3121, 3109, 3108, 3105, 3104, 3101, 3098, 3097, 39, + 106, 68, 99, 204, 213, 3096, 176, 166, 198, 3093, + 3092, 3091, 116, 192, 83, 82, 195, 3089, 3088, 74, + 3087, 3084, 3081, 185, 184, 183, 1030, 3077, 182, 112, + 48, 3076, 3073, 3066, 3064, 3062, 3061, 3055, 3054, 3053, + 3047, 3044, 3042, 3041, 3040, 3037, 3036, 3034, 3031, 296, + 3029, 3027, 21, 3026, 76, 3025, 3024, 3023, 3018, 3013, + 11, 3010, 3009, 26, 44, 3008, 3005, 47, 2999, 2998, + 2995, 2984, 2980, 69, 2979, 22, 2975, 40, 2972, 2967, + 121, 2963, 2962, 2958, 43, 2957, 2956, 2955, 29, 167, + 2954, 2951, 139, 2950, 2949, 2948, 165, 206, 2947, 2255, + 215, 108, 111, 2928, 2925, 103, 188, 2916, 123, 2915, + 2914, 2910, 150, 2908, 3192, 2900, 2899, 64, 70, 199, + 2897, 2896, 163, 66, 8, 16, 17, 2895, 2893, 63, + 73, 2890, 101, 2886, 2885, 104, 84, 2884, 90, 98, + 2883, 2882, 5, 7, 2880, 1, 4, 2, 80, 2879, + 2878, 115, 2877, 2874, 2872, 95, 2869, 2866, 4205, 2863, + 85, 128, 102, 62, 2861, 171, 131, 2859, 2858, 2857, + 2855, 2851, 49, 2850, 2849, 2848, 138, 251, 162, 2846, + 144, 337, 52, 143, 2845, 189, 77, 197, 190, 2826, + 2825, 135, 133, 2822, 2819, 55, 164, 191, 2818, 94, + 127, 117, 168, 91, 130, 2816, 2813, 56, 60, 2809, + 2806, 2804, 2803, 174, 2802, 2796, 59, 2790, 54, 2789, + 186, 2784, 136, 79, 2783, 170, 169, 2782, 61, 2781, + 2780, 65, 96, 100, 38, 2779, 158, 161, 125, 172, + 2776, 2775, 53, 2774, 2773, 2772, 196, 292, 2771, 2768, + 294, 178, 141, 147, 89, 2767, 299, 2765, 2762, 13, + 4392, 7332, 2760, 37, 160, 2759, 2756, 7030, 20, 45, + 24, 2754, 205, 2749, 2745, 2744, 2742, 238, 202, 110, + 159, 57, 2737, 2736, 2735, 36, 2732, 2731, 2724, 2723, + 2722, 2708, 72, 34, 33, 32, 212, 58, 19, 97, + 153, 152, 67, 2707, 2706, 2705, 124, 87, 2702, 157, + 155, 120, 129, 2701, 180, 142, 119, 2697, 93, 31, + 2694, 2692, 2689, 2684, 92, 2681, 2679, 2676, 2674, 151, + 146, 118, 78, 2670, 81, 114, 149, 145, 51, 2665, + 46, 2663, 2661, 30, 193, 23, 2658, 15, 105, 109, + 2656, 6221, 181, 2655, 9, 298, 148, 2650, 2647, 10, + 12, 18, 2646, 2640, 2639, 2636, 132, 2632, 2630, 2626, + 2622, 27, 50, 25, 14, 113, 75, 2621, 2616, 140, + 2615, 2614, 2594, 0, 1005, 126, 2586, 207, } -//line sql.y:8575 +//line sql.y:8579 type yySymType struct { union any empty struct{} @@ -8381,44 +8433,44 @@ var yyR1 = [...]int{ 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 278, 278, 287, 287, 277, 277, - 302, 302, 302, 280, 280, 280, 281, 281, 398, 398, - 398, 274, 274, 66, 66, 66, 303, 303, 303, 303, - 69, 69, 407, 407, 408, 408, 409, 409, 409, 70, - 71, 71, 305, 305, 306, 306, 72, 73, 85, 85, - 85, 85, 85, 85, 85, 86, 86, 86, 86, 109, - 109, 109, 10, 10, 10, 10, 81, 81, 81, 9, - 9, 11, 68, 68, 75, 395, 395, 396, 397, 397, - 397, 397, 76, 78, 27, 27, 27, 27, 27, 27, - 134, 134, 122, 122, 122, 122, 122, 122, 122, 122, - 122, 122, 122, 122, 129, 129, 129, 123, 123, 416, - 79, 80, 80, 127, 127, 127, 120, 120, 120, 126, - 126, 126, 12, 12, 13, 260, 260, 14, 14, 131, - 131, 133, 133, 133, 133, 133, 135, 135, 135, 135, - 135, 135, 135, 130, 130, 132, 132, 132, 132, 295, - 295, 295, 294, 294, 165, 165, 167, 166, 166, 168, - 168, 169, 169, 169, 169, 214, 214, 191, 191, 253, - 253, 254, 254, 252, 252, 259, 259, 255, 255, 255, - 255, 262, 262, 170, 170, 170, 170, 178, 178, 179, - 179, 180, 180, 304, 304, 300, 300, 300, 299, 299, - 184, 184, 184, 186, 185, 185, 185, 185, 187, 187, - 189, 189, 188, 188, 190, 195, 195, 194, 194, 192, - 192, 192, 192, 193, 193, 193, 193, 196, 196, 144, - 144, 144, 144, 144, 144, 144, 144, 157, 157, 157, - 157, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 243, 243, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 152, + 65, 65, 65, 65, 65, 278, 278, 287, 287, 277, + 277, 302, 302, 302, 280, 280, 280, 281, 281, 398, + 398, 398, 274, 274, 66, 66, 66, 303, 303, 303, + 303, 69, 69, 407, 407, 408, 408, 409, 409, 409, + 70, 71, 71, 305, 305, 306, 306, 72, 73, 85, + 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, + 109, 109, 109, 10, 10, 10, 10, 81, 81, 81, + 9, 9, 11, 68, 68, 75, 395, 395, 396, 397, + 397, 397, 397, 76, 78, 27, 27, 27, 27, 27, + 27, 134, 134, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 129, 129, 129, 123, 123, + 416, 79, 80, 80, 127, 127, 127, 120, 120, 120, + 126, 126, 126, 12, 12, 13, 260, 260, 14, 14, + 131, 131, 133, 133, 133, 133, 133, 135, 135, 135, + 135, 135, 135, 135, 130, 130, 132, 132, 132, 132, + 295, 295, 295, 294, 294, 165, 165, 167, 166, 166, + 168, 168, 169, 169, 169, 169, 214, 214, 191, 191, + 253, 253, 254, 254, 252, 252, 259, 259, 255, 255, + 255, 255, 262, 262, 170, 170, 170, 170, 178, 178, + 179, 179, 180, 180, 304, 304, 300, 300, 300, 299, + 299, 184, 184, 184, 186, 185, 185, 185, 185, 187, + 187, 189, 189, 188, 188, 190, 195, 195, 194, 194, + 192, 192, 192, 192, 193, 193, 193, 193, 196, 196, + 144, 144, 144, 144, 144, 144, 144, 144, 157, 157, + 157, 157, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 243, 243, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, - 152, 152, 152, 152, 219, 219, 218, 218, 87, 87, - 87, 88, 88, 89, 89, 89, 89, 89, 90, 90, - 90, 90, 90, 90, 90, 92, 92, 91, 91, 209, - 209, 292, 292, 93, 94, 94, 97, 97, 96, 95, - 95, 101, 101, 98, 98, 100, 100, 99, 102, 102, - 103, 104, 104, 275, 275, 197, 197, 205, 205, 205, - 205, 198, 198, 198, 198, 198, 198, 198, 206, 206, - 206, 213, 207, 207, 203, 203, 201, 201, 201, 201, - 201, 201, 201, 201, 201, 201, 202, 202, 202, 202, + 152, 152, 152, 152, 152, 219, 219, 218, 218, 87, + 87, 87, 88, 88, 89, 89, 89, 89, 89, 90, + 90, 90, 90, 90, 90, 90, 92, 92, 91, 91, + 209, 209, 292, 292, 93, 94, 94, 97, 97, 96, + 95, 95, 101, 101, 98, 98, 100, 100, 99, 102, + 102, 103, 104, 104, 275, 275, 197, 197, 205, 205, + 205, 205, 198, 198, 198, 198, 198, 198, 198, 206, + 206, 206, 213, 207, 207, 203, 203, 201, 201, 201, + 201, 201, 201, 201, 201, 201, 201, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, @@ -8437,35 +8489,35 @@ var yyR1 = [...]int{ 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 162, 162, 162, - 162, 224, 224, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 151, 151, - 163, 163, 163, 163, 164, 164, 164, 164, 164, 164, - 164, 312, 312, 118, 118, 118, 118, 118, 118, 118, + 202, 202, 202, 202, 202, 202, 202, 202, 162, 162, + 162, 162, 224, 224, 150, 150, 150, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 151, + 151, 163, 163, 163, 163, 164, 164, 164, 164, 164, + 164, 164, 312, 312, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, + 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 417, 417, 326, 326, 326, 204, 204, 204, 204, - 204, 125, 125, 125, 125, 125, 309, 309, 309, 313, - 313, 313, 311, 311, 311, 311, 311, 311, 311, 311, - 311, 311, 311, 311, 311, 311, 311, 314, 314, 222, - 222, 121, 121, 220, 220, 221, 223, 223, 215, 215, - 215, 215, 217, 217, 200, 200, 200, 225, 225, 226, - 226, 105, 106, 106, 107, 107, 227, 227, 229, 228, - 228, 230, 231, 231, 231, 232, 232, 233, 233, 233, - 49, 49, 49, 49, 49, 44, 44, 44, 44, 45, - 45, 45, 45, 136, 136, 136, 136, 138, 138, 137, - 137, 82, 82, 83, 83, 83, 142, 142, 143, 143, - 143, 140, 140, 141, 141, 250, 250, 234, 234, 234, - 241, 241, 241, 237, 237, 239, 239, 239, 240, 240, - 240, 238, 247, 247, 249, 249, 248, 248, 244, 244, - 245, 245, 246, 246, 246, 242, 242, 199, 199, 199, - 199, 199, 251, 251, 251, 251, 263, 263, 210, 210, - 212, 212, 211, 211, 161, 264, 264, 272, 269, 269, - 270, 270, 296, 296, 296, 273, 273, 286, 286, 282, - 282, 283, 283, 276, 276, 288, 288, 288, 77, 208, - 208, 365, 365, 362, 291, 291, 293, 293, 297, 297, - 301, 301, 298, 298, 8, 410, 410, 410, 289, 289, + 119, 119, 417, 417, 326, 326, 326, 204, 204, 204, + 204, 204, 125, 125, 125, 125, 125, 309, 309, 309, + 313, 313, 313, 311, 311, 311, 311, 311, 311, 311, + 311, 311, 311, 311, 311, 311, 311, 311, 314, 314, + 222, 222, 121, 121, 220, 220, 221, 223, 223, 215, + 215, 215, 215, 217, 217, 200, 200, 200, 225, 225, + 226, 226, 105, 106, 106, 107, 107, 227, 227, 229, + 228, 228, 230, 231, 231, 231, 232, 232, 233, 233, + 233, 49, 49, 49, 49, 49, 44, 44, 44, 44, + 45, 45, 45, 45, 136, 136, 136, 136, 138, 138, + 137, 137, 82, 82, 83, 83, 83, 142, 142, 143, + 143, 143, 140, 140, 141, 141, 250, 250, 234, 234, + 234, 241, 241, 241, 237, 237, 239, 239, 239, 240, + 240, 240, 238, 247, 247, 249, 249, 248, 248, 244, + 244, 245, 245, 246, 246, 246, 242, 242, 199, 199, + 199, 199, 199, 251, 251, 251, 251, 263, 263, 210, + 210, 212, 212, 211, 211, 161, 264, 264, 272, 269, + 269, 270, 270, 296, 296, 296, 273, 273, 286, 286, + 282, 282, 283, 283, 276, 276, 288, 288, 288, 77, + 208, 208, 365, 365, 362, 291, 291, 293, 293, 297, + 297, 301, 301, 298, 298, 8, 410, 410, 410, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, @@ -8480,7 +8532,7 @@ var yyR1 = [...]int{ 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 289, 289, 289, 289, 289, 290, 290, + 289, 289, 289, 289, 289, 289, 289, 289, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, @@ -8527,7 +8579,7 @@ var yyR1 = [...]int{ 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 413, 414, 307, 308, 308, 308, + 290, 290, 290, 413, 414, 307, 308, 308, 308, } var yyR2 = [...]int{ @@ -8607,92 +8659,92 @@ var yyR2 = [...]int{ 7, 5, 2, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 2, 3, 3, 3, 3, - 5, 2, 3, 3, 2, 3, 4, 4, 4, 3, - 4, 4, 5, 3, 0, 1, 0, 1, 1, 1, - 0, 2, 2, 0, 2, 2, 0, 2, 0, 1, - 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, - 1, 3, 0, 1, 1, 3, 3, 2, 2, 1, - 1, 5, 0, 1, 0, 1, 2, 3, 0, 3, - 3, 3, 3, 3, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 1, 4, - 4, 4, 2, 2, 3, 1, 3, 2, 1, 2, - 1, 2, 2, 4, 3, 3, 6, 4, 7, 6, - 1, 3, 2, 2, 2, 2, 1, 1, 1, 3, - 2, 1, 1, 1, 0, 1, 1, 0, 3, 0, - 2, 0, 2, 1, 2, 2, 0, 1, 1, 0, - 1, 1, 5, 5, 4, 0, 2, 4, 4, 0, - 1, 0, 1, 2, 3, 4, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 1, 2, 3, 5, 0, - 1, 2, 1, 1, 0, 1, 2, 1, 3, 1, - 1, 1, 4, 3, 1, 1, 2, 3, 7, 0, - 3, 0, 1, 1, 3, 1, 3, 1, 1, 3, - 3, 1, 3, 4, 4, 4, 3, 2, 4, 0, - 1, 0, 2, 0, 1, 0, 1, 2, 1, 1, - 1, 2, 2, 1, 2, 3, 2, 3, 2, 2, - 2, 1, 1, 3, 3, 0, 1, 1, 2, 6, - 5, 6, 6, 0, 2, 3, 3, 0, 2, 3, - 3, 3, 2, 3, 1, 3, 6, 3, 4, 3, - 1, 3, 4, 5, 6, 3, 4, 5, 6, 3, - 4, 1, 1, 1, 3, 3, 3, 3, 3, 3, - 5, 5, 3, 3, 3, 3, 3, 3, 1, 1, - 1, 1, 1, 3, 1, 1, 1, 2, 2, 2, - 2, 1, 1, 2, 7, 7, 6, 6, 2, 2, - 5, 6, 3, 3, 1, 3, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, - 2, 2, 4, 2, 4, 0, 1, 2, 5, 0, - 3, 0, 1, 4, 4, 2, 0, 1, 1, 2, - 2, 1, 1, 2, 2, 0, 1, 1, 1, 1, - 5, 1, 3, 0, 3, 1, 1, 1, 2, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 4, 6, 4, 4, 8, 6, - 8, 6, 5, 4, 10, 2, 2, 1, 2, 2, - 2, 2, 2, 4, 5, 5, 5, 5, 5, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, - 4, 8, 8, 6, 5, 4, 4, 4, 4, 4, - 7, 4, 4, 6, 6, 6, 8, 6, 6, 4, - 4, 3, 4, 6, 6, 4, 4, 6, 4, 6, - 4, 4, 4, 4, 4, 4, 6, 4, 6, 4, - 4, 4, 6, 4, 6, 4, 4, 6, 4, 6, + 3, 5, 2, 3, 3, 2, 3, 4, 4, 4, + 3, 4, 4, 5, 3, 0, 1, 0, 1, 1, + 1, 0, 2, 2, 0, 2, 2, 0, 2, 0, + 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, + 1, 1, 3, 0, 1, 1, 3, 3, 2, 2, + 1, 1, 5, 0, 1, 0, 1, 2, 3, 0, + 3, 3, 3, 3, 3, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 4, 4, 4, 2, 2, 3, 1, 3, 2, 1, + 2, 1, 2, 2, 4, 3, 3, 6, 4, 7, + 6, 1, 3, 2, 2, 2, 2, 1, 1, 1, + 3, 2, 1, 1, 1, 0, 1, 1, 0, 3, + 0, 2, 0, 2, 1, 2, 2, 0, 1, 1, + 0, 1, 1, 5, 5, 4, 0, 2, 4, 4, + 0, 1, 0, 1, 2, 3, 4, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 2, 3, 5, + 0, 1, 2, 1, 1, 0, 1, 2, 1, 3, + 1, 1, 1, 4, 3, 1, 1, 2, 3, 7, + 0, 3, 0, 1, 1, 3, 1, 3, 1, 1, + 3, 3, 1, 3, 4, 4, 4, 3, 2, 4, + 0, 1, 0, 2, 0, 1, 0, 1, 2, 1, + 1, 1, 2, 2, 1, 2, 3, 2, 3, 2, + 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, + 6, 5, 6, 6, 0, 2, 3, 3, 0, 2, + 3, 3, 3, 2, 3, 1, 3, 6, 3, 4, + 3, 1, 3, 4, 5, 6, 3, 4, 5, 6, + 3, 4, 1, 1, 1, 3, 3, 3, 3, 3, + 3, 5, 5, 3, 3, 3, 3, 3, 3, 1, + 1, 1, 1, 1, 3, 1, 1, 1, 2, 2, + 2, 2, 1, 1, 2, 7, 7, 6, 6, 2, + 2, 5, 6, 3, 3, 1, 3, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 4, 2, 4, 0, 1, 2, 5, + 0, 3, 0, 1, 4, 4, 2, 0, 1, 1, + 2, 2, 1, 1, 2, 2, 0, 1, 1, 1, + 1, 5, 1, 3, 0, 3, 1, 1, 1, 2, + 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 4, 6, 4, 4, 8, + 6, 8, 6, 5, 4, 10, 2, 2, 1, 2, + 2, 2, 2, 2, 4, 5, 5, 5, 5, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 8, 4, 8, 8, 6, 5, 4, 4, 4, 4, + 4, 7, 4, 4, 6, 6, 6, 8, 6, 6, + 4, 4, 3, 4, 6, 6, 4, 4, 6, 4, + 6, 4, 4, 4, 4, 4, 4, 6, 4, 6, + 4, 4, 4, 6, 4, 6, 4, 4, 6, 4, + 6, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, 6, 8, 4, - 6, 8, 4, 6, 8, 4, 6, 8, 4, 4, - 4, 6, 4, 6, 4, 8, 6, 4, 4, 6, - 4, 6, 8, 4, 6, 8, 4, 4, 6, 8, - 6, 4, 6, 6, 8, 10, 7, 8, 8, 9, - 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, - 6, 4, 6, 5, 9, 6, 9, 8, 6, 8, - 8, 8, 6, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 2, 6, 8, 10, 12, 14, 6, 8, - 8, 10, 12, 14, 6, 8, 10, 12, 6, 8, - 4, 4, 3, 4, 6, 6, 4, 6, 4, 6, - 8, 0, 2, 1, 1, 1, 1, 1, 1, 1, + 4, 4, 6, 4, 6, 4, 8, 6, 4, 4, + 6, 4, 6, 8, 4, 6, 8, 4, 4, 6, + 8, 6, 4, 6, 6, 8, 10, 7, 8, 8, + 9, 4, 4, 4, 4, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, + 4, 6, 4, 6, 5, 9, 6, 9, 8, 6, + 8, 8, 8, 6, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 2, 6, 8, 10, 12, 14, 6, + 8, 8, 10, 12, 14, 6, 8, 10, 12, 6, + 8, 4, 4, 3, 4, 6, 6, 4, 6, 4, + 6, 8, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 2, 0, 2, 3, 4, 4, 4, 4, - 4, 0, 3, 4, 7, 3, 1, 1, 1, 0, - 5, 5, 2, 3, 1, 2, 2, 1, 2, 1, - 2, 2, 1, 2, 2, 1, 1, 0, 1, 0, - 1, 0, 2, 1, 2, 4, 0, 2, 1, 1, - 3, 5, 1, 1, 1, 2, 2, 0, 3, 0, - 2, 2, 1, 3, 0, 1, 0, 1, 3, 1, - 3, 2, 0, 1, 1, 0, 1, 2, 4, 4, - 0, 2, 2, 1, 1, 3, 3, 3, 3, 3, - 3, 3, 3, 0, 3, 3, 3, 0, 3, 1, - 1, 0, 4, 0, 1, 1, 0, 3, 1, 3, - 2, 1, 1, 0, 1, 2, 4, 9, 3, 5, - 0, 3, 3, 0, 1, 0, 2, 2, 0, 2, - 2, 2, 0, 2, 1, 2, 3, 3, 0, 2, - 1, 2, 3, 4, 3, 0, 1, 2, 1, 5, - 4, 4, 1, 3, 3, 5, 0, 5, 1, 3, - 1, 2, 3, 4, 1, 1, 3, 3, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, - 2, 0, 3, 0, 1, 0, 1, 1, 5, 0, - 1, 0, 1, 2, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 1, 3, 0, 1, 1, 1, 1, + 1, 1, 0, 2, 0, 2, 3, 4, 4, 4, + 4, 4, 0, 3, 4, 7, 3, 1, 1, 1, + 0, 5, 5, 2, 3, 1, 2, 2, 1, 2, + 1, 2, 2, 1, 2, 2, 1, 1, 0, 1, + 0, 1, 0, 2, 1, 2, 4, 0, 2, 1, + 1, 3, 5, 1, 1, 1, 2, 2, 0, 3, + 0, 2, 2, 1, 3, 0, 1, 0, 1, 3, + 1, 3, 2, 0, 1, 1, 0, 1, 2, 4, + 4, 0, 2, 2, 1, 1, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 3, 3, 3, 0, 3, + 1, 1, 0, 4, 0, 1, 1, 0, 3, 1, + 3, 2, 1, 1, 0, 1, 2, 4, 9, 3, + 5, 0, 3, 3, 0, 1, 0, 2, 2, 0, + 2, 2, 2, 0, 2, 1, 2, 3, 3, 0, + 2, 1, 2, 3, 4, 3, 0, 1, 2, 1, + 5, 4, 4, 1, 3, 3, 5, 0, 5, 1, + 3, 1, 2, 3, 4, 1, 1, 3, 3, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 0, 2, 0, 3, 0, 1, 0, 1, 1, 5, + 0, 1, 0, 1, 2, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -8754,7 +8806,7 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 1, 1, } var yyChk = [...]int{ @@ -8883,34 +8935,34 @@ var yyChk = [...]int{ -280, -280, 287, 381, -343, 241, 36, 252, 398, 287, 381, 287, 288, 287, 288, 391, 401, 287, -302, 15, 163, 425, 386, 390, 280, 240, 281, 242, 400, 288, - -302, 90, -281, 160, 287, 398, 283, -280, -280, -308, - -413, -293, -291, -289, 232, 24, 143, 26, 28, 146, - 179, 130, 20, 147, 38, 234, 347, 251, 178, 247, - 470, 227, 73, 586, 426, 433, 424, 432, 436, 472, - 473, 425, 384, 32, 14, 588, 29, 261, 25, 39, - 172, 229, 150, 589, 264, 27, 262, 118, 121, 591, - 23, 76, 256, 15, 249, 41, 17, 592, 593, 18, - 245, 244, 163, 241, 71, 12, 222, 30, 159, 67, - 594, 138, 133, 595, 596, 597, 598, 131, 69, 160, - 21, 726, 434, 435, 34, 687, 574, 275, 174, 74, - 60, 688, 144, 430, 599, 600, 119, 601, 122, 77, - 693, 140, 19, 72, 43, 602, 276, 603, 246, 727, - 604, 416, 605, 161, 230, 469, 70, 162, 700, 606, - 701, 239, 397, 9, 474, 33, 260, 248, 129, 68, - 440, 607, 240, 149, 243, 132, 120, 8, 137, 35, - 13, 75, 78, 437, 438, 439, 58, 128, 578, 148, - 16, 608, 417, 142, -381, 689, -308, -308, 33, 92, - -407, -408, -409, 578, 416, 243, -291, -188, -85, 679, - 231, -86, 685, 24, 238, -134, 398, -122, 179, 707, - 690, 691, 692, 689, 395, 697, 695, 693, 287, 694, - 88, 140, 142, 143, 4, -144, 159, -198, 152, 153, - 154, 155, 156, 157, 158, 164, 163, 144, 146, 160, - -243, 141, 165, 166, 167, 168, 169, 170, 171, 173, - 172, 174, 175, 161, 162, 178, 225, 226, -152, -152, - -152, -152, -213, -219, -218, -413, -215, -381, -290, -297, - -413, -413, -152, -275, -413, -149, -413, -413, -413, -413, - -222, -144, -413, -413, -417, -413, -417, -417, -417, -326, - -413, -326, -326, -413, -413, -413, -413, -413, -413, -413, + -302, 90, -281, 160, 287, 398, 392, 283, -280, -280, + -308, -413, -293, -291, -289, 232, 24, 143, 26, 28, + 146, 179, 130, 20, 147, 38, 234, 347, 251, 178, + 247, 470, 227, 73, 586, 426, 433, 424, 432, 436, + 472, 473, 425, 384, 32, 14, 588, 29, 261, 25, + 39, 172, 229, 150, 589, 264, 27, 262, 118, 121, + 591, 23, 76, 256, 15, 249, 41, 17, 592, 593, + 18, 245, 244, 163, 241, 71, 12, 222, 30, 159, + 67, 594, 138, 133, 595, 596, 597, 598, 131, 69, + 160, 21, 726, 434, 435, 34, 687, 574, 275, 174, + 74, 60, 688, 144, 430, 599, 600, 119, 601, 122, + 77, 693, 140, 19, 72, 43, 602, 276, 603, 246, + 727, 604, 416, 605, 161, 230, 469, 70, 162, 700, + 606, 701, 239, 397, 9, 474, 33, 260, 248, 129, + 68, 440, 607, 240, 149, 243, 132, 120, 8, 137, + 35, 13, 75, 78, 437, 438, 439, 58, 128, 578, + 148, 16, 608, 417, 142, -381, 689, -308, -308, 33, + 92, -407, -408, -409, 578, 416, 243, -291, -188, -85, + 679, 231, -86, 685, 24, 238, -134, 398, -122, 179, + 707, 690, 691, 692, 689, 395, 697, 695, 693, 287, + 694, 88, 140, 142, 143, 4, -144, 159, -198, 152, + 153, 154, 155, 156, 157, 158, 164, 163, 144, 146, + 160, -243, 141, 165, 166, 167, 168, 169, 170, 171, + 173, 172, 174, 175, 161, 162, 178, 225, 226, -152, + -152, -152, -152, -213, -219, -218, -413, -215, -381, -290, + -297, -413, -413, -152, -275, -413, -149, -413, -413, -413, + -413, -222, -144, -413, -413, -417, -413, -417, -417, -417, + -326, -413, -326, -326, -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, @@ -8922,386 +8974,386 @@ var yyChk = [...]int{ -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, 223, -413, -413, -413, - -413, -413, -326, -326, -326, -326, -326, -326, -413, -413, + -413, -413, -413, -413, -413, -413, -413, 223, -413, -413, + -413, -413, -413, -326, -326, -326, -326, -326, -326, -413, -413, -413, -413, -413, -413, -413, -413, -413, -413, -413, - -413, -413, 103, 99, 102, 94, -217, 105, 90, 90, - 90, 90, -31, -32, -207, -413, -307, -395, -396, -191, - -188, -413, 304, -291, -291, 273, 96, -232, -34, -31, - -227, -233, -229, -31, -79, -120, -133, 64, 65, -135, - 25, 39, 68, 66, 24, -414, 89, -414, -250, -414, - 88, -38, -253, 87, 62, 44, 90, 90, 88, 22, - -228, -230, -144, 15, -295, 4, -294, 26, -291, 90, - 223, 15, -189, 30, -188, -276, -276, 88, 91, 317, - -266, -268, 414, 416, 152, -296, -291, 90, 32, 89, - 88, -188, -315, -318, -320, -319, -321, -316, -317, 344, - 345, 179, 348, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 361, 33, 263, 340, 341, 342, 343, 362, - 363, 364, 365, 367, 368, 369, 370, 325, 346, 576, - 326, 327, 328, 329, 330, 331, 333, 334, 337, 335, - 336, 338, 339, -382, -381, 87, 89, 88, -322, 87, - -144, -136, 240, -381, 241, 241, 241, -79, 469, -348, - -348, -348, 271, 20, -46, -43, -374, 19, -42, -43, - 232, 123, 124, 229, 87, -337, 87, -346, -382, -381, - 87, 138, 246, 137, -345, -342, -345, -346, -381, -215, - -381, 138, 138, -381, -381, -262, -291, -262, -262, 24, - -262, 24, -262, 24, 96, -291, -262, 24, -262, 24, - -262, 24, -262, 24, -262, 24, 32, 79, 80, 81, - 32, 83, 84, 85, -215, -381, -381, -215, -337, -215, - -188, -381, -269, 96, 96, 96, -348, -348, 96, 90, - 90, 90, -348, -348, 96, 90, -299, -297, 90, 90, - -387, 257, 301, 303, 96, 96, 96, 96, 32, 90, - -388, 32, 714, 713, 715, 716, 717, 90, 96, 32, - 96, 32, 96, -291, 87, -188, -142, 291, 227, 229, - 232, 77, 90, 307, 308, 305, 310, 311, 152, 45, - 88, 243, 240, -381, -282, 245, -282, -291, -298, -297, - -289, -188, 243, 380, 90, -144, -344, 15, 163, -302, - -302, -280, -188, -344, -302, -280, -188, -280, -280, -280, - -280, -302, -302, -302, -280, -297, -297, -188, -188, -188, - -188, -188, -188, -188, -308, -281, -280, 689, 90, -274, - 15, 77, -308, -308, 88, 323, 417, 418, -306, 320, - -81, -291, 90, -10, -29, -18, -17, -19, 152, -10, - 88, 578, -181, -188, 689, 689, 689, 689, 689, 689, - -144, -144, -144, -144, 601, -205, 119, 144, 120, 121, - -160, -144, -206, -211, -213, 106, 163, 146, 160, -243, - -149, -152, -149, -149, -149, -149, -149, -149, 222, -149, - 222, -149, -149, -149, -149, -149, -149, -309, -291, 90, - 179, -156, -155, 105, -404, -156, 575, 88, -218, 223, - -144, -144, -381, -118, 442, 443, 444, 445, 447, 448, - 449, 452, 453, 457, 458, 441, 459, 446, 451, 454, - 455, 456, 450, 343, -144, -130, -132, -130, -144, -220, - -221, 148, -215, -144, -414, -414, 96, 170, -126, 25, - 39, -126, -126, -126, -126, -144, -144, -144, -144, -144, - -144, -144, -144, -144, -144, -126, -144, -119, 441, 459, - 446, 451, 454, 455, 456, 450, 343, 460, 461, 462, - 463, 464, 465, 466, 467, 468, -119, -118, -144, -144, - -144, -144, -144, -144, -87, -144, 130, 131, 132, -207, - -144, -149, -144, -144, -144, -414, -144, -144, -144, -208, - -207, -144, -144, -144, -144, -144, -144, -144, -144, -144, + -413, -413, -413, 103, 99, 102, 94, -217, 105, 90, + 90, 90, 90, -31, -32, -207, -413, -307, -395, -396, + -191, -188, -413, 304, -291, -291, 273, 96, -232, -34, + -31, -227, -233, -229, -31, -79, -120, -133, 64, 65, + -135, 25, 39, 68, 66, 24, -414, 89, -414, -250, + -414, 88, -38, -253, 87, 62, 44, 90, 90, 88, + 22, -228, -230, -144, 15, -295, 4, -294, 26, -291, + 90, 223, 15, -189, 30, -188, -276, -276, 88, 91, + 317, -266, -268, 414, 416, 152, -296, -291, 90, 32, + 89, 88, -188, -315, -318, -320, -319, -321, -316, -317, + 344, 345, 179, 348, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 361, 33, 263, 340, 341, 342, 343, + 362, 363, 364, 365, 367, 368, 369, 370, 325, 346, + 576, 326, 327, 328, 329, 330, 331, 333, 334, 337, + 335, 336, 338, 339, -382, -381, 87, 89, 88, -322, + 87, -144, -136, 240, -381, 241, 241, 241, -79, 469, + -348, -348, -348, 271, 20, -46, -43, -374, 19, -42, + -43, 232, 123, 124, 229, 87, -337, 87, -346, -382, + -381, 87, 138, 246, 137, -345, -342, -345, -346, -381, + -215, -381, 138, 138, -381, -381, -262, -291, -262, -262, + 24, -262, 24, -262, 24, 96, -291, -262, 24, -262, + 24, -262, 24, -262, 24, -262, 24, 32, 79, 80, + 81, 32, 83, 84, 85, -215, -381, -381, -215, -337, + -215, -188, -381, -269, 96, 96, 96, -348, -348, 96, + 90, 90, 90, -348, -348, 96, 90, -299, -297, 90, + 90, -387, 257, 301, 303, 96, 96, 96, 96, 32, + 90, -388, 32, 714, 713, 715, 716, 717, 90, 96, + 32, 96, 32, 96, -291, 87, -188, -142, 291, 227, + 229, 232, 77, 90, 307, 308, 305, 310, 311, 152, + 45, 88, 243, 240, -381, -282, 245, -282, -291, -298, + -297, -289, -188, 243, 380, 90, -144, -344, 15, 163, + -302, -302, -280, -188, -344, -302, -280, -188, -280, -280, + -280, -280, -302, -302, -302, -280, -297, -297, -188, -188, + -188, -188, -188, -188, -188, -308, -281, -280, 689, 90, + -274, 15, 77, -308, -308, 88, 323, 417, 418, -306, + 320, -81, -291, 90, -10, -29, -18, -17, -19, 152, + -10, 88, 578, -181, -188, 689, 689, 689, 689, 689, + 689, -144, -144, -144, -144, 601, -205, 119, 144, 120, + 121, -160, -144, -206, -211, -213, 106, 163, 146, 160, + -243, -149, -152, -149, -149, -149, -149, -149, -149, 222, + -149, 222, -149, -149, -149, -149, -149, -149, -309, -291, + 90, 179, -156, -155, 105, -404, -156, 575, 88, -218, + 223, -144, -144, -381, -118, 442, 443, 444, 445, 447, + 448, 449, 452, 453, 457, 458, 441, 459, 446, 451, + 454, 455, 456, 450, 343, -144, -130, -132, -130, -144, + -220, -221, 148, -215, -144, -414, -414, 96, 170, -126, + 25, 39, -126, -126, -126, -126, -144, -144, -144, -144, + -144, -144, -144, -144, -144, -144, -126, -144, -119, 441, + 459, 446, 451, 454, 455, 456, 450, 343, 460, 461, + 462, 463, 464, 465, 466, 467, 468, -119, -118, -144, + -144, -144, -144, -144, -144, -87, -144, 130, 131, 132, + -207, -144, -149, -144, -144, -144, -414, -144, -144, -144, + -208, -207, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, - -144, -144, -144, -144, -144, -144, -144, -380, -379, -378, + -144, -144, -144, -144, -144, -144, -144, -144, -380, -379, + -378, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, + -144, -144, -144, -144, -207, -207, -207, -207, -207, -144, + -414, -144, -162, -147, 96, -258, 105, 92, -144, -144, + -144, -144, -144, -144, -131, -130, -293, -298, -289, -290, + -130, -131, -131, -130, -130, -144, -144, -144, -144, -144, + -144, -144, -144, -414, -144, -144, -144, -144, -144, -250, + -414, -207, 88, -397, 416, 417, 687, -300, 276, -299, + 26, -208, 90, 15, -260, 78, -291, -232, -232, 64, + 65, 60, -130, -135, -414, -37, 26, -252, -291, 63, + 90, -327, -269, 371, 372, 179, -144, -144, 88, -231, + 28, 29, -188, -294, 170, -298, -188, -261, 276, -188, + -166, -168, -169, -170, -191, -214, -413, -171, -31, 597, + 594, 15, -181, -182, -190, -297, -267, -310, -266, 88, + 415, 417, 418, 77, 122, -144, -328, 178, -356, -355, + -354, -337, -339, -340, -341, 89, -328, -333, 377, 376, + -322, -322, -322, -322, -322, -327, -327, -327, -327, 87, + 87, -322, -322, -322, -322, -330, 87, -330, -330, -331, + -330, 87, -331, -332, 87, -332, -367, -144, -364, -363, + -361, -362, 250, 101, 669, 625, 578, 618, 659, 78, + -359, -231, 96, -414, -142, -283, 245, -365, -362, -381, + -381, -381, -283, 91, 90, 91, 90, 91, 90, -111, + -60, -1, 726, 727, 728, 88, 20, -338, -337, -59, + 301, -370, -371, 276, -366, -360, -346, 138, -345, -346, + -346, -381, 88, 30, 127, 127, 127, 127, 578, 229, + 33, -284, 617, 144, 669, 625, -337, -59, 243, 243, + -309, -309, -309, 90, 90, -279, 722, -181, -138, 293, + 152, 282, 282, 240, 295, 240, 295, -188, 306, 309, + 307, 308, 305, 310, 311, 24, 24, 24, 24, 24, + 294, 296, 298, 284, -188, -188, -282, 77, -183, -188, + 27, -297, 90, 90, -188, -280, -280, -188, -280, -280, + -188, -409, 324, -291, 358, 680, 681, 683, 682, -122, + 416, 88, 578, 23, -123, 23, -413, 119, 120, 121, + -206, -149, -152, -149, 143, 264, -149, -149, -413, -215, + -414, -293, 26, 88, 78, -414, 168, 88, 88, -414, + -414, 88, 15, -223, -221, 150, -144, -414, 88, -414, + -414, -207, -144, -144, -144, -144, -414, -414, -414, -414, + -414, -414, -414, -414, -414, -414, -207, -414, 88, 88, + 15, -313, 26, -414, -414, -414, -414, -414, -222, -414, + 15, -414, 78, 88, 163, 88, -414, -414, -414, 88, + 88, -414, -414, 88, -414, 88, -414, -414, -414, -414, + -414, -414, 88, -414, 88, -414, -414, -414, 88, -414, + 88, -414, -414, 88, -414, 88, -414, 88, -414, 88, + -414, 88, -414, 88, -414, 88, -414, 88, -414, 88, + -414, 88, -414, 88, -414, 88, -414, 88, -414, 88, + -414, 88, -414, 88, -414, 88, -414, 88, -414, -414, + -414, 88, -414, 88, -414, 88, -414, -414, 88, -414, + 88, -414, 88, -414, 88, 88, -414, 88, 88, 88, + -414, 88, 88, 88, 88, -414, -414, -414, -414, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, -414, + -414, -414, -414, -414, -414, 88, -94, 602, -414, -414, + 88, -414, 88, 88, 88, 88, 88, -414, -413, 223, + -414, -414, -414, -414, -414, 88, 88, 88, 88, 88, + 88, -414, -414, -414, 88, 88, -414, 88, -414, 88, + -414, -396, 686, 417, -195, -194, -192, 75, 244, 76, + -413, -299, -414, -156, -258, -259, -258, -200, -291, 96, + 105, -234, -165, -167, 15, -135, -213, 89, 88, -327, + -238, -244, -277, -291, 90, 179, -329, 179, -329, 371, + 372, -230, 223, -196, 16, -199, 33, 58, -29, -413, + -413, 33, 88, -184, -186, -185, -187, 67, 71, 73, + 68, 69, 70, 74, -304, 26, -31, -166, -31, -413, + -188, -181, -415, 15, 78, -415, 88, 223, -268, -271, + 419, 416, 422, -381, 90, -110, 88, -354, -341, -235, + -139, 41, -334, 378, -327, 585, -327, -336, 90, -336, + 96, 96, 96, 89, -49, -44, -45, 34, 82, -361, + -348, 90, 40, -348, -348, -291, 89, -231, -138, -188, + 144, 77, -365, -365, -365, -297, -2, 725, 731, 138, + 87, 383, 19, -252, 88, 89, -216, 302, 89, -112, + -291, 89, 87, -346, -346, -291, -413, 240, 32, 32, + 669, 625, 617, -59, -216, -215, -381, -328, 724, 723, + 89, 242, 300, -143, 436, -140, 90, 91, -188, -188, + -188, -188, -188, -188, 232, 229, 406, -405, 312, -405, + 285, 243, -181, -188, 88, -84, 259, 254, -302, -302, + 34, -188, 416, 698, 696, -144, 143, 264, -160, -152, + -118, -118, -149, -311, 179, 344, 263, 342, 338, 358, + 349, 376, 340, 377, 335, 334, 333, -311, -309, -149, + -207, -132, -144, -144, 151, -144, 149, -144, -414, -414, + -414, -414, -414, -227, -144, -144, -144, -414, 179, 344, + 15, -144, -309, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, - -144, -144, -144, -207, -207, -207, -207, -207, -144, -414, - -144, -162, -147, 96, -258, 105, 92, -144, -144, -144, - -144, -144, -144, -131, -130, -293, -298, -289, -290, -130, - -131, -131, -130, -130, -144, -144, -144, -144, -144, -144, - -144, -144, -414, -144, -144, -144, -144, -144, -250, -414, - -207, 88, -397, 416, 417, 687, -300, 276, -299, 26, - -208, 90, 15, -260, 78, -291, -232, -232, 64, 65, - 60, -130, -135, -414, -37, 26, -252, -291, 63, 90, - -327, -269, 371, 372, 179, -144, -144, 88, -231, 28, - 29, -188, -294, 170, -298, -188, -261, 276, -188, -166, - -168, -169, -170, -191, -214, -413, -171, -31, 597, 594, - 15, -181, -182, -190, -297, -267, -310, -266, 88, 415, - 417, 418, 77, 122, -144, -328, 178, -356, -355, -354, - -337, -339, -340, -341, 89, -328, -333, 377, 376, -322, - -322, -322, -322, -322, -327, -327, -327, -327, 87, 87, - -322, -322, -322, -322, -330, 87, -330, -330, -331, -330, - 87, -331, -332, 87, -332, -367, -144, -364, -363, -361, - -362, 250, 101, 669, 625, 578, 618, 659, 78, -359, - -231, 96, -414, -142, -283, 245, -365, -362, -381, -381, - -381, -283, 91, 90, 91, 90, 91, 90, -111, -60, - -1, 726, 727, 728, 88, 20, -338, -337, -59, 301, - -370, -371, 276, -366, -360, -346, 138, -345, -346, -346, - -381, 88, 30, 127, 127, 127, 127, 578, 229, 33, - -284, 617, 144, 669, 625, -337, -59, 243, 243, -309, - -309, -309, 90, 90, -279, 722, -181, -138, 293, 152, - 282, 282, 240, 295, 240, 295, -188, 306, 309, 307, - 308, 305, 310, 311, 24, 24, 24, 24, 24, 294, - 296, 298, 284, -188, -188, -282, 77, -183, -188, 27, - -297, 90, 90, -188, -280, -280, -188, -280, -280, -188, - -409, 324, -291, 358, 680, 681, 683, 682, -122, 416, - 88, 578, 23, -123, 23, -413, 119, 120, 121, -206, - -149, -152, -149, 143, 264, -149, -149, -413, -215, -414, - -293, 26, 88, 78, -414, 168, 88, 88, -414, -414, - 88, 15, -223, -221, 150, -144, -414, 88, -414, -414, - -207, -144, -144, -144, -144, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -207, -414, 88, 88, 15, - -313, 26, -414, -414, -414, -414, -414, -222, -414, 15, - -414, 78, 88, 163, 88, -414, -414, -414, 88, 88, - -414, -414, 88, -414, 88, -414, -414, -414, -414, -414, - -414, 88, -414, 88, -414, -414, -414, 88, -414, 88, - -414, -414, 88, -414, 88, -414, 88, -414, 88, -414, - 88, -414, 88, -414, 88, -414, 88, -414, 88, -414, - 88, -414, 88, -414, 88, -414, 88, -414, 88, -414, - 88, -414, 88, -414, 88, -414, 88, -414, -414, -414, - 88, -414, 88, -414, 88, -414, -414, 88, -414, 88, - -414, 88, -414, 88, 88, -414, 88, 88, 88, -414, - 88, 88, 88, 88, -414, -414, -414, -414, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, -414, -414, - -414, -414, -414, -414, 88, -94, 602, -414, -414, 88, - -414, 88, 88, 88, 88, 88, -414, -413, 223, -414, - -414, -414, -414, -414, 88, 88, 88, 88, 88, 88, - -414, -414, -414, 88, 88, -414, 88, -414, 88, -414, - -396, 686, 417, -195, -194, -192, 75, 244, 76, -413, - -299, -414, -156, -258, -259, -258, -200, -291, 96, 105, - -234, -165, -167, 15, -135, -213, 89, 88, -327, -238, - -244, -277, -291, 90, 179, -329, 179, -329, 371, 372, - -230, 223, -196, 16, -199, 33, 58, -29, -413, -413, - 33, 88, -184, -186, -185, -187, 67, 71, 73, 68, - 69, 70, 74, -304, 26, -31, -166, -31, -413, -188, - -181, -415, 15, 78, -415, 88, 223, -268, -271, 419, - 416, 422, -381, 90, -110, 88, -354, -341, -235, -139, - 41, -334, 378, -327, 585, -327, -336, 90, -336, 96, - 96, 96, 89, -49, -44, -45, 34, 82, -361, -348, - 90, 40, -348, -348, -291, 89, -231, -138, -188, 144, - 77, -365, -365, -365, -297, -2, 725, 731, 138, 87, - 383, 19, -252, 88, 89, -216, 302, 89, -112, -291, - 89, 87, -346, -346, -291, -413, 240, 32, 32, 669, - 625, 617, -59, -216, -215, -381, -328, 724, 723, 89, - 242, 300, -143, 436, -140, 90, 91, -188, -188, -188, - -188, -188, -188, 232, 229, 406, -405, 312, -405, 285, - 243, -181, -188, 88, -84, 259, 254, -302, -302, 34, - -188, 416, 698, 696, -144, 143, 264, -160, -152, -118, - -118, -149, -311, 179, 344, 263, 342, 338, 358, 349, - 376, 340, 377, 335, 334, 333, -311, -309, -149, -207, - -132, -144, -144, 151, -144, 149, -144, -414, -414, -414, - -414, -414, -227, -144, -144, -144, -414, 179, 344, 15, - -144, -309, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, + -144, -144, -144, -144, -144, -144, -144, -144, -378, -144, + -207, -144, -207, -144, -144, -144, -144, -144, -379, -379, + -379, -379, -379, -207, -207, -207, -207, -144, -413, -291, + -97, -96, -95, 652, 244, -94, -162, -97, -162, 222, + -144, 222, 222, 222, -144, -131, -293, -144, -144, -144, + -144, -144, -144, -144, -144, -144, -144, -192, -342, -342, + -342, -262, 88, -273, 23, 15, 58, 58, -165, -196, + -166, -135, -291, -241, 679, -247, 47, -245, -246, 48, + -242, 49, 57, -329, -329, 170, -232, -144, -263, 77, + -264, -272, -215, -210, -212, -211, -413, -251, -414, -291, + -262, -264, -168, -169, -169, -168, -169, 67, 67, 67, + 72, 67, 72, 67, -185, -297, -414, -144, -300, 78, + -166, -166, -190, -297, 170, 416, 420, 421, -354, -403, + 119, 144, 32, 77, 374, 101, -401, 178, 614, 664, + 669, 625, 618, 659, -402, 246, 137, 138, 258, 26, + 42, 89, 88, 89, 88, 89, 89, 88, -285, -284, + -45, -44, -348, -348, 96, -381, 90, 90, 242, 27, + -188, 77, 77, 77, -113, 729, 96, 87, -3, 82, + -144, 87, 20, -337, -215, -372, -323, -373, -324, -325, + -5, -6, -349, -116, 58, 101, -63, 45, 241, 709, + 710, 127, -413, 722, -364, -252, -368, -370, -188, -148, + -413, -159, -146, -145, -147, -153, 168, 169, 263, 340, + 341, -216, -188, -137, 291, 299, 87, -141, 92, -384, + 78, 282, 374, 282, 374, 90, -406, 313, 90, -406, + -188, -84, -49, -188, -280, -280, 34, -381, -414, -160, + -152, -125, 163, 578, -314, 584, -322, -322, -322, -332, + -322, 330, -322, 330, -322, -414, -414, -414, 88, -414, + 23, -414, -144, 88, -121, 474, 88, 88, -414, 87, + 87, -144, -414, -414, -414, 88, -414, -414, -414, -414, + -414, -414, -414, -414, -414, -414, -414, -414, -414, 88, + -414, 88, -414, 88, -414, 88, -414, 88, -414, 88, + -414, 88, -414, 88, -414, 88, -414, 88, -414, 88, + -414, 88, -414, 88, -414, 88, -414, 88, -414, 88, + -414, -414, 88, -414, -414, -414, 88, -414, 88, -414, + 88, -414, -414, -414, 88, -312, 670, -414, -414, -414, + -414, -414, -414, -414, -414, -414, -414, -414, -93, -292, + -291, -94, 634, 634, -414, -94, -224, 88, -149, -414, + -149, -149, -149, -414, -414, -414, 88, -414, 88, 88, + -414, 88, -414, 88, -414, -414, -414, -414, 88, -193, + 23, -193, -193, -414, -258, -188, -196, -225, 17, -238, + 52, 350, -249, -248, 56, 48, -246, 20, 50, 20, + 31, -263, 88, 152, 88, -414, -414, 88, 58, 223, + -414, -196, -179, -178, 77, 78, -180, 77, -178, 67, + 67, -253, 88, -261, -166, -196, -196, 223, 119, -413, + -148, 13, 90, 90, -381, -400, 713, 714, 32, 96, + -348, -348, 138, 138, -188, 87, -327, 90, -327, 96, + 96, 32, 83, 84, 85, 32, 79, 80, 81, -188, + -188, -188, -188, -369, 87, 20, -144, 87, 152, 89, + -252, -252, 278, 163, -348, 707, 284, 284, -348, -348, + -348, -115, -114, 729, 89, -414, 88, -335, 578, 581, + -144, -154, -154, -253, 89, -377, 578, -383, -291, -291, + -291, -291, 96, 98, -414, 576, 74, 579, -414, -327, + -144, -144, -144, -232, 90, -144, -144, 96, 96, -414, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, - -144, -144, -144, -144, -144, -144, -144, -378, -144, -207, - -144, -207, -144, -144, -144, -144, -144, -379, -379, -379, - -379, -379, -207, -207, -207, -207, -144, -413, -291, -97, - -96, -95, 652, 244, -94, -162, -97, -162, 222, -144, - 222, 222, 222, -144, -131, -293, -144, -144, -144, -144, - -144, -144, -144, -144, -144, -144, -192, -342, -342, -342, - -262, 88, -273, 23, 15, 58, 58, -165, -196, -166, - -135, -291, -241, 679, -247, 47, -245, -246, 48, -242, - 49, 57, -329, -329, 170, -232, -144, -263, 77, -264, - -272, -215, -210, -212, -211, -413, -251, -414, -291, -262, - -264, -168, -169, -169, -168, -169, 67, 67, 67, 72, - 67, 72, 67, -185, -297, -414, -144, -300, 78, -166, - -166, -190, -297, 170, 416, 420, 421, -354, -403, 119, - 144, 32, 77, 374, 101, -401, 178, 614, 664, 669, - 625, 618, 659, -402, 246, 137, 138, 258, 26, 42, - 89, 88, 89, 88, 89, 89, 88, -285, -284, -45, - -44, -348, -348, 96, -381, 90, 90, 242, 27, -188, - 77, 77, 77, -113, 729, 96, 87, -3, 82, -144, - 87, 20, -337, -215, -372, -323, -373, -324, -325, -5, - -6, -349, -116, 58, 101, -63, 45, 241, 709, 710, - 127, -413, 722, -364, -252, -368, -370, -188, -148, -413, - -159, -146, -145, -147, -153, 168, 169, 263, 340, 341, - -216, -188, -137, 291, 299, 87, -141, 92, -384, 78, - 282, 374, 282, 374, 90, -406, 313, 90, -406, -188, - -84, -49, -188, -280, -280, 34, -381, -414, -160, -152, - -125, 163, 578, -314, 584, -322, -322, -322, -332, -322, - 330, -322, 330, -322, -414, -414, -414, 88, -414, 23, - -414, -144, 88, -121, 474, 88, 88, -414, 87, 87, - -144, -414, -414, -414, 88, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, 88, -414, - 88, -414, 88, -414, 88, -414, 88, -414, 88, -414, - 88, -414, 88, -414, 88, -414, 88, -414, 88, -414, - 88, -414, 88, -414, 88, -414, 88, -414, 88, -414, - -414, 88, -414, -414, -414, 88, -414, 88, -414, 88, - -414, -414, -414, 88, -312, 670, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -93, -292, -291, - -94, 634, 634, -414, -94, -224, 88, -149, -414, -149, - -149, -149, -414, -414, -414, 88, -414, 88, 88, -414, - 88, -414, 88, -414, -414, -414, -414, 88, -193, 23, - -193, -193, -414, -258, -188, -196, -225, 17, -238, 52, - 350, -249, -248, 56, 48, -246, 20, 50, 20, 31, - -263, 88, 152, 88, -414, -414, 88, 58, 223, -414, - -196, -179, -178, 77, 78, -180, 77, -178, 67, 67, - -253, 88, -261, -166, -196, -196, 223, 119, -413, -148, - 13, 90, 90, -381, -400, 713, 714, 32, 96, -348, - -348, 138, 138, -188, 87, -327, 90, -327, 96, 96, - 32, 83, 84, 85, 32, 79, 80, 81, -188, -188, - -188, -188, -369, 87, 20, -144, 87, 152, 89, -252, - -252, 278, 163, -348, 707, 284, 284, -348, -348, -348, - -115, -114, 729, 89, -414, 88, -335, 578, 581, -144, - -154, -154, -253, 89, -377, 578, -383, -291, -291, -291, - -291, 96, 98, -414, 576, 74, 579, -414, -327, -144, - -144, -144, -232, 90, -144, -144, 96, 96, -414, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, - -144, -144, -144, -144, -144, -144, -144, -144, -144, -207, - -144, -414, -176, -175, -177, 690, 119, 32, -311, -414, - -209, 276, -100, -99, -98, 15, -414, -144, -118, -118, - -118, -118, -144, -144, -144, -144, -144, -144, -413, 67, - 19, 17, -413, -413, -300, -225, -226, 18, 20, -239, - 54, -237, 53, -237, -248, 20, 20, 90, 20, 90, - 138, -272, -144, -212, 58, -29, -291, -210, -291, -227, - -144, 87, -144, -156, -196, -196, -144, -202, 498, 500, - 501, 502, 499, 504, 505, 506, 507, 508, 509, 510, - 511, 512, 513, 503, 514, 475, 476, 477, 108, 110, - 109, 478, 479, 480, 344, 526, 527, 521, 524, 525, - 523, 522, 359, 360, 481, 544, 545, 549, 548, 546, - 547, 550, 553, 554, 555, 556, 557, 558, 560, 559, - 551, 552, 529, 528, 530, 531, 532, 533, 534, 535, - 537, 536, 538, 539, 540, 541, 542, 543, 561, 562, - 563, 564, 565, 567, 566, 571, 570, 568, 569, 573, - 572, 482, 483, 111, 112, 113, 114, 115, 116, 117, - 484, 487, 485, 488, 489, 490, 495, 496, 491, 492, - 493, 494, 497, 370, 368, 369, 365, 364, 363, 423, - 428, 429, 431, 515, 516, 517, 518, 519, 520, 671, - 672, 673, 674, 675, 676, 677, 678, 90, 90, 87, - -144, 89, 89, -253, -368, -60, 89, -254, -252, 96, - 89, 279, -211, -413, 90, -348, -348, -348, 96, 96, - -299, -414, 88, -291, -402, -370, 582, 582, -414, 26, - -376, -375, -293, 87, 78, 63, 577, 580, -414, -414, - 88, -414, -414, -414, 89, 89, -414, -414, -414, -414, + -207, -144, -414, -176, -175, -177, 690, 119, 32, -311, + -414, -209, 276, -100, -99, -98, 15, -414, -144, -118, + -118, -118, -118, -144, -144, -144, -144, -144, -144, -413, + 67, 19, 17, -413, -413, -300, -225, -226, 18, 20, + -239, 54, -237, 53, -237, -248, 20, 20, 90, 20, + 90, 138, -272, -144, -212, 58, -29, -291, -210, -291, + -227, -144, 87, -144, -156, -196, -196, -144, -202, 498, + 500, 501, 502, 499, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 503, 514, 475, 476, 477, 108, + 110, 109, 478, 479, 480, 344, 526, 527, 521, 524, + 525, 523, 522, 359, 360, 481, 544, 545, 549, 548, + 546, 547, 550, 553, 554, 555, 556, 557, 558, 560, + 559, 551, 552, 529, 528, 530, 531, 532, 533, 534, + 535, 537, 536, 538, 539, 540, 541, 542, 543, 561, + 562, 563, 564, 565, 567, 566, 571, 570, 568, 569, + 573, 572, 482, 483, 111, 112, 113, 114, 115, 116, + 117, 484, 487, 485, 488, 489, 490, 495, 496, 491, + 492, 493, 494, 497, 370, 368, 369, 365, 364, 363, + 423, 428, 429, 431, 515, 516, 517, 518, 519, 520, + 671, 672, 673, 674, 675, 676, 677, 678, 90, 90, + 87, -144, 89, 89, -253, -368, -60, 89, -254, -252, + 96, 89, 279, -211, -413, 90, -348, -348, -348, 96, + 96, -299, -414, 88, -291, -402, -370, 582, 582, -414, + 26, -376, -375, -293, 87, 78, 63, 577, 580, -414, + -414, 88, -414, -414, -414, 89, 89, -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, 88, -414, - -175, -177, -414, 77, -156, -227, 20, -97, 301, 303, - -97, -414, -414, -414, -414, -414, 88, -414, -414, 88, - -414, 88, -414, -414, -255, -414, -291, 246, 20, 20, - -255, -255, -195, -226, -107, -106, -105, 608, -144, -207, - -240, 55, 77, 122, 90, 90, 90, 13, -210, 223, - -232, -252, -173, 383, -227, -414, -252, 89, 26, 89, - 731, 138, 89, -211, -124, -413, 275, -299, 90, 90, - -114, -117, -29, 88, 152, -252, -188, 63, -144, -207, - -414, 77, 589, 690, -92, -91, -88, 701, 727, -207, - -94, -94, -144, -144, -144, 88, -414, -414, -414, -107, - 88, -104, -103, -291, 77, 122, -264, -291, 89, -414, - -413, -232, 89, -236, -29, 87, -3, 275, -323, -373, - -324, -325, -5, -6, -349, -82, 578, -375, -353, -297, - -293, 90, 96, 89, 578, -414, -414, -90, 146, 699, - 667, -154, 222, -414, 88, -414, 88, -414, 88, -291, - 246, -105, 88, 26, -300, -174, -172, -291, 631, -393, - -392, 574, -403, -399, 119, 144, 101, -401, 669, 625, - 128, 129, -82, -144, 87, -414, -83, 290, 686, 223, - -384, 579, -90, 700, 645, 620, 645, 620, -149, -144, - -144, -144, -103, -413, -414, 88, 23, -315, -62, 642, - -390, -391, 77, -394, 389, 641, 662, 119, 90, 89, - -252, 251, -298, -377, 580, 143, -118, -414, 88, -414, - 88, -414, -93, -172, 638, -328, -156, -391, 77, -390, - 77, 14, 13, -4, 730, 89, 292, -90, 645, 620, - -144, -144, -414, -61, 27, -173, -389, 259, 254, 257, - 33, -389, 96, -4, -414, -414, 642, 253, 32, 119, - -156, -176, -175, -175, + -414, -414, -414, -414, -414, -414, -414, -414, -414, 88, + -414, -175, -177, -414, 77, -156, -227, 20, -97, 301, + 303, -97, -414, -414, -414, -414, -414, 88, -414, -414, + 88, -414, 88, -414, -414, -255, -414, -291, 246, 20, + 20, -255, -255, -195, -226, -107, -106, -105, 608, -144, + -207, -240, 55, 77, 122, 90, 90, 90, 13, -210, + 223, -232, -252, -173, 383, -227, -414, -252, 89, 26, + 89, 731, 138, 89, -211, -124, -413, 275, -299, 90, + 90, -114, -117, -29, 88, 152, -252, -188, 63, -144, + -207, -414, 77, 589, 690, -92, -91, -88, 701, 727, + -207, -94, -94, -144, -144, -144, 88, -414, -414, -414, + -107, 88, -104, -103, -291, 77, 122, -264, -291, 89, + -414, -413, -232, 89, -236, -29, 87, -3, 275, -323, + -373, -324, -325, -5, -6, -349, -82, 578, -375, -353, + -297, -293, 90, 96, 89, 578, -414, -414, -90, 146, + 699, 667, -154, 222, -414, 88, -414, 88, -414, 88, + -291, 246, -105, 88, 26, -300, -174, -172, -291, 631, + -393, -392, 574, -403, -399, 119, 144, 101, -401, 669, + 625, 128, 129, -82, -144, 87, -414, -83, 290, 686, + 223, -384, 579, -90, 700, 645, 620, 645, 620, -149, + -144, -144, -144, -103, -413, -414, 88, 23, -315, -62, + 642, -390, -391, 77, -394, 389, 641, 662, 119, 90, + 89, -252, 251, -298, -377, 580, 143, -118, -414, 88, + -414, 88, -414, -93, -172, 638, -328, -156, -391, 77, + -390, 77, 14, 13, -4, 730, 89, 292, -90, 645, + 620, -144, -144, -414, -61, 27, -173, -389, 259, 254, + 257, 33, -389, 96, -4, -414, -414, 642, 253, 32, + 119, -156, -176, -175, -175, } var yyDef = [...]int{ - 879, -2, -2, 881, 2, 4, 5, 6, 7, 8, + 880, -2, -2, 882, 2, 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, 72, 74, 75, 879, 879, 879, 0, 879, 0, - 0, 879, -2, -2, 879, 1610, 0, 879, 0, 874, - 0, -2, 794, 800, 0, 809, -2, 0, 0, 879, - 879, 2234, 2234, 874, 0, 0, 0, 0, 0, 879, - 879, 879, 879, 1615, 1476, 52, 879, 0, 87, 88, - 829, 830, 831, 67, 0, 2232, 880, 1, 3, 73, - 77, 0, 0, 0, 60, 1485, 0, 80, 0, 0, - 883, 0, 0, 1593, 879, 879, 0, 128, 129, 0, + 39, 72, 74, 75, 880, 880, 880, 0, 880, 0, + 0, 880, -2, -2, 880, 1611, 0, 880, 0, 875, + 0, -2, 795, 801, 0, 810, -2, 0, 0, 880, + 880, 2235, 2235, 875, 0, 0, 0, 0, 0, 880, + 880, 880, 880, 1616, 1477, 52, 880, 0, 87, 88, + 830, 831, 832, 67, 0, 2233, 881, 1, 3, 73, + 77, 0, 0, 0, 60, 1486, 0, 80, 0, 0, + 884, 0, 0, 1594, 880, 880, 0, 128, 129, 0, 0, 0, -2, 132, -2, 161, 162, 163, 0, 168, 605, 526, 578, 524, 563, -2, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 529, - 401, 401, 0, 0, -2, 512, 512, 512, 1595, 0, + 401, 401, 0, 0, -2, 512, 512, 512, 1596, 0, 0, 0, 560, 463, 401, 401, 401, 0, 401, 401, 401, 401, 0, 0, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, - 401, 1503, 167, 1611, 1608, 1609, 1768, 1769, 1770, 1771, - 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, - 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, - 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, - 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, - 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, - 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, - 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, - 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, - 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, - 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, - 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, - 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, - 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, - 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, - 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, - 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, - 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, - 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, - 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, - 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, - 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, - 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, - 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, - 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, - 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, - 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, - 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, - 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, - 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, - 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, - 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, - 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, - 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, - 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, - 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, - 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, - 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, - 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, - 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, - 2172, 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, - 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, - 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, - 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, - 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, - 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, - 0, 1587, 0, 718, 982, 0, 875, 876, 0, 783, - 783, 0, 783, 783, 783, 783, 0, 0, 0, 732, - 0, 0, 0, 0, 780, 0, 748, 749, 0, 780, - 0, 755, 786, 0, 0, 761, 783, 783, 764, 2235, - 0, 2235, 2235, 1578, 0, 777, 775, 789, 790, 42, - 793, 796, 797, 798, 799, 802, 0, 813, 816, 1604, - 1605, 0, 818, 825, 842, 843, 0, 47, 1132, 0, - 1004, 0, 1010, -2, 1021, 1038, 1039, 1040, 1041, 1042, - 1044, 1045, 1046, 0, 0, 0, 0, 1051, 1052, 0, - 0, 0, 0, 0, 1113, 0, 0, 0, 0, 1449, - 0, 0, 1411, 1411, 1147, 1411, 1411, 1413, 1413, 1413, - 1820, 1958, 1966, 2142, 1781, 1787, 1788, 1789, 2088, 2089, - 2090, 2091, 2179, 2180, 2184, 1882, 1776, 2155, 2156, 0, - 2231, 1919, 1927, 1928, 1952, 2052, 2165, 1799, 1947, 2016, - 1879, 1901, 1902, 2034, 2035, 1923, 1924, 1905, 2094, 2096, - 2112, 2113, 2098, 2100, 2109, 2115, 2120, 2099, 2111, 2116, - 2129, 2133, 2136, 2137, 2138, 2106, 2104, 2117, 2121, 2123, - 2125, 2131, 2134, 2107, 2105, 2118, 2122, 2124, 2126, 2132, - 2135, 2093, 2097, 2101, 2110, 2128, 2108, 2127, 2102, 2114, - 2119, 2130, 2103, 2095, 1917, 1920, 1908, 1909, 1911, 1913, - 1918, 1925, 1931, 1910, 1930, 1929, 0, 1906, 1907, 1912, - 1922, 1926, 1914, 1915, 1916, 1921, 1932, 1972, 1971, 1970, - 2015, 1943, 2014, 0, 0, 0, 0, 0, 1771, 1825, - 1826, 2139, 1333, 1334, 1335, 1336, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 1462, 1463, 46, 1131, 1574, - 1413, 1413, 1413, 1413, 1413, 1413, 1073, 1074, 1075, 1076, - 1077, 1101, 1102, 1108, 1109, 2029, 2030, 2031, 2032, 1863, - 2174, 1871, 1872, 2011, 2012, 1884, 1885, 2205, 2206, -2, + 401, 1504, 167, 1612, 1609, 1610, 1769, 1770, 1771, 1772, + 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, + 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, + 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, + 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, + 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, + 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, + 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, + 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, + 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, + 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, + 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, + 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, + 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, + 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, + 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, + 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, + 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, + 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, + 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, + 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, + 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, + 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, + 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, + 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, + 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, + 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, + 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, + 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, + 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, + 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, + 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, + 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, + 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, + 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, + 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, + 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, + 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, + 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, + 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, + 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, + 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, + 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, + 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, + 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, + 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, + 0, 1588, 0, 718, 983, 0, 876, 877, 0, 784, + 784, 0, 784, 784, 784, 784, 0, 0, 0, 732, + 0, 0, 0, 0, 781, 0, 748, 749, 0, 781, + 0, 755, 787, 0, 0, 762, 784, 784, 765, 2236, + 0, 2236, 2236, 1579, 0, 778, 776, 790, 791, 42, + 794, 797, 798, 799, 800, 803, 0, 814, 817, 1605, + 1606, 0, 819, 826, 843, 844, 0, 47, 1133, 0, + 1005, 0, 1011, -2, 1022, 1039, 1040, 1041, 1042, 1043, + 1045, 1046, 1047, 0, 0, 0, 0, 1052, 1053, 0, + 0, 0, 0, 0, 1114, 0, 0, 0, 0, 1450, + 0, 0, 1412, 1412, 1148, 1412, 1412, 1414, 1414, 1414, + 1821, 1959, 1967, 2143, 1782, 1788, 1789, 1790, 2089, 2090, + 2091, 2092, 2180, 2181, 2185, 1883, 1777, 2156, 2157, 0, + 2232, 1920, 1928, 1929, 1953, 2053, 2166, 1800, 1948, 2017, + 1880, 1902, 1903, 2035, 2036, 1924, 1925, 1906, 2095, 2097, + 2113, 2114, 2099, 2101, 2110, 2116, 2121, 2100, 2112, 2117, + 2130, 2134, 2137, 2138, 2139, 2107, 2105, 2118, 2122, 2124, + 2126, 2132, 2135, 2108, 2106, 2119, 2123, 2125, 2127, 2133, + 2136, 2094, 2098, 2102, 2111, 2129, 2109, 2128, 2103, 2115, + 2120, 2131, 2104, 2096, 1918, 1921, 1909, 1910, 1912, 1914, + 1919, 1926, 1932, 1911, 1931, 1930, 0, 1907, 1908, 1913, + 1923, 1927, 1915, 1916, 1917, 1922, 1933, 1973, 1972, 1971, + 2016, 1944, 2015, 0, 0, 0, 0, 0, 1772, 1826, + 1827, 2140, 1334, 1335, 1336, 1337, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 1463, 1464, 46, 1132, 1575, + 1414, 1414, 1414, 1414, 1414, 1414, 1074, 1075, 1076, 1077, + 1078, 1102, 1103, 1109, 1110, 2030, 2031, 2032, 2033, 1864, + 2175, 1872, 1873, 2012, 2013, 1885, 1886, 2206, 2207, -2, -2, -2, 234, 235, 236, 237, 238, 239, 240, 241, - 0, 1824, 2153, 2154, 230, 0, 0, 298, 299, 295, - 296, 297, 1115, 1116, 251, 252, 253, 254, 255, 256, + 0, 1825, 2154, 2155, 230, 0, 0, 298, 299, 295, + 296, 297, 1116, 1117, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 2234, 0, 852, 0, - 0, 0, 0, 0, 0, 1616, 1617, 1485, 0, 1477, - 1476, 65, 0, 879, -2, 0, 0, 0, 0, 49, - 0, 54, 939, 882, 79, 78, 1525, 0, 0, 0, - 61, 1486, 69, 71, 1487, 0, 884, 885, 0, 915, - 919, 0, 0, 0, 1594, 1593, 1593, 104, 0, 0, - 105, 125, 126, 127, 0, 0, 111, 112, 1580, 1581, + 287, 288, 289, 290, 291, 292, 2235, 0, 853, 0, + 0, 0, 0, 0, 0, 1617, 1618, 1486, 0, 1478, + 1477, 65, 0, 880, -2, 0, 0, 0, 0, 49, + 0, 54, 940, 883, 79, 78, 1526, 0, 0, 0, + 61, 1487, 69, 71, 1488, 0, 885, 886, 0, 916, + 920, 0, 0, 0, 1595, 1594, 1594, 104, 0, 0, + 105, 125, 126, 127, 0, 0, 111, 112, 1581, 1582, 45, 0, 0, 179, 180, 0, 43, 428, 0, 175, - 0, 421, 360, 0, 1503, 0, 0, 0, 0, 0, - 879, 0, 1588, 156, 157, 164, 165, 166, 401, 401, + 0, 421, 360, 0, 1504, 0, 0, 0, 0, 0, + 880, 0, 1589, 156, 157, 164, 165, 166, 401, 401, 401, 575, 0, 0, 167, 167, 533, 534, 535, 0, 0, -2, 426, 0, 513, 0, 0, 415, 415, 419, 417, 418, 0, 0, 0, 0, 0, 0, 0, 0, 552, 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 666, 0, 402, 0, 573, 574, 464, 0, - 0, 0, 0, 0, 0, 0, 0, 1596, 1597, 0, + 0, 0, 0, 0, 0, 0, 0, 1597, 1598, 0, 550, 551, 0, 0, 0, 401, 401, 0, 0, 0, 0, 401, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 155, 1516, 0, 0, 0, -2, 0, 710, 0, - 0, 0, 1589, 1589, 0, 717, 0, 0, 0, 722, - 0, 0, 723, 0, 780, 780, 778, 779, 725, 726, - 727, 728, 783, 0, 0, 410, 411, 412, 780, 783, - 0, 783, 783, 783, 783, 780, 780, 780, 783, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2235, 786, - 783, 0, 756, 0, 757, 758, 759, 762, 763, 765, - 2236, 2237, 1606, 1607, 1618, 1619, 1620, 1621, 1622, 1623, + 0, 155, 1517, 0, 0, 0, -2, 0, 710, 0, + 0, 0, 1590, 1590, 0, 717, 0, 0, 0, 722, + 0, 0, 723, 0, 781, 781, 779, 780, 725, 726, + 727, 728, 784, 0, 0, 410, 411, 412, 781, 784, + 0, 784, 784, 784, 784, 781, 781, 781, 784, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2236, 787, + 784, 0, 756, 0, 757, 758, 759, 760, 763, 764, + 766, 2237, 2238, 1607, 1608, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, @@ -9316,279 +9368,279 @@ var yyDef = [...]int{ 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, - 1764, 1765, 1766, 1767, 2235, 2235, 769, 773, 1579, 795, - 801, 803, 804, 0, 0, 814, 817, 836, 51, 1870, - 824, 51, 826, 827, 828, 854, 855, 860, 0, 0, - 0, 0, 866, 867, 868, 0, 0, 871, 872, 873, - 0, 0, 0, 0, 0, 1002, 0, 0, 1121, 1122, - 1123, 1124, 1125, 1126, 1127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1022, 1023, 0, 0, 0, 1047, 1048, - 1049, 1050, 1053, 0, 1064, 0, 1066, 1458, -2, 0, - 0, 0, 1058, 1059, 0, 0, 0, 0, 0, 0, - 0, 1450, 0, 0, 1145, 0, 1146, 1148, 1149, 1150, - 0, 1151, 1152, 889, 889, 889, 889, 889, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 889, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1599, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 899, 0, 0, 899, 899, - 0, 0, 222, 223, 224, 225, 226, 227, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 242, 243, 244, 245, 246, 247, 300, 248, - 249, 250, 1131, 0, 0, 0, 48, 844, 845, 0, - 965, 1599, 0, 0, 895, 0, 1614, 59, 68, 70, - 1485, 63, 1485, 0, 901, 0, 0, -2, -2, 902, - 908, 909, 910, 911, 912, 56, 2233, 57, 0, 76, - 0, 50, 0, 0, 0, 0, 374, 1528, 0, 0, - 1478, 1479, 1482, 0, 916, 1964, 920, 0, 922, 923, - 0, 0, 102, 0, 981, 0, 0, 0, 113, 0, - 115, 116, 0, 0, 0, 385, 1582, 1583, 1584, -2, - 408, 0, 385, 369, 308, 309, 310, 360, 312, 360, - 360, 360, 360, 374, 374, 374, 374, 343, 344, 345, - 346, 347, 0, 0, 329, 360, 360, 360, 360, 350, - 351, 352, 353, 354, 355, 356, 357, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 362, 362, 362, 362, - 362, 366, 366, 0, 44, 0, 389, 0, 1482, 0, - 0, 1516, 1591, 1601, 0, 0, 0, 1591, 134, 0, - 0, 0, 576, 616, 527, 564, 577, 0, 530, 531, - -2, 0, 0, 512, 0, 514, 0, 409, 0, -2, - 0, 419, 0, 415, 419, 416, 419, 407, 420, 554, - 555, 556, 0, 558, 559, 646, 951, 0, 0, 0, - 0, 0, 652, 653, 654, 0, 656, 657, 658, 659, - 660, 661, 662, 663, 664, 665, 565, 566, 567, 568, - 569, 570, 571, 572, 0, 0, 0, 0, 514, 0, - 561, 0, 0, 465, 466, 467, 0, 0, 470, 471, - 472, 473, 0, 0, 476, 477, 478, 968, 969, 479, - 480, 505, 506, 507, 481, 482, 483, 484, 485, 486, - 487, 499, 500, 501, 502, 503, 504, 488, 489, 490, - 491, 492, 493, 496, 0, 149, 1507, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1589, 0, 0, 0, 0, 898, 983, 1612, - 1613, 719, 0, 0, 784, 785, 0, 413, 414, 783, - 783, 729, 770, 0, 783, 733, 771, 734, 736, 735, - 737, 750, 751, 783, 740, 781, 782, 741, 742, 743, - 744, 745, 746, 747, 766, 752, 753, 754, 787, 0, - 791, 792, 767, 768, 0, 0, 807, 808, 0, 815, - 839, 837, 838, 840, 832, 833, 834, 835, 0, 841, - 0, 0, 857, 98, 862, 863, 864, 865, 877, 870, - 1133, 999, 1000, 1001, 0, 1003, 1007, 0, 1117, 1119, - 1009, 1005, 1011, 1128, 1129, 1130, 0, 0, 0, 0, - 0, 1015, 1019, 1024, 1025, 1026, 1027, 1028, 0, 1029, - 0, 1032, 1033, 1034, 1035, 1036, 1037, 1043, 1426, 1427, - 1428, 1062, 301, 302, 0, 1063, 0, 0, 0, 0, - 0, 0, 0, 0, 1373, 1374, 1375, 1376, 1377, 1378, + 1764, 1765, 1766, 1767, 1768, 2236, 2236, 770, 774, 1580, + 796, 802, 804, 805, 0, 0, 815, 818, 837, 51, + 1871, 825, 51, 827, 828, 829, 855, 856, 861, 0, + 0, 0, 0, 867, 868, 869, 0, 0, 872, 873, + 874, 0, 0, 0, 0, 0, 1003, 0, 0, 1122, + 1123, 1124, 1125, 1126, 1127, 1128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1023, 1024, 0, 0, 0, 1048, + 1049, 1050, 1051, 1054, 0, 1065, 0, 1067, 1459, -2, + 0, 0, 0, 1059, 1060, 0, 0, 0, 0, 0, + 0, 0, 1451, 0, 0, 1146, 0, 1147, 1149, 1150, + 1151, 0, 1152, 1153, 890, 890, 890, 890, 890, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 890, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1600, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 900, 0, 0, 900, + 900, 0, 0, 222, 223, 224, 225, 226, 227, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 242, 243, 244, 245, 246, 247, 300, + 248, 249, 250, 1132, 0, 0, 0, 48, 845, 846, + 0, 966, 1600, 0, 0, 896, 0, 1615, 59, 68, + 70, 1486, 63, 1486, 0, 902, 0, 0, -2, -2, + 903, 909, 910, 911, 912, 913, 56, 2234, 57, 0, + 76, 0, 50, 0, 0, 0, 0, 374, 1529, 0, + 0, 1479, 1480, 1483, 0, 917, 1965, 921, 0, 923, + 924, 0, 0, 102, 0, 982, 0, 0, 0, 113, + 0, 115, 116, 0, 0, 0, 385, 1583, 1584, 1585, + -2, 408, 0, 385, 369, 308, 309, 310, 360, 312, + 360, 360, 360, 360, 374, 374, 374, 374, 343, 344, + 345, 346, 347, 0, 0, 329, 360, 360, 360, 360, + 350, 351, 352, 353, 354, 355, 356, 357, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 362, 362, 362, + 362, 362, 366, 366, 0, 44, 0, 389, 0, 1483, + 0, 0, 1517, 1592, 1602, 0, 0, 0, 1592, 134, + 0, 0, 0, 576, 616, 527, 564, 577, 0, 530, + 531, -2, 0, 0, 512, 0, 514, 0, 409, 0, + -2, 0, 419, 0, 415, 419, 416, 419, 407, 420, + 554, 555, 556, 0, 558, 559, 646, 952, 0, 0, + 0, 0, 0, 652, 653, 654, 0, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 565, 566, 567, + 568, 569, 570, 571, 572, 0, 0, 0, 0, 514, + 0, 561, 0, 0, 465, 466, 467, 0, 0, 470, + 471, 472, 473, 0, 0, 476, 477, 478, 969, 970, + 479, 480, 505, 506, 507, 481, 482, 483, 484, 485, + 486, 487, 499, 500, 501, 502, 503, 504, 488, 489, + 490, 491, 492, 493, 496, 0, 149, 1508, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1590, 0, 0, 0, 0, 899, 984, + 1613, 1614, 719, 0, 0, 785, 786, 0, 413, 414, + 784, 784, 729, 771, 0, 784, 733, 772, 734, 736, + 735, 737, 750, 751, 784, 740, 782, 783, 741, 742, + 743, 744, 745, 746, 747, 767, 752, 753, 754, 788, + 0, 792, 793, 768, 769, 0, 0, 808, 809, 0, + 816, 840, 838, 839, 841, 833, 834, 835, 836, 0, + 842, 0, 0, 858, 98, 863, 864, 865, 866, 878, + 871, 1134, 1000, 1001, 1002, 0, 1004, 1008, 0, 1118, + 1120, 1010, 1006, 1012, 1129, 1130, 1131, 0, 0, 0, + 0, 0, 1016, 1020, 1025, 1026, 1027, 1028, 1029, 0, + 1030, 0, 1033, 1034, 1035, 1036, 1037, 1038, 1044, 1427, + 1428, 1429, 1063, 301, 302, 0, 1064, 0, 0, 0, + 0, 0, 0, 0, 0, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, - 1389, 1390, 1391, 1392, 1132, 0, 913, 0, 0, 1456, - 1453, 0, 0, 0, 1412, 1414, 0, 0, 0, 890, - 891, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1393, 1394, + 1389, 1390, 1391, 1392, 1393, 1133, 0, 914, 0, 0, + 1457, 1454, 0, 0, 0, 1413, 1415, 0, 0, 0, + 891, 892, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, - 1405, 1406, 1407, 1408, 1409, 1410, 0, 0, 1429, 0, - 0, 0, 0, 0, 1449, 0, 1068, 1069, 1070, 0, - 0, 0, 0, 0, 0, 1191, 0, 0, 0, 0, - 1600, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 144, 145, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1337, 1338, 1339, 1340, 41, 0, 0, 0, - 0, 0, 0, 0, 900, 1460, 0, -2, -2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1362, 0, 0, 0, 0, 0, 0, 1572, - 0, 0, 847, 848, 850, 0, 985, 0, 966, 0, - 0, 853, 0, 894, 0, 897, 62, 64, 906, 907, - 0, 924, 903, 58, 53, 0, 0, 943, 1526, 374, - 1548, 0, 383, 383, 380, 1488, 1489, 0, 1481, 1483, - 1484, 81, 921, 917, 0, 997, 0, 0, 980, 0, - 927, 929, 930, 931, 963, 0, 934, 935, 0, 0, - 0, 0, 0, 100, 982, 106, 0, 114, 0, 0, - 119, 120, 107, 108, 109, 110, 0, 605, -2, 460, - 181, 183, 184, 185, 176, -2, 372, 370, 371, 311, - 374, 374, 337, 338, 339, 340, 341, 342, 0, 0, - 330, 331, 332, 333, 322, 0, 323, 324, 325, 364, - 0, 326, 327, 0, 328, 427, 0, 1490, 390, 391, - 393, 401, 0, 396, 397, 0, 401, 401, 0, 422, - 423, 0, 1482, 1507, 0, 0, 0, 1602, 1601, 1601, - 1601, 0, 169, 170, 171, 172, 173, 174, 641, 0, - 0, 617, 639, 640, 167, 0, 0, 177, 516, 515, - 0, 673, 0, 425, 0, 0, 419, 419, 404, 405, - 557, 0, 0, 648, 649, 650, 651, 0, 0, 0, - 543, 454, 0, 544, 545, 514, 516, 0, 0, 385, - 468, 469, 474, 475, 494, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 592, 593, 594, - 597, 599, 518, 603, 596, 598, 600, 518, 604, 1504, - 1505, 1506, 0, 0, 711, 0, 0, 451, 96, 1590, - 716, 720, 721, 780, 739, 772, 780, 731, 738, 760, - 805, 806, 811, 819, 820, 821, 822, 823, 861, 0, - 0, 0, 0, 869, 0, 0, 1008, 1118, 1120, 1012, - 0, 1016, 1020, 0, 0, 0, 0, 0, 1067, 1065, - 1460, 0, 0, 0, 1114, 0, 0, 0, 1136, 1137, - 0, 0, 0, 1454, 0, 0, 1143, 0, 1415, 1153, - 0, 0, 0, 0, 0, 1159, 1160, 1161, 1162, 1163, - 1164, 1165, 1166, 1167, 1168, 1476, 1170, 0, 0, 0, - 0, 0, 1175, 1176, 1177, 1178, 1179, 0, 1181, 0, - 1182, 0, 0, 0, 0, 1189, 1190, 1192, 0, 0, - 1195, 1196, 0, 1198, 0, 1200, 1201, 1202, 1203, 1204, - 1205, 0, 1207, 0, 1209, 1210, 1211, 0, 1213, 0, - 1215, 1216, 0, 1218, 0, 1220, 0, 1223, 0, 1226, - 0, 1229, 0, 1232, 0, 1235, 0, 1238, 0, 1241, - 0, 1244, 0, 1247, 0, 1250, 0, 1253, 0, 1256, - 0, 1259, 0, 1262, 0, 1265, 0, 1268, 1269, 1270, - 0, 1272, 0, 1274, 0, 1277, 1278, 0, 1280, 0, - 1283, 0, 1286, 0, 0, 1287, 0, 0, 0, 1291, - 0, 0, 0, 0, 1300, 1301, 1302, 1303, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1314, 1315, - 1316, 1317, 1318, 1319, 0, 1321, 0, 1096, 0, 0, - 1096, 0, 0, 0, 0, 0, 1134, 899, 0, 1416, - 1417, 1418, 1419, 1420, 0, 0, 0, 0, 0, 0, - 1360, 1361, 1363, 0, 0, 1366, 0, 1368, 0, 1573, - 846, 849, 851, 937, 986, 987, 0, 0, 0, 0, - 967, 1598, 892, 893, 896, 945, 0, 1464, 0, 0, - 924, 997, 925, 0, 904, 55, 940, 0, 1530, 1529, - 1542, 1555, 383, 383, 377, 378, 384, 379, 381, 382, - 1480, 0, 1485, 0, 1566, 0, 0, 1558, 0, 0, - 0, 0, 0, 0, 0, 0, 970, 0, 0, 973, - 0, 0, 0, 0, 964, 935, 0, 936, 0, -2, - 0, 0, 94, 95, 0, 0, 0, 117, 118, 0, - 0, 124, 386, 387, 158, 167, 462, 182, 435, 0, - 0, 307, 373, 334, 335, 336, 0, 358, 0, 0, - 0, 0, 456, 130, 1494, 1493, 401, 401, 392, 0, - 395, 0, 0, 0, 1603, 361, 424, 0, 148, 0, - 0, 0, 0, 0, 154, 611, 0, 0, 618, 0, - 0, 0, 525, 0, 536, 537, 0, 645, -2, 707, - 389, 0, 403, 406, 952, 0, 0, 538, 0, 541, - 542, 455, 516, 547, 548, 562, 549, 497, 498, 495, - 0, 0, 1517, 1518, 1523, 1521, 1522, 135, 583, 585, - 589, 584, 588, 0, 0, 0, 520, 0, 520, 581, - 0, 451, 1490, 0, 715, 452, 453, 783, 783, 856, - 99, 0, 859, 0, 0, 0, 0, 1013, 1017, 1030, - 1031, 1421, 1447, 360, 360, 1434, 360, 366, 1437, 360, - 1439, 360, 1442, 360, 1445, 1446, 0, 0, 1060, 0, - 914, 0, 0, 1142, 1457, 0, 0, 1154, 1155, 1156, - 1157, 1158, 1451, 0, 0, 0, 1174, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 146, 147, 0, - 0, 0, 0, 0, 0, 1371, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1091, 1095, 0, - 1097, 1098, 0, 0, 1323, 0, 0, 1341, 0, 0, - 0, 0, 0, 0, 0, 1461, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 988, 993, 993, 993, - 0, 0, 0, 1585, 1586, 1465, 1466, 997, 1467, 926, - 905, 944, 1548, 0, 1541, 0, -2, 1550, 0, 0, - 0, 1556, 375, 376, 918, 82, 998, 85, 0, 1566, - 1575, 0, 1557, 1568, 1570, 0, 0, 0, 1562, 0, - 997, 928, 959, 961, 0, 956, 971, 972, 974, 0, - 976, 0, 978, 979, 939, 933, 0, 102, 0, 997, - 997, 101, 0, 984, 121, 122, 123, 461, 186, 191, - 0, 0, 0, 196, 0, 198, 0, 0, 0, 203, - 204, 401, 401, 436, 0, 304, 306, 0, 0, 189, - 374, 0, 374, 0, 365, 367, 0, 437, 457, 1491, - 1492, 0, 0, 394, 398, 399, 400, 0, 1592, 150, - 0, 0, 0, 614, 0, 642, 0, 0, 0, 0, - 0, 0, 178, 517, 674, 675, 676, 677, 678, 679, - 680, 681, 682, 0, 401, 0, 0, 0, 401, 401, - 401, 0, 699, 388, 0, 0, 670, 667, 539, 0, - 220, 221, 228, 229, 231, 0, 0, 0, 0, 0, - 546, 939, 1508, 1509, 1510, 0, 1520, 1524, 138, 0, - 0, 0, 0, 591, 595, 601, 0, 519, 602, 712, - 713, 714, 97, 724, 730, 858, 878, 1006, 1014, 1018, - 0, 0, 0, 0, 1448, 1432, 374, 1435, 1436, 1438, - 1440, 1441, 1443, 1444, 1056, 1057, 1061, 0, 1139, 0, - 1141, 1455, 0, 1485, 0, 0, 0, 1173, 0, 0, - 0, 1184, 1183, 1185, 0, 1187, 1188, 1193, 1194, 1197, - 1199, 1206, 1208, 1212, 1214, 1217, 1219, 1221, 0, 1224, - 0, 1227, 0, 1230, 0, 1233, 0, 1236, 0, 1239, - 0, 1242, 0, 1245, 0, 1248, 0, 1251, 0, 1254, - 0, 1257, 0, 1260, 0, 1263, 0, 1266, 0, 1271, - 1273, 0, 1276, 1279, 1281, 0, 1284, 0, 1288, 0, - 1290, 1292, 1293, 0, 0, 0, 1304, 1305, 1306, 1307, - 1308, 1309, 1310, 1311, 1312, 1313, 1320, 0, 1089, 1092, - 1322, 1099, 1100, 1105, 1325, 0, 0, 0, 1328, 0, - 0, 0, 1332, 1135, 1343, 0, 1348, 0, 0, 1354, - 0, 1358, 0, 1364, 1365, 1367, 1369, 0, 0, 0, - 0, 0, 965, 946, 66, 1467, 1469, 0, 1535, 1533, - 1533, 1543, 1544, 0, 0, 1551, 0, 0, 0, 0, - 86, 0, 0, 0, 1571, 0, 0, 0, 0, 103, - 1476, 953, 960, 0, 0, 954, 0, 955, 975, 977, - 932, 0, 997, 997, 92, 93, 0, 192, 0, 194, - 0, 197, 199, 200, 201, 207, 208, 209, 202, 0, - 0, 303, 305, 0, 0, 348, 359, 349, 0, 0, - 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 939, 151, - 152, 153, 606, 0, 616, 0, 941, 0, 609, 0, - 528, 0, 0, 0, 401, 401, 401, 0, 0, 0, - 0, 684, 0, 0, 647, 0, 655, 0, 0, 0, - 232, 233, 0, 1519, 582, 0, 136, 137, 0, 0, - 587, 521, 522, 1054, 0, 0, 0, 1055, 1433, 0, - 0, 0, 0, 1452, 0, 0, 0, 0, 1180, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1296, 0, 0, 0, 636, 637, 0, 1372, 1094, - 1476, 0, 1096, 1106, 1107, 0, 1096, 1342, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 994, - 0, 0, 0, 0, 985, 1469, 1474, 0, 0, 1538, - 0, 1531, 1534, 1532, 1545, 0, 0, 1552, 0, 1554, - 0, 1576, 1577, 1569, 0, 1561, 1564, 1560, 1563, 1485, - 957, 0, 962, 0, 1476, 91, 0, 195, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 205, 206, 0, - 0, 363, 368, 0, 0, 0, 607, 0, 942, 619, - 610, 0, 697, 0, 701, 0, 0, 0, 704, 705, - 706, 683, 0, 687, 429, 671, 668, 669, 540, 0, - 139, 140, 0, 0, 0, 1422, 0, 1425, 1138, 1140, - 0, 1169, 1171, 1172, 1430, 1431, 1186, 1222, 1225, 1228, - 1231, 1234, 1237, 1240, 1243, 1246, 1249, 1252, 1255, 1258, - 1261, 1264, 1267, 1275, 1282, 1285, 1289, 1294, 0, 1297, - 0, 0, 1298, 0, 638, 1085, 0, 0, 1103, 1104, - 0, 1327, 1329, 1330, 1331, 1344, 0, 1349, 1350, 0, - 1355, 0, 1359, 1370, 0, 990, 947, 948, 995, 996, - 0, 0, 938, 1474, 84, 1475, 1472, 0, 1470, 1468, - 1527, 0, 1536, 1537, 1546, 1547, 1553, 0, 1559, 0, - 89, 0, 0, 0, 1485, 193, 0, 212, 0, 615, - 0, 618, 608, 695, 696, 0, 708, 700, 702, 703, - 685, -2, 1511, 0, 0, 0, 590, 1423, 0, 0, - 1299, 0, 634, 635, 1093, 1086, 0, 1071, 1072, 1090, - 1324, 1326, 0, 0, 0, 0, 989, 991, 992, 83, - 0, 1471, 1111, 0, 1539, 1540, 1567, 1565, 958, 965, - 0, 90, 442, 435, 1511, 0, 0, 0, 688, 689, - 690, 691, 692, 693, 694, 579, 1513, 141, 142, 0, - 509, 510, 511, 135, 0, 1144, 1295, 1087, 0, 0, - 0, 0, 0, 1345, 0, 1351, 0, 1356, 0, 949, - 950, 1473, 0, 0, 620, 0, 622, 0, -2, 430, - 443, 0, 187, 213, 214, 0, 0, 217, 218, 219, - 210, 211, 131, 0, 0, 709, 0, 1514, 1515, 0, - 138, 0, 0, 1078, 1079, 1080, 1081, 1083, 0, 0, - 0, 0, 1112, 1091, 621, 0, 0, 385, 0, 631, - 431, 432, 0, 438, 439, 440, 441, 215, 216, 643, - 0, 0, 508, 586, 1424, 0, 0, 1346, 0, 1352, - 0, 1357, 0, 623, 624, 632, 0, 433, 0, 434, - 0, 0, 0, 612, 0, 643, 1512, 1088, 1082, 1084, - 0, 0, 1110, 0, 633, 629, 444, 446, 447, 0, - 0, 445, 644, 613, 1347, 1353, 0, 448, 449, 450, - 625, 626, 627, 628, + 1405, 1406, 1407, 1408, 1409, 1410, 1411, 0, 0, 1430, + 0, 0, 0, 0, 0, 1450, 0, 1069, 1070, 1071, + 0, 0, 0, 0, 0, 0, 1192, 0, 0, 0, + 0, 1601, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, + 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1338, 1339, 1340, 1341, 41, 0, 0, + 0, 0, 0, 0, 0, 901, 1461, 0, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1363, 0, 0, 0, 0, 0, 0, + 1573, 0, 0, 848, 849, 851, 0, 986, 0, 967, + 0, 0, 854, 0, 895, 0, 898, 62, 64, 907, + 908, 0, 925, 904, 58, 53, 0, 0, 944, 1527, + 374, 1549, 0, 383, 383, 380, 1489, 1490, 0, 1482, + 1484, 1485, 81, 922, 918, 0, 998, 0, 0, 981, + 0, 928, 930, 931, 932, 964, 0, 935, 936, 0, + 0, 0, 0, 0, 100, 983, 106, 0, 114, 0, + 0, 119, 120, 107, 108, 109, 110, 0, 605, -2, + 460, 181, 183, 184, 185, 176, -2, 372, 370, 371, + 311, 374, 374, 337, 338, 339, 340, 341, 342, 0, + 0, 330, 331, 332, 333, 322, 0, 323, 324, 325, + 364, 0, 326, 327, 0, 328, 427, 0, 1491, 390, + 391, 393, 401, 0, 396, 397, 0, 401, 401, 0, + 422, 423, 0, 1483, 1508, 0, 0, 0, 1603, 1602, + 1602, 1602, 0, 169, 170, 171, 172, 173, 174, 641, + 0, 0, 617, 639, 640, 167, 0, 0, 177, 516, + 515, 0, 673, 0, 425, 0, 0, 419, 419, 404, + 405, 557, 0, 0, 648, 649, 650, 651, 0, 0, + 0, 543, 454, 0, 544, 545, 514, 516, 0, 0, + 385, 468, 469, 474, 475, 494, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 592, 593, + 594, 597, 599, 518, 603, 596, 598, 600, 518, 604, + 1505, 1506, 1507, 0, 0, 711, 0, 0, 451, 96, + 1591, 716, 720, 721, 781, 739, 773, 781, 731, 738, + 761, 806, 807, 812, 820, 821, 822, 823, 824, 862, + 0, 0, 0, 0, 870, 0, 0, 1009, 1119, 1121, + 1013, 0, 1017, 1021, 0, 0, 0, 0, 0, 1068, + 1066, 1461, 0, 0, 0, 1115, 0, 0, 0, 1137, + 1138, 0, 0, 0, 1455, 0, 0, 1144, 0, 1416, + 1154, 0, 0, 0, 0, 0, 1160, 1161, 1162, 1163, + 1164, 1165, 1166, 1167, 1168, 1169, 1477, 1171, 0, 0, + 0, 0, 0, 1176, 1177, 1178, 1179, 1180, 0, 1182, + 0, 1183, 0, 0, 0, 0, 1190, 1191, 1193, 0, + 0, 1196, 1197, 0, 1199, 0, 1201, 1202, 1203, 1204, + 1205, 1206, 0, 1208, 0, 1210, 1211, 1212, 0, 1214, + 0, 1216, 1217, 0, 1219, 0, 1221, 0, 1224, 0, + 1227, 0, 1230, 0, 1233, 0, 1236, 0, 1239, 0, + 1242, 0, 1245, 0, 1248, 0, 1251, 0, 1254, 0, + 1257, 0, 1260, 0, 1263, 0, 1266, 0, 1269, 1270, + 1271, 0, 1273, 0, 1275, 0, 1278, 1279, 0, 1281, + 0, 1284, 0, 1287, 0, 0, 1288, 0, 0, 0, + 1292, 0, 0, 0, 0, 1301, 1302, 1303, 1304, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1315, + 1316, 1317, 1318, 1319, 1320, 0, 1322, 0, 1097, 0, + 0, 1097, 0, 0, 0, 0, 0, 1135, 900, 0, + 1417, 1418, 1419, 1420, 1421, 0, 0, 0, 0, 0, + 0, 1361, 1362, 1364, 0, 0, 1367, 0, 1369, 0, + 1574, 847, 850, 852, 938, 987, 988, 0, 0, 0, + 0, 968, 1599, 893, 894, 897, 946, 0, 1465, 0, + 0, 925, 998, 926, 0, 905, 55, 941, 0, 1531, + 1530, 1543, 1556, 383, 383, 377, 378, 384, 379, 381, + 382, 1481, 0, 1486, 0, 1567, 0, 0, 1559, 0, + 0, 0, 0, 0, 0, 0, 0, 971, 0, 0, + 974, 0, 0, 0, 0, 965, 936, 0, 937, 0, + -2, 0, 0, 94, 95, 0, 0, 0, 117, 118, + 0, 0, 124, 386, 387, 158, 167, 462, 182, 435, + 0, 0, 307, 373, 334, 335, 336, 0, 358, 0, + 0, 0, 0, 456, 130, 1495, 1494, 401, 401, 392, + 0, 395, 0, 0, 0, 1604, 361, 424, 0, 148, + 0, 0, 0, 0, 0, 154, 611, 0, 0, 618, + 0, 0, 0, 525, 0, 536, 537, 0, 645, -2, + 707, 389, 0, 403, 406, 953, 0, 0, 538, 0, + 541, 542, 455, 516, 547, 548, 562, 549, 497, 498, + 495, 0, 0, 1518, 1519, 1524, 1522, 1523, 135, 583, + 585, 589, 584, 588, 0, 0, 0, 520, 0, 520, + 581, 0, 451, 1491, 0, 715, 452, 453, 784, 784, + 857, 99, 0, 860, 0, 0, 0, 0, 1014, 1018, + 1031, 1032, 1422, 1448, 360, 360, 1435, 360, 366, 1438, + 360, 1440, 360, 1443, 360, 1446, 1447, 0, 0, 1061, + 0, 915, 0, 0, 1143, 1458, 0, 0, 1155, 1156, + 1157, 1158, 1159, 1452, 0, 0, 0, 1175, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 146, 147, + 0, 0, 0, 0, 0, 0, 1372, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1092, 1096, + 0, 1098, 1099, 0, 0, 1324, 0, 0, 1342, 0, + 0, 0, 0, 0, 0, 0, 1462, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 989, 994, 994, + 994, 0, 0, 0, 1586, 1587, 1466, 1467, 998, 1468, + 927, 906, 945, 1549, 0, 1542, 0, -2, 1551, 0, + 0, 0, 1557, 375, 376, 919, 82, 999, 85, 0, + 1567, 1576, 0, 1558, 1569, 1571, 0, 0, 0, 1563, + 0, 998, 929, 960, 962, 0, 957, 972, 973, 975, + 0, 977, 0, 979, 980, 940, 934, 0, 102, 0, + 998, 998, 101, 0, 985, 121, 122, 123, 461, 186, + 191, 0, 0, 0, 196, 0, 198, 0, 0, 0, + 203, 204, 401, 401, 436, 0, 304, 306, 0, 0, + 189, 374, 0, 374, 0, 365, 367, 0, 437, 457, + 1492, 1493, 0, 0, 394, 398, 399, 400, 0, 1593, + 150, 0, 0, 0, 614, 0, 642, 0, 0, 0, + 0, 0, 0, 178, 517, 674, 675, 676, 677, 678, + 679, 680, 681, 682, 0, 401, 0, 0, 0, 401, + 401, 401, 0, 699, 388, 0, 0, 670, 667, 539, + 0, 220, 221, 228, 229, 231, 0, 0, 0, 0, + 0, 546, 940, 1509, 1510, 1511, 0, 1521, 1525, 138, + 0, 0, 0, 0, 591, 595, 601, 0, 519, 602, + 712, 713, 714, 97, 724, 730, 859, 879, 1007, 1015, + 1019, 0, 0, 0, 0, 1449, 1433, 374, 1436, 1437, + 1439, 1441, 1442, 1444, 1445, 1057, 1058, 1062, 0, 1140, + 0, 1142, 1456, 0, 1486, 0, 0, 0, 1174, 0, + 0, 0, 1185, 1184, 1186, 0, 1188, 1189, 1194, 1195, + 1198, 1200, 1207, 1209, 1213, 1215, 1218, 1220, 1222, 0, + 1225, 0, 1228, 0, 1231, 0, 1234, 0, 1237, 0, + 1240, 0, 1243, 0, 1246, 0, 1249, 0, 1252, 0, + 1255, 0, 1258, 0, 1261, 0, 1264, 0, 1267, 0, + 1272, 1274, 0, 1277, 1280, 1282, 0, 1285, 0, 1289, + 0, 1291, 1293, 1294, 0, 0, 0, 1305, 1306, 1307, + 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1321, 0, 1090, + 1093, 1323, 1100, 1101, 1106, 1326, 0, 0, 0, 1329, + 0, 0, 0, 1333, 1136, 1344, 0, 1349, 0, 0, + 1355, 0, 1359, 0, 1365, 1366, 1368, 1370, 0, 0, + 0, 0, 0, 966, 947, 66, 1468, 1470, 0, 1536, + 1534, 1534, 1544, 1545, 0, 0, 1552, 0, 0, 0, + 0, 86, 0, 0, 0, 1572, 0, 0, 0, 0, + 103, 1477, 954, 961, 0, 0, 955, 0, 956, 976, + 978, 933, 0, 998, 998, 92, 93, 0, 192, 0, + 194, 0, 197, 199, 200, 201, 207, 208, 209, 202, + 0, 0, 303, 305, 0, 0, 348, 359, 349, 0, + 0, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 940, + 151, 152, 153, 606, 0, 616, 0, 942, 0, 609, + 0, 528, 0, 0, 0, 401, 401, 401, 0, 0, + 0, 0, 684, 0, 0, 647, 0, 655, 0, 0, + 0, 232, 233, 0, 1520, 582, 0, 136, 137, 0, + 0, 587, 521, 522, 1055, 0, 0, 0, 1056, 1434, + 0, 0, 0, 0, 1453, 0, 0, 0, 0, 1181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1297, 0, 0, 0, 636, 637, 0, 1373, + 1095, 1477, 0, 1097, 1107, 1108, 0, 1097, 1343, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 995, 0, 0, 0, 0, 986, 1470, 1475, 0, 0, + 1539, 0, 1532, 1535, 1533, 1546, 0, 0, 1553, 0, + 1555, 0, 1577, 1578, 1570, 0, 1562, 1565, 1561, 1564, + 1486, 958, 0, 963, 0, 1477, 91, 0, 195, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 205, 206, + 0, 0, 363, 368, 0, 0, 0, 607, 0, 943, + 619, 610, 0, 697, 0, 701, 0, 0, 0, 704, + 705, 706, 683, 0, 687, 429, 671, 668, 669, 540, + 0, 139, 140, 0, 0, 0, 1423, 0, 1426, 1139, + 1141, 0, 1170, 1172, 1173, 1431, 1432, 1187, 1223, 1226, + 1229, 1232, 1235, 1238, 1241, 1244, 1247, 1250, 1253, 1256, + 1259, 1262, 1265, 1268, 1276, 1283, 1286, 1290, 1295, 0, + 1298, 0, 0, 1299, 0, 638, 1086, 0, 0, 1104, + 1105, 0, 1328, 1330, 1331, 1332, 1345, 0, 1350, 1351, + 0, 1356, 0, 1360, 1371, 0, 991, 948, 949, 996, + 997, 0, 0, 939, 1475, 84, 1476, 1473, 0, 1471, + 1469, 1528, 0, 1537, 1538, 1547, 1548, 1554, 0, 1560, + 0, 89, 0, 0, 0, 1486, 193, 0, 212, 0, + 615, 0, 618, 608, 695, 696, 0, 708, 700, 702, + 703, 685, -2, 1512, 0, 0, 0, 590, 1424, 0, + 0, 1300, 0, 634, 635, 1094, 1087, 0, 1072, 1073, + 1091, 1325, 1327, 0, 0, 0, 0, 990, 992, 993, + 83, 0, 1472, 1112, 0, 1540, 1541, 1568, 1566, 959, + 966, 0, 90, 442, 435, 1512, 0, 0, 0, 688, + 689, 690, 691, 692, 693, 694, 579, 1514, 141, 142, + 0, 509, 510, 511, 135, 0, 1145, 1296, 1088, 0, + 0, 0, 0, 0, 1346, 0, 1352, 0, 1357, 0, + 950, 951, 1474, 0, 0, 620, 0, 622, 0, -2, + 430, 443, 0, 187, 213, 214, 0, 0, 217, 218, + 219, 210, 211, 131, 0, 0, 709, 0, 1515, 1516, + 0, 138, 0, 0, 1079, 1080, 1081, 1082, 1084, 0, + 0, 0, 0, 1113, 1092, 621, 0, 0, 385, 0, + 631, 431, 432, 0, 438, 439, 440, 441, 215, 216, + 643, 0, 0, 508, 586, 1425, 0, 0, 1347, 0, + 1353, 0, 1358, 0, 623, 624, 632, 0, 433, 0, + 434, 0, 0, 0, 612, 0, 643, 1513, 1089, 1083, + 1085, 0, 0, 1111, 0, 633, 629, 444, 446, 447, + 0, 0, 445, 644, 613, 1348, 1354, 0, 448, 449, + 450, 625, 626, 627, 628, } var yyTok1 = [...]int{ @@ -15622,31 +15674,31 @@ yydefault: var yyLOCAL Statement //line sql.y:4132 { - yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaKeyspaces}} } yyVAL.union = yyLOCAL case 760: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4136 { - yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} } yyVAL.union = yyLOCAL case 761: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:4140 { - yyLOCAL = &Show{&ShowBasic{Command: Warnings}} + yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} } yyVAL.union = yyLOCAL case 762: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement //line sql.y:4144 { - yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: Warnings}} } yyVAL.union = yyLOCAL case 763: @@ -15654,31 +15706,31 @@ yydefault: var yyLOCAL Statement //line sql.y:4148 { - yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} + yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 764: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4152 { - yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} + yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL case 765: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4159 +//line sql.y:4156 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} + yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} } yyVAL.union = yyLOCAL case 766: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4163 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].identifierCI.String())}} } yyVAL.union = yyLOCAL case 767: @@ -15686,7 +15738,7 @@ yydefault: var yyLOCAL Statement //line sql.y:4167 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String()}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL case 768: @@ -15694,23 +15746,23 @@ yydefault: var yyLOCAL Statement //line sql.y:4171 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String()}} } yyVAL.union = yyLOCAL case 769: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4175 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL case 770: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement //line sql.y:4179 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } yyVAL.union = yyLOCAL case 771: @@ -15722,55 +15774,57 @@ yydefault: } yyVAL.union = yyLOCAL case 772: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement //line sql.y:4187 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } yyVAL.union = yyLOCAL case 773: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement //line sql.y:4191 { - yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL case 774: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL Statement +//line sql.y:4195 + { + yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} + } + yyVAL.union = yyLOCAL + case 775: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4197 +//line sql.y:4201 { yyVAL.str = "" } - case 775: + case 776: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4201 +//line sql.y:4205 { yyVAL.str = "extended " } - case 776: + case 777: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4207 +//line sql.y:4211 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 777: + case 778: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4211 +//line sql.y:4215 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 778: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4217 - { - yyVAL.str = string(yyDollar[1].str) - } case 779: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4221 @@ -15778,16 +15832,16 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 780: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4227 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4225 { - yyVAL.identifierCS = NewIdentifierCS("") + yyVAL.str = string(yyDollar[1].str) } case 781: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:4231 { - yyVAL.identifierCS = yyDollar[2].identifierCS + yyVAL.identifierCS = NewIdentifierCS("") } case 782: yyDollar = yyS[yypt-2 : yypt+1] @@ -15796,53 +15850,53 @@ yydefault: yyVAL.identifierCS = yyDollar[2].identifierCS } case 783: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:4239 + { + yyVAL.identifierCS = yyDollar[2].identifierCS + } + case 784: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4241 +//line sql.y:4245 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 784: + case 785: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4245 +//line sql.y:4249 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 785: + case 786: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4249 +//line sql.y:4253 { yyLOCAL = &ShowFilter{Filter: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 786: + case 787: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4255 +//line sql.y:4259 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 787: + case 788: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:4259 +//line sql.y:4263 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 788: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4265 - { - yyVAL.empty = struct{}{} - } case 789: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:4269 { yyVAL.empty = struct{}{} @@ -15855,9 +15909,9 @@ yydefault: } case 791: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4279 +//line sql.y:4277 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.empty = struct{}{} } case 792: yyDollar = yyS[yypt-1 : yypt+1] @@ -15866,202 +15920,200 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 793: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4287 + { + yyVAL.str = string(yyDollar[1].str) + } + case 794: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4289 +//line sql.y:4293 { yyLOCAL = &Use{DBName: yyDollar[2].identifierCS} } yyVAL.union = yyLOCAL - case 794: + case 795: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4293 +//line sql.y:4297 { yyLOCAL = &Use{DBName: IdentifierCS{v: ""}} } yyVAL.union = yyLOCAL - case 795: + case 796: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4297 +//line sql.y:4301 { yyLOCAL = &Use{DBName: NewIdentifierCS(yyDollar[2].identifierCS.String() + "@" + string(yyDollar[3].str))} } yyVAL.union = yyLOCAL - case 796: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4304 - { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) - } case 797: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4308 { - yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 798: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4312 { - yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS("@" + string(yyDollar[1].str)) } case 799: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4316 { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + yyVAL.identifierCS = NewIdentifierCS("@@" + string(yyDollar[1].str)) } case 800: yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4320 + { + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + } + case 801: + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4323 +//line sql.y:4327 { yyLOCAL = &Begin{} } yyVAL.union = yyLOCAL - case 801: + case 802: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4327 +//line sql.y:4331 { yyLOCAL = &Begin{TxAccessModes: yyDollar[3].txAccessModesUnion()} } yyVAL.union = yyLOCAL - case 802: + case 803: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4332 +//line sql.y:4336 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 803: + case 804: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4336 +//line sql.y:4340 { yyLOCAL = yyDollar[1].txAccessModesUnion() } yyVAL.union = yyLOCAL - case 804: + case 805: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []TxAccessMode -//line sql.y:4342 +//line sql.y:4346 { yyLOCAL = []TxAccessMode{yyDollar[1].txAccessModeUnion()} } yyVAL.union = yyLOCAL - case 805: + case 806: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4346 +//line sql.y:4350 { yySLICE := (*[]TxAccessMode)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].txAccessModeUnion()) } - case 806: + case 807: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4352 +//line sql.y:4356 { yyLOCAL = WithConsistentSnapshot } yyVAL.union = yyLOCAL - case 807: + case 808: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4356 +//line sql.y:4360 { yyLOCAL = ReadWrite } yyVAL.union = yyLOCAL - case 808: + case 809: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TxAccessMode -//line sql.y:4360 +//line sql.y:4364 { yyLOCAL = ReadOnly } yyVAL.union = yyLOCAL - case 809: + case 810: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4367 +//line sql.y:4371 { yyLOCAL = &Commit{} } yyVAL.union = yyLOCAL - case 810: + case 811: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:4373 +//line sql.y:4377 { yyLOCAL = &Rollback{} } yyVAL.union = yyLOCAL - case 811: + case 812: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4377 +//line sql.y:4381 { yyLOCAL = &SRollback{Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 812: + case 813: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4382 +//line sql.y:4386 { yyVAL.empty = struct{}{} } - case 813: + case 814: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4384 +//line sql.y:4388 { yyVAL.empty = struct{}{} } - case 814: + case 815: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4387 +//line sql.y:4391 { yyVAL.empty = struct{}{} } - case 815: + case 816: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4389 +//line sql.y:4393 { yyVAL.empty = struct{}{} } - case 816: + case 817: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4393 +//line sql.y:4397 { yyLOCAL = &Savepoint{Name: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 817: + case 818: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4399 +//line sql.y:4403 { yyLOCAL = &Release{Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 818: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL ExplainType -//line sql.y:4404 - { - yyLOCAL = EmptyType - } - yyVAL.union = yyLOCAL case 819: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL ExplainType //line sql.y:4408 { - yyLOCAL = JSONType + yyLOCAL = EmptyType } yyVAL.union = yyLOCAL case 820: @@ -16069,7 +16121,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4412 { - yyLOCAL = TreeType + yyLOCAL = JSONType } yyVAL.union = yyLOCAL case 821: @@ -16077,7 +16129,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4416 { - yyLOCAL = VitessType + yyLOCAL = TreeType } yyVAL.union = yyLOCAL case 822: @@ -16085,7 +16137,7 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4420 { - yyLOCAL = VTExplainType + yyLOCAL = VitessType } yyVAL.union = yyLOCAL case 823: @@ -16093,27 +16145,27 @@ yydefault: var yyLOCAL ExplainType //line sql.y:4424 { - yyLOCAL = TraditionalType + yyLOCAL = VTExplainType } yyVAL.union = yyLOCAL case 824: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType //line sql.y:4428 { - yyLOCAL = AnalyzeType + yyLOCAL = TraditionalType } yyVAL.union = yyLOCAL case 825: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL VExplainType -//line sql.y:4433 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ExplainType +//line sql.y:4432 { - yyLOCAL = PlanVExplainType + yyLOCAL = AnalyzeType } yyVAL.union = yyLOCAL case 826: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL VExplainType //line sql.y:4437 { @@ -16125,7 +16177,7 @@ yydefault: var yyLOCAL VExplainType //line sql.y:4441 { - yyLOCAL = AllVExplainType + yyLOCAL = PlanVExplainType } yyVAL.union = yyLOCAL case 828: @@ -16133,15 +16185,17 @@ yydefault: var yyLOCAL VExplainType //line sql.y:4445 { - yyLOCAL = QueriesVExplainType + yyLOCAL = AllVExplainType } yyVAL.union = yyLOCAL case 829: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4451 + var yyLOCAL VExplainType +//line sql.y:4449 { - yyVAL.str = yyDollar[1].str + yyLOCAL = QueriesVExplainType } + yyVAL.union = yyLOCAL case 830: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4455 @@ -16156,18 +16210,16 @@ yydefault: } case 832: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL Statement -//line sql.y:4465 +//line sql.y:4463 { - yyLOCAL = yyDollar[1].selStmtUnion() + yyVAL.str = yyDollar[1].str } - yyVAL.union = yyLOCAL case 833: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement //line sql.y:4469 { - yyLOCAL = yyDollar[1].statementUnion() + yyLOCAL = yyDollar[1].selStmtUnion() } yyVAL.union = yyLOCAL case 834: @@ -16187,208 +16239,210 @@ yydefault: } yyVAL.union = yyLOCAL case 836: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4482 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Statement +//line sql.y:4481 { - yyVAL.str = "" + yyLOCAL = yyDollar[1].statementUnion() } + yyVAL.union = yyLOCAL case 837: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:4486 { - yyVAL.str = yyDollar[1].identifierCI.val + yyVAL.str = "" } case 838: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4490 { - yyVAL.str = encodeSQLString(yyDollar[1].str) + yyVAL.str = yyDollar[1].identifierCI.val } case 839: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4494 + { + yyVAL.str = encodeSQLString(yyDollar[1].str) + } + case 840: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4496 +//line sql.y:4500 { yyLOCAL = &ExplainTab{Table: yyDollar[3].tableName, Wild: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 840: + case 841: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4500 +//line sql.y:4504 { yyLOCAL = &ExplainStmt{Type: yyDollar[3].explainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 841: + case 842: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4506 +//line sql.y:4510 { yyLOCAL = &VExplainStmt{Type: yyDollar[3].vexplainTypeUnion(), Statement: yyDollar[4].statementUnion(), Comments: Comments(yyDollar[2].strs).Parsed()} } yyVAL.union = yyLOCAL - case 842: + case 843: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4512 +//line sql.y:4516 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 843: + case 844: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4516 +//line sql.y:4520 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 844: + case 845: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4522 +//line sql.y:4526 { yyLOCAL = &LockTables{Tables: yyDollar[3].tableAndLockTypesUnion()} } yyVAL.union = yyLOCAL - case 845: + case 846: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableAndLockTypes -//line sql.y:4528 +//line sql.y:4532 { yyLOCAL = TableAndLockTypes{yyDollar[1].tableAndLockTypeUnion()} } yyVAL.union = yyLOCAL - case 846: + case 847: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4532 +//line sql.y:4536 { yySLICE := (*TableAndLockTypes)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableAndLockTypeUnion()) } - case 847: + case 848: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *TableAndLockType -//line sql.y:4538 +//line sql.y:4542 { yyLOCAL = &TableAndLockType{Table: yyDollar[1].aliasedTableNameUnion(), Lock: yyDollar[2].lockTypeUnion()} } yyVAL.union = yyLOCAL - case 848: + case 849: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4544 +//line sql.y:4548 { yyLOCAL = Read } yyVAL.union = yyLOCAL - case 849: + case 850: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4548 +//line sql.y:4552 { yyLOCAL = ReadLocal } yyVAL.union = yyLOCAL - case 850: + case 851: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:4552 +//line sql.y:4556 { yyLOCAL = Write } yyVAL.union = yyLOCAL - case 851: + case 852: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:4556 +//line sql.y:4560 { yyLOCAL = LowPriorityWrite } yyVAL.union = yyLOCAL - case 852: + case 853: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:4562 +//line sql.y:4566 { yyLOCAL = &UnlockTables{} } yyVAL.union = yyLOCAL - case 853: + case 854: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4568 +//line sql.y:4572 { yyLOCAL = &RevertMigration{Comments: Comments(yyDollar[2].strs).Parsed(), UUID: string(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 854: + case 855: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4574 +//line sql.y:4578 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), FlushOptions: yyDollar[3].strs} } yyVAL.union = yyLOCAL - case 855: + case 856: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:4578 +//line sql.y:4582 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion()} } yyVAL.union = yyLOCAL - case 856: + case 857: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4582 +//line sql.y:4586 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 857: + case 858: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4586 +//line sql.y:4590 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL - case 858: + case 859: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:4590 +//line sql.y:4594 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 859: + case 860: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:4594 +//line sql.y:4598 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), ForExport: true} } yyVAL.union = yyLOCAL - case 860: + case 861: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4600 +//line sql.y:4604 { yyVAL.strs = []string{yyDollar[1].str} } - case 861: + case 862: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4604 +//line sql.y:4608 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[3].str) } - case 862: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4610 - { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) - } case 863: yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4614 @@ -16408,10 +16462,10 @@ yydefault: yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 866: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4626 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 867: yyDollar = yyS[yypt-1 : yypt+1] @@ -16426,22 +16480,22 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 869: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4638 { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str + yyVAL.str = string(yyDollar[1].str) } case 870: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:4642 { - yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str } case 871: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:4646 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 872: yyDollar = yyS[yypt-1 : yypt+1] @@ -16456,144 +16510,150 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 874: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4658 + { + yyVAL.str = string(yyDollar[1].str) + } + case 875: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4659 +//line sql.y:4663 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 875: + case 876: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4663 +//line sql.y:4667 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 876: + case 877: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4667 +//line sql.y:4671 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 877: + case 878: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4672 +//line sql.y:4676 { yyVAL.str = "" } - case 878: + case 879: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4676 +//line sql.y:4680 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) + " " + yyDollar[3].identifierCI.String() } - case 879: + case 880: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4681 +//line sql.y:4685 { setAllowComments(yylex, true) } - case 880: + case 881: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4685 +//line sql.y:4689 { yyVAL.strs = yyDollar[2].strs setAllowComments(yylex, false) } - case 881: + case 882: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4691 +//line sql.y:4695 { yyVAL.strs = nil } - case 882: + case 883: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4695 +//line sql.y:4699 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } - case 883: + case 884: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4701 +//line sql.y:4705 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 884: + case 885: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4705 +//line sql.y:4709 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 885: + case 886: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:4709 +//line sql.y:4713 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 886: + case 887: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4714 +//line sql.y:4718 { yyVAL.str = "" } - case 887: + case 888: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4718 +//line sql.y:4722 { yyVAL.str = SQLNoCacheStr } - case 888: + case 889: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4722 +//line sql.y:4726 { yyVAL.str = SQLCacheStr } - case 889: + case 890: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:4727 +//line sql.y:4731 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 890: + case 891: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4731 +//line sql.y:4735 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 891: + case 892: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:4735 +//line sql.y:4739 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 892: + case 893: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4741 +//line sql.y:4745 { yyLOCAL = &PrepareStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Statement: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 893: + case 894: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:4745 +//line sql.y:4749 { yyLOCAL = &PrepareStmt{ Name: yyDollar[3].identifierCI, @@ -16602,109 +16662,103 @@ yydefault: } } yyVAL.union = yyLOCAL - case 894: + case 895: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4755 +//line sql.y:4759 { yyLOCAL = &ExecuteStmt{Name: yyDollar[3].identifierCI, Comments: Comments(yyDollar[2].strs).Parsed(), Arguments: yyDollar[4].variablesUnion()} } yyVAL.union = yyLOCAL - case 895: + case 896: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4760 +//line sql.y:4764 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 896: + case 897: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4764 +//line sql.y:4768 { yyLOCAL = yyDollar[2].variablesUnion() } yyVAL.union = yyLOCAL - case 897: + case 898: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4770 +//line sql.y:4774 { yyLOCAL = &DeallocateStmt{Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 898: + case 899: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4774 +//line sql.y:4778 { yyLOCAL = &DeallocateStmt{Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].identifierCI} } yyVAL.union = yyLOCAL - case 899: + case 900: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4779 +//line sql.y:4783 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 900: + case 901: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4783 +//line sql.y:4787 { yyLOCAL = yyDollar[1].selectExprsUnion() } yyVAL.union = yyLOCAL - case 901: + case 902: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4788 +//line sql.y:4792 { yyVAL.strs = nil } - case 902: + case 903: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4792 +//line sql.y:4796 { yyVAL.strs = []string{yyDollar[1].str} } - case 903: + case 904: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4796 +//line sql.y:4800 { // TODO: This is a hack since I couldn't get it to work in a nicer way. I got 'conflicts: 8 shift/reduce' yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str} } - case 904: + case 905: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4800 +//line sql.y:4804 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } - case 905: + case 906: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4804 +//line sql.y:4808 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } - case 906: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4810 - { - yyVAL.str = SQLNoCacheStr - } case 907: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4814 { - yyVAL.str = SQLCacheStr + yyVAL.str = SQLNoCacheStr } case 908: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4818 { - yyVAL.str = DistinctStr + yyVAL.str = SQLCacheStr } case 909: yyDollar = yyS[yypt-1 : yypt+1] @@ -16716,481 +16770,487 @@ yydefault: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4826 { - yyVAL.str = StraightJoinHint + yyVAL.str = DistinctStr } case 911: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4830 { - yyVAL.str = SQLCalcFoundRowsStr + yyVAL.str = StraightJoinHint } case 912: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:4834 { - yyVAL.str = AllStr // These are not picked up by NewSelect, and so ALL will be dropped. But this is OK, since it's redundant anyway + yyVAL.str = SQLCalcFoundRowsStr } case 913: yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:4838 + { + yyVAL.str = AllStr // These are not picked up by NewSelect, and so ALL will be dropped. But this is OK, since it's redundant anyway + } + case 914: + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4840 +//line sql.y:4844 { yyLOCAL = SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL - case 914: + case 915: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4844 +//line sql.y:4848 { yySLICE := (*SelectExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].selectExprUnion()) } - case 915: + case 916: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4850 +//line sql.y:4854 { yyLOCAL = &StarExpr{} } yyVAL.union = yyLOCAL - case 916: + case 917: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4854 +//line sql.y:4858 { yyLOCAL = &AliasedExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 917: + case 918: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4858 +//line sql.y:4862 { yyLOCAL = &StarExpr{TableName: TableName{Name: yyDollar[1].identifierCS}} } yyVAL.union = yyLOCAL - case 918: + case 919: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4862 +//line sql.y:4866 { yyLOCAL = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}} } yyVAL.union = yyLOCAL - case 919: + case 920: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4867 +//line sql.y:4871 { yyVAL.identifierCI = IdentifierCI{} } - case 920: + case 921: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4871 +//line sql.y:4875 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 921: + case 922: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4875 +//line sql.y:4879 { yyVAL.identifierCI = yyDollar[2].identifierCI } - case 923: + case 924: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4882 +//line sql.y:4886 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 924: + case 925: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4887 +//line sql.y:4891 { yyLOCAL = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewIdentifierCS("dual")}}} } yyVAL.union = yyLOCAL - case 925: + case 926: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4891 +//line sql.y:4895 { yyLOCAL = yyDollar[1].tableExprsUnion() } yyVAL.union = yyLOCAL - case 926: + case 927: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4897 +//line sql.y:4901 { yyLOCAL = yyDollar[2].tableExprsUnion() } yyVAL.union = yyLOCAL - case 927: + case 928: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4903 +//line sql.y:4907 { yyLOCAL = TableExprs{yyDollar[1].tableExprUnion()} } yyVAL.union = yyLOCAL - case 928: + case 929: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4907 +//line sql.y:4911 { yySLICE := (*TableExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableExprUnion()) } - case 931: + case 932: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4917 +//line sql.y:4921 { yyLOCAL = yyDollar[1].aliasedTableNameUnion() } yyVAL.union = yyLOCAL - case 932: + case 933: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4921 +//line sql.y:4925 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].derivedTableUnion(), As: yyDollar[3].identifierCS, Columns: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 933: + case 934: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4925 +//line sql.y:4929 { yyLOCAL = &ParenTableExpr{Exprs: yyDollar[2].tableExprsUnion()} } yyVAL.union = yyLOCAL - case 934: + case 935: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4929 +//line sql.y:4933 { yyLOCAL = yyDollar[1].tableExprUnion() } yyVAL.union = yyLOCAL - case 935: + case 936: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4935 +//line sql.y:4939 { yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 936: + case 937: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4939 +//line sql.y:4943 { yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[2].selStmtUnion()} } yyVAL.union = yyLOCAL - case 937: + case 938: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4945 +//line sql.y:4949 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].identifierCS, Hints: yyDollar[3].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 938: + case 939: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4949 +//line sql.y:4953 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitionsUnion(), As: yyDollar[6].identifierCS, Hints: yyDollar[7].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 939: + case 940: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4954 +//line sql.y:4958 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 940: + case 941: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:4958 +//line sql.y:4962 { yyLOCAL = yyDollar[2].columnsUnion() } yyVAL.union = yyLOCAL - case 941: + case 942: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4963 +//line sql.y:4967 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 942: + case 943: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4967 +//line sql.y:4971 { yyLOCAL = yyDollar[1].columnsUnion() } yyVAL.union = yyLOCAL - case 943: + case 944: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4973 +//line sql.y:4977 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 944: + case 945: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4977 +//line sql.y:4981 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 945: + case 946: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*Variable -//line sql.y:4983 +//line sql.y:4987 { yyLOCAL = []*Variable{yyDollar[1].variableUnion()} } yyVAL.union = yyLOCAL - case 946: + case 947: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4987 +//line sql.y:4991 { yySLICE := (*[]*Variable)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].variableUnion()) } - case 947: + case 948: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4993 +//line sql.y:4997 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 948: + case 949: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4997 +//line sql.y:5001 { yyLOCAL = Columns{NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 949: + case 950: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5001 +//line sql.y:5005 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 950: + case 951: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5005 +//line sql.y:5009 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, NewIdentifierCI(string(yyDollar[3].str))) } - case 951: + case 952: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Partitions -//line sql.y:5011 +//line sql.y:5015 { yyLOCAL = Partitions{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 952: + case 953: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5015 +//line sql.y:5019 { yySLICE := (*Partitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 953: + case 954: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5028 +//line sql.y:5032 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 954: + case 955: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5032 +//line sql.y:5036 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 955: + case 956: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5036 +//line sql.y:5040 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 956: + case 957: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:5040 +//line sql.y:5044 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion()} } yyVAL.union = yyLOCAL - case 957: + case 958: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5046 +//line sql.y:5050 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 958: + case 959: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:5048 +//line sql.y:5052 { yyVAL.joinCondition = &JoinCondition{Using: yyDollar[3].columnsUnion()} } - case 959: + case 960: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5052 +//line sql.y:5056 { yyVAL.joinCondition = &JoinCondition{} } - case 960: + case 961: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5054 +//line sql.y:5058 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 961: + case 962: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5058 +//line sql.y:5062 { yyVAL.joinCondition = &JoinCondition{} } - case 962: + case 963: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5060 +//line sql.y:5064 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 963: + case 964: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5063 +//line sql.y:5067 { yyVAL.empty = struct{}{} } - case 964: + case 965: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5065 +//line sql.y:5069 { yyVAL.empty = struct{}{} } - case 965: + case 966: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5068 +//line sql.y:5072 { yyVAL.identifierCS = NewIdentifierCS("") } - case 966: + case 967: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5072 +//line sql.y:5076 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 967: + case 968: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5076 +//line sql.y:5080 { yyVAL.identifierCS = yyDollar[2].identifierCS } - case 969: + case 970: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5083 +//line sql.y:5087 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 970: + case 971: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5089 +//line sql.y:5093 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 971: + case 972: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5093 +//line sql.y:5097 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 972: + case 973: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5097 +//line sql.y:5101 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 973: + case 974: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:5103 +//line sql.y:5107 { yyLOCAL = StraightJoinType } yyVAL.union = yyLOCAL - case 974: + case 975: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5109 +//line sql.y:5113 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 975: + case 976: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5113 +//line sql.y:5117 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 976: + case 977: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5117 +//line sql.y:5121 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 977: + case 978: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:5121 +//line sql.y:5125 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 978: + case 979: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5127 +//line sql.y:5131 { yyLOCAL = NaturalJoinType } yyVAL.union = yyLOCAL - case 979: + case 980: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:5131 +//line sql.y:5135 { if yyDollar[2].joinTypeUnion() == LeftJoinType { yyLOCAL = NaturalLeftJoinType @@ -17199,161 +17259,153 @@ yydefault: } } yyVAL.union = yyLOCAL - case 980: + case 981: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5141 +//line sql.y:5145 { yyVAL.tableName = yyDollar[2].tableName } - case 981: + case 982: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5145 +//line sql.y:5149 { yyVAL.tableName = yyDollar[1].tableName } - case 982: + case 983: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5151 +//line sql.y:5155 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 983: + case 984: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5155 +//line sql.y:5159 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS} } - case 984: + case 985: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5161 +//line sql.y:5165 { yyVAL.tableName = TableName{Name: yyDollar[1].identifierCS} } - case 985: + case 986: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5166 +//line sql.y:5170 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 986: + case 987: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5170 +//line sql.y:5174 { yyLOCAL = yyDollar[1].indexHintsUnion() } yyVAL.union = yyLOCAL - case 987: + case 988: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:5176 +//line sql.y:5180 { yyLOCAL = IndexHints{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL - case 988: + case 989: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5180 +//line sql.y:5184 { yySLICE := (*IndexHints)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexHintUnion()) } - case 989: + case 990: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5186 +//line sql.y:5190 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 990: + case 991: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5190 +//line sql.y:5194 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion()} } yyVAL.union = yyLOCAL - case 991: + case 992: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5194 +//line sql.y:5198 { yyLOCAL = &IndexHint{Type: IgnoreOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 992: + case 993: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:5198 +//line sql.y:5202 { yyLOCAL = &IndexHint{Type: ForceOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 993: + case 994: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5203 +//line sql.y:5207 { yyLOCAL = NoForType } yyVAL.union = yyLOCAL - case 994: + case 995: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5207 +//line sql.y:5211 { yyLOCAL = JoinForType } yyVAL.union = yyLOCAL - case 995: + case 996: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5211 +//line sql.y:5215 { yyLOCAL = OrderByForType } yyVAL.union = yyLOCAL - case 996: + case 997: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:5215 +//line sql.y:5219 { yyLOCAL = GroupByForType } yyVAL.union = yyLOCAL - case 997: + case 998: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5221 +//line sql.y:5225 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 998: + case 999: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5225 +//line sql.y:5229 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 999: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL Expr -//line sql.y:5232 - { - yyLOCAL = &OrExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} - } - yyVAL.union = yyLOCAL case 1000: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5236 { - yyLOCAL = &XorExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} + yyLOCAL = &OrExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1001: @@ -17361,193 +17413,193 @@ yydefault: var yyLOCAL Expr //line sql.y:5240 { - yyLOCAL = &AndExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} + yyLOCAL = &XorExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1002: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5244 { - yyLOCAL = &NotExpr{Expr: yyDollar[2].exprUnion()} + yyLOCAL = &AndExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1003: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5248 { - yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].isExprOperatorUnion()} + yyLOCAL = &NotExpr{Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1004: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5252 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].isExprOperatorUnion()} } yyVAL.union = yyLOCAL case 1005: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5256 { - yyLOCAL = &AssignmentExpr{Left: yyDollar[1].variableUnion(), Right: yyDollar[3].exprUnion()} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1006: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5260 { - yyLOCAL = &MemberOfExpr{Value: yyDollar[1].exprUnion(), JSONArr: yyDollar[5].exprUnion()} + yyLOCAL = &AssignmentExpr{Left: yyDollar[1].variableUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1007: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5266 +//line sql.y:5264 { - yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNullOp} + yyLOCAL = &MemberOfExpr{Value: yyDollar[1].exprUnion(), JSONArr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1008: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5270 { - yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNotNullOp} + yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNullOp} } yyVAL.union = yyLOCAL case 1009: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5274 { - yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Right: yyDollar[3].exprUnion()} + yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNotNullOp} } yyVAL.union = yyLOCAL case 1010: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5278 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1011: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5284 +//line sql.y:5282 { - yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: InOp, Right: yyDollar[3].colTupleUnion()} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1012: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5288 { - yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotInOp, Right: yyDollar[4].colTupleUnion()} + yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: InOp, Right: yyDollar[3].colTupleUnion()} } yyVAL.union = yyLOCAL case 1013: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5292 { - yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: true, From: yyDollar[3].exprUnion(), To: yyDollar[5].exprUnion()} + yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotInOp, Right: yyDollar[4].colTupleUnion()} } yyVAL.union = yyLOCAL case 1014: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5296 { - yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: false, From: yyDollar[4].exprUnion(), To: yyDollar[6].exprUnion()} + yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: true, From: yyDollar[3].exprUnion(), To: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1015: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5300 { - yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: false, From: yyDollar[4].exprUnion(), To: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL case 1016: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5304 { - yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion()} + yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1017: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5308 { - yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion(), Escape: yyDollar[5].exprUnion()} + yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1018: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5312 { - yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion(), Escape: yyDollar[6].exprUnion()} + yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion(), Escape: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1019: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5316 { - yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: RegexpOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion(), Escape: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL case 1020: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5320 { - yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotRegexpOp, Right: yyDollar[4].exprUnion()} + yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: RegexpOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1021: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5324 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotRegexpOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1022: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5330 + var yyLOCAL Expr +//line sql.y:5328 { + yyLOCAL = yyDollar[1].exprUnion() } + yyVAL.union = yyLOCAL case 1023: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5333 +//line sql.y:5334 { } case 1024: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL Expr -//line sql.y:5339 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:5337 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } - yyVAL.union = yyLOCAL case 1025: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5343 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1026: @@ -17555,7 +17607,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5347 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1027: @@ -17563,7 +17615,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5351 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1028: @@ -17571,7 +17623,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5355 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1029: @@ -17579,15 +17631,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5359 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1030: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5363 { - yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinaryAdd, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1031: @@ -17595,15 +17647,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5367 { - yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinarySub, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} + yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinaryAdd, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1032: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5371 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinarySub, Date: yyDollar[1].exprUnion(), Unit: yyDollar[5].intervalTypeUnion(), Interval: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1033: @@ -17611,7 +17663,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5375 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1034: @@ -17619,7 +17671,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5379 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1035: @@ -17627,7 +17679,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5383 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1036: @@ -17635,7 +17687,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5387 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1037: @@ -17643,21 +17695,21 @@ yydefault: var yyLOCAL Expr //line sql.y:5391 { - yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1038: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5395 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1039: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5401 +//line sql.y:5399 { yyLOCAL = yyDollar[1].exprUnion() } @@ -17687,19 +17739,19 @@ yydefault: } yyVAL.union = yyLOCAL case 1043: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5417 { - yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1044: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:5421 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } yyVAL.union = yyLOCAL case 1045: @@ -17715,15 +17767,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5429 { - yyLOCAL = yyDollar[1].variableUnion() + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1047: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5433 { - yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? + yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL case 1048: @@ -17731,7 +17783,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5437 { - yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} + yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? } yyVAL.union = yyLOCAL case 1049: @@ -17739,7 +17791,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5441 { - yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} + yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1050: @@ -17747,15 +17799,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5445 { - yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} + yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1051: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5449 { - yyLOCAL = yyDollar[1].subqueryUnion() + yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL case 1052: @@ -17763,23 +17815,23 @@ yydefault: var yyLOCAL Expr //line sql.y:5453 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL case 1053: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr //line sql.y:5457 { - yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1054: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5461 { - yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} + yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} } yyVAL.union = yyLOCAL case 1055: @@ -17787,15 +17839,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5465 { - yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} + yyLOCAL = &MatchExpr{Columns: yyDollar[2].colNamesUnion(), Expr: yyDollar[5].exprUnion(), Option: yyDollar[6].matchExprOptionUnion()} } yyVAL.union = yyLOCAL case 1056: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr //line sql.y:5469 { - yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} + yyLOCAL = &CastExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion(), Array: yyDollar[6].booleanUnion()} } yyVAL.union = yyLOCAL case 1057: @@ -17803,13 +17855,21 @@ yydefault: var yyLOCAL Expr //line sql.y:5473 { - yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} + yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} } yyVAL.union = yyLOCAL case 1058: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5477 + { + yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} + } + yyVAL.union = yyLOCAL + case 1059: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL Expr +//line sql.y:5481 { // From: https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#operator_binary // To convert a string expression to a binary string, these constructs are equivalent: @@ -17818,91 +17878,83 @@ yydefault: yyLOCAL = &ConvertExpr{Expr: yyDollar[2].exprUnion(), Type: &ConvertType{Type: yyDollar[1].str}} } yyVAL.union = yyLOCAL - case 1059: + case 1060: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5485 +//line sql.y:5489 { yyLOCAL = &Default{ColName: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 1060: + case 1061: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:5489 +//line sql.y:5493 { yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprBinaryAddLeft, Date: yyDollar[5].exprUnion(), Unit: yyDollar[3].intervalTypeUnion(), Interval: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1061: + case 1062: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5493 +//line sql.y:5497 { yyLOCAL = &IntervalFuncExpr{Expr: yyDollar[3].exprUnion(), Exprs: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 1062: + case 1063: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5497 +//line sql.y:5501 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONExtractOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1063: + case 1064: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5501 +//line sql.y:5505 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: JSONUnquoteExtractOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1064: + case 1065: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5507 +//line sql.y:5511 { yyLOCAL = yyDollar[1].colNamesUnion() } yyVAL.union = yyLOCAL - case 1065: + case 1066: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5511 +//line sql.y:5515 { yyLOCAL = yyDollar[2].colNamesUnion() } yyVAL.union = yyLOCAL - case 1066: + case 1067: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColName -//line sql.y:5517 +//line sql.y:5521 { yyLOCAL = []*ColName{yyDollar[1].colNameUnion()} } yyVAL.union = yyLOCAL - case 1067: + case 1068: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5521 +//line sql.y:5525 { yySLICE := (*[]*ColName)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colNameUnion()) } - case 1068: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL TrimType -//line sql.y:5527 - { - yyLOCAL = BothTrimType - } - yyVAL.union = yyLOCAL case 1069: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType //line sql.y:5531 { - yyLOCAL = LeadingTrimType + yyLOCAL = BothTrimType } yyVAL.union = yyLOCAL case 1070: @@ -17910,15 +17962,15 @@ yydefault: var yyLOCAL TrimType //line sql.y:5535 { - yyLOCAL = TrailingTrimType + yyLOCAL = LeadingTrimType } yyVAL.union = yyLOCAL case 1071: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL FrameUnitType -//line sql.y:5541 + var yyLOCAL TrimType +//line sql.y:5539 { - yyLOCAL = FrameRowsType + yyLOCAL = TrailingTrimType } yyVAL.union = yyLOCAL case 1072: @@ -17926,15 +17978,15 @@ yydefault: var yyLOCAL FrameUnitType //line sql.y:5545 { - yyLOCAL = FrameRangeType + yyLOCAL = FrameRowsType } yyVAL.union = yyLOCAL case 1073: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ArgumentLessWindowExprType -//line sql.y:5552 + var yyLOCAL FrameUnitType +//line sql.y:5549 { - yyLOCAL = CumeDistExprType + yyLOCAL = FrameRangeType } yyVAL.union = yyLOCAL case 1074: @@ -17942,7 +17994,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5556 { - yyLOCAL = DenseRankExprType + yyLOCAL = CumeDistExprType } yyVAL.union = yyLOCAL case 1075: @@ -17950,7 +18002,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5560 { - yyLOCAL = PercentRankExprType + yyLOCAL = DenseRankExprType } yyVAL.union = yyLOCAL case 1076: @@ -17958,7 +18010,7 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5564 { - yyLOCAL = RankExprType + yyLOCAL = PercentRankExprType } yyVAL.union = yyLOCAL case 1077: @@ -17966,15 +18018,15 @@ yydefault: var yyLOCAL ArgumentLessWindowExprType //line sql.y:5568 { - yyLOCAL = RowNumberExprType + yyLOCAL = RankExprType } yyVAL.union = yyLOCAL case 1078: - yyDollar = yyS[yypt-2 : yypt+1] - var yyLOCAL *FramePoint -//line sql.y:5574 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ArgumentLessWindowExprType +//line sql.y:5572 { - yyLOCAL = &FramePoint{Type: CurrentRowType} + yyLOCAL = RowNumberExprType } yyVAL.union = yyLOCAL case 1079: @@ -17982,7 +18034,7 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5578 { - yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} + yyLOCAL = &FramePoint{Type: CurrentRowType} } yyVAL.union = yyLOCAL case 1080: @@ -17990,7 +18042,7 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5582 { - yyLOCAL = &FramePoint{Type: UnboundedFollowingType} + yyLOCAL = &FramePoint{Type: UnboundedPrecedingType} } yyVAL.union = yyLOCAL case 1081: @@ -17998,309 +18050,309 @@ yydefault: var yyLOCAL *FramePoint //line sql.y:5586 { - yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} + yyLOCAL = &FramePoint{Type: UnboundedFollowingType} } yyVAL.union = yyLOCAL case 1082: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint //line sql.y:5590 { - yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} + yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL case 1083: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *FramePoint //line sql.y:5594 { - yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} + yyLOCAL = &FramePoint{Type: ExprPrecedingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } yyVAL.union = yyLOCAL case 1084: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FramePoint //line sql.y:5598 { - yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} + yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL case 1085: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL *FramePoint +//line sql.y:5602 + { + yyLOCAL = &FramePoint{Type: ExprFollowingType, Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} + } + yyVAL.union = yyLOCAL + case 1086: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5603 +//line sql.y:5607 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1086: + case 1087: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5607 +//line sql.y:5611 { yyLOCAL = yyDollar[1].frameClauseUnion() } yyVAL.union = yyLOCAL - case 1087: + case 1088: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5613 +//line sql.y:5617 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[2].framePointUnion()} } yyVAL.union = yyLOCAL - case 1088: + case 1089: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *FrameClause -//line sql.y:5617 +//line sql.y:5621 { yyLOCAL = &FrameClause{Unit: yyDollar[1].frameUnitTypeUnion(), Start: yyDollar[3].framePointUnion(), End: yyDollar[5].framePointUnion()} } yyVAL.union = yyLOCAL - case 1089: + case 1090: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:5622 +//line sql.y:5626 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1090: + case 1091: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:5626 +//line sql.y:5630 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1091: + case 1092: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5631 +//line sql.y:5635 { } - case 1092: + case 1093: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5634 +//line sql.y:5638 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1093: + case 1094: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *WindowSpecification -//line sql.y:5640 +//line sql.y:5644 { yyLOCAL = &WindowSpecification{Name: yyDollar[1].identifierCI, PartitionClause: yyDollar[2].exprsUnion(), OrderClause: yyDollar[3].orderByUnion(), FrameClause: yyDollar[4].frameClauseUnion()} } yyVAL.union = yyLOCAL - case 1094: + case 1095: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5646 +//line sql.y:5650 { yyLOCAL = &OverClause{WindowSpec: yyDollar[3].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1095: + case 1096: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OverClause -//line sql.y:5650 +//line sql.y:5654 { yyLOCAL = &OverClause{WindowName: yyDollar[2].identifierCI} } yyVAL.union = yyLOCAL - case 1096: + case 1097: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5655 +//line sql.y:5659 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1098: + case 1099: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *NullTreatmentClause -//line sql.y:5662 +//line sql.y:5666 { yyLOCAL = &NullTreatmentClause{yyDollar[1].nullTreatmentTypeUnion()} } yyVAL.union = yyLOCAL - case 1099: + case 1100: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5668 +//line sql.y:5672 { yyLOCAL = RespectNullsType } yyVAL.union = yyLOCAL - case 1100: + case 1101: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL NullTreatmentType -//line sql.y:5672 +//line sql.y:5676 { yyLOCAL = IgnoreNullsType } yyVAL.union = yyLOCAL - case 1101: + case 1102: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5678 +//line sql.y:5682 { yyLOCAL = FirstValueExprType } yyVAL.union = yyLOCAL - case 1102: + case 1103: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL FirstOrLastValueExprType -//line sql.y:5682 +//line sql.y:5686 { yyLOCAL = LastValueExprType } yyVAL.union = yyLOCAL - case 1103: + case 1104: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5688 +//line sql.y:5692 { yyLOCAL = FromFirstType } yyVAL.union = yyLOCAL - case 1104: + case 1105: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL FromFirstLastType -//line sql.y:5692 +//line sql.y:5696 { yyLOCAL = FromLastType } yyVAL.union = yyLOCAL - case 1105: + case 1106: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5697 +//line sql.y:5701 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1107: + case 1108: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *FromFirstLastClause -//line sql.y:5704 +//line sql.y:5708 { yyLOCAL = &FromFirstLastClause{yyDollar[1].fromFirstLastTypeUnion()} } yyVAL.union = yyLOCAL - case 1108: + case 1109: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5710 +//line sql.y:5714 { yyLOCAL = LagExprType } yyVAL.union = yyLOCAL - case 1109: + case 1110: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LagLeadExprType -//line sql.y:5714 +//line sql.y:5718 { yyLOCAL = LeadExprType } yyVAL.union = yyLOCAL - case 1110: + case 1111: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *WindowDefinition -//line sql.y:5720 +//line sql.y:5724 { yyLOCAL = &WindowDefinition{Name: yyDollar[1].identifierCI, WindowSpec: yyDollar[4].windowSpecificationUnion()} } yyVAL.union = yyLOCAL - case 1111: + case 1112: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL WindowDefinitions -//line sql.y:5726 +//line sql.y:5730 { yyLOCAL = WindowDefinitions{yyDollar[1].windowDefinitionUnion()} } yyVAL.union = yyLOCAL - case 1112: + case 1113: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5730 +//line sql.y:5734 { yySLICE := (*WindowDefinitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].windowDefinitionUnion()) } - case 1113: + case 1114: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5736 +//line sql.y:5740 { yyVAL.str = "" } - case 1114: + case 1115: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5740 +//line sql.y:5744 { yyVAL.str = string(yyDollar[2].identifierCI.String()) } - case 1115: + case 1116: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5746 +//line sql.y:5750 { yyLOCAL = BoolVal(true) } yyVAL.union = yyLOCAL - case 1116: + case 1117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:5750 +//line sql.y:5754 { yyLOCAL = BoolVal(false) } yyVAL.union = yyLOCAL - case 1117: + case 1118: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5757 +//line sql.y:5761 { yyLOCAL = IsTrueOp } yyVAL.union = yyLOCAL - case 1118: + case 1119: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5761 +//line sql.y:5765 { yyLOCAL = IsNotTrueOp } yyVAL.union = yyLOCAL - case 1119: + case 1120: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5765 +//line sql.y:5769 { yyLOCAL = IsFalseOp } yyVAL.union = yyLOCAL - case 1120: + case 1121: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:5769 +//line sql.y:5773 { yyLOCAL = IsNotFalseOp } yyVAL.union = yyLOCAL - case 1121: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ComparisonExprOperator -//line sql.y:5775 - { - yyLOCAL = EqualOp - } - yyVAL.union = yyLOCAL case 1122: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator //line sql.y:5779 { - yyLOCAL = LessThanOp + yyLOCAL = EqualOp } yyVAL.union = yyLOCAL case 1123: @@ -18308,7 +18360,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5783 { - yyLOCAL = GreaterThanOp + yyLOCAL = LessThanOp } yyVAL.union = yyLOCAL case 1124: @@ -18316,7 +18368,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5787 { - yyLOCAL = LessEqualOp + yyLOCAL = GreaterThanOp } yyVAL.union = yyLOCAL case 1125: @@ -18324,7 +18376,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5791 { - yyLOCAL = GreaterEqualOp + yyLOCAL = LessEqualOp } yyVAL.union = yyLOCAL case 1126: @@ -18332,7 +18384,7 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5795 { - yyLOCAL = NotEqualOp + yyLOCAL = GreaterEqualOp } yyVAL.union = yyLOCAL case 1127: @@ -18340,15 +18392,15 @@ yydefault: var yyLOCAL ComparisonExprOperator //line sql.y:5799 { - yyLOCAL = NullSafeEqualOp + yyLOCAL = NotEqualOp } yyVAL.union = yyLOCAL case 1128: yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL ColTuple -//line sql.y:5805 + var yyLOCAL ComparisonExprOperator +//line sql.y:5803 { - yyLOCAL = yyDollar[1].valTupleUnion() + yyLOCAL = NullSafeEqualOp } yyVAL.union = yyLOCAL case 1129: @@ -18356,159 +18408,159 @@ yydefault: var yyLOCAL ColTuple //line sql.y:5809 { - yyLOCAL = yyDollar[1].subqueryUnion() + yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL case 1130: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple //line sql.y:5813 + { + yyLOCAL = yyDollar[1].subqueryUnion() + } + yyVAL.union = yyLOCAL + case 1131: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL ColTuple +//line sql.y:5817 { yyLOCAL = ListArg(yyDollar[1].str[2:]) markBindVariable(yylex, yyDollar[1].str[2:]) } yyVAL.union = yyLOCAL - case 1131: + case 1132: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Subquery -//line sql.y:5820 +//line sql.y:5824 { yyLOCAL = &Subquery{yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1132: + case 1133: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:5826 +//line sql.y:5830 { yyLOCAL = Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 1133: + case 1134: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5830 +//line sql.y:5834 { yySLICE := (*Exprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].exprUnion()) } - case 1134: + case 1135: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5840 +//line sql.y:5844 { yyLOCAL = &FuncExpr{Name: yyDollar[1].identifierCI, Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1135: + case 1136: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5844 +//line sql.y:5848 { yyLOCAL = &FuncExpr{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCI, Exprs: yyDollar[5].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1136: - yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL Expr -//line sql.y:5854 - { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].selectExprsUnion()} - } - yyVAL.union = yyLOCAL case 1137: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5858 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("left"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1138: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5862 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("right"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1139: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5866 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1140: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5870 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1141: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:5874 { - yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1142: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:5878 { - yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} + yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1143: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5882 { - yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} + yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1144: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5886 { - yyLOCAL = &InsertExpr{Str: yyDollar[3].exprUnion(), Pos: yyDollar[5].exprUnion(), Len: yyDollar[7].exprUnion(), NewStr: yyDollar[9].exprUnion()} + yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL case 1145: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr //line sql.y:5890 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} + yyLOCAL = &InsertExpr{Str: yyDollar[3].exprUnion(), Pos: yyDollar[5].exprUnion(), Len: yyDollar[7].exprUnion(), NewStr: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL case 1146: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5901 +//line sql.y:5894 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1147: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5905 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("utc_date")} } yyVAL.union = yyLOCAL case 1148: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5911 +//line sql.y:5909 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1149: @@ -18516,7 +18568,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5915 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("curdate")} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("current_date")} } yyVAL.union = yyLOCAL case 1150: @@ -18524,39 +18576,39 @@ yydefault: var yyLOCAL Expr //line sql.y:5919 { - yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].integerUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("curdate")} } yyVAL.union = yyLOCAL case 1151: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5924 +//line sql.y:5923 { - yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("curtime"), Fsp: yyDollar[2].integerUnion()} + yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("utc_time"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL case 1152: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5929 +//line sql.y:5928 { - yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].integerUnion()} + yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("curtime"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL case 1153: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr //line sql.y:5933 { - yyLOCAL = &CountStar{} + yyLOCAL = &CurTimeFuncExpr{Name: NewIdentifierCI("current_time"), Fsp: yyDollar[2].integerUnion()} } yyVAL.union = yyLOCAL case 1154: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5937 { - yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion()} + yyLOCAL = &CountStar{} } yyVAL.union = yyLOCAL case 1155: @@ -18564,7 +18616,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5941 { - yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Count{Distinct: yyDollar[3].booleanUnion(), Args: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL case 1156: @@ -18572,7 +18624,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5945 { - yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Max{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1157: @@ -18580,7 +18632,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5949 { - yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Min{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1158: @@ -18588,15 +18640,15 @@ yydefault: var yyLOCAL Expr //line sql.y:5953 { - yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} + yyLOCAL = &Sum{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1159: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:5957 { - yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &Avg{Distinct: yyDollar[3].booleanUnion(), Arg: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL case 1160: @@ -18604,7 +18656,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5961 { - yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitAnd{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1161: @@ -18612,7 +18664,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5965 { - yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitOr{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1162: @@ -18620,7 +18672,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5969 { - yyLOCAL = &Std{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &BitXor{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1163: @@ -18628,7 +18680,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5973 { - yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &Std{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1164: @@ -18636,7 +18688,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5977 { - yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdDev{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1165: @@ -18644,7 +18696,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5981 { - yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdPop{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1166: @@ -18652,7 +18704,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5985 { - yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &StdSamp{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1167: @@ -18660,7 +18712,7 @@ yydefault: var yyLOCAL Expr //line sql.y:5989 { - yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &VarPop{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1168: @@ -18668,31 +18720,31 @@ yydefault: var yyLOCAL Expr //line sql.y:5993 { - yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &VarSamp{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1169: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:5997 { - yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].exprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} + yyLOCAL = &Variance{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1170: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6001 { - yyLOCAL = &AnyValue{Arg: yyDollar[3].exprUnion()} + yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].exprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} } yyVAL.union = yyLOCAL case 1171: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6005 { - yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprTimestampadd, Date: yyDollar[7].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} + yyLOCAL = &AnyValue{Arg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1172: @@ -18700,31 +18752,31 @@ yydefault: var yyLOCAL Expr //line sql.y:6009 { - yyLOCAL = &TimestampDiffExpr{Unit: yyDollar[3].intervalTypeUnion(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} + yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprTimestampadd, Date: yyDollar[7].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: yyDollar[3].intervalTypeUnion()} } yyVAL.union = yyLOCAL case 1173: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6013 { - yyLOCAL = &ExtractFuncExpr{IntervalType: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} + yyLOCAL = &TimestampDiffExpr{Unit: yyDollar[3].intervalTypeUnion(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1174: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6017 { - yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} + yyLOCAL = &ExtractFuncExpr{IntervalType: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1175: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:6021 { - yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} } yyVAL.union = yyLOCAL case 1176: @@ -18732,7 +18784,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6025 { - yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1177: @@ -18740,7 +18792,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6029 { - yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} + yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1178: @@ -18748,7 +18800,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6033 { - yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, Type: LeadingTrimType, StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1179: @@ -18756,23 +18808,23 @@ yydefault: var yyLOCAL Expr //line sql.y:6037 { - yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, Type: TrailingTrimType, StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, Type: LeadingTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1180: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6041 { - yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} + yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, Type: TrailingTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1181: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr //line sql.y:6045 { - yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL case 1182: @@ -18780,15 +18832,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6049 { - yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} + yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1183: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6053 { - yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} + yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1184: @@ -18796,7 +18848,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6057 { - yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} + yyLOCAL = &CharExpr{Exprs: yyDollar[3].exprsUnion(), Charset: yyDollar[5].str} } yyVAL.union = yyLOCAL case 1185: @@ -18804,23 +18856,23 @@ yydefault: var yyLOCAL Expr //line sql.y:6061 { - yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} + yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1186: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6065 { - yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion(), Pos: yyDollar[7].exprUnion()} + yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1187: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6069 { - yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} + yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion(), Pos: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1188: @@ -18828,15 +18880,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6073 { - yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} + yyLOCAL = &LocateExpr{SubStr: yyDollar[3].exprUnion(), Str: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1189: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6077 { - yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: GetLock, Name: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1190: @@ -18844,31 +18896,31 @@ yydefault: var yyLOCAL Expr //line sql.y:6081 { - yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: IsFreeLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1191: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6085 { - yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} + yyLOCAL = &LockingFunc{Type: IsUsedLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1192: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr //line sql.y:6089 { - yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} + yyLOCAL = &LockingFunc{Type: ReleaseAllLocks} } yyVAL.union = yyLOCAL case 1193: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6093 { - yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} + yyLOCAL = &LockingFunc{Type: ReleaseLock, Name: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1194: @@ -18876,15 +18928,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6097 { - yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} + yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1195: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6101 { - yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} + yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1196: @@ -18892,39 +18944,39 @@ yydefault: var yyLOCAL Expr //line sql.y:6105 { - yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion()} + yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1197: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6109 { - yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1198: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6113 { - yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFormatExpr{FormatType: BinaryFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1199: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6117 { - yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1200: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6121 { - yyLOCAL = &GeomPropertyFuncExpr{Property: IsEmpty, Geom: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFormatExpr{FormatType: TextFormat, Geom: yyDollar[3].exprUnion(), AxisOrderOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1201: @@ -18932,7 +18984,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6125 { - yyLOCAL = &GeomPropertyFuncExpr{Property: IsSimple, Geom: yyDollar[3].exprUnion()} + yyLOCAL = &GeomPropertyFuncExpr{Property: IsEmpty, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1202: @@ -18940,7 +18992,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6129 { - yyLOCAL = &GeomPropertyFuncExpr{Property: Dimension, Geom: yyDollar[3].exprUnion()} + yyLOCAL = &GeomPropertyFuncExpr{Property: IsSimple, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1203: @@ -18948,7 +19000,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6133 { - yyLOCAL = &GeomPropertyFuncExpr{Property: Envelope, Geom: yyDollar[3].exprUnion()} + yyLOCAL = &GeomPropertyFuncExpr{Property: Dimension, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1204: @@ -18956,7 +19008,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6137 { - yyLOCAL = &GeomPropertyFuncExpr{Property: GeometryType, Geom: yyDollar[3].exprUnion()} + yyLOCAL = &GeomPropertyFuncExpr{Property: Envelope, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1205: @@ -18964,39 +19016,39 @@ yydefault: var yyLOCAL Expr //line sql.y:6141 { - yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion()} + yyLOCAL = &GeomPropertyFuncExpr{Property: GeometryType, Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1206: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6145 { - yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} + yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1207: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6149 { - yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion()} + yyLOCAL = &PointPropertyFuncExpr{Property: Latitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1208: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6153 { - yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} + yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1209: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6157 { - yyLOCAL = &LinestrPropertyFuncExpr{Property: EndPoint, Linestring: yyDollar[3].exprUnion()} + yyLOCAL = &PointPropertyFuncExpr{Property: Longitude, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1210: @@ -19004,7 +19056,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6161 { - yyLOCAL = &LinestrPropertyFuncExpr{Property: IsClosed, Linestring: yyDollar[3].exprUnion()} + yyLOCAL = &LinestrPropertyFuncExpr{Property: EndPoint, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1211: @@ -19012,39 +19064,39 @@ yydefault: var yyLOCAL Expr //line sql.y:6165 { - yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion()} + yyLOCAL = &LinestrPropertyFuncExpr{Property: IsClosed, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1212: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6169 { - yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} + yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1213: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6173 { - yyLOCAL = &LinestrPropertyFuncExpr{Property: NumPoints, Linestring: yyDollar[3].exprUnion()} + yyLOCAL = &LinestrPropertyFuncExpr{Property: Length, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1214: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6177 { - yyLOCAL = &LinestrPropertyFuncExpr{Property: PointN, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} + yyLOCAL = &LinestrPropertyFuncExpr{Property: NumPoints, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1215: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6181 { - yyLOCAL = &LinestrPropertyFuncExpr{Property: StartPoint, Linestring: yyDollar[3].exprUnion()} + yyLOCAL = &LinestrPropertyFuncExpr{Property: PointN, Linestring: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1216: @@ -19052,423 +19104,423 @@ yydefault: var yyLOCAL Expr //line sql.y:6185 { - yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion()} + yyLOCAL = &LinestrPropertyFuncExpr{Property: StartPoint, Linestring: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1217: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6189 { - yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} + yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1218: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6193 { - yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion()} + yyLOCAL = &PointPropertyFuncExpr{Property: XCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1219: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6197 { - yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} + yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1220: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6201 { - yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion()} + yyLOCAL = &PointPropertyFuncExpr{Property: YCordinate, Point: yyDollar[3].exprUnion(), ValueToSet: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1221: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6205 { - yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1222: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6209 { - yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1223: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6213 { - yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: GeometryFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1224: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6217 { - yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1225: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6221 { - yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1226: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6225 { - yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: GeometryCollectionFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1227: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6229 { - yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1228: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6233 { - yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1229: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6237 { - yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: LineStringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1230: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6241 { - yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1231: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6245 { - yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1232: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6249 { - yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: MultiLinestringFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1233: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6253 { - yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1234: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6257 { - yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1235: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6261 { - yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: MultiPointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1236: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6265 { - yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1237: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6269 { - yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1238: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6273 { - yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: MultiPolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1239: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6277 { - yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1240: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6281 { - yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1241: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6285 { - yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: PointFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1242: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6289 { - yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1243: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6293 { - yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1244: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6297 { - yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromTextExpr{Type: PolygonFromText, WktText: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1245: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6301 { - yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1246: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6305 { - yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1247: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6309 { - yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: GeometryFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1248: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6313 { - yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1249: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6317 { - yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1250: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6321 { - yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: GeometryCollectionFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1251: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6325 { - yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1252: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6329 { - yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1253: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6333 { - yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: LineStringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1254: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6337 { - yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1255: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6341 { - yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1256: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6345 { - yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: MultiLinestringFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1257: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6349 { - yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1258: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6353 { - yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1259: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6357 { - yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: MultiPointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1260: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6361 { - yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1261: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6365 { - yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1262: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6369 { - yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: MultiPolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1263: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6373 { - yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1264: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6377 { - yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1265: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6381 { - yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: PointFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1266: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6385 { - yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1267: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6389 { - yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1268: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6393 { - yyLOCAL = &PolygonPropertyFuncExpr{Property: Area, Polygon: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromWKBExpr{Type: PolygonFromWKB, WkbBlob: yyDollar[3].exprUnion(), Srid: yyDollar[5].exprUnion(), AxisOrderOpt: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1269: @@ -19476,7 +19528,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6397 { - yyLOCAL = &PolygonPropertyFuncExpr{Property: Centroid, Polygon: yyDollar[3].exprUnion()} + yyLOCAL = &PolygonPropertyFuncExpr{Property: Area, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1270: @@ -19484,63 +19536,63 @@ yydefault: var yyLOCAL Expr //line sql.y:6401 { - yyLOCAL = &PolygonPropertyFuncExpr{Property: ExteriorRing, Polygon: yyDollar[3].exprUnion()} + yyLOCAL = &PolygonPropertyFuncExpr{Property: Centroid, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1271: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6405 { - yyLOCAL = &PolygonPropertyFuncExpr{Property: InteriorRingN, Polygon: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} + yyLOCAL = &PolygonPropertyFuncExpr{Property: ExteriorRing, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1272: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6409 { - yyLOCAL = &PolygonPropertyFuncExpr{Property: NumInteriorRings, Polygon: yyDollar[3].exprUnion()} + yyLOCAL = &PolygonPropertyFuncExpr{Property: InteriorRingN, Polygon: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1273: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6413 { - yyLOCAL = &GeomCollPropertyFuncExpr{Property: GeometryN, GeomColl: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} + yyLOCAL = &PolygonPropertyFuncExpr{Property: NumInteriorRings, Polygon: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1274: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6417 { - yyLOCAL = &GeomCollPropertyFuncExpr{Property: NumGeometries, GeomColl: yyDollar[3].exprUnion()} + yyLOCAL = &GeomCollPropertyFuncExpr{Property: GeometryN, GeomColl: yyDollar[3].exprUnion(), PropertyDefArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1275: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6421 { - yyLOCAL = &GeoHashFromLatLongExpr{Longitude: yyDollar[3].exprUnion(), Latitude: yyDollar[5].exprUnion(), MaxLength: yyDollar[7].exprUnion()} + yyLOCAL = &GeomCollPropertyFuncExpr{Property: NumGeometries, GeomColl: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1276: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6425 { - yyLOCAL = &GeoHashFromPointExpr{Point: yyDollar[3].exprUnion(), MaxLength: yyDollar[5].exprUnion()} + yyLOCAL = &GeoHashFromLatLongExpr{Longitude: yyDollar[3].exprUnion(), Latitude: yyDollar[5].exprUnion(), MaxLength: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1277: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6429 { - yyLOCAL = &GeomFromGeoHashExpr{GeomType: LatitudeFromHash, GeoHash: yyDollar[3].exprUnion()} + yyLOCAL = &GeoHashFromPointExpr{Point: yyDollar[3].exprUnion(), MaxLength: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1278: @@ -19548,71 +19600,71 @@ yydefault: var yyLOCAL Expr //line sql.y:6433 { - yyLOCAL = &GeomFromGeoHashExpr{GeomType: LongitudeFromHash, GeoHash: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromGeoHashExpr{GeomType: LatitudeFromHash, GeoHash: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1279: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6437 { - yyLOCAL = &GeomFromGeoHashExpr{GeomType: PointFromHash, GeoHash: yyDollar[3].exprUnion(), SridOpt: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromGeoHashExpr{GeomType: LongitudeFromHash, GeoHash: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1280: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6441 { - yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromGeoHashExpr{GeomType: PointFromHash, GeoHash: yyDollar[3].exprUnion(), SridOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1281: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6445 { - yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion()} + yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1282: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6449 { - yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion(), Srid: yyDollar[7].exprUnion()} + yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1283: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6453 { - yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion()} + yyLOCAL = &GeomFromGeoJSONExpr{GeoJSON: yyDollar[3].exprUnion(), HigherDimHandlerOpt: yyDollar[5].exprUnion(), Srid: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1284: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6457 { - yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion()} + yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1285: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6461 { - yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion(), Bitmask: yyDollar[7].exprUnion()} + yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1286: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6465 { - yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} + yyLOCAL = &GeoJSONFromGeomExpr{Geom: yyDollar[3].exprUnion(), MaxDecimalDigits: yyDollar[5].exprUnion(), Bitmask: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1287: @@ -19620,47 +19672,47 @@ yydefault: var yyLOCAL Expr //line sql.y:6469 { - yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} + yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1288: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6473 { - yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprsUnion()[0], PathList: yyDollar[5].exprsUnion()[1:]} + yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1289: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6477 { - yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].exprsUnion()} + yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprsUnion()[0], PathList: yyDollar[5].exprsUnion()[1:]} } yyVAL.union = yyLOCAL case 1290: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6481 { - yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].exprsUnion()} } yyVAL.union = yyLOCAL case 1291: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6485 { - yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1292: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6489 { - yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} + yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1293: @@ -19668,39 +19720,39 @@ yydefault: var yyLOCAL Expr //line sql.y:6493 { - yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} + yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1294: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6497 { - yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} + yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1295: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6501 { - yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprsUnion()[0], PathList: yyDollar[9].exprsUnion()[1:]} + yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL case 1296: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr //line sql.y:6505 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion()} + yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprsUnion()[0], PathList: yyDollar[9].exprsUnion()[1:]} } yyVAL.union = yyLOCAL case 1297: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr //line sql.y:6509 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion()} } yyVAL.union = yyLOCAL case 1298: @@ -19708,23 +19760,23 @@ yydefault: var yyLOCAL Expr //line sql.y:6513 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL case 1299: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6517 { - yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} } yyVAL.union = yyLOCAL case 1300: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr //line sql.y:6521 { - yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion(), ReturningType: yyDollar[6].convertTypeUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} } yyVAL.union = yyLOCAL case 1301: @@ -19732,7 +19784,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6525 { - yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1302: @@ -19740,7 +19792,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6529 { - yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1303: @@ -19748,15 +19800,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6533 { - yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1304: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6537 { - yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} + yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1305: @@ -19764,7 +19816,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6541 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1306: @@ -19772,7 +19824,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6545 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1307: @@ -19780,7 +19832,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6549 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1308: @@ -19788,7 +19840,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6553 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1309: @@ -19796,7 +19848,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6557 { - yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1310: @@ -19804,7 +19856,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6561 { - yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL case 1311: @@ -19812,7 +19864,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6565 { - yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1312: @@ -19820,7 +19872,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6569 { - yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1313: @@ -19828,15 +19880,15 @@ yydefault: var yyLOCAL Expr //line sql.y:6573 { - yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} + yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1314: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6577 { - yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} + yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL case 1315: @@ -19844,7 +19896,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6581 { - yyLOCAL = &MultiPolygonExpr{PolygonParams: yyDollar[3].exprsUnion()} + yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL case 1316: @@ -19852,7 +19904,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6585 { - yyLOCAL = &MultiPointExpr{PointParams: yyDollar[3].exprsUnion()} + yyLOCAL = &MultiPolygonExpr{PolygonParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1317: @@ -19860,7 +19912,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6589 { - yyLOCAL = &MultiLinestringExpr{LinestringParams: yyDollar[3].exprsUnion()} + yyLOCAL = &MultiPointExpr{PointParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1318: @@ -19868,7 +19920,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6593 { - yyLOCAL = &PolygonExpr{LinestringParams: yyDollar[3].exprsUnion()} + yyLOCAL = &MultiLinestringExpr{LinestringParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1319: @@ -19876,87 +19928,87 @@ yydefault: var yyLOCAL Expr //line sql.y:6597 { - yyLOCAL = &LineStringExpr{PointParams: yyDollar[3].exprsUnion()} + yyLOCAL = &PolygonExpr{LinestringParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1320: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6601 { - yyLOCAL = &PointExpr{XCordinate: yyDollar[3].exprUnion(), YCordinate: yyDollar[5].exprUnion()} + yyLOCAL = &LineStringExpr{PointParams: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL case 1321: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6605 { - yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} + yyLOCAL = &PointExpr{XCordinate: yyDollar[3].exprUnion(), YCordinate: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL case 1322: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr //line sql.y:6609 { - yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} + yyLOCAL = &ArgumentLessWindowExpr{Type: yyDollar[1].argumentLessWindowExprTypeUnion(), OverClause: yyDollar[4].overClauseUnion()} } yyVAL.union = yyLOCAL case 1323: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6613 { - yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} + yyLOCAL = &FirstOrLastValueExpr{Type: yyDollar[1].firstOrLastValueExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL case 1324: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr //line sql.y:6617 { - yyLOCAL = &NTHValueExpr{Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), FromFirstLastClause: yyDollar[7].fromFirstLastClauseUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} + yyLOCAL = &NtileExpr{N: yyDollar[3].exprUnion(), OverClause: yyDollar[5].overClauseUnion()} } yyVAL.union = yyLOCAL case 1325: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr //line sql.y:6621 { - yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} + yyLOCAL = &NTHValueExpr{Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), FromFirstLastClause: yyDollar[7].fromFirstLastClauseUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL case 1326: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6625 { - yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), Default: yyDollar[6].exprUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} + yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), NullTreatmentClause: yyDollar[5].nullTreatmentClauseUnion(), OverClause: yyDollar[6].overClauseUnion()} } yyVAL.union = yyLOCAL case 1327: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr //line sql.y:6629 { - yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} + yyLOCAL = &LagLeadExpr{Type: yyDollar[1].lagLeadExprTypeUnion(), Expr: yyDollar[3].exprUnion(), N: yyDollar[5].exprUnion(), Default: yyDollar[6].exprUnion(), NullTreatmentClause: yyDollar[8].nullTreatmentClauseUnion(), OverClause: yyDollar[9].overClauseUnion()} } yyVAL.union = yyLOCAL case 1328: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6633 { - yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} + yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL case 1329: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr //line sql.y:6637 { - yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateAdd, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} + yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprAdddate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} } yyVAL.union = yyLOCAL case 1330: @@ -19964,7 +20016,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6641 { - yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateSub, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} + yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateAdd, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL case 1331: @@ -19972,23 +20024,23 @@ yydefault: var yyLOCAL Expr //line sql.y:6645 { - yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} + yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprDateSub, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL case 1332: - yyDollar = yyS[yypt-6 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr //line sql.y:6649 { - yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} + yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[6].exprUnion(), Unit: yyDollar[7].intervalTypeUnion()} } yyVAL.union = yyLOCAL - case 1337: - yyDollar = yyS[yypt-1 : yypt+1] + case 1333: + yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6659 +//line sql.y:6653 { - yyLOCAL = yyDollar[1].exprUnion() + yyLOCAL = &IntervalDateExpr{Syntax: IntervalDateExprSubdate, Date: yyDollar[3].exprUnion(), Interval: yyDollar[5].exprUnion(), Unit: IntervalNone} } yyVAL.union = yyLOCAL case 1338: @@ -19996,7 +20048,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6663 { - yyLOCAL = NewIntLiteral(yyDollar[1].str) + yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL case 1339: @@ -20004,7 +20056,7 @@ yydefault: var yyLOCAL Expr //line sql.y:6667 { - yyLOCAL = yyDollar[1].variableUnion() + yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL case 1340: @@ -20012,282 +20064,282 @@ yydefault: var yyLOCAL Expr //line sql.y:6671 { - yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) + yyLOCAL = yyDollar[1].variableUnion() } yyVAL.union = yyLOCAL case 1341: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL Expr +//line sql.y:6675 + { + yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) + } + yyVAL.union = yyLOCAL + case 1342: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:6676 +//line sql.y:6680 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1342: + case 1343: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:6680 +//line sql.y:6684 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1343: + case 1344: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6686 +//line sql.y:6690 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1344: + case 1345: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6690 +//line sql.y:6694 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1345: + case 1346: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6694 +//line sql.y:6698 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1346: + case 1347: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6698 +//line sql.y:6702 { yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1347: + case 1348: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6702 +//line sql.y:6706 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpInstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), ReturnOption: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1348: + case 1349: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6707 +//line sql.y:6711 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1349: + case 1350: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6711 +//line sql.y:6715 { yyLOCAL = &RegexpLikeExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), MatchType: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1350: + case 1351: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6715 +//line sql.y:6719 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1351: + case 1352: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6719 +//line sql.y:6723 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1352: + case 1353: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6723 +//line sql.y:6727 { yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1353: + case 1354: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL Expr -//line sql.y:6727 +//line sql.y:6731 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpReplaceExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Repl: yyDollar[7].exprUnion(), Position: yyDollar[9].exprUnion(), Occurrence: yyDollar[11].exprUnion(), MatchType: yyDollar[13].exprUnion()} } yyVAL.union = yyLOCAL - case 1354: + case 1355: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6732 +//line sql.y:6736 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1355: + case 1356: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6736 +//line sql.y:6740 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1356: + case 1357: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Expr -//line sql.y:6740 +//line sql.y:6744 { yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion()} } yyVAL.union = yyLOCAL - case 1357: + case 1358: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Expr -//line sql.y:6744 +//line sql.y:6748 { // Match type is kept expression as TRIM( ' m ') is accepted yyLOCAL = &RegexpSubstrExpr{Expr: yyDollar[3].exprUnion(), Pattern: yyDollar[5].exprUnion(), Position: yyDollar[7].exprUnion(), Occurrence: yyDollar[9].exprUnion(), MatchType: yyDollar[11].exprUnion()} } yyVAL.union = yyLOCAL - case 1358: + case 1359: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6751 +//line sql.y:6755 { yyLOCAL = &ExtractValueExpr{Fragment: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1359: + case 1360: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6755 +//line sql.y:6759 { yyLOCAL = &UpdateXMLExpr{Target: yyDollar[3].exprUnion(), XPathExpr: yyDollar[5].exprUnion(), NewXML: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1360: + case 1361: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6761 +//line sql.y:6765 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatBytesType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1361: + case 1362: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6765 +//line sql.y:6769 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: FormatPicoTimeType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1362: + case 1363: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:6769 +//line sql.y:6773 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsCurrentThreadIDType} } yyVAL.union = yyLOCAL - case 1363: + case 1364: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6773 +//line sql.y:6777 { yyLOCAL = &PerformanceSchemaFuncExpr{Type: PsThreadIDType, Argument: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1364: + case 1365: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6779 +//line sql.y:6783 { yyLOCAL = >IDFuncExpr{Type: GTIDSubsetType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1365: + case 1366: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6783 +//line sql.y:6787 { yyLOCAL = >IDFuncExpr{Type: GTIDSubtractType, Set1: yyDollar[3].exprUnion(), Set2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1366: + case 1367: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6787 +//line sql.y:6791 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1367: + case 1368: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6791 +//line sql.y:6795 { yyLOCAL = >IDFuncExpr{Type: WaitForExecutedGTIDSetType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1368: + case 1369: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:6795 +//line sql.y:6799 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1369: + case 1370: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:6799 +//line sql.y:6803 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 1370: + case 1371: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:6803 +//line sql.y:6807 { yyLOCAL = >IDFuncExpr{Type: WaitUntilSQLThreadAfterGTIDSType, Set1: yyDollar[3].exprUnion(), Timeout: yyDollar[5].exprUnion(), Channel: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 1371: + case 1372: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6808 +//line sql.y:6812 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1372: + case 1373: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:6812 +//line sql.y:6816 { yyLOCAL = yyDollar[2].convertTypeUnion() } yyVAL.union = yyLOCAL - case 1373: - yyDollar = yyS[yypt-1 : yypt+1] - var yyLOCAL IntervalType -//line sql.y:6818 - { - yyLOCAL = IntervalDayHour - } - yyVAL.union = yyLOCAL case 1374: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType //line sql.y:6822 { - yyLOCAL = IntervalDayMicrosecond + yyLOCAL = IntervalDayHour } yyVAL.union = yyLOCAL case 1375: @@ -20295,7 +20347,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6826 { - yyLOCAL = IntervalDayMinute + yyLOCAL = IntervalDayMicrosecond } yyVAL.union = yyLOCAL case 1376: @@ -20303,7 +20355,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6830 { - yyLOCAL = IntervalDaySecond + yyLOCAL = IntervalDayMinute } yyVAL.union = yyLOCAL case 1377: @@ -20311,7 +20363,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6834 { - yyLOCAL = IntervalHourMicrosecond + yyLOCAL = IntervalDaySecond } yyVAL.union = yyLOCAL case 1378: @@ -20319,7 +20371,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6838 { - yyLOCAL = IntervalHourMinute + yyLOCAL = IntervalHourMicrosecond } yyVAL.union = yyLOCAL case 1379: @@ -20327,7 +20379,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6842 { - yyLOCAL = IntervalHourSecond + yyLOCAL = IntervalHourMinute } yyVAL.union = yyLOCAL case 1380: @@ -20335,7 +20387,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6846 { - yyLOCAL = IntervalMinuteMicrosecond + yyLOCAL = IntervalHourSecond } yyVAL.union = yyLOCAL case 1381: @@ -20343,7 +20395,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6850 { - yyLOCAL = IntervalMinuteSecond + yyLOCAL = IntervalMinuteMicrosecond } yyVAL.union = yyLOCAL case 1382: @@ -20351,7 +20403,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6854 { - yyLOCAL = IntervalSecondMicrosecond + yyLOCAL = IntervalMinuteSecond } yyVAL.union = yyLOCAL case 1383: @@ -20359,7 +20411,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6858 { - yyLOCAL = IntervalYearMonth + yyLOCAL = IntervalSecondMicrosecond } yyVAL.union = yyLOCAL case 1384: @@ -20367,7 +20419,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6862 { - yyLOCAL = IntervalDay + yyLOCAL = IntervalYearMonth } yyVAL.union = yyLOCAL case 1385: @@ -20375,7 +20427,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6866 { - yyLOCAL = IntervalWeek + yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL case 1386: @@ -20383,7 +20435,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6870 { - yyLOCAL = IntervalHour + yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL case 1387: @@ -20391,7 +20443,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6874 { - yyLOCAL = IntervalMinute + yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL case 1388: @@ -20399,7 +20451,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6878 { - yyLOCAL = IntervalMonth + yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL case 1389: @@ -20407,7 +20459,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6882 { - yyLOCAL = IntervalQuarter + yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL case 1390: @@ -20415,7 +20467,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6886 { - yyLOCAL = IntervalSecond + yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL case 1391: @@ -20423,7 +20475,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6890 { - yyLOCAL = IntervalMicrosecond + yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL case 1392: @@ -20431,15 +20483,15 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6894 { - yyLOCAL = IntervalYear + yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL case 1393: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalType -//line sql.y:6900 +//line sql.y:6898 { - yyLOCAL = IntervalDay + yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL case 1394: @@ -20447,7 +20499,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6904 { - yyLOCAL = IntervalWeek + yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL case 1395: @@ -20455,7 +20507,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6908 { - yyLOCAL = IntervalHour + yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL case 1396: @@ -20463,7 +20515,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6912 { - yyLOCAL = IntervalMinute + yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL case 1397: @@ -20471,7 +20523,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6916 { - yyLOCAL = IntervalMonth + yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL case 1398: @@ -20479,7 +20531,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6920 { - yyLOCAL = IntervalQuarter + yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL case 1399: @@ -20487,7 +20539,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6924 { - yyLOCAL = IntervalSecond + yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL case 1400: @@ -20495,7 +20547,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6928 { - yyLOCAL = IntervalMicrosecond + yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL case 1401: @@ -20503,7 +20555,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6932 { - yyLOCAL = IntervalYear + yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL case 1402: @@ -20511,7 +20563,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6936 { - yyLOCAL = IntervalDay + yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL case 1403: @@ -20519,7 +20571,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6940 { - yyLOCAL = IntervalWeek + yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL case 1404: @@ -20527,7 +20579,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6944 { - yyLOCAL = IntervalHour + yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL case 1405: @@ -20535,7 +20587,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6948 { - yyLOCAL = IntervalMinute + yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL case 1406: @@ -20543,7 +20595,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6952 { - yyLOCAL = IntervalMonth + yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL case 1407: @@ -20551,7 +20603,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6956 { - yyLOCAL = IntervalQuarter + yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL case 1408: @@ -20559,7 +20611,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6960 { - yyLOCAL = IntervalSecond + yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL case 1409: @@ -20567,7 +20619,7 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6964 { - yyLOCAL = IntervalMicrosecond + yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL case 1410: @@ -20575,19 +20627,19 @@ yydefault: var yyLOCAL IntervalType //line sql.y:6968 { - yyLOCAL = IntervalYear + yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1413: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL int -//line sql.y:6978 + case 1411: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL IntervalType +//line sql.y:6972 { - yyLOCAL = 0 + yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL case 1414: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int //line sql.y:6982 { @@ -20595,19 +20647,19 @@ yydefault: } yyVAL.union = yyLOCAL case 1415: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int //line sql.y:6986 { - yyLOCAL = convertStringToInt(yyDollar[2].str) + yyLOCAL = 0 } yyVAL.union = yyLOCAL case 1416: - yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL Expr -//line sql.y:6996 + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL int +//line sql.y:6990 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = convertStringToInt(yyDollar[2].str) } yyVAL.union = yyLOCAL case 1417: @@ -20615,7 +20667,7 @@ yydefault: var yyLOCAL Expr //line sql.y:7000 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("if"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1418: @@ -20623,7 +20675,7 @@ yydefault: var yyLOCAL Expr //line sql.y:7004 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("database"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1419: @@ -20631,7 +20683,7 @@ yydefault: var yyLOCAL Expr //line sql.y:7008 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("schema"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1420: @@ -20639,60 +20691,62 @@ yydefault: var yyLOCAL Expr //line sql.y:7012 { - yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].selectExprsUnion()} + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("mod"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1421: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL MatchExprOption -//line sql.y:7018 + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL Expr +//line sql.y:7016 { - yyLOCAL = NoOption + yyLOCAL = &FuncExpr{Name: NewIdentifierCI("replace"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL case 1422: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:7022 { - yyLOCAL = BooleanModeOpt + yyLOCAL = NoOption } yyVAL.union = yyLOCAL case 1423: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:7026 { - yyLOCAL = NaturalLanguageModeOpt + yyLOCAL = BooleanModeOpt } yyVAL.union = yyLOCAL case 1424: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:7030 { - yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt + yyLOCAL = NaturalLanguageModeOpt } yyVAL.union = yyLOCAL case 1425: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL MatchExprOption //line sql.y:7034 { - yyLOCAL = QueryExpansionOpt + yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt } yyVAL.union = yyLOCAL case 1426: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7040 + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL MatchExprOption +//line sql.y:7038 { - yyVAL.str = string(yyDollar[1].identifierCI.String()) + yyLOCAL = QueryExpansionOpt } + yyVAL.union = yyLOCAL case 1427: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:7044 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = string(yyDollar[1].identifierCI.String()) } case 1428: yyDollar = yyS[yypt-1 : yypt+1] @@ -20701,19 +20755,17 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1429: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL *ConvertType -//line sql.y:7054 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:7052 { - yyLOCAL = nil + yyVAL.str = string(yyDollar[1].str) } - yyVAL.union = yyLOCAL case 1430: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType //line sql.y:7058 { - yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: NewIntLiteral(yyDollar[4].str)} + yyLOCAL = nil } yyVAL.union = yyLOCAL case 1431: @@ -20725,73 +20777,73 @@ yydefault: } yyVAL.union = yyLOCAL case 1432: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7068 +//line sql.y:7066 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: NewIntLiteral(yyDollar[4].str)} } yyVAL.union = yyLOCAL case 1433: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:7072 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].columnCharset} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1434: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConvertType //line sql.y:7076 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].columnCharset} } yyVAL.union = yyLOCAL case 1435: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:7080 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1436: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:7084 - { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} - yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length - yyLOCAL.Scale = yyDollar[2].LengthScaleOption.Scale + { + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1437: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:7090 +//line sql.y:7088 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length + yyLOCAL.Scale = yyDollar[2].LengthScaleOption.Scale } yyVAL.union = yyLOCAL case 1438: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:7094 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1439: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:7098 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1440: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:7102 { @@ -20803,19 +20855,19 @@ yydefault: var yyLOCAL *ConvertType //line sql.y:7106 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1442: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:7110 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1443: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType //line sql.y:7114 { @@ -20827,15 +20879,15 @@ yydefault: var yyLOCAL *ConvertType //line sql.y:7118 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL case 1445: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType //line sql.y:7122 { - yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL case 1446: @@ -20847,140 +20899,148 @@ yydefault: } yyVAL.union = yyLOCAL case 1447: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL *ConvertType +//line sql.y:7130 + { + yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} + } + yyVAL.union = yyLOCAL + case 1448: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7132 +//line sql.y:7136 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1448: + case 1449: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7136 +//line sql.y:7140 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1449: + case 1450: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7141 +//line sql.y:7145 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1450: + case 1451: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7145 +//line sql.y:7149 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1451: + case 1452: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7150 +//line sql.y:7154 { yyVAL.str = string("") } - case 1452: + case 1453: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7154 +//line sql.y:7158 { yyVAL.str = encodeSQLString(yyDollar[2].str) } - case 1453: + case 1454: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*When -//line sql.y:7160 +//line sql.y:7164 { yyLOCAL = []*When{yyDollar[1].whenUnion()} } yyVAL.union = yyLOCAL - case 1454: + case 1455: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7164 +//line sql.y:7168 { yySLICE := (*[]*When)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].whenUnion()) } - case 1455: + case 1456: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *When -//line sql.y:7170 +//line sql.y:7174 { yyLOCAL = &When{Cond: yyDollar[2].exprUnion(), Val: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1456: + case 1457: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7175 +//line sql.y:7179 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1457: + case 1458: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7179 +//line sql.y:7183 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1458: + case 1459: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:7185 +//line sql.y:7189 { yyLOCAL = &ColName{Name: yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1459: + case 1460: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:7189 +//line sql.y:7193 { yyLOCAL = &ColName{Name: NewIdentifierCI(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 1460: + case 1461: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColName -//line sql.y:7193 +//line sql.y:7197 { yyLOCAL = &ColName{Qualifier: TableName{Name: yyDollar[1].identifierCS}, Name: yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1461: + case 1462: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColName -//line sql.y:7197 +//line sql.y:7201 { yyLOCAL = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].identifierCS, Name: yyDollar[3].identifierCS}, Name: yyDollar[5].identifierCI} } yyVAL.union = yyLOCAL - case 1462: + case 1463: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7203 +//line sql.y:7207 { yyLOCAL = yyDollar[1].colNameUnion() } yyVAL.union = yyLOCAL - case 1463: + case 1464: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7207 +//line sql.y:7211 { yyLOCAL = &Offset{V: convertStringToInt(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1464: + case 1465: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7213 +//line sql.y:7217 { // TODO(sougou): Deprecate this construct. if yyDollar[1].identifierCI.Lowered() != "value" { @@ -20990,218 +21050,210 @@ yydefault: yyLOCAL = NewIntLiteral("1") } yyVAL.union = yyLOCAL - case 1465: + case 1466: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7222 +//line sql.y:7226 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1466: + case 1467: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7226 +//line sql.y:7230 { yyLOCAL = parseBindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1467: + case 1468: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:7231 +//line sql.y:7235 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1468: + case 1469: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:7235 +//line sql.y:7239 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1469: + case 1470: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:7240 +//line sql.y:7244 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1470: + case 1471: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:7244 +//line sql.y:7248 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1471: + case 1472: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *NamedWindow -//line sql.y:7250 +//line sql.y:7254 { yyLOCAL = &NamedWindow{yyDollar[2].windowDefinitionsUnion()} } yyVAL.union = yyLOCAL - case 1472: + case 1473: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7256 +//line sql.y:7260 { yyLOCAL = NamedWindows{yyDollar[1].namedWindowUnion()} } yyVAL.union = yyLOCAL - case 1473: + case 1474: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7260 +//line sql.y:7264 { yySLICE := (*NamedWindows)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].namedWindowUnion()) } - case 1474: + case 1475: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7265 +//line sql.y:7269 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1475: + case 1476: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL NamedWindows -//line sql.y:7269 +//line sql.y:7273 { yyLOCAL = yyDollar[1].namedWindowsUnion() } yyVAL.union = yyLOCAL - case 1476: + case 1477: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7274 +//line sql.y:7278 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1477: + case 1478: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7278 +//line sql.y:7282 { yyLOCAL = yyDollar[1].orderByUnion() } yyVAL.union = yyLOCAL - case 1478: + case 1479: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7284 +//line sql.y:7288 { yyLOCAL = yyDollar[3].orderByUnion() } yyVAL.union = yyLOCAL - case 1479: + case 1480: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:7290 +//line sql.y:7294 { yyLOCAL = OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL - case 1480: + case 1481: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7294 +//line sql.y:7298 { yySLICE := (*OrderBy)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].orderUnion()) } - case 1481: + case 1482: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Order -//line sql.y:7300 +//line sql.y:7304 { yyLOCAL = &Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 1482: + case 1483: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7305 +//line sql.y:7309 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1483: + case 1484: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7309 +//line sql.y:7313 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1484: + case 1485: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:7313 +//line sql.y:7317 { yyLOCAL = DescOrder } yyVAL.union = yyLOCAL - case 1485: + case 1486: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Limit -//line sql.y:7318 +//line sql.y:7322 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1486: + case 1487: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Limit -//line sql.y:7322 +//line sql.y:7326 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1487: + case 1488: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Limit -//line sql.y:7328 +//line sql.y:7332 { yyLOCAL = &Limit{Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1488: + case 1489: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:7332 +//line sql.y:7336 { yyLOCAL = &Limit{Offset: yyDollar[2].exprUnion(), Rowcount: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1489: + case 1490: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:7336 +//line sql.y:7340 { yyLOCAL = &Limit{Offset: yyDollar[4].exprUnion(), Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1490: - yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL []AlterOption -//line sql.y:7341 - { - yyLOCAL = nil - } - yyVAL.union = yyLOCAL case 1491: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption //line sql.y:7345 { - yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} + yyLOCAL = nil } yyVAL.union = yyLOCAL case 1492: @@ -21213,11 +21265,11 @@ yydefault: } yyVAL.union = yyLOCAL case 1493: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption //line sql.y:7353 { - yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} + yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL case 1494: @@ -21229,11 +21281,11 @@ yydefault: } yyVAL.union = yyLOCAL case 1495: - yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL AlterOption -//line sql.y:7364 + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL []AlterOption +//line sql.y:7361 { - yyLOCAL = &LockOption{Type: DefaultType} + yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 1496: @@ -21241,7 +21293,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:7368 { - yyLOCAL = &LockOption{Type: NoneType} + yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL case 1497: @@ -21249,7 +21301,7 @@ yydefault: var yyLOCAL AlterOption //line sql.y:7372 { - yyLOCAL = &LockOption{Type: SharedType} + yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL case 1498: @@ -21257,15 +21309,15 @@ yydefault: var yyLOCAL AlterOption //line sql.y:7376 { - yyLOCAL = &LockOption{Type: ExclusiveType} + yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL case 1499: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:7382 +//line sql.y:7380 { - yyLOCAL = AlgorithmValue(yyDollar[3].str) + yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL case 1500: @@ -21293,16 +21345,18 @@ yydefault: } yyVAL.union = yyLOCAL case 1503: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7399 + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL AlterOption +//line sql.y:7398 { - yyVAL.str = "" + yyLOCAL = AlgorithmValue(yyDollar[3].str) } + yyVAL.union = yyLOCAL case 1504: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:7403 { - yyVAL.str = string(yyDollar[3].str) + yyVAL.str = "" } case 1505: yyDollar = yyS[yypt-3 : yypt+1] @@ -21317,22 +21371,22 @@ yydefault: yyVAL.str = string(yyDollar[3].str) } case 1507: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7416 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:7415 { - yyVAL.str = "" + yyVAL.str = string(yyDollar[3].str) } case 1508: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:7420 { - yyVAL.str = yyDollar[3].str + yyVAL.str = "" } case 1509: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7426 + yyDollar = yyS[yypt-3 : yypt+1] +//line sql.y:7424 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = yyDollar[3].str } case 1510: yyDollar = yyS[yypt-1 : yypt+1] @@ -21341,28 +21395,28 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1511: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7435 + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:7434 { - yyVAL.str = "" + yyVAL.str = string(yyDollar[1].str) } case 1512: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:7439 { - yyVAL.str = yyDollar[2].str + yyVAL.str = "" } case 1513: - yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7444 + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:7443 { - yyVAL.str = "cascaded" + yyVAL.str = yyDollar[2].str } case 1514: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:7448 { - yyVAL.str = string(yyDollar[1].str) + yyVAL.str = "cascaded" } case 1515: yyDollar = yyS[yypt-1 : yypt+1] @@ -21371,45 +21425,51 @@ yydefault: yyVAL.str = string(yyDollar[1].str) } case 1516: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:7456 + { + yyVAL.str = string(yyDollar[1].str) + } + case 1517: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Definer -//line sql.y:7457 +//line sql.y:7461 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1517: + case 1518: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:7461 +//line sql.y:7465 { yyLOCAL = yyDollar[3].definerUnion() } yyVAL.union = yyLOCAL - case 1518: + case 1519: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Definer -//line sql.y:7467 +//line sql.y:7471 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1519: + case 1520: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:7473 +//line sql.y:7477 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1520: + case 1521: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Definer -//line sql.y:7479 +//line sql.y:7483 { yyLOCAL = &Definer{ Name: yyDollar[1].str, @@ -21417,369 +21477,369 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1521: + case 1522: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7488 +//line sql.y:7492 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 1522: + case 1523: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7492 +//line sql.y:7496 { yyVAL.str = formatIdentifier(yyDollar[1].str) } - case 1523: + case 1524: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7497 +//line sql.y:7501 { yyVAL.str = "" } - case 1524: + case 1525: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7501 +//line sql.y:7505 { yyVAL.str = formatAddress(yyDollar[1].str) } - case 1525: + case 1526: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:7507 +//line sql.y:7511 { yyLOCAL = ForUpdateLock } yyVAL.union = yyLOCAL - case 1526: + case 1527: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:7511 +//line sql.y:7515 { yyLOCAL = ShareModeLock } yyVAL.union = yyLOCAL - case 1527: + case 1528: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7517 +//line sql.y:7521 { yyLOCAL = &SelectInto{Type: IntoOutfileS3, FileName: encodeSQLString(yyDollar[4].str), Charset: yyDollar[5].columnCharset, FormatOption: yyDollar[6].str, ExportOption: yyDollar[7].str, Manifest: yyDollar[8].str, Overwrite: yyDollar[9].str} } yyVAL.union = yyLOCAL - case 1528: + case 1529: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7521 +//line sql.y:7525 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: ColumnCharset{}, FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1529: + case 1530: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7525 +//line sql.y:7529 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].columnCharset, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1530: + case 1531: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7530 +//line sql.y:7534 { yyVAL.str = "" } - case 1531: + case 1532: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7534 +//line sql.y:7538 { yyVAL.str = " format csv" + yyDollar[3].str } - case 1532: + case 1533: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7538 +//line sql.y:7542 { yyVAL.str = " format text" + yyDollar[3].str } - case 1533: + case 1534: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7543 +//line sql.y:7547 { yyVAL.str = "" } - case 1534: + case 1535: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7547 +//line sql.y:7551 { yyVAL.str = " header" } - case 1535: + case 1536: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7552 +//line sql.y:7556 { yyVAL.str = "" } - case 1536: + case 1537: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7556 +//line sql.y:7560 { yyVAL.str = " manifest on" } - case 1537: + case 1538: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7560 +//line sql.y:7564 { yyVAL.str = " manifest off" } - case 1538: + case 1539: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7565 +//line sql.y:7569 { yyVAL.str = "" } - case 1539: + case 1540: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7569 +//line sql.y:7573 { yyVAL.str = " overwrite on" } - case 1540: + case 1541: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7573 +//line sql.y:7577 { yyVAL.str = " overwrite off" } - case 1541: + case 1542: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7579 +//line sql.y:7583 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1542: + case 1543: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7584 +//line sql.y:7588 { yyVAL.str = "" } - case 1543: + case 1544: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7588 +//line sql.y:7592 { yyVAL.str = " lines" + yyDollar[2].str } - case 1544: + case 1545: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7594 +//line sql.y:7598 { yyVAL.str = yyDollar[1].str } - case 1545: + case 1546: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7598 +//line sql.y:7602 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1546: + case 1547: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7604 +//line sql.y:7608 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } - case 1547: + case 1548: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7608 +//line sql.y:7612 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1548: + case 1549: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7613 +//line sql.y:7617 { yyVAL.str = "" } - case 1549: + case 1550: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7617 +//line sql.y:7621 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } - case 1550: + case 1551: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7623 +//line sql.y:7627 { yyVAL.str = yyDollar[1].str } - case 1551: + case 1552: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7627 +//line sql.y:7631 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1552: + case 1553: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7633 +//line sql.y:7637 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1553: + case 1554: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7637 +//line sql.y:7641 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } - case 1554: + case 1555: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7641 +//line sql.y:7645 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } - case 1555: + case 1556: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7646 +//line sql.y:7650 { yyVAL.str = "" } - case 1556: + case 1557: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7650 +//line sql.y:7654 { yyVAL.str = " optionally" } - case 1557: + case 1558: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Insert -//line sql.y:7663 +//line sql.y:7667 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion()} } yyVAL.union = yyLOCAL - case 1558: + case 1559: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:7667 +//line sql.y:7671 { yyLOCAL = &Insert{Rows: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1559: + case 1560: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:7671 +//line sql.y:7675 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion()} } yyVAL.union = yyLOCAL - case 1560: + case 1561: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7675 +//line sql.y:7679 { yyLOCAL = &Insert{Columns: []IdentifierCI{}, Rows: yyDollar[4].valuesUnion()} } yyVAL.union = yyLOCAL - case 1561: + case 1562: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7679 +//line sql.y:7683 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1562: + case 1563: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:7685 +//line sql.y:7689 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1563: + case 1564: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:7689 +//line sql.y:7693 { yyLOCAL = Columns{yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1564: + case 1565: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7693 +//line sql.y:7697 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 1565: + case 1566: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:7697 +//line sql.y:7701 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].identifierCI) } - case 1566: + case 1567: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7702 +//line sql.y:7706 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1567: + case 1568: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7706 +//line sql.y:7710 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 1568: + case 1569: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7712 +//line sql.y:7716 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL - case 1569: + case 1570: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7716 +//line sql.y:7720 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) } - case 1570: + case 1571: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7722 +//line sql.y:7726 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1571: + case 1572: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7726 +//line sql.y:7730 { yyLOCAL = ValTuple{} } yyVAL.union = yyLOCAL - case 1572: + case 1573: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7732 +//line sql.y:7736 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 1573: + case 1574: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7736 +//line sql.y:7740 { yyLOCAL = ValTuple(yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 1574: + case 1575: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7741 +//line sql.y:7745 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -21788,212 +21848,206 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1575: + case 1576: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7751 +//line sql.y:7755 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 1576: + case 1577: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7755 +//line sql.y:7759 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) } - case 1577: + case 1578: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:7761 +//line sql.y:7765 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1579: + case 1580: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7768 +//line sql.y:7772 { yyVAL.str = "charset" } - case 1582: + case 1583: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7778 +//line sql.y:7782 { yyLOCAL = NewStrLiteral(yyDollar[1].identifierCI.String()) } yyVAL.union = yyLOCAL - case 1583: + case 1584: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7782 +//line sql.y:7786 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1584: + case 1585: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7786 +//line sql.y:7790 { yyLOCAL = &Default{} } yyVAL.union = yyLOCAL - case 1587: + case 1588: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7795 +//line sql.y:7799 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1588: + case 1589: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7797 +//line sql.y:7801 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1589: + case 1590: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7800 +//line sql.y:7804 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1590: + case 1591: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7802 +//line sql.y:7806 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1591: + case 1592: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7805 +//line sql.y:7809 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1592: + case 1593: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:7807 +//line sql.y:7811 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1593: + case 1594: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:7810 +//line sql.y:7814 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1594: + case 1595: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:7812 +//line sql.y:7816 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1595: + case 1596: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7815 +//line sql.y:7819 { yyVAL.empty = struct{}{} } - case 1596: + case 1597: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7817 +//line sql.y:7821 { yyVAL.empty = struct{}{} } - case 1597: + case 1598: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7819 +//line sql.y:7823 { yyVAL.empty = struct{}{} } - case 1598: + case 1599: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:7823 +//line sql.y:7827 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL - case 1599: + case 1600: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:7828 +//line sql.y:7832 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1600: + case 1601: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:7832 +//line sql.y:7836 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1601: + case 1602: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7837 +//line sql.y:7841 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1602: + case 1603: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7839 +//line sql.y:7843 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 1603: + case 1604: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:7843 +//line sql.y:7847 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].identifierCI.String())} } yyVAL.union = yyLOCAL - case 1604: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7849 - { - yyVAL.identifierCI = yyDollar[1].identifierCI - } case 1605: yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:7853 { - yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) + yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1607: + case 1606: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7860 +//line sql.y:7857 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1608: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7866 +//line sql.y:7864 { - yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } case 1609: yyDollar = yyS[yypt-1 : yypt+1] @@ -22002,79 +22056,79 @@ yydefault: yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } case 1610: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:7874 + { + yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) + } + case 1611: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7876 +//line sql.y:7880 { yyVAL.identifierCS = NewIdentifierCS("") } - case 1611: + case 1612: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7880 +//line sql.y:7884 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 1613: + case 1614: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7887 +//line sql.y:7891 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1614: + case 1615: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:7893 +//line sql.y:7897 { yyLOCAL = &Kill{Type: yyDollar[2].killTypeUnion(), ProcesslistID: convertStringToUInt64(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 1615: + case 1616: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL KillType -//line sql.y:7899 +//line sql.y:7903 { yyLOCAL = ConnectionType } yyVAL.union = yyLOCAL - case 1616: + case 1617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:7903 +//line sql.y:7907 { yyLOCAL = ConnectionType } yyVAL.union = yyLOCAL - case 1617: + case 1618: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:7907 +//line sql.y:7911 { yyLOCAL = QueryType } yyVAL.union = yyLOCAL - case 2232: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8550 - { - } case 2233: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8555 +//line sql.y:8554 { } case 2234: - yyDollar = yyS[yypt-0 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] //line sql.y:8559 { - skipToEnd(yylex) } case 2235: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8564 +//line sql.y:8563 { skipToEnd(yylex) } case 2236: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-0 : yypt+1] //line sql.y:8568 { skipToEnd(yylex) @@ -22085,6 +22139,12 @@ yydefault: { skipToEnd(yylex) } + case 2238: + yyDollar = yyS[yypt-1 : yypt+1] +//line sql.y:8576 + { + skipToEnd(yylex) + } } goto yystack /* stack new state and value */ } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index fcb481725e9..4ed613718fd 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -4128,6 +4128,10 @@ show_statement: { $$ = &Show{&ShowBasic{Command: VschemaTables}} } +| SHOW VSCHEMA KEYSPACES + { + $$ = &Show{&ShowBasic{Command: VschemaKeyspaces}} + } | SHOW VSCHEMA VINDEXES { $$ = &Show{&ShowBasic{Command: VschemaVindexes}} diff --git a/go/vt/vtgate/planbuilder/show.go b/go/vt/vtgate/planbuilder/show.go index 6e5fad4023a..2a8b11fb70e 100644 --- a/go/vt/vtgate/planbuilder/show.go +++ b/go/vt/vtgate/planbuilder/show.go @@ -20,6 +20,7 @@ import ( "fmt" "regexp" "sort" + "strconv" "strings" "sync" @@ -116,6 +117,8 @@ func buildShowBasicPlan(show *sqlparser.ShowBasic, vschema plancontext.VSchema) return buildShowTargetPlan(vschema) case sqlparser.VschemaTables: return buildVschemaTablesPlan(vschema) + case sqlparser.VschemaKeyspaces: + return buildVschemaKeyspacesPlan(vschema) case sqlparser.VschemaVindexes: return buildVschemaVindexesPlan(show, vschema) } @@ -641,6 +644,26 @@ func buildEnginesPlan() (engine.Primitive, error) { buildVarCharFields("Engine", "Support", "Comment", "Transactions", "XA", "Savepoints")), nil } +func buildVschemaKeyspacesPlan(vschema plancontext.VSchema) (engine.Primitive, error) { + vs := vschema.GetVSchema() + var rows [][]sqltypes.Value + for ksName, ks := range vs.Keyspaces { + var row []sqltypes.Value + row = append(row, sqltypes.NewVarChar(ksName)) + row = append(row, sqltypes.NewVarChar(strconv.FormatBool(ks.Keyspace.Sharded))) + fkMode, _ := vschema.ForeignKeyMode(ksName) + row = append(row, sqltypes.NewVarChar(fkMode.String())) + ksError := "" + if ks.Error != nil { + ksError = ks.Error.Error() + } + row = append(row, sqltypes.NewVarChar(ksError)) + rows = append(rows, row) + } + + return engine.NewRowsPrimitive(rows, buildVarCharFields("Keyspace", "Sharded", "Foreign Key", "Comment")), nil +} + func buildVschemaTablesPlan(vschema plancontext.VSchema) (engine.Primitive, error) { vs := vschema.GetVSchema() ks, err := vschema.DefaultKeyspace() diff --git a/go/vt/vtgate/planbuilder/testdata/show_cases.json b/go/vt/vtgate/planbuilder/testdata/show_cases.json index c20a1c79f5a..896f762819e 100644 --- a/go/vt/vtgate/planbuilder/testdata/show_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/show_cases.json @@ -720,6 +720,24 @@ } } }, + { + "comment": "show vschema keyspaces", + "query": "show vschema keyspaces", + "plan": { + "QueryType": "SHOW", + "Original": "show vschema keyspaces", + "Instructions": { + "OperatorType": "Rows", + "Fields": { + "Comment": "VARCHAR", + "Foreign Key": "VARCHAR", + "Keyspace": "VARCHAR", + "Sharded": "VARCHAR" + }, + "RowCount": 7 + } + } + }, { "comment": "show vschema vindexes", "query": "show vschema vindexes", From d9c0555de3597a20e8c7d143441e597a12b94f3d Mon Sep 17 00:00:00 2001 From: lixin18 <68135097+lixin963@users.noreply.github.com> Date: Tue, 14 Nov 2023 02:59:45 +0800 Subject: [PATCH 24/39] Update create_release.sh (#14492) --- tools/create_release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/create_release.sh b/tools/create_release.sh index 68e051f884e..17c8139dce2 100755 --- a/tools/create_release.sh +++ b/tools/create_release.sh @@ -52,7 +52,7 @@ function createRelease () { rm -f ./.github/workflows/code_freeze.yml.bak # Wait for release notes to be injected in the code base - echo -n Pausing so relase notes can be added. Press enter to continue + echo -n Pausing so release notes can be added. Press enter to continue read line git add --all From 99253961aa8fb04570594f7d02011a4ee17be2d7 Mon Sep 17 00:00:00 2001 From: Deepthi Sigireddi Date: Mon, 13 Nov 2023 21:48:33 -0800 Subject: [PATCH 25/39] release notes: add FK import to summary (#14518) Signed-off-by: deepthi --- changelog/18.0/18.0.0/summary.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog/18.0/18.0.0/summary.md b/changelog/18.0/18.0.0/summary.md index eb2b6692201..35ad018b7bc 100644 --- a/changelog/18.0/18.0.0/summary.md +++ b/changelog/18.0/18.0.0/summary.md @@ -95,6 +95,8 @@ There are 3 foreign key modes now supported in Vitess - 3. `disallow` - In this mode Vitess explicitly disallows any DDL statements that try to create a foreign key constraint. This mode is equivalent to running VTGate with the flag `--foreign_key_mode=disallow`. +In addition to query support, there is a new flag to `MoveTables` called `--atomic-copy` which should be used to import data into Vitess from databases which have foreign keys defined in the schema. + #### Upgrade process After upgrading from v17 to v18, users should specify the correct foreign key mode for all their keyspaces in the VSchema using the new property. From 76299df4aaa2a5048f147433a6102315270a7969 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Tue, 14 Nov 2023 22:06:03 +0200 Subject: [PATCH 26/39] Support `fast_analyze_table` variable, introduced in public MySQL fork (#14494) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/vttablet/onlineddl/schema.go | 3 +++ go/vt/vttablet/onlineddl/vrepl.go | 35 ++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/go/vt/vttablet/onlineddl/schema.go b/go/vt/vttablet/onlineddl/schema.go index 1cef44e08d3..c072da2dc7b 100644 --- a/go/vt/vttablet/onlineddl/schema.go +++ b/go/vt/vttablet/onlineddl/schema.go @@ -528,6 +528,9 @@ const ( sqlShowVariablesLikePreserveForeignKey = "show global variables like 'rename_table_preserve_foreign_key'" sqlEnablePreserveForeignKey = "set @@rename_table_preserve_foreign_key = 1" sqlDisablePreserveForeignKey = "set @@rename_table_preserve_foreign_key = 0" + sqlShowVariablesLikeFastAnalyzeTable = "show global variables like 'fast_analyze_table'" + sqlEnableFastAnalyzeTable = "set @@fast_analyze_table = 1" + sqlDisableFastAnalyzeTable = "set @@fast_analyze_table = 0" sqlGetAutoIncrement = ` SELECT AUTO_INCREMENT diff --git a/go/vt/vttablet/onlineddl/vrepl.go b/go/vt/vttablet/onlineddl/vrepl.go index 8432f79b506..b1dd0ff8629 100644 --- a/go/vt/vttablet/onlineddl/vrepl.go +++ b/go/vt/vttablet/onlineddl/vrepl.go @@ -37,6 +37,7 @@ import ( "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/textutil" "vitess.io/vitess/go/vt/dbconnpool" + "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/schema" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" @@ -247,11 +248,41 @@ func (v *VRepl) readTableUniqueKeys(ctx context.Context, conn *dbconnpool.DBConn return uniqueKeys, nil } +// isFastAnalyzeTableSupported checks if the underlying MySQL server supports 'fast_analyze_table', +// introduced by a fork of MySQL: https://github.com/planetscale/mysql-server/commit/c8a9d93686358dabfba8f3dc5cc0621e3149fe78 +// When `fast_analyze_table=1`, an `ANALYZE TABLE` command only analyzes the clustering index (normally the `PRIMARY KEY`). +// This is useful when you want to get a better estimate of the number of table rows, as fast as possible. +func (v *VRepl) isFastAnalyzeTableSupported(ctx context.Context, conn *dbconnpool.DBConnection) (isSupported bool, err error) { + rs, err := conn.ExecuteFetch(sqlShowVariablesLikeFastAnalyzeTable, math.MaxInt64, true) + if err != nil { + return false, err + } + return len(rs.Rows) > 0, nil +} + // executeAnalyzeTable runs an ANALYZE TABLE command func (v *VRepl) executeAnalyzeTable(ctx context.Context, conn *dbconnpool.DBConnection, tableName string) error { + fastAnalyzeTableSupported, err := v.isFastAnalyzeTableSupported(ctx, conn) + if err != nil { + return err + } + if fastAnalyzeTableSupported { + // This code is only applicable when MySQL supports the 'fast_analyze_table' variable. This variable + // does not exist in vanilla MySQL. + // See https://github.com/planetscale/mysql-server/commit/c8a9d93686358dabfba8f3dc5cc0621e3149fe78 + // as part of https://github.com/planetscale/mysql-server/releases/tag/8.0.34-ps1. + if _, err := conn.ExecuteFetch(sqlEnableFastAnalyzeTable, 1, false); err != nil { + return err + } + log.Infof("@@fast_analyze_table enabled") + defer conn.ExecuteFetch(sqlDisableFastAnalyzeTable, 1, false) + } + parsed := sqlparser.BuildParsedQuery(sqlAnalyzeTable, tableName) - _, err := conn.ExecuteFetch(parsed.Query, 1, false) - return err + if _, err := conn.ExecuteFetch(parsed.Query, 1, false); err != nil { + return err + } + return nil } // readTableStatus reads table status information From 024af9375d36e083b05684452dcbc51e2ab83fd0 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Wed, 15 Nov 2023 06:38:32 +0200 Subject: [PATCH 27/39] Online DDL: edit CONSTRAINT names in CREATE TABLE (#14517) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/mysql/flavor.go | 1 + go/mysql/flavor_mysql.go | 2 ++ go/mysql/flavor_test.go | 10 +++++++++ .../onlineddl/revert/onlineddl_revert_test.go | 18 ++++++++++++++-- .../scheduler/onlineddl_scheduler_test.go | 21 ++++++++++++++++++- go/vt/vttablet/onlineddl/executor.go | 11 ++++++++++ 6 files changed, 60 insertions(+), 3 deletions(-) diff --git a/go/mysql/flavor.go b/go/mysql/flavor.go index edb64913c31..a8c2de2e114 100644 --- a/go/mysql/flavor.go +++ b/go/mysql/flavor.go @@ -55,6 +55,7 @@ const ( MySQLUpgradeInServerFlavorCapability DynamicRedoLogCapacityFlavorCapability // supported in MySQL 8.0.30 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-30.html DisableRedoLogFlavorCapability // supported in MySQL 8.0.21 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-21.html + CheckConstraintsCapability // supported in MySQL 8.0.16 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-16.html ) const ( diff --git a/go/mysql/flavor_mysql.go b/go/mysql/flavor_mysql.go index bc5f31006e5..3cc2e08e489 100644 --- a/go/mysql/flavor_mysql.go +++ b/go/mysql/flavor_mysql.go @@ -397,6 +397,8 @@ func (mysqlFlavor80) supportsCapability(serverVersion string, capability FlavorC return ServerVersionAtLeast(serverVersion, 8, 0, 30) case DisableRedoLogFlavorCapability: return ServerVersionAtLeast(serverVersion, 8, 0, 21) + case CheckConstraintsCapability: + return ServerVersionAtLeast(serverVersion, 8, 0, 16) default: return false, nil } diff --git a/go/mysql/flavor_test.go b/go/mysql/flavor_test.go index 891725b5afc..925504722b7 100644 --- a/go/mysql/flavor_test.go +++ b/go/mysql/flavor_test.go @@ -160,6 +160,16 @@ func TestGetFlavor(t *testing.T) { capability: DisableRedoLogFlavorCapability, isCapable: false, }, + { + version: "8.0.15", + capability: CheckConstraintsCapability, + isCapable: false, + }, + { + version: "8.0.20", + capability: CheckConstraintsCapability, + isCapable: true, + }, } for _, tc := range testcases { name := fmt.Sprintf("%s %v", tc.version, tc.capability) diff --git a/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go b/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go index 41cd5b5a1be..3220465269e 100644 --- a/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go +++ b/go/test/endtoend/onlineddl/revert/onlineddl_revert_test.go @@ -428,7 +428,20 @@ func testRevertible(t *testing.T) { droppedNoDefaultColumnNames := row.AsString("dropped_no_default_column_names", "") expandedColumnNames := row.AsString("expanded_column_names", "") - assert.Equal(t, testcase.removedForeignKeyNames, removeBackticks(removedForeignKeyNames)) + // Online DDL renames constraint names, and keeps the original name as a prefix. + // The name of e.g. "some_fk_2_" might turn into "some_fk_2_518ubnm034rel35l1m0u1dc7m" + expectRemovedForeignKeyNames := strings.Split(testcase.removedForeignKeyNames, ",") + actualRemovedForeignKeyNames := strings.Split(removeBackticks(removedForeignKeyNames), ",") + assert.Equal(t, len(expectRemovedForeignKeyNames), len(actualRemovedForeignKeyNames)) + for _, actualRemovedForeignKeyName := range actualRemovedForeignKeyNames { + found := false + for _, expectRemovedForeignKeyName := range expectRemovedForeignKeyNames { + if strings.HasPrefix(actualRemovedForeignKeyName, expectRemovedForeignKeyName) { + found = true + } + } + assert.Truef(t, found, "unexpected FK name", "%s", actualRemovedForeignKeyName) + } assert.Equal(t, testcase.removedUniqueKeyNames, removeBackticks(removedUniqueKeyNames)) assert.Equal(t, testcase.droppedNoDefaultColumnNames, removeBackticks(droppedNoDefaultColumnNames)) assert.Equal(t, testcase.expandedColumnNames, removeBackticks(expandedColumnNames)) @@ -466,7 +479,8 @@ func testRevertible(t *testing.T) { droppedNoDefaultColumnNames := row.AsString("dropped_no_default_column_names", "") expandedColumnNames := row.AsString("expanded_column_names", "") - assert.Equal(t, "some_fk_2", removeBackticks(removedForeignKeyNames)) + // Online DDL renames constraint names, and keeps the original name as a prefix. The name will be e.g. some_fk_2_518ubnm034rel35l1m0u1dc7m + assert.Contains(t, removeBackticks(removedForeignKeyNames), "some_fk_2") assert.Equal(t, "", removeBackticks(removedUniqueKeyNames)) assert.Equal(t, "", removeBackticks(droppedNoDefaultColumnNames)) assert.Equal(t, "", removeBackticks(expandedColumnNames)) diff --git a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go index fbe6377c1fe..627567441b1 100644 --- a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go +++ b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go @@ -941,6 +941,25 @@ func testScheduler(t *testing.T) { }) }) + checkConstraintCapable, err := capableOf(mysql.CheckConstraintsCapability) // 8.0.16 and above + require.NoError(t, err) + if checkConstraintCapable { + // Constraints + t.Run("CREATE TABLE with CHECK constraint", func(t *testing.T) { + query := `create table with_constraint (id int primary key, check ((id >= 0)))` + uuid := testOnlineDDLStatement(t, createParams(query, ddlStrategy, "vtgate", "chk_", "", false)) + onlineddl.CheckMigrationStatus(t, &vtParams, shards, uuid, schema.OnlineDDLStatusComplete) + t.Run("ensure constraint name is rewritten", func(t *testing.T) { + // Since we did not provide a name for the CHECK constraint, MySQL will + // name it `with_constraint_chk_1`. But we expect Online DDL to explicitly + // modify the constraint name, specifically to get rid of the prefix, + // so that we don't get into https://bugs.mysql.com/bug.php?id=107772 situation. + createStatement := getCreateTableStatement(t, shards[0].Vttablets[0], "with_constraint") + assert.NotContains(t, createStatement, "with_constraint_chk") + }) + }) + } + // INSTANT DDL instantDDLCapable, err := capableOf(mysql.InstantAddLastColumnFlavorCapability) require.NoError(t, err) @@ -2328,7 +2347,7 @@ func testRevertMigration(t *testing.T, params *testRevertMigrationParams) (uuid return uuid } -// checkTable checks the number of tables in the first two shards. +// checkTable checks the number of tables in all shards func checkTable(t *testing.T, showTableName string, expectExists bool) bool { expectCount := 0 if expectExists { diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index 8a3cf61348b..771a9000435 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -2863,6 +2863,17 @@ func (e *Executor) executeCreateDDLActionMigration(ctx context.Context, onlineDD } } } + if originalCreateTable, ok := ddlStmt.(*sqlparser.CreateTable); ok { + newCreateTable := sqlparser.CloneRefOfCreateTable(originalCreateTable) + // Rewrite this CREATE TABLE statement such that CONSTRAINT names are edited, + // specifically removing any prefix. + if _, err := e.validateAndEditCreateTableStatement(ctx, onlineDDL, newCreateTable); err != nil { + return failMigration(err) + } + ddlStmt = newCreateTable + onlineDDL.SQL = sqlparser.String(newCreateTable) + } + // from now on, whether a VIEW or a TABLE, they get the same treatment sentryArtifactTableName, err := schema.GenerateGCTableName(schema.HoldTableGCState, newGCTableRetainTime()) From c823b86a19bfeb9a6a411a75caf492464caf697e Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Wed, 15 Nov 2023 09:30:19 +0200 Subject: [PATCH 28/39] Online DDL: fix endtoend test dropping foreign key (#14522) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- .../scheduler/onlineddl_scheduler_test.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go index 627567441b1..575ecb91091 100644 --- a/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go +++ b/go/test/endtoend/onlineddl/scheduler/onlineddl_scheduler_test.go @@ -2147,7 +2147,7 @@ func testForeignKeys(t *testing.T) { }, { name: "drop foreign key from a child", - sql: "alter table child_table DROP FOREIGN KEY child_parent_fk", + sql: "alter table child_table DROP FOREIGN KEY ", // See "getting child_table constraint name" test step below. allowForeignKeys: true, expectHint: "child_hint", onlyIfFKOnlineDDLPossible: true, @@ -2212,6 +2212,19 @@ func testForeignKeys(t *testing.T) { }) } }) + t.Run("getting child_table constraint name", func(t *testing.T) { + // Due to how OnlineDDL works, the name of the foreign key constraint will not be the one we used in the CREATE TABLE statement. + // There's a specific test where we drop said constraint. So speficially for that test (or any similar future tests), we need to dynamically + // evaluate the constraint name. + rs := onlineddl.VtgateExecQuery(t, &vtParams, "select CONSTRAINT_NAME from information_schema.REFERENTIAL_CONSTRAINTS where TABLE_NAME='child_table'", "") + assert.Equal(t, 1, len(rs.Rows)) + row := rs.Named().Row() + assert.NotNil(t, row) + childTableConstraintName := row.AsString("CONSTRAINT_NAME", "") + assert.NotEmpty(t, childTableConstraintName) + testcase.sql = strings.ReplaceAll(testcase.sql, "", childTableConstraintName) + }) + var uuid string t.Run("run migration", func(t *testing.T) { if testcase.allowForeignKeys { From 4a0aa63ea529015e960ac8e1a057dcac4ee01489 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Wed, 15 Nov 2023 19:22:39 +0200 Subject: [PATCH 29/39] MysqlCtl: implement missing `ReadBinlogFilesTimestamps` function (#14525) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/test/endtoend/mysqlctld/mysqlctld_test.go | 8 ++++++++ go/vt/mysqlctl/grpcmysqlctlserver/server.go | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/go/test/endtoend/mysqlctld/mysqlctld_test.go b/go/test/endtoend/mysqlctld/mysqlctld_test.go index 908a870d6f0..e1577acfc52 100644 --- a/go/test/endtoend/mysqlctld/mysqlctld_test.go +++ b/go/test/endtoend/mysqlctld/mysqlctld_test.go @@ -28,6 +28,7 @@ import ( "vitess.io/vitess/go/constants/sidecar" "vitess.io/vitess/go/vt/mysqlctl/mysqlctlclient" + "vitess.io/vitess/go/vt/proto/mysqlctl" "vitess.io/vitess/go/test/endtoend/cluster" ) @@ -169,3 +170,10 @@ func TestVersionString(t *testing.T) { require.NoError(t, err) require.NotEmpty(t, version) } + +func TestReadBinlogFilesTimestamps(t *testing.T) { + client, err := mysqlctlclient.New("unix", primaryTablet.MysqlctldProcess.SocketFile) + require.NoError(t, err) + _, err = client.ReadBinlogFilesTimestamps(context.Background(), &mysqlctl.ReadBinlogFilesTimestampsRequest{}) + require.ErrorContains(t, err, "empty binlog list in ReadBinlogFilesTimestampsRequest") +} diff --git a/go/vt/mysqlctl/grpcmysqlctlserver/server.go b/go/vt/mysqlctl/grpcmysqlctlserver/server.go index 84953020534..ac3b5092f19 100644 --- a/go/vt/mysqlctl/grpcmysqlctlserver/server.go +++ b/go/vt/mysqlctl/grpcmysqlctlserver/server.go @@ -56,6 +56,11 @@ func (s *server) ApplyBinlogFile(ctx context.Context, request *mysqlctlpb.ApplyB return &mysqlctlpb.ApplyBinlogFileResponse{}, s.mysqld.ApplyBinlogFile(ctx, request) } +// ReadBinlogFilesTimestamps implements the server side of the MysqlctlClient interface. +func (s *server) ReadBinlogFilesTimestamps(ctx context.Context, request *mysqlctlpb.ReadBinlogFilesTimestampsRequest) (*mysqlctlpb.ReadBinlogFilesTimestampsResponse, error) { + return s.mysqld.ReadBinlogFilesTimestamps(ctx, request) +} + // ReinitConfig implements the server side of the MysqlctlClient interface. func (s *server) ReinitConfig(ctx context.Context, request *mysqlctlpb.ReinitConfigRequest) (*mysqlctlpb.ReinitConfigResponse, error) { return &mysqlctlpb.ReinitConfigResponse{}, s.mysqld.ReinitConfig(ctx, s.cnf) From 9ddf932cf46df57fea1f9873d10d3183ef16129a Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 15 Nov 2023 23:45:43 +0530 Subject: [PATCH 30/39] `Replace into` statement plan with foreign keys : unsharded (#14396) Signed-off-by: Harshit Gangal Co-authored-by: Manan Gupta --- go/mysql/sqlerror/sql_error.go | 1 + .../vtgate/foreignkey/fk_fuzz_test.go | 164 +++--- go/test/endtoend/vtgate/foreignkey/fk_test.go | 161 ++++++ .../endtoend/vtgate/foreignkey/main_test.go | 12 +- .../{sharded_schema.sql => schema.sql} | 44 +- .../vtgate/foreignkey/unsharded_schema.sql | 472 ------------------ go/vt/proto/vschema/vschema.pb.go | 79 +-- go/vt/proto/vschema/vschema_vtproto.pb.go | 44 ++ go/vt/vterrors/code.go | 6 +- go/vt/vterrors/state.go | 1 + go/vt/vtgate/engine/cached_size.go | 21 +- go/vt/vtgate/engine/delete.go | 1 + go/vt/vtgate/engine/dml.go | 4 +- go/vt/vtgate/engine/insert.go | 5 +- go/vt/vtgate/engine/sequential.go | 90 ++++ go/vt/vtgate/engine/update.go | 1 + go/vt/vtgate/planbuilder/insert.go | 15 +- .../planbuilder/operator_transformers.go | 19 + go/vt/vtgate/planbuilder/operators/insert.go | 235 ++++++++- .../planbuilder/operators/sequential.go | 54 ++ go/vt/vtgate/planbuilder/plan_test.go | 18 +- go/vt/vtgate/planbuilder/sequential.go | 36 ++ .../testdata/foreignkey_cases.json | 182 ++++++- .../planbuilder/testdata/vschemas/schema.json | 7 +- go/vt/vtgate/schema/tracker.go | 16 +- go/vt/vtgate/schema/tracker_test.go | 89 +++- go/vt/vtgate/vindexes/foreign_keys.go | 30 ++ go/vt/vtgate/vindexes/vschema.go | 36 +- go/vt/vtgate/vindexes/vschema_test.go | 26 +- go/vt/vtgate/vschema_manager.go | 30 +- go/vt/vtgate/vschema_manager_test.go | 123 +++-- proto/vschema.proto | 1 + web/vtadmin/src/proto/vtadmin.d.ts | 6 + web/vtadmin/src/proto/vtadmin.js | 23 + 34 files changed, 1375 insertions(+), 677 deletions(-) rename go/test/endtoend/vtgate/foreignkey/{sharded_schema.sql => schema.sql} (95%) delete mode 100644 go/test/endtoend/vtgate/foreignkey/unsharded_schema.sql create mode 100644 go/vt/vtgate/engine/sequential.go create mode 100644 go/vt/vtgate/planbuilder/operators/sequential.go create mode 100644 go/vt/vtgate/planbuilder/sequential.go diff --git a/go/mysql/sqlerror/sql_error.go b/go/mysql/sqlerror/sql_error.go index 9b1f65c82e3..30ce99d681a 100644 --- a/go/mysql/sqlerror/sql_error.go +++ b/go/mysql/sqlerror/sql_error.go @@ -243,6 +243,7 @@ var stateToMysqlCode = map[vterrors.State]mysqlCode{ vterrors.CharacterSetMismatch: {num: ERCharacterSetMismatch, state: SSUnknownSQLState}, vterrors.WrongParametersToNativeFct: {num: ERWrongParametersToNativeFct, state: SSUnknownSQLState}, vterrors.KillDeniedError: {num: ERKillDenied, state: SSUnknownSQLState}, + vterrors.BadNullError: {num: ERBadNullError, state: SSConstraintViolation}, } func getStateToMySQLState(state vterrors.State) mysqlCode { diff --git a/go/test/endtoend/vtgate/foreignkey/fk_fuzz_test.go b/go/test/endtoend/vtgate/foreignkey/fk_fuzz_test.go index f7d7340d6a4..4c84eae2f42 100644 --- a/go/test/endtoend/vtgate/foreignkey/fk_fuzz_test.go +++ b/go/test/endtoend/vtgate/foreignkey/fk_fuzz_test.go @@ -95,9 +95,9 @@ func (fz *fuzzer) generateQuery() []string { if val < fz.insertShare { switch fz.queryFormat { case OlapSQLQueries, SQLQueries: - return []string{fz.generateInsertDMLQuery()} + return []string{fz.generateInsertDMLQuery(getInsertType())} case PreparedStatmentQueries: - return fz.getPreparedInsertQueries() + return fz.getPreparedInsertQueries(getInsertType()) default: panic("Unknown query type") } @@ -122,22 +122,26 @@ func (fz *fuzzer) generateQuery() []string { } } +func getInsertType() string { + return "insert" +} + // generateInsertDMLQuery generates an INSERT query from the parameters for the fuzzer. -func (fz *fuzzer) generateInsertDMLQuery() string { +func (fz *fuzzer) generateInsertDMLQuery(insertType string) string { tableId := rand.Intn(len(fkTables)) idValue := 1 + rand.Intn(fz.maxValForId) tableName := fkTables[tableId] if tableName == "fk_t20" { colValue := rand.Intn(1 + fz.maxValForCol) col2Value := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, col, col2) values (%v, %v, %v)", tableName, idValue, convertIntValueToString(colValue), convertIntValueToString(col2Value)) + return fmt.Sprintf("%s into %v (id, col, col2) values (%v, %v, %v)", insertType, tableName, idValue, convertIntValueToString(colValue), convertIntValueToString(col2Value)) } else if isMultiColFkTable(tableName) { colaValue := rand.Intn(1 + fz.maxValForCol) colbValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, cola, colb) values (%v, %v, %v)", tableName, idValue, convertIntValueToString(colaValue), convertIntValueToString(colbValue)) + return fmt.Sprintf("%s into %v (id, cola, colb) values (%v, %v, %v)", insertType, tableName, idValue, convertIntValueToString(colaValue), convertIntValueToString(colbValue)) } else { colValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, col) values (%v, %v)", tableName, idValue, convertIntValueToString(colValue)) + return fmt.Sprintf("%s into %v (id, col) values (%v, %v)", insertType, tableName, idValue, convertIntValueToString(colValue)) } } @@ -332,7 +336,7 @@ func (fz *fuzzer) getPreparedDeleteQueries() []string { } // getPreparedInsertQueries gets the list of queries to run for executing an INSERT using prepared statements. -func (fz *fuzzer) getPreparedInsertQueries() []string { +func (fz *fuzzer) getPreparedInsertQueries(insertType string) []string { tableId := rand.Intn(len(fkTables)) idValue := 1 + rand.Intn(fz.maxValForId) tableName := fkTables[tableId] @@ -340,7 +344,7 @@ func (fz *fuzzer) getPreparedInsertQueries() []string { colValue := rand.Intn(1 + fz.maxValForCol) col2Value := rand.Intn(1 + fz.maxValForCol) return []string{ - "prepare stmt_insert from 'insert into fk_t20 (id, col, col2) values (?, ?, ?)'", + fmt.Sprintf("prepare stmt_insert from '%s into fk_t20 (id, col, col2) values (?, ?, ?)'", insertType), fmt.Sprintf("SET @id = %v", idValue), fmt.Sprintf("SET @col = %v", convertIntValueToString(colValue)), fmt.Sprintf("SET @col2 = %v", convertIntValueToString(col2Value)), @@ -350,7 +354,7 @@ func (fz *fuzzer) getPreparedInsertQueries() []string { colaValue := rand.Intn(1 + fz.maxValForCol) colbValue := rand.Intn(1 + fz.maxValForCol) return []string{ - fmt.Sprintf("prepare stmt_insert from 'insert into %v (id, cola, colb) values (?, ?, ?)'", tableName), + fmt.Sprintf("prepare stmt_insert from '%s into %v (id, cola, colb) values (?, ?, ?)'", insertType, tableName), fmt.Sprintf("SET @id = %v", idValue), fmt.Sprintf("SET @cola = %v", convertIntValueToString(colaValue)), fmt.Sprintf("SET @colb = %v", convertIntValueToString(colbValue)), @@ -359,7 +363,7 @@ func (fz *fuzzer) getPreparedInsertQueries() []string { } else { colValue := rand.Intn(1 + fz.maxValForCol) return []string{ - fmt.Sprintf("prepare stmt_insert from 'insert into %v (id, col) values (?, ?)'", tableName), + fmt.Sprintf("prepare stmt_insert from '%s into %v (id, col) values (?, ?)'", insertType, tableName), fmt.Sprintf("SET @id = %v", idValue), fmt.Sprintf("SET @col = %v", convertIntValueToString(colValue)), "execute stmt_insert using @id, @col", @@ -407,7 +411,7 @@ func (fz *fuzzer) getPreparedUpdateQueries() []string { func (fz *fuzzer) generateParameterizedQuery() (query string, params []any) { val := rand.Intn(fz.insertShare + fz.updateShare + fz.deleteShare) if val < fz.insertShare { - return fz.generateParameterizedInsertQuery() + return fz.generateParameterizedInsertQuery(getInsertType()) } if val < fz.insertShare+fz.updateShare { return fz.generateParameterizedUpdateQuery() @@ -416,21 +420,21 @@ func (fz *fuzzer) generateParameterizedQuery() (query string, params []any) { } // generateParameterizedInsertQuery generates a parameterized INSERT query for the query format PreparedStatementPacket. -func (fz *fuzzer) generateParameterizedInsertQuery() (query string, params []any) { +func (fz *fuzzer) generateParameterizedInsertQuery(insertType string) (query string, params []any) { tableId := rand.Intn(len(fkTables)) idValue := 1 + rand.Intn(fz.maxValForId) tableName := fkTables[tableId] if tableName == "fk_t20" { colValue := rand.Intn(1 + fz.maxValForCol) col2Value := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, col, col2) values (?, ?, ?)", tableName), []any{idValue, convertIntValueToString(colValue), convertIntValueToString(col2Value)} + return fmt.Sprintf("%s into %v (id, col, col2) values (?, ?, ?)", insertType, tableName), []any{idValue, convertIntValueToString(colValue), convertIntValueToString(col2Value)} } else if isMultiColFkTable(tableName) { colaValue := rand.Intn(1 + fz.maxValForCol) colbValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, cola, colb) values (?, ?, ?)", tableName), []any{idValue, convertIntValueToString(colaValue), convertIntValueToString(colbValue)} + return fmt.Sprintf("%s into %v (id, cola, colb) values (?, ?, ?)", insertType, tableName), []any{idValue, convertIntValueToString(colaValue), convertIntValueToString(colbValue)} } else { colValue := rand.Intn(1 + fz.maxValForCol) - return fmt.Sprintf("insert into %v (id, col) values (?, ?)", tableName), []any{idValue, convertIntValueToString(colValue)} + return fmt.Sprintf("%s into %v (id, col) values (?, ?)", insertType, tableName), []any{idValue, convertIntValueToString(colValue)} } } @@ -555,58 +559,61 @@ func TestFkFuzzTest(t *testing.T) { insertShare int deleteShare int updateShare int - }{ - { - name: "Single Thread - Only Inserts", - concurrency: 1, - timeForTesting: 5 * time.Second, - maxValForCol: 5, - maxValForId: 10, - insertShare: 100, - deleteShare: 0, - updateShare: 0, - }, - { - name: "Single Thread - Balanced Inserts and Deletes", - concurrency: 1, - timeForTesting: 5 * time.Second, - maxValForCol: 5, - maxValForId: 10, - insertShare: 50, - deleteShare: 50, - updateShare: 0, - }, - { - name: "Single Thread - Balanced Inserts and Updates", - concurrency: 1, - timeForTesting: 5 * time.Second, - maxValForCol: 5, - maxValForId: 10, - insertShare: 50, - deleteShare: 0, - updateShare: 50, - }, - { - name: "Single Thread - Balanced Inserts, Updates and Deletes", - concurrency: 1, - timeForTesting: 5 * time.Second, - maxValForCol: 5, - maxValForId: 10, - insertShare: 50, - deleteShare: 50, - updateShare: 50, - }, - { - name: "Multi Thread - Balanced Inserts, Updates and Deletes", - concurrency: 30, - timeForTesting: 5 * time.Second, - maxValForCol: 5, - maxValForId: 30, - insertShare: 50, - deleteShare: 50, - updateShare: 50, - }, - } + }{{ + name: "Single Thread - Only Inserts", + concurrency: 1, + timeForTesting: 5 * time.Second, + maxValForCol: 5, + maxValForId: 10, + insertShare: 100, + deleteShare: 0, + updateShare: 0, + }, { + name: "Single Thread - Balanced Inserts and Deletes", + concurrency: 1, + timeForTesting: 5 * time.Second, + maxValForCol: 5, + maxValForId: 10, + insertShare: 50, + deleteShare: 50, + updateShare: 0, + }, { + name: "Single Thread - Balanced Inserts and Updates", + concurrency: 1, + timeForTesting: 5 * time.Second, + maxValForCol: 5, + maxValForId: 10, + insertShare: 50, + deleteShare: 0, + updateShare: 50, + }, { + name: "Single Thread - Balanced Inserts, Updates and Deletes", + concurrency: 1, + timeForTesting: 5 * time.Second, + maxValForCol: 5, + maxValForId: 10, + insertShare: 50, + deleteShare: 50, + updateShare: 50, + }, { + name: "Multi Thread - Only Inserts", + concurrency: 30, + timeForTesting: 5 * time.Second, + maxValForCol: 5, + maxValForId: 30, + insertShare: 100, + deleteShare: 0, + updateShare: 0, + }, { + name: "Multi Thread - Balanced Inserts, Updates and Deletes", + concurrency: 30, + timeForTesting: 5 * time.Second, + maxValForCol: 5, + maxValForId: 30, + insertShare: 50, + deleteShare: 50, + updateShare: 50, + }} for _, tt := range testcases { for _, testSharded := range []bool{false, true} { @@ -632,7 +639,16 @@ func TestFkFuzzTest(t *testing.T) { fz.start(t, testSharded) // Wait for the timeForTesting so that the threads continue to run. - time.Sleep(tt.timeForTesting) + totalTime := time.After(tt.timeForTesting) + done := false + for !done { + select { + case <-totalTime: + done = true + case <-time.After(10 * time.Millisecond): + validateReplication(t) + } + } fz.stop() @@ -654,3 +670,15 @@ func TestFkFuzzTest(t *testing.T) { } } } + +func validateReplication(t *testing.T) { + for _, keyspace := range clusterInstance.Keyspaces { + for _, shard := range keyspace.Shards { + for _, vttablet := range shard.Vttablets { + if vttablet.Type != "primary" { + checkReplicationHealthy(t, vttablet) + } + } + } + } +} diff --git a/go/test/endtoend/vtgate/foreignkey/fk_test.go b/go/test/endtoend/vtgate/foreignkey/fk_test.go index afd04679066..a05f0de7ac1 100644 --- a/go/test/endtoend/vtgate/foreignkey/fk_test.go +++ b/go/test/endtoend/vtgate/foreignkey/fk_test.go @@ -986,3 +986,164 @@ func TestCyclicFks(t *testing.T) { _, err := utils.ExecAllowError(t, mcmp.VtConn, "insert into fk_t10(id, col) values (1, 1)") require.ErrorContains(t, err, "VT09019: uks has cyclic foreign keys") } + +func TestReplace(t *testing.T) { + t.Skip("replace engine marked for failure, hence skipping this.") + // Wait for schema-tracking to be complete. + waitForSchemaTrackingForFkTables(t) + // Remove all the foreign key constraints for all the replicas. + // We can then verify that the replica, and the primary have the same data, to ensure + // that none of the queries ever lead to cascades/updates on MySQL level. + for _, ks := range []string{shardedKs, unshardedKs} { + replicas := getReplicaTablets(ks) + for _, replica := range replicas { + removeAllForeignKeyConstraints(t, replica, ks) + } + } + + mcmp1, _ := start(t) + // defer closer1() + _ = utils.Exec(t, mcmp1.VtConn, "use `uks`") + + mcmp2, _ := start(t) + // defer closer2() + _ = utils.Exec(t, mcmp2.VtConn, "use `uks`") + + _ = utils.Exec(t, mcmp1.VtConn, "insert into fk_t2 values(1,5), (2,5)") + + done := false + go func() { + number := 1 + for !done { + query := fmt.Sprintf("replace /* g1q1 - %d */ into fk_t2 values(5,5)", number) + _, _ = utils.ExecAllowError(t, mcmp1.VtConn, query) + number++ + } + }() + + go func() { + number := 1 + for !done { + query := fmt.Sprintf("replace /* q1 - %d */ into fk_t3 values(3,5)", number) + _, _ = utils.ExecAllowError(t, mcmp2.VtConn, query) + + query = fmt.Sprintf("replace /* q2 - %d */ into fk_t3 values(4,5)", number) + _, _ = utils.ExecAllowError(t, mcmp2.VtConn, query) + number++ + } + }() + + totalTime := time.After(1 * time.Minute) + for !done { + select { + case <-totalTime: + done = true + case <-time.After(10 * time.Millisecond): + validateReplication(t) + } + } +} + +func TestReplaceExplicit(t *testing.T) { + t.Skip("explicit delete-insert in transaction fails, hence skipping") + // Wait for schema-tracking to be complete. + waitForSchemaTrackingForFkTables(t) + // Remove all the foreign key constraints for all the replicas. + // We can then verify that the replica, and the primary have the same data, to ensure + // that none of the queries ever lead to cascades/updates on MySQL level. + for _, ks := range []string{shardedKs, unshardedKs} { + replicas := getReplicaTablets(ks) + for _, replica := range replicas { + removeAllForeignKeyConstraints(t, replica, ks) + } + } + + mcmp1, _ := start(t) + // defer closer1() + _ = utils.Exec(t, mcmp1.VtConn, "use `uks`") + + mcmp2, _ := start(t) + // defer closer2() + _ = utils.Exec(t, mcmp2.VtConn, "use `uks`") + + _ = utils.Exec(t, mcmp1.VtConn, "insert into fk_t2 values(1,5), (2,5)") + + done := false + go func() { + number := 0 + for !done { + number++ + _, _ = utils.ExecAllowError(t, mcmp1.VtConn, "begin") + query := fmt.Sprintf("delete /* g1q1 - %d */ from fk_t2 where id = 5", number) + _, err := utils.ExecAllowError(t, mcmp1.VtConn, query) + if err != nil { + _, _ = utils.ExecAllowError(t, mcmp1.VtConn, "rollback") + continue + } + query = fmt.Sprintf("insert /* g1q1 - %d */ into fk_t2 values(5,5)", number) + _, err = utils.ExecAllowError(t, mcmp1.VtConn, query) + if err != nil { + _, _ = utils.ExecAllowError(t, mcmp1.VtConn, "rollback") + continue + } + _, _ = utils.ExecAllowError(t, mcmp1.VtConn, "commit") + } + }() + + go func() { + number := 0 + for !done { + number++ + _, _ = utils.ExecAllowError(t, mcmp2.VtConn, "begin") + query := fmt.Sprintf("delete /* g1q1 - %d */ from fk_t3 where id = 3 or col = 5", number) + _, err := utils.ExecAllowError(t, mcmp2.VtConn, query) + if err != nil { + _, _ = utils.ExecAllowError(t, mcmp2.VtConn, "rollback") + } else { + query = fmt.Sprintf("insert /* g1q1 - %d */ into fk_t3 values(3,5)", number) + _, err = utils.ExecAllowError(t, mcmp2.VtConn, query) + if err != nil { + _, _ = utils.ExecAllowError(t, mcmp2.VtConn, "rollback") + } else { + _, _ = utils.ExecAllowError(t, mcmp2.VtConn, "commit") + } + } + + _, _ = utils.ExecAllowError(t, mcmp2.VtConn, "begin") + query = fmt.Sprintf("delete /* g1q1 - %d */ from fk_t3 where id = 4 or col = 5", number) + _, err = utils.ExecAllowError(t, mcmp2.VtConn, query) + if err != nil { + _, _ = utils.ExecAllowError(t, mcmp2.VtConn, "rollback") + continue + } + query = fmt.Sprintf("insert /* g1q1 - %d */ into fk_t3 values(4,5)", number) + _, err = utils.ExecAllowError(t, mcmp2.VtConn, query) + if err != nil { + _, _ = utils.ExecAllowError(t, mcmp2.VtConn, "rollback") + continue + } + _, _ = utils.ExecAllowError(t, mcmp2.VtConn, "commit") + } + }() + + totalTime := time.After(1 * time.Minute) + for !done { + select { + case <-totalTime: + done = true + case <-time.After(10 * time.Millisecond): + validateReplication(t) + } + } +} + +// TestReplaceWithFK tests that replace into work as expected when foreign key management is enabled in Vitess. +func TestReplaceWithFK(t *testing.T) { + mcmp, closer := start(t) + conn := mcmp.VtConn + defer closer() + + // replace some data. + _, err := utils.ExecAllowError(t, conn, `replace into t1(id, col) values (1, 1)`) + require.ErrorContains(t, err, "VT12001: unsupported: REPLACE INTO with sharded keyspace (errno 1235) (sqlstate 42000)") +} diff --git a/go/test/endtoend/vtgate/foreignkey/main_test.go b/go/test/endtoend/vtgate/foreignkey/main_test.go index dae78ae93a1..3ce449f893f 100644 --- a/go/test/endtoend/vtgate/foreignkey/main_test.go +++ b/go/test/endtoend/vtgate/foreignkey/main_test.go @@ -38,11 +38,9 @@ var ( shardedKs = "ks" unshardedKs = "uks" Cell = "test" - //go:embed sharded_schema.sql - shardedSchemaSQL string - //go:embed unsharded_schema.sql - unshardedSchemaSQL string + //go:embed schema.sql + schemaSQL string //go:embed sharded_vschema.json shardedVSchema string @@ -107,7 +105,7 @@ func TestMain(m *testing.M) { // Start keyspace sKs := &cluster.Keyspace{ Name: shardedKs, - SchemaSQL: shardedSchemaSQL, + SchemaSQL: schemaSQL, VSchema: shardedVSchema, } @@ -118,7 +116,7 @@ func TestMain(m *testing.M) { uKs := &cluster.Keyspace{ Name: unshardedKs, - SchemaSQL: unshardedSchemaSQL, + SchemaSQL: schemaSQL, VSchema: unshardedVSchema, } err = clusterInstance.StartUnshardedKeyspace(*uKs, 1, false) @@ -142,7 +140,7 @@ func TestMain(m *testing.M) { } vtgateGrpcAddress = fmt.Sprintf("%s:%d", clusterInstance.Hostname, clusterInstance.VtgateGrpcPort) - connParams, closer, err := utils.NewMySQL(clusterInstance, shardedKs, shardedSchemaSQL) + connParams, closer, err := utils.NewMySQL(clusterInstance, shardedKs, schemaSQL) if err != nil { fmt.Println(err) return 1 diff --git a/go/test/endtoend/vtgate/foreignkey/sharded_schema.sql b/go/test/endtoend/vtgate/foreignkey/schema.sql similarity index 95% rename from go/test/endtoend/vtgate/foreignkey/sharded_schema.sql rename to go/test/endtoend/vtgate/foreignkey/schema.sql index c1f511350f2..fd8bec5dc4a 100644 --- a/go/test/endtoend/vtgate/foreignkey/sharded_schema.sql +++ b/go/test/endtoend/vtgate/foreignkey/schema.sql @@ -73,6 +73,31 @@ create table t6 foreign key (sk, col1) references t5 (sk, col1) on delete restrict on update restrict ) Engine = InnoDB; +create table u_t1 +( + id bigint, + col1 bigint, + index(col1), + primary key (id) +) Engine = InnoDB; + +create table u_t2 +( + id bigint, + col2 bigint, + primary key (id), + foreign key (col2) references u_t1 (col1) on delete set null on update set null +) Engine = InnoDB; + +create table u_t3 +( + id bigint, + col3 bigint, + primary key (id), + foreign key (col3) references u_t1 (col1) on delete cascade on update cascade +) Engine = InnoDB; + + /* * fk_t1 * │ @@ -122,7 +147,7 @@ create table fk_t3 id bigint, col varchar(10), primary key (id), - index(col), + unique index(col), foreign key (col) references fk_t2(col) on delete set null on update set null ) Engine = InnoDB; @@ -184,7 +209,7 @@ create table fk_t10 id bigint, col varchar(10), primary key (id), - index(col) + unique index(col) ) Engine = InnoDB; create table fk_t11 @@ -243,7 +268,7 @@ create table fk_t15 id bigint, col varchar(10), primary key (id), - index(col) + unique index(col) ) Engine = InnoDB; create table fk_t16 @@ -251,7 +276,7 @@ create table fk_t16 id bigint, col varchar(10), primary key (id), - index(col), + unique index(col), foreign key (col) references fk_t15(col) on delete cascade on update cascade ) Engine = InnoDB; @@ -296,6 +321,7 @@ create table fk_t20 foreign key (col2) references fk_t20(col) on delete restrict on update restrict ) Engine = InnoDB; + /* * fk_multicol_t1 * │ @@ -328,16 +354,17 @@ create table fk_multicol_t1 colb varchar(10), cola varchar(10), primary key (id), - index(cola, colb) + index(cola, colb), + unique index(colb) ) Engine = InnoDB; create table fk_multicol_t2 ( id bigint, - colb varchar(10), + colb varchar(10) default 'xyz', cola varchar(10), primary key (id), - index(cola, colb), + unique index(cola, colb), foreign key (cola, colb) references fk_multicol_t1(cola, colb) on delete restrict on update restrict ) Engine = InnoDB; @@ -355,9 +382,10 @@ create table fk_multicol_t4 ( id bigint, colb varchar(10), - cola varchar(10), + cola varchar(10) default 'abcd', primary key (id), index(cola, colb), + unique index(cola), foreign key (cola, colb) references fk_multicol_t3(cola, colb) on delete set null on update set null ) Engine = InnoDB; diff --git a/go/test/endtoend/vtgate/foreignkey/unsharded_schema.sql b/go/test/endtoend/vtgate/foreignkey/unsharded_schema.sql deleted file mode 100644 index 3b4496d47fb..00000000000 --- a/go/test/endtoend/vtgate/foreignkey/unsharded_schema.sql +++ /dev/null @@ -1,472 +0,0 @@ -create table u_t1 -( - id bigint, - col1 bigint, - index(col1), - primary key (id) -) Engine = InnoDB; - -create table u_t2 -( - id bigint, - col2 bigint, - primary key (id), - foreign key (col2) references u_t1 (col1) on delete set null on update set null -) Engine = InnoDB; - -create table u_t3 -( - id bigint, - col3 bigint, - primary key (id), - foreign key (col3) references u_t1 (col1) on delete cascade on update cascade -) Engine = InnoDB; - - -/* - * fk_t1 - * │ - * │ On Delete Restrict - * │ On Update Restrict - * ▼ - * ┌────────────────fk_t2────────────────┐ - * │ │ - * │On Delete Set Null │ On Delete Set Null - * │On Update Set Null │ On Update Set Null - * ▼ ▼ - * fk_t7 fk_t3───────────────────┐ - * │ │ - * │ │ On Delete Set Null - * On Delete Set Null │ │ On Update Set Null - * On Update Set Null │ │ - * ▼ ▼ - * fk_t4 fk_t6 - * │ - * │ - * On Delete Restrict │ - * On Update Restrict │ - * │ - * ▼ - * fk_t5 - */ - -create table fk_t1 -( - id bigint, - col varchar(10), - primary key (id), - index(col) -) Engine = InnoDB; - -create table fk_t2 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t1(col) on delete restrict on update restrict -) Engine = InnoDB; - -create table fk_t3 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t2(col) on delete set null on update set null -) Engine = InnoDB; - -create table fk_t4 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t3(col) on delete set null on update set null -) Engine = InnoDB; - -create table fk_t5 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t4(col) on delete restrict on update restrict -) Engine = InnoDB; - -create table fk_t6 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t3(col) on delete set null on update set null -) Engine = InnoDB; - -create table fk_t7 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t2(col) on delete set null on update set null -) Engine = InnoDB; - -/* - * fk_t10 - * │ - * On Delete Cascade │ - * On Update Cascade │ - * │ - * ▼ - * fk_t11──────────────────┐ - * │ │ - * │ │ On Delete Restrict - * On Delete Cascade │ │ On Update Restrict - * On Update Cascade │ │ - * │ │ - * ▼ ▼ - * fk_t12 fk_t13 - */ - -create table fk_t10 -( - id bigint, - col varchar(10), - primary key (id), - index(col) -) Engine = InnoDB; - -create table fk_t11 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t10(col) on delete cascade on update cascade -) Engine = InnoDB; - -create table fk_t12 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t11(col) on delete cascade on update cascade -) Engine = InnoDB; - -create table fk_t13 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t11(col) on delete restrict on update restrict -) Engine = InnoDB; - -/* - * fk_t15 - * │ - * │ - * On Delete Cascade │ - * On Update Cascade │ - * │ - * ▼ - * fk_t16 - * │ - * On Delete Set Null │ - * On Update Set Null │ - * │ - * ▼ - * fk_t17──────────────────┐ - * │ │ - * │ │ On Delete Set Null - * On Delete Cascade │ │ On Update Set Null - * On Update Cascade │ │ - * │ │ - * ▼ ▼ - * fk_t18 fk_t19 - */ - -create table fk_t15 -( - id bigint, - col varchar(10), - primary key (id), - index(col) -) Engine = InnoDB; - -create table fk_t16 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t15(col) on delete cascade on update cascade -) Engine = InnoDB; - -create table fk_t17 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t16(col) on delete set null on update set null -) Engine = InnoDB; - -create table fk_t18 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t17(col) on delete cascade on update cascade -) Engine = InnoDB; - -create table fk_t19 -( - id bigint, - col varchar(10), - primary key (id), - index(col), - foreign key (col) references fk_t17(col) on delete set null on update set null -) Engine = InnoDB; - -/* - Self referenced foreign key from col2 to col in fk_t20 -*/ - -create table fk_t20 -( - id bigint, - col varchar(10), - col2 varchar(10), - primary key (id), - index(col), - foreign key (col2) references fk_t20(col) on delete restrict on update restrict -) Engine = InnoDB; - - -/* - * fk_multicol_t1 - * │ - * │ On Delete Restrict - * │ On Update Restrict - * ▼ - * ┌────────fk_multicol_t2───────────────┐ - * │ │ - * │On Delete Set Null │ On Delete Set Null - * │On Update Set Null │ On Update Set Null - * ▼ ▼ - * fk_multicol_t7 fk_multicol_t3───────────────────┐ - * │ │ - * │ │ On Delete Set Null - * On Delete Set Null │ │ On Update Set Null - * On Update Set Null │ │ - * ▼ ▼ - * fk_multicol_t4 fk_multicol_t6 - * │ - * │ - * On Delete Restrict │ - * On Update Restrict │ - * │ - * ▼ - * fk_multicol_t5 - */ -create table fk_multicol_t1 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb) -) Engine = InnoDB; - -create table fk_multicol_t2 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t1(cola, colb) on delete restrict on update restrict -) Engine = InnoDB; - -create table fk_multicol_t3 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t2(cola, colb) on delete set null on update set null -) Engine = InnoDB; - -create table fk_multicol_t4 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t3(cola, colb) on delete set null on update set null -) Engine = InnoDB; - -create table fk_multicol_t5 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t4(cola, colb) on delete restrict on update restrict -) Engine = InnoDB; - -create table fk_multicol_t6 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t3(cola, colb) on delete set null on update set null -) Engine = InnoDB; - -create table fk_multicol_t7 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t2(cola, colb) on delete set null on update set null -) Engine = InnoDB; - -/* - * fk_multicol_t10 - * │ - * On Delete Cascade │ - * On Update Cascade │ - * │ - * ▼ - * fk_multicol_t11──────────────────┐ - * │ │ - * │ │ On Delete Restrict - * On Delete Cascade │ │ On Update Restrict - * On Update Cascade │ │ - * │ │ - * ▼ ▼ - * fk_multicol_t12 fk_multicol_t13 - */ - -create table fk_multicol_t10 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb) -) Engine = InnoDB; - -create table fk_multicol_t11 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t10(cola, colb) on delete cascade on update cascade -) Engine = InnoDB; - -create table fk_multicol_t12 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t11(cola, colb) on delete cascade on update cascade -) Engine = InnoDB; - -create table fk_multicol_t13 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t11(cola, colb) on delete restrict on update restrict -) Engine = InnoDB; - -/* - * fk_multicol_t15 - * │ - * │ - * On Delete Cascade │ - * On Update Cascade │ - * │ - * ▼ - * fk_multicol_t16 - * │ - * On Delete Set Null │ - * On Update Set Null │ - * │ - * ▼ - * fk_multicol_t17──────────────────┐ - * │ │ - * │ │ On Delete Set Null - * On Delete Cascade │ │ On Update Set Null - * On Update Cascade │ │ - * │ │ - * ▼ ▼ - * fk_multicol_t18 fk_multicol_t19 - */ - -create table fk_multicol_t15 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb) -) Engine = InnoDB; - -create table fk_multicol_t16 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t15(cola, colb) on delete cascade on update cascade -) Engine = InnoDB; - -create table fk_multicol_t17 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t16(cola, colb) on delete set null on update set null -) Engine = InnoDB; - -create table fk_multicol_t18 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t17(cola, colb) on delete cascade on update cascade -) Engine = InnoDB; - -create table fk_multicol_t19 -( - id bigint, - colb varchar(10), - cola varchar(10), - primary key (id), - index(cola, colb), - foreign key (cola, colb) references fk_multicol_t17(cola, colb) on delete set null on update set null -) Engine = InnoDB; diff --git a/go/vt/proto/vschema/vschema.pb.go b/go/vt/proto/vschema/vschema.pb.go index b45f7010c56..fe185d63fcd 100644 --- a/go/vt/proto/vschema/vschema.pb.go +++ b/go/vt/proto/vschema/vschema.pb.go @@ -603,6 +603,7 @@ type Column struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Type query.Type `protobuf:"varint,2,opt,name=type,proto3,enum=query.Type" json:"type,omitempty"` Invisible bool `protobuf:"varint,3,opt,name=invisible,proto3" json:"invisible,omitempty"` + Default string `protobuf:"bytes,4,opt,name=default,proto3" json:"default,omitempty"` } func (x *Column) Reset() { @@ -658,6 +659,13 @@ func (x *Column) GetInvisible() bool { return false } +func (x *Column) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + // SrvVSchema is the roll-up of all the Keyspace schema for a cell. type SrvVSchema struct { state protoimpl.MessageState @@ -920,46 +928,47 @@ var file_vschema_proto_rawDesc = []byte{ 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x5b, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x75, 0x0a, 0x06, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x69, 0x73, - 0x69, 0x62, 0x6c, 0x65, 0x22, 0xa7, 0x02, 0x0a, 0x0a, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x12, 0x40, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, - 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x4f, 0x0a, - 0x0e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x44, - 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x68, 0x61, - 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, - 0x75, 0x6c, 0x65, 0x73, 0x22, 0x6e, 0x0a, 0x10, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, - 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x6f, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x42, 0x26, 0x5a, 0x24, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, - 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0xa7, + 0x02, 0x0a, 0x0a, 0x53, 0x72, 0x76, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x40, 0x0a, + 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x72, 0x76, 0x56, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, + 0x3a, 0x0a, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x13, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x11, 0x73, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x4f, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x27, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x44, 0x0a, 0x11, 0x53, 0x68, 0x61, 0x72, + 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2f, 0x0a, + 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x6e, + 0x0a, 0x10, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x5f, 0x6b, 0x65, + 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x42, 0x26, + 0x5a, 0x24, 0x76, 0x69, 0x74, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x69, 0x74, 0x65, + 0x73, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/go/vt/proto/vschema/vschema_vtproto.pb.go b/go/vt/proto/vschema/vschema_vtproto.pb.go index 94527ef14ae..2235bfea496 100644 --- a/go/vt/proto/vschema/vschema_vtproto.pb.go +++ b/go/vt/proto/vschema/vschema_vtproto.pb.go @@ -213,6 +213,7 @@ func (m *Column) CloneVT() *Column { Name: m.Name, Type: m.Type, Invisible: m.Invisible, + Default: m.Default, } if len(m.unknownFields) > 0 { r.unknownFields = make([]byte, len(m.unknownFields)) @@ -787,6 +788,13 @@ func (m *Column) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.Default) > 0 { + i -= len(m.Default) + copy(dAtA[i:], m.Default) + i = encodeVarint(dAtA, i, uint64(len(m.Default))) + i-- + dAtA[i] = 0x22 + } if m.Invisible { i-- if m.Invisible { @@ -1203,6 +1211,10 @@ func (m *Column) SizeVT() (n int) { if m.Invisible { n += 2 } + l = len(m.Default) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } n += len(m.unknownFields) return n } @@ -2725,6 +2737,38 @@ func (m *Column) UnmarshalVT(dAtA []byte) error { } } m.Invisible = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Default", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Default = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) diff --git a/go/vt/vterrors/code.go b/go/vt/vterrors/code.go index 6bc317db4ed..80e1b0edd34 100644 --- a/go/vt/vterrors/code.go +++ b/go/vt/vterrors/code.go @@ -36,7 +36,7 @@ var ( VT03011 = errorWithoutState("VT03011", vtrpcpb.Code_INVALID_ARGUMENT, "invalid value type: %v", "The given value type is not accepted.") VT03012 = errorWithoutState("VT03012", vtrpcpb.Code_INVALID_ARGUMENT, "invalid syntax: %s", "The syntax is invalid. Please refer to the MySQL documentation for the proper syntax.") VT03013 = errorWithState("VT03013", vtrpcpb.Code_INVALID_ARGUMENT, NonUniqTable, "not unique table/alias: '%s'", "This table or alias name is already use. Please use another one that is unique.") - VT03014 = errorWithState("VT03014", vtrpcpb.Code_INVALID_ARGUMENT, BadFieldError, "unknown column '%d' in '%s'", "The given column is unknown.") + VT03014 = errorWithState("VT03014", vtrpcpb.Code_INVALID_ARGUMENT, BadFieldError, "unknown column '%s' in '%s'", "The given column is unknown.") VT03015 = errorWithoutState("VT03015", vtrpcpb.Code_INVALID_ARGUMENT, "column has duplicate set values: '%v'", "Cannot assign multiple values to a column in an update statement.") VT03016 = errorWithoutState("VT03016", vtrpcpb.Code_INVALID_ARGUMENT, "unknown vindex column: '%s'", "The given column is unknown in the vindex table.") VT03017 = errorWithState("VT03017", vtrpcpb.Code_INVALID_ARGUMENT, SyntaxError, "where clause can only be of the type 'pos > '", "This vstream where clause can only be a greater than filter.") @@ -49,6 +49,7 @@ var ( VT03024 = errorWithoutState("VT03024", vtrpcpb.Code_INVALID_ARGUMENT, "'%s' user defined variable does not exists", "The query cannot be prepared using the user defined variable as it does not exists for this session.") VT03025 = errorWithState("VT03025", vtrpcpb.Code_INVALID_ARGUMENT, WrongArguments, "Incorrect arguments to %s", "The execute statement have wrong number of arguments") VT03026 = errorWithoutState("VT03024", vtrpcpb.Code_INVALID_ARGUMENT, "'%s' bind variable does not exists", "The query cannot be executed as missing the bind variable.") + VT03027 = errorWithState("VT03027", vtrpcpb.Code_INVALID_ARGUMENT, BadNullError, "Column '%s' cannot be null", "The column cannot have null value.") VT05001 = errorWithState("VT05001", vtrpcpb.Code_NOT_FOUND, DbDropExists, "cannot drop database '%s'; database does not exists", "The given database does not exist; Vitess cannot drop it.") VT05002 = errorWithState("VT05002", vtrpcpb.Code_NOT_FOUND, BadDb, "cannot alter database '%s'; unknown database", "The given database does not exist; Vitess cannot alter it.") @@ -83,6 +84,7 @@ var ( VT09019 = errorWithoutState("VT09019", vtrpcpb.Code_FAILED_PRECONDITION, "%s has cyclic foreign keys", "Vitess doesn't support cyclic foreign keys.") VT10001 = errorWithoutState("VT10001", vtrpcpb.Code_ABORTED, "foreign key constraints are not allowed", "Foreign key constraints are not allowed, see https://vitess.io/blog/2021-06-15-online-ddl-why-no-fk/.") + VT10002 = errorWithoutState("VT10002", vtrpcpb.Code_ABORTED, "'replace into' with foreign key constraints are not allowed", "Foreign key constraints sometimes are not written in binary logs and will cause issue with vreplication workflows like online-ddl.") VT12001 = errorWithoutState("VT12001", vtrpcpb.Code_UNIMPLEMENTED, "unsupported: %s", "This statement is unsupported by Vitess. Please rewrite your query to use supported syntax.") VT12002 = errorWithoutState("VT12002", vtrpcpb.Code_UNIMPLEMENTED, "unsupported: cross-shard foreign keys", "Vitess does not support cross shard foreign keys.") @@ -124,6 +126,7 @@ var ( VT03024, VT03025, VT03026, + VT03027, VT05001, VT05002, VT05003, @@ -152,6 +155,7 @@ var ( VT09017, VT09018, VT10001, + VT10002, VT12001, VT12002, VT13001, diff --git a/go/vt/vterrors/state.go b/go/vt/vterrors/state.go index 5e3dcf22dfb..5d286b0c991 100644 --- a/go/vt/vterrors/state.go +++ b/go/vt/vterrors/state.go @@ -47,6 +47,7 @@ const ( WrongValueCountOnRow WrongValue WrongArguments + BadNullError // failed precondition NoDB diff --git a/go/vt/vtgate/engine/cached_size.go b/go/vt/vtgate/engine/cached_size.go index d878650c63e..6121ad5f675 100644 --- a/go/vt/vtgate/engine/cached_size.go +++ b/go/vt/vtgate/engine/cached_size.go @@ -145,7 +145,7 @@ func (cached *DML) CachedSize(alloc bool) int64 { } size := int64(0) if alloc { - size += int64(128) + size += int64(144) } // field Query string size += hack.RuntimeAllocSize(int64(len(cached.Query))) @@ -1007,6 +1007,25 @@ func (cached *Send) CachedSize(alloc bool) int64 { size += hack.RuntimeAllocSize(int64(len(cached.Query))) return size } +func (cached *Sequential) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + // field Sources []vitess.io/vitess/go/vt/vtgate/engine.Primitive + { + size += hack.RuntimeAllocSize(int64(cap(cached.Sources)) * int64(16)) + for _, elem := range cached.Sources { + if cc, ok := elem.(cachedObject); ok { + size += cc.CachedSize(true) + } + } + } + return size +} func (cached *SessionPrimitive) CachedSize(alloc bool) int64 { if cached == nil { return int64(0) diff --git a/go/vt/vtgate/engine/delete.go b/go/vt/vtgate/engine/delete.go index 5f0f2408993..adcc11174fd 100644 --- a/go/vt/vtgate/engine/delete.go +++ b/go/vt/vtgate/engine/delete.go @@ -130,6 +130,7 @@ func (del *Delete) description() PrimitiveDescription { "OwnedVindexQuery": del.OwnedVindexQuery, "MultiShardAutocommit": del.MultiShardAutocommit, "QueryTimeout": del.QueryTimeout, + "NoAutoCommit": del.PreventAutoCommit, } addFieldsIfNotEmpty(del.DML, other) diff --git a/go/vt/vtgate/engine/dml.go b/go/vt/vtgate/engine/dml.go index 51177f41e08..a7b1712bacd 100644 --- a/go/vt/vtgate/engine/dml.go +++ b/go/vt/vtgate/engine/dml.go @@ -61,6 +61,8 @@ type DML struct { // QueryTimeout contains the optional timeout (in milliseconds) to apply to this query QueryTimeout int + PreventAutoCommit bool + // RoutingParameters parameters required for query routing. *RoutingParameters @@ -73,7 +75,7 @@ func NewDML() *DML { } func (dml *DML) execUnsharded(ctx context.Context, primitive Primitive, vcursor VCursor, bindVars map[string]*querypb.BindVariable, rss []*srvtopo.ResolvedShard) (*sqltypes.Result, error) { - return execShard(ctx, primitive, vcursor, dml.Query, bindVars, rss[0], true /* rollbackOnError */, true /* canAutocommit */) + return execShard(ctx, primitive, vcursor, dml.Query, bindVars, rss[0], true /* rollbackOnError */, !dml.PreventAutoCommit /* canAutocommit */) } func (dml *DML) execMultiDestination(ctx context.Context, primitive Primitive, vcursor VCursor, bindVars map[string]*querypb.BindVariable, rss []*srvtopo.ResolvedShard, dmlSpecialFunc func(context.Context, VCursor, map[string]*querypb.BindVariable, []*srvtopo.ResolvedShard) error) (*sqltypes.Result, error) { diff --git a/go/vt/vtgate/engine/insert.go b/go/vt/vtgate/engine/insert.go index fc65fbfbff9..e0c90d091a0 100644 --- a/go/vt/vtgate/engine/insert.go +++ b/go/vt/vtgate/engine/insert.go @@ -102,6 +102,8 @@ type ( // This will avoid locking by the select table. ForceNonStreaming bool + PreventAutoCommit bool + // Insert needs tx handling txNeeded } @@ -958,6 +960,7 @@ func (ins *Insert) description() PrimitiveDescription { "QueryTimeout": ins.QueryTimeout, "InsertIgnore": ins.Ignore, "InputAsNonStreaming": ins.ForceNonStreaming, + "NoAutoCommit": ins.PreventAutoCommit, } if len(ins.VindexValues) > 0 { @@ -1041,7 +1044,7 @@ func (ins *Insert) executeUnshardedTableQuery(ctx context.Context, vcursor VCurs if err != nil { return 0, nil, err } - qr, err := execShard(ctx, ins, vcursor, query, bindVars, rss[0], true, true /* canAutocommit */) + qr, err := execShard(ctx, ins, vcursor, query, bindVars, rss[0], true, !ins.PreventAutoCommit /* canAutocommit */) if err != nil { return 0, nil, err } diff --git a/go/vt/vtgate/engine/sequential.go b/go/vt/vtgate/engine/sequential.go new file mode 100644 index 00000000000..d038df4afbf --- /dev/null +++ b/go/vt/vtgate/engine/sequential.go @@ -0,0 +1,90 @@ +/* +Copyright 2023 The Vitess Authors. + +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 engine + +import ( + "context" + + "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vterrors" +) + +// Sequential Primitive is used to execute DML statements in a fixed order. +// Any failure, stops the execution and returns. +type Sequential struct { + Sources []Primitive + + txNeeded +} + +var _ Primitive = (*Sequential)(nil) + +// NewSequential creates a Sequential primitive. +func NewSequential(Sources []Primitive) *Sequential { + return &Sequential{ + Sources: Sources, + } +} + +// RouteType returns a description of the query routing type used by the primitive +func (s *Sequential) RouteType() string { + return "Sequential" +} + +// GetKeyspaceName specifies the Keyspace that this primitive routes to +func (s *Sequential) GetKeyspaceName() string { + res := s.Sources[0].GetKeyspaceName() + for i := 1; i < len(s.Sources); i++ { + res = formatTwoOptionsNicely(res, s.Sources[i].GetKeyspaceName()) + } + return res +} + +// GetTableName specifies the table that this primitive routes to. +func (s *Sequential) GetTableName() string { + res := s.Sources[0].GetTableName() + for i := 1; i < len(s.Sources); i++ { + res = formatTwoOptionsNicely(res, s.Sources[i].GetTableName()) + } + return res +} + +// TryExecute performs a non-streaming exec. +func (s *Sequential) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantFields bool) (*sqltypes.Result, error) { + return nil, vterrors.VT10002() +} + +// TryStreamExecute performs a streaming exec. +func (s *Sequential) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantFields bool, callback func(*sqltypes.Result) error) error { + return vterrors.VT10002() +} + +// GetFields fetches the field info. +func (s *Sequential) GetFields(context.Context, VCursor, map[string]*querypb.BindVariable) (*sqltypes.Result, error) { + return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "[BUG] unreachable code for Sequential engine") +} + +// Inputs returns the input primitives for this +func (s *Sequential) Inputs() ([]Primitive, []map[string]any) { + return s.Sources, nil +} + +func (s *Sequential) description() PrimitiveDescription { + return PrimitiveDescription{OperatorType: s.RouteType()} +} diff --git a/go/vt/vtgate/engine/update.go b/go/vt/vtgate/engine/update.go index 3db7972fba5..913cacaaba8 100644 --- a/go/vt/vtgate/engine/update.go +++ b/go/vt/vtgate/engine/update.go @@ -204,6 +204,7 @@ func (upd *Update) description() PrimitiveDescription { "OwnedVindexQuery": upd.OwnedVindexQuery, "MultiShardAutocommit": upd.MultiShardAutocommit, "QueryTimeout": upd.QueryTimeout, + "NoAutoCommit": upd.PreventAutoCommit, } addFieldsIfNotEmpty(upd.DML, other) diff --git a/go/vt/vtgate/planbuilder/insert.go b/go/vt/vtgate/planbuilder/insert.go index c187cd7efdc..39144fc858d 100644 --- a/go/vt/vtgate/planbuilder/insert.go +++ b/go/vt/vtgate/planbuilder/insert.go @@ -19,7 +19,6 @@ package planbuilder import ( querypb "vitess.io/vitess/go/vt/proto/query" "vitess.io/vitess/go/vt/sqlparser" - "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vtgate/engine" "vitess.io/vitess/go/vt/vtgate/planbuilder/operators" "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" @@ -62,7 +61,7 @@ func gen4InsertStmtPlanner(version querypb.ExecuteOptions_PlannerVersion, insStm return nil, err } - if err = errOutIfPlanCannotBeConstructed(ctx, tblInfo.GetVindexTable(), insStmt, ctx.SemTable.ForeignKeysPresent()); err != nil { + if err = errOutIfPlanCannotBeConstructed(ctx, tblInfo.GetVindexTable()); err != nil { return nil, err } @@ -84,17 +83,11 @@ func gen4InsertStmtPlanner(version querypb.ExecuteOptions_PlannerVersion, insStm return newPlanResult(plan.Primitive(), operators.TablesUsed(op)...), nil } -func errOutIfPlanCannotBeConstructed(ctx *plancontext.PlanningContext, vTbl *vindexes.Table, insStmt *sqlparser.Insert, fkPlanNeeded bool) error { - if vTbl.Keyspace.Sharded && ctx.SemTable.NotUnshardedErr != nil { - return ctx.SemTable.NotUnshardedErr - } - if insStmt.Action != sqlparser.ReplaceAct { +func errOutIfPlanCannotBeConstructed(ctx *plancontext.PlanningContext, vTbl *vindexes.Table) error { + if !vTbl.Keyspace.Sharded { return nil } - if fkPlanNeeded { - return vterrors.VT12001("REPLACE INTO with foreign keys") - } - return nil + return ctx.SemTable.NotUnshardedErr } func insertUnshardedShortcut(stmt *sqlparser.Insert, ks *vindexes.Keyspace, tables []*vindexes.Table) logicalPlan { diff --git a/go/vt/vtgate/planbuilder/operator_transformers.go b/go/vt/vtgate/planbuilder/operator_transformers.go index 59200e92e2a..5f59a96000a 100644 --- a/go/vt/vtgate/planbuilder/operator_transformers.go +++ b/go/vt/vtgate/planbuilder/operator_transformers.go @@ -68,11 +68,30 @@ func transformToLogicalPlan(ctx *plancontext.PlanningContext, op ops.Operator) ( return transformFkVerify(ctx, op) case *operators.InsertSelection: return transformInsertionSelection(ctx, op) + case *operators.Sequential: + return transformSequential(ctx, op) } return nil, vterrors.VT13001(fmt.Sprintf("unknown type encountered: %T (transformToLogicalPlan)", op)) } +func transformSequential(ctx *plancontext.PlanningContext, op *operators.Sequential) (logicalPlan, error) { + var lps []logicalPlan + for _, source := range op.Sources { + lp, err := transformToLogicalPlan(ctx, source) + if err != nil { + return nil, err + } + if ins, ok := lp.(*insert); ok { + ins.eInsert.PreventAutoCommit = true + } + lps = append(lps, lp) + } + return &sequential{ + sources: lps, + }, nil +} + func transformInsertionSelection(ctx *plancontext.PlanningContext, op *operators.InsertSelection) (logicalPlan, error) { rb, isRoute := op.Insert.(*operators.Route) if !isRoute { diff --git a/go/vt/vtgate/planbuilder/operators/insert.go b/go/vt/vtgate/planbuilder/operators/insert.go index a48e53c18b1..e3f0748b78b 100644 --- a/go/vt/vtgate/planbuilder/operators/insert.go +++ b/go/vt/vtgate/planbuilder/operators/insert.go @@ -111,12 +111,228 @@ func createOperatorFromInsert(ctx *plancontext.PlanningContext, ins *sqlparser.I return nil, err } - vindexTable, routing, err := buildVindexTableForDML(ctx, tableInfo, qt, "insert") + vTbl, routing, err := buildVindexTableForDML(ctx, tableInfo, qt, "insert") if err != nil { return nil, err } - insOp, err := createInsertOperator(ctx, ins, vindexTable, routing) + deleteBeforeInsert := false + if ins.Action == sqlparser.ReplaceAct && + (ctx.SemTable.ForeignKeysPresent() || vTbl.Keyspace.Sharded) && + (len(vTbl.PrimaryKey) > 0 || len(vTbl.UniqueKeys) > 0) { + // this needs a delete before insert as there can be row clash which needs to be deleted first. + ins.Action = sqlparser.InsertAct + deleteBeforeInsert = true + } + + insOp, err := checkAndCreateInsertOperator(ctx, ins, vTbl, routing) + if err != nil { + return nil, err + } + + if !deleteBeforeInsert { + return insOp, nil + } + + rows, isRows := ins.Rows.(sqlparser.Values) + if !isRows { + return nil, vterrors.VT12001("REPLACE INTO using select statement") + } + + pkCompExpr := pkCompExpression(vTbl, ins, rows) + uniqKeyCompExprs, err := uniqKeyCompExpressions(vTbl, ins, rows) + if err != nil { + return nil, err + } + + whereExpr := getWhereCondExpr(append(uniqKeyCompExprs, pkCompExpr)) + + delStmt := &sqlparser.Delete{ + TableExprs: sqlparser.TableExprs{sqlparser.CloneRefOfAliasedTableExpr(ins.Table)}, + Where: sqlparser.NewWhere(sqlparser.WhereClause, whereExpr), + } + delOp, err := createOpFromStmt(ctx, delStmt, false, "") + if err != nil { + return nil, err + } + return &Sequential{Sources: []ops.Operator{delOp, insOp}}, nil +} + +func getWhereCondExpr(compExprs []*sqlparser.ComparisonExpr) sqlparser.Expr { + var outputExpr sqlparser.Expr + for _, expr := range compExprs { + if expr == nil { + continue + } + if outputExpr == nil { + outputExpr = expr + continue + } + outputExpr = &sqlparser.OrExpr{ + Left: outputExpr, + Right: expr, + } + } + return outputExpr +} + +func pkCompExpression(vTbl *vindexes.Table, ins *sqlparser.Insert, rows sqlparser.Values) *sqlparser.ComparisonExpr { + if len(vTbl.PrimaryKey) == 0 { + return nil + } + type pComp struct { + idx int + def sqlparser.Expr + } + var pIndexes []pComp + var pColTuple sqlparser.ValTuple + for _, pCol := range vTbl.PrimaryKey { + var def sqlparser.Expr + idx := ins.Columns.FindColumn(pCol) + if idx == -1 { + def = findDefault(vTbl, pCol) + if def == nil { + // If default value is empty, nothing to compare as it will always be false. + return nil + } + } + pIndexes = append(pIndexes, pComp{idx, def}) + pColTuple = append(pColTuple, sqlparser.NewColName(pCol.String())) + } + + var pValTuple sqlparser.ValTuple + for _, row := range rows { + var rowTuple sqlparser.ValTuple + for _, pIdx := range pIndexes { + if pIdx.idx == -1 { + rowTuple = append(rowTuple, pIdx.def) + } else { + rowTuple = append(rowTuple, row[pIdx.idx]) + } + } + pValTuple = append(pValTuple, rowTuple) + } + return sqlparser.NewComparisonExpr(sqlparser.InOp, pColTuple, pValTuple, nil) +} + +func findDefault(vTbl *vindexes.Table, pCol sqlparser.IdentifierCI) sqlparser.Expr { + for _, column := range vTbl.Columns { + if column.Name.Equal(pCol) { + return column.Default + } + } + panic(vterrors.VT03014(pCol.String(), vTbl.Name.String())) +} + +type uComp struct { + idx int + def sqlparser.Expr +} + +func uniqKeyCompExpressions(vTbl *vindexes.Table, ins *sqlparser.Insert, rows sqlparser.Values) (comps []*sqlparser.ComparisonExpr, err error) { + noOfUniqKeys := len(vTbl.UniqueKeys) + if noOfUniqKeys == 0 { + return nil, nil + } + + type uIdx struct { + Indexes [][]uComp + uniqKey sqlparser.Exprs + } + + allIndexes := make([]uIdx, 0, noOfUniqKeys) + allColTuples := make([]sqlparser.ValTuple, 0, noOfUniqKeys) + for _, uniqKey := range vTbl.UniqueKeys { + var uIndexes [][]uComp + var uColTuple sqlparser.ValTuple + skipKey := false + for _, expr := range uniqKey { + var offsets []uComp + offsets, skipKey, err = createUniqueKeyComp(ins, expr, vTbl) + if err != nil { + return nil, err + } + if skipKey { + break + } + uIndexes = append(uIndexes, offsets) + uColTuple = append(uColTuple, expr) + } + if skipKey { + continue + } + allIndexes = append(allIndexes, uIdx{uIndexes, uniqKey}) + allColTuples = append(allColTuples, uColTuple) + } + + allValTuples := make([]sqlparser.ValTuple, len(allColTuples)) + for _, row := range rows { + for i, uk := range allIndexes { + var rowTuple sqlparser.ValTuple + for j, offsets := range uk.Indexes { + colIdx := 0 + valExpr := sqlparser.CopyOnRewrite(uk.uniqKey[j], nil, func(cursor *sqlparser.CopyOnWriteCursor) { + _, isCol := cursor.Node().(*sqlparser.ColName) + if !isCol { + return + } + if offsets[colIdx].idx == -1 { + cursor.Replace(offsets[colIdx].def) + } else { + cursor.Replace(row[offsets[colIdx].idx]) + } + colIdx++ + }, nil).(sqlparser.Expr) + rowTuple = append(rowTuple, valExpr) + } + allValTuples[i] = append(allValTuples[i], rowTuple) + } + } + + compExprs := make([]*sqlparser.ComparisonExpr, 0, noOfUniqKeys) + for i, valTuple := range allValTuples { + compExprs = append(compExprs, sqlparser.NewComparisonExpr(sqlparser.InOp, allColTuples[i], valTuple, nil)) + } + return compExprs, nil +} + +func createUniqueKeyComp(ins *sqlparser.Insert, expr sqlparser.Expr, vTbl *vindexes.Table) ([]uComp, bool, error) { + col, isCol := expr.(*sqlparser.ColName) + if isCol { + var def sqlparser.Expr + idx := ins.Columns.FindColumn(col.Name) + if idx == -1 { + def = findDefault(vTbl, col.Name) + if def == nil { + // default value is empty, nothing to compare as it will always be false. + return nil, true, nil + } + } + return []uComp{{idx, def}}, false, nil + } + var offsets []uComp + err := sqlparser.Walk(func(node sqlparser.SQLNode) (kontinue bool, err error) { + col, ok := node.(*sqlparser.ColName) + if !ok { + return true, nil + } + var def sqlparser.Expr + idx := ins.Columns.FindColumn(col.Name) + if idx == -1 { + def = findDefault(vTbl, col.Name) + // no default, replace it with null value. + if def == nil { + def = &sqlparser.NullVal{} + } + } + offsets = append(offsets, uComp{idx, def}) + return false, nil + }, expr) + return offsets, false, err +} + +func checkAndCreateInsertOperator(ctx *plancontext.PlanningContext, ins *sqlparser.Insert, vTbl *vindexes.Table, routing Routing) (ops.Operator, error) { + insOp, err := createInsertOperator(ctx, ins, vTbl, routing) if err != nil { return nil, err } @@ -129,7 +345,7 @@ func createOperatorFromInsert(ctx *plancontext.PlanningContext, ins *sqlparser.I } // Find the foreign key mode and for unmanaged foreign-key-mode, we don't need to do anything. - ksMode, err := ctx.VSchema.ForeignKeyMode(vindexTable.Keyspace.Name) + ksMode, err := ctx.VSchema.ForeignKeyMode(vTbl.Keyspace.Name) if err != nil { return nil, err } @@ -139,13 +355,18 @@ func createOperatorFromInsert(ctx *plancontext.PlanningContext, ins *sqlparser.I parentFKs := ctx.SemTable.GetParentForeignKeysList() childFks := ctx.SemTable.GetChildForeignKeysList() - if len(childFks) == 0 && len(parentFKs) == 0 { - return insOp, nil - } if len(parentFKs) > 0 { return nil, vterrors.VT12002() } - return nil, vterrors.VT12001("ON DUPLICATE KEY UPDATE with foreign keys") + if len(childFks) > 0 { + if ins.Action == sqlparser.ReplaceAct { + return nil, vterrors.VT12001("REPLACE INTO with foreign keys") + } + if len(ins.OnDup) > 0 { + return nil, vterrors.VT12001("ON DUPLICATE KEY UPDATE with foreign keys") + } + } + return insOp, nil } func createInsertOperator(ctx *plancontext.PlanningContext, insStmt *sqlparser.Insert, vTbl *vindexes.Table, routing Routing) (ops.Operator, error) { diff --git a/go/vt/vtgate/planbuilder/operators/sequential.go b/go/vt/vtgate/planbuilder/operators/sequential.go new file mode 100644 index 00000000000..2b333c6270a --- /dev/null +++ b/go/vt/vtgate/planbuilder/operators/sequential.go @@ -0,0 +1,54 @@ +/* +Copyright 2023 The Vitess Authors. + +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 operators + +import ( + "vitess.io/vitess/go/vt/vtgate/planbuilder/operators/ops" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" +) + +type Sequential struct { + Sources []ops.Operator + + noPredicates + noColumns +} + +// Clone implements the Operator interface +func (s *Sequential) Clone(inputs []ops.Operator) ops.Operator { + newOp := *s + newOp.Sources = inputs + return &newOp +} + +func (s *Sequential) GetOrdering(*plancontext.PlanningContext) []ops.OrderBy { + return nil +} + +// Inputs implements the Operator interface +func (s *Sequential) Inputs() []ops.Operator { + return s.Sources +} + +// SetInputs implements the Operator interface +func (s *Sequential) SetInputs(ops []ops.Operator) { + s.Sources = ops +} + +func (s *Sequential) ShortDescription() string { + return "" +} diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index 472648828ef..9c1592fdf81 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -175,7 +175,23 @@ func setFks(t *testing.T, vschema *vindexes.VSchema) { _ = vschema.AddForeignKey("unsharded_fk_allow", "u_multicol_tbl2", createFkDefinition([]string{"cola", "colb"}, "u_multicol_tbl1", []string{"cola", "colb"}, sqlparser.SetNull, sqlparser.SetNull)) _ = vschema.AddForeignKey("unsharded_fk_allow", "u_multicol_tbl3", createFkDefinition([]string{"cola", "colb"}, "u_multicol_tbl2", []string{"cola", "colb"}, sqlparser.Cascade, sqlparser.Cascade)) - } + + _ = vschema.AddForeignKey("unsharded_fk_allow", "fk_t3", createFkDefinition([]string{"col"}, "fk_t2", []string{"col2"}, sqlparser.SetNull, sqlparser.SetNull)) + _ = vschema.AddForeignKey("unsharded_fk_allow", "fk_t4", createFkDefinition([]string{"col3"}, "fk_t3", []string{"col2"}, sqlparser.SetNull, sqlparser.SetNull)) + _ = vschema.AddPrimaryKey("unsharded_fk_allow", "fk_t2", []string{"id"}) + _ = vschema.AddPrimaryKey("unsharded_fk_allow", "fk_t3", []string{"id"}) + _ = vschema.AddPrimaryKey("unsharded_fk_allow", "fk_t4", []string{"id"}) + _ = vschema.AddUniqueKey("unsharded_fk_allow", "fk_t3", sqlparser.Exprs{sqlparser.NewColName("col")}) + } + + _ = vschema.AddPrimaryKey("unsharded_fk_allow", "u_tbl1", []string{"id"}) + _ = vschema.AddPrimaryKey("unsharded_fk_allow", "u_tbl9", []string{"id"}) + _ = vschema.AddUniqueKey("unsharded_fk_allow", "u_tbl9", sqlparser.Exprs{sqlparser.NewColName("col9")}) + _ = vschema.AddUniqueKey("unsharded_fk_allow", "u_tbl9", sqlparser.Exprs{&sqlparser.BinaryExpr{Operator: sqlparser.MultOp, Left: sqlparser.NewColName("col9"), Right: sqlparser.NewColName("foo")}}) + _ = vschema.AddUniqueKey("unsharded_fk_allow", "u_tbl9", sqlparser.Exprs{sqlparser.NewColName("col9"), sqlparser.NewColName("foo")}) + _ = vschema.AddUniqueKey("unsharded_fk_allow", "u_tbl9", sqlparser.Exprs{sqlparser.NewColName("foo"), sqlparser.NewColName("bar")}) + _ = vschema.AddUniqueKey("unsharded_fk_allow", "u_tbl9", sqlparser.Exprs{sqlparser.NewColName("bar"), sqlparser.NewColName("col9")}) + _ = vschema.AddUniqueKey("unsharded_fk_allow", "u_tbl8", sqlparser.Exprs{sqlparser.NewColName("col8")}) } func TestSystemTables57(t *testing.T) { diff --git a/go/vt/vtgate/planbuilder/sequential.go b/go/vt/vtgate/planbuilder/sequential.go new file mode 100644 index 00000000000..ff6abacb437 --- /dev/null +++ b/go/vt/vtgate/planbuilder/sequential.go @@ -0,0 +1,36 @@ +/* +Copyright 2023 The Vitess Authors. + +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 planbuilder + +import ( + "vitess.io/vitess/go/vt/vtgate/engine" +) + +type sequential struct { + sources []logicalPlan +} + +var _ logicalPlan = (*sequential)(nil) + +// Primitive implements the logicalPlan interface +func (s *sequential) Primitive() engine.Primitive { + var sources []engine.Primitive + for _, source := range s.sources { + sources = append(sources, source.Primitive()) + } + return engine.NewSequential(sources) +} diff --git a/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json b/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json index afe42a45720..0a57806cb1d 100644 --- a/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json @@ -1690,9 +1690,113 @@ "plan": "VT12002: unsupported: cross-shard foreign keys" }, { - "comment": "replace with fk reference unsupported", + "comment": "replace into with table having primary key", "query": "replace into u_tbl1 (id, col1) values (1, 2)", - "plan": "VT12001: unsupported: REPLACE INTO with foreign keys" + "plan": { + "QueryType": "INSERT", + "Original": "replace into u_tbl1 (id, col1) values (1, 2)", + "Instructions": { + "OperatorType": "Sequential", + "Inputs": [ + { + "OperatorType": "FkCascade", + "Inputs": [ + { + "InputName": "Selection", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select col1 from u_tbl1 where 1 != 1", + "Query": "select col1 from u_tbl1 where (id) in ((1)) for update", + "Table": "u_tbl1" + }, + { + "InputName": "CascadeChild-1", + "OperatorType": "FkCascade", + "BvName": "fkc_vals", + "Cols": [ + 0 + ], + "Inputs": [ + { + "InputName": "Selection", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select col2 from u_tbl2 where 1 != 1", + "Query": "select col2 from u_tbl2 where (col2) in ::fkc_vals for update", + "Table": "u_tbl2" + }, + { + "InputName": "CascadeChild-1", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "BvName": "fkc_vals1", + "Cols": [ + 0 + ], + "Query": "update u_tbl3 set col3 = null where (col3) in ::fkc_vals1", + "Table": "u_tbl3" + }, + { + "InputName": "Parent", + "OperatorType": "Delete", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "delete from u_tbl2 where (col2) in ::fkc_vals", + "Table": "u_tbl2" + } + ] + }, + { + "InputName": "Parent", + "OperatorType": "Delete", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "delete from u_tbl1 where (id) in ((1))", + "Table": "u_tbl1" + } + ] + }, + { + "OperatorType": "Insert", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "NoAutoCommit": true, + "Query": "insert into u_tbl1(id, col1) values (1, 2)", + "TableName": "u_tbl1" + } + ] + }, + "TablesUsed": [ + "unsharded_fk_allow.u_tbl1", + "unsharded_fk_allow.u_tbl2", + "unsharded_fk_allow.u_tbl3" + ] + } }, { "comment": "update on a multicol foreign key that set nulls and then cascades", @@ -2258,5 +2362,79 @@ "unsharded_fk_allow.u_multicol_tbl3" ] } + }, + { + "comment": "replace into with table having unique key and primary key", + "query": "replace into u_tbl9(id, col9) values (1, 10),(2, 20),(3, 30)", + "plan": { + "QueryType": "INSERT", + "Original": "replace into u_tbl9(id, col9) values (1, 10),(2, 20),(3, 30)", + "Instructions": { + "OperatorType": "Sequential", + "Inputs": [ + { + "OperatorType": "FkCascade", + "Inputs": [ + { + "InputName": "Selection", + "OperatorType": "Route", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "FieldQuery": "select col9 from u_tbl9 where 1 != 1", + "Query": "select col9 from u_tbl9 where (col9) in ((10), (20), (30)) or (col9 * foo) in ((10 * null), (20 * null), (30 * null)) or (bar, col9) in ((1, 10), (1, 20), (1, 30)) or (id) in ((1), (2), (3)) for update", + "Table": "u_tbl9" + }, + { + "InputName": "CascadeChild-1", + "OperatorType": "Update", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "BvName": "fkc_vals", + "Cols": [ + 0 + ], + "Query": "update u_tbl8 set col8 = null where (col8) in ::fkc_vals", + "Table": "u_tbl8" + }, + { + "InputName": "Parent", + "OperatorType": "Delete", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "Query": "delete from u_tbl9 where (col9) in ((10), (20), (30)) or (col9 * foo) in ((10 * null), (20 * null), (30 * null)) or (bar, col9) in ((1, 10), (1, 20), (1, 30)) or (id) in ((1), (2), (3))", + "Table": "u_tbl9" + } + ] + }, + { + "OperatorType": "Insert", + "Variant": "Unsharded", + "Keyspace": { + "Name": "unsharded_fk_allow", + "Sharded": false + }, + "TargetTabletType": "PRIMARY", + "NoAutoCommit": true, + "Query": "insert into u_tbl9(id, col9) values (1, 10), (2, 20), (3, 30)", + "TableName": "u_tbl9" + } + ] + }, + "TablesUsed": [ + "unsharded_fk_allow.u_tbl8", + "unsharded_fk_allow.u_tbl9" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json b/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json index a7824126c98..d5b9ece501b 100644 --- a/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json +++ b/go/vt/vtgate/planbuilder/testdata/vschemas/schema.json @@ -760,7 +760,12 @@ "u_tbl6": {}, "u_tbl7": {}, "u_tbl8": {}, - "u_tbl9": {}, + "u_tbl9": { + "columns": [ + {"name": "foo"}, + {"name": "bar", "default": "1"} + ] + }, "u_tbl": {}, "u_multicol_tbl1": {}, "u_multicol_tbl2": {}, diff --git a/go/vt/vtgate/schema/tracker.go b/go/vt/vtgate/schema/tracker.go index 369ab178986..c4b48ce8156 100644 --- a/go/vt/vtgate/schema/tracker.go +++ b/go/vt/vtgate/schema/tracker.go @@ -216,6 +216,15 @@ func (t *Tracker) GetForeignKeys(ks string, tbl string) []*sqlparser.ForeignKeyD return tblInfo.ForeignKeys } +// GetIndexes returns the indexes for table in the given keyspace. +func (t *Tracker) GetIndexes(ks string, tbl string) []*sqlparser.IndexDefinition { + t.mu.Lock() + defer t.mu.Unlock() + + tblInfo := t.tables.get(ks, tbl) + return tblInfo.Indexes +} + // Tables returns a map with the columns for all known tables in the keyspace func (t *Tracker) Tables(ks string) map[string]*vindexes.TableInfo { t.mu.Lock() @@ -293,7 +302,7 @@ func (t *Tracker) updateTables(keyspace string, res map[string]string) { cols := getColumns(ddl.TableSpec) fks := getForeignKeys(ddl.TableSpec) - t.tables.set(keyspace, tableName, cols, fks) + t.tables.set(keyspace, tableName, cols, fks, ddl.TableSpec.Indexes) } } @@ -308,6 +317,7 @@ func getColumns(tblSpec *sqlparser.TableSpec) []vindexes.Column { Type: column.Type.SQLType(), CollationName: colCollation, Invisible: column.Type.Invisible(), + Default: column.Type.Options.Default, }) } return cols @@ -403,13 +413,13 @@ type tableMap struct { m map[keyspaceStr]map[tableNameStr]*vindexes.TableInfo } -func (tm *tableMap) set(ks, tbl string, cols []vindexes.Column, fks []*sqlparser.ForeignKeyDefinition) { +func (tm *tableMap) set(ks, tbl string, cols []vindexes.Column, fks []*sqlparser.ForeignKeyDefinition, indexes []*sqlparser.IndexDefinition) { m := tm.m[ks] if m == nil { m = make(map[tableNameStr]*vindexes.TableInfo) tm.m[ks] = m } - m[tbl] = &vindexes.TableInfo{Columns: cols, ForeignKeys: fks} + m[tbl] = &vindexes.TableInfo{Columns: cols, ForeignKeys: fks, Indexes: indexes} } func (tm *tableMap) get(ks, tbl string) *vindexes.TableInfo { diff --git a/go/vt/vtgate/schema/tracker_test.go b/go/vt/vtgate/schema/tracker_test.go index 4f514fec101..88b9dfa0d50 100644 --- a/go/vt/vtgate/schema/tracker_test.go +++ b/go/vt/vtgate/schema/tracker_test.go @@ -264,8 +264,8 @@ func TestViewsTracking(t *testing.T) { testTracker(t, schemaDefResult, testcases) } -// TestTableInfoRetrieval tests that the tracker is able to retrieve required information from ddl statement. -func TestTableInfoRetrieval(t *testing.T) { +// TestFKInfoRetrieval tests that the tracker is able to retrieve required foreign key information from ddl statement. +func TestFKInfoRetrieval(t *testing.T) { schemaDefResult := []map[string]string{{ "my_tbl": "CREATE TABLE `my_tbl` (" + "`id` bigint NOT NULL AUTO_INCREMENT," + @@ -293,8 +293,8 @@ func TestTableInfoRetrieval(t *testing.T) { expTbl: map[string][]vindexes.Column{ "my_tbl": { {Name: sqlparser.NewIdentifierCI("id"), Type: querypb.Type_INT64, CollationName: "utf8mb4_0900_ai_ci"}, - {Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, CollationName: "latin1_swedish_ci"}, - {Name: sqlparser.NewIdentifierCI("email"), Type: querypb.Type_VARBINARY, CollationName: "utf8mb4_0900_ai_ci"}, + {Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, CollationName: "latin1_swedish_ci", Default: &sqlparser.NullVal{}}, + {Name: sqlparser.NewIdentifierCI("email"), Type: querypb.Type_VARBINARY, CollationName: "utf8mb4_0900_ai_ci", Default: &sqlparser.NullVal{}}, }, }, }, { @@ -303,14 +303,14 @@ func TestTableInfoRetrieval(t *testing.T) { expTbl: map[string][]vindexes.Column{ "my_tbl": { {Name: sqlparser.NewIdentifierCI("id"), Type: querypb.Type_INT64, CollationName: "utf8mb4_0900_ai_ci"}, - {Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, CollationName: "latin1_swedish_ci"}, - {Name: sqlparser.NewIdentifierCI("email"), Type: querypb.Type_VARBINARY, CollationName: "utf8mb4_0900_ai_ci"}, + {Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, CollationName: "latin1_swedish_ci", Default: &sqlparser.NullVal{}}, + {Name: sqlparser.NewIdentifierCI("email"), Type: querypb.Type_VARBINARY, CollationName: "utf8mb4_0900_ai_ci", Default: &sqlparser.NullVal{}}, }, "my_child_tbl": { {Name: sqlparser.NewIdentifierCI("id"), Type: querypb.Type_INT64, CollationName: "utf8mb4_0900_ai_ci"}, - {Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, CollationName: "latin1_swedish_ci"}, - {Name: sqlparser.NewIdentifierCI("code"), Type: querypb.Type_VARCHAR, CollationName: "utf8mb4_0900_ai_ci"}, - {Name: sqlparser.NewIdentifierCI("my_id"), Type: querypb.Type_INT64, CollationName: "utf8mb4_0900_ai_ci"}, + {Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, CollationName: "latin1_swedish_ci", Default: &sqlparser.NullVal{}}, + {Name: sqlparser.NewIdentifierCI("code"), Type: querypb.Type_VARCHAR, CollationName: "utf8mb4_0900_ai_ci", Default: &sqlparser.NullVal{}}, + {Name: sqlparser.NewIdentifierCI("my_id"), Type: querypb.Type_INT64, CollationName: "utf8mb4_0900_ai_ci", Default: &sqlparser.NullVal{}}, }, }, expFk: map[string]string{ @@ -322,12 +322,73 @@ func TestTableInfoRetrieval(t *testing.T) { testTracker(t, schemaDefResult, testcases) } +// TestIndexInfoRetrieval tests that the tracker is able to retrieve required index information from ddl statement. +func TestIndexInfoRetrieval(t *testing.T) { + schemaDefResult := []map[string]string{{ + "my_tbl": "CREATE TABLE `my_tbl` (" + + "`id` bigint NOT NULL AUTO_INCREMENT," + + "`name` varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL," + + "`email` varbinary(100) DEFAULT NULL," + + "PRIMARY KEY (`id`)," + + "KEY `id` (`id`,`name`)) " + + "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", + }, { + // initial load of view - kept empty + }, { + "my_tbl": "CREATE TABLE `my_tbl` (" + + "`id` bigint NOT NULL AUTO_INCREMENT," + + "`name` varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL," + + "`email` varbinary(100) DEFAULT NULL," + + "PRIMARY KEY (`id`)," + + "KEY `id` (`id`,`name`), " + + "UNIQUE KEY `email` (`email`)) " + + "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", + }} + + testcases := []testCases{{ + testName: "initial table load", + expTbl: map[string][]vindexes.Column{ + "my_tbl": { + {Name: sqlparser.NewIdentifierCI("id"), Type: querypb.Type_INT64, CollationName: "utf8mb4_0900_ai_ci"}, + {Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, CollationName: "latin1_swedish_ci", Default: &sqlparser.NullVal{}}, + {Name: sqlparser.NewIdentifierCI("email"), Type: querypb.Type_VARBINARY, CollationName: "utf8mb4_0900_ai_ci", Default: &sqlparser.NullVal{}}, + }, + }, + expIdx: map[string][]string{ + "my_tbl": { + "primary key (id)", + "key id (id, `name`)", + }, + }, + }, { + testName: "next load", + updTbl: []string{"my_tbl"}, + expTbl: map[string][]vindexes.Column{ + "my_tbl": { + {Name: sqlparser.NewIdentifierCI("id"), Type: querypb.Type_INT64, CollationName: "utf8mb4_0900_ai_ci"}, + {Name: sqlparser.NewIdentifierCI("name"), Type: querypb.Type_VARCHAR, CollationName: "latin1_swedish_ci", Default: &sqlparser.NullVal{}}, + {Name: sqlparser.NewIdentifierCI("email"), Type: querypb.Type_VARBINARY, CollationName: "utf8mb4_0900_ai_ci", Default: &sqlparser.NullVal{}}, + }, + }, + expIdx: map[string][]string{ + "my_tbl": { + "primary key (id)", + "key id (id, `name`)", + "unique key email (email)", + }, + }, + }} + + testTracker(t, schemaDefResult, testcases) +} + type testCases struct { testName string updTbl []string expTbl map[string][]vindexes.Column expFk map[string]string + expIdx map[string][]string updView []string expView map[string]string @@ -376,6 +437,16 @@ func testTracker(t *testing.T, schemaDefResult []map[string]string, tcases []tes utils.MustMatch(t, tcase.expFk[k], sqlparser.String(fk), "mismatch foreign keys for table: ", k) } } + expIndexes := tcase.expIdx[k] + if len(expIndexes) > 0 { + idxs := tracker.GetIndexes(keyspace, k) + if len(expIndexes) != len(idxs) { + t.Fatalf("mismatch index for table: %s", k) + } + for i, idx := range idxs { + utils.MustMatch(t, expIndexes[i], sqlparser.String(idx), "mismatch index for table: ", k) + } + } } for k, v := range tcase.expView { diff --git a/go/vt/vtgate/vindexes/foreign_keys.go b/go/vt/vtgate/vindexes/foreign_keys.go index 74f9ce74844..275a0674998 100644 --- a/go/vt/vtgate/vindexes/foreign_keys.go +++ b/go/vt/vtgate/vindexes/foreign_keys.go @@ -144,3 +144,33 @@ func (vschema *VSchema) AddForeignKey(ksname, childTableName string, fkConstrain cTbl.ParentForeignKeys = append(cTbl.ParentForeignKeys, NewParentFkInfo(pTbl, fkConstraint)) return nil } + +// AddPrimaryKey is for testing only. +func (vschema *VSchema) AddPrimaryKey(ksname, tblName string, cols []string) error { + ks, ok := vschema.Keyspaces[ksname] + if !ok { + return fmt.Errorf("keyspace %s not found in vschema", ksname) + } + tbl, ok := ks.Tables[tblName] + if !ok { + return fmt.Errorf("table %s not found in keyspace %s", tblName, ksname) + } + for _, col := range cols { + tbl.PrimaryKey = append(tbl.PrimaryKey, sqlparser.NewIdentifierCI(col)) + } + return nil +} + +// AddUniqueKey is for testing only. +func (vschema *VSchema) AddUniqueKey(ksname, tblName string, exprs sqlparser.Exprs) error { + ks, ok := vschema.Keyspaces[ksname] + if !ok { + return fmt.Errorf("keyspace %s not found in vschema", ksname) + } + tbl, ok := ks.Tables[tblName] + if !ok { + return fmt.Errorf("table %s not found in keyspace %s", tblName, ksname) + } + tbl.UniqueKeys = append(tbl.UniqueKeys, exprs) + return nil +} diff --git a/go/vt/vtgate/vindexes/vschema.go b/go/vt/vtgate/vindexes/vschema.go index 4e9f527eb83..66321b7a41c 100644 --- a/go/vt/vtgate/vindexes/vschema.go +++ b/go/vt/vtgate/vindexes/vschema.go @@ -118,6 +118,12 @@ type Table struct { ChildForeignKeys []ChildFKInfo `json:"child_foreign_keys,omitempty"` ParentForeignKeys []ParentFKInfo `json:"parent_foreign_keys,omitempty"` + + // index can be columns or expression. + // For Primary key, functional indexes are not allowed, therefore it will only be columns. + // MySQL error message: ERROR 3756 (HY000): The primary key cannot be a functional index + PrimaryKey sqlparser.Columns `json:"primary_key,omitempty"` + UniqueKeys []sqlparser.Exprs `json:"unique_keys,omitempty"` } // GetTableName gets the sqlparser.TableName for the vindex Table. @@ -148,6 +154,7 @@ type ColumnVindex struct { type TableInfo struct { Columns []Column ForeignKeys []*sqlparser.ForeignKeyDefinition + Indexes []*sqlparser.IndexDefinition } // IsUnique is used to tell whether the ColumnVindex @@ -178,6 +185,7 @@ type Column struct { Name sqlparser.IdentifierCI `json:"name"` Type querypb.Type `json:"type"` CollationName string `json:"collation_name"` + Default sqlparser.Expr `json:"default,omitempty"` // Invisible marks this as a column that will not be automatically included in `*` projections Invisible bool `json:"invisible"` @@ -185,13 +193,22 @@ type Column struct { // MarshalJSON returns a JSON representation of Column. func (col *Column) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Name string `json:"name"` - Type string `json:"type,omitempty"` + cj := struct { + Name string `json:"name"` + Type string `json:"type,omitempty"` + Invisible bool `json:"invisible,omitempty"` + Default string `json:"default,omitempty"` }{ Name: col.Name.String(), Type: querypb.Type_name[int32(col.Type)], - }) + } + if col.Invisible { + cj.Invisible = true + } + if col.Default != nil { + cj.Default = sqlparser.String(col.Default) + } + return json.Marshal(cj) } // KeyspaceSchema contains the schema(table) for a keyspace. @@ -612,8 +629,17 @@ func buildTables(ks *vschemapb.Keyspace, vschema *VSchema, ksvschema *KeyspaceSc tname, ) } + var colDefault sqlparser.Expr + if col.Default != "" { + var err error + colDefault, err = sqlparser.ParseExpr(col.Default) + if err != nil { + return vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, + "could not parse the '%s' column's default expression '%s' for table '%s'", col.Name, col.Default, tname) + } + } colNames[name.Lowered()] = true - t.Columns = append(t.Columns, Column{Name: name, Type: col.Type, Invisible: col.Invisible}) + t.Columns = append(t.Columns, Column{Name: name, Type: col.Type, Invisible: col.Invisible, Default: colDefault}) } // Initialize ColumnVindexes. diff --git a/go/vt/vtgate/vindexes/vschema_test.go b/go/vt/vtgate/vindexes/vschema_test.go index a59ec78139d..92c95d64674 100644 --- a/go/vt/vtgate/vindexes/vschema_test.go +++ b/go/vt/vtgate/vindexes/vschema_test.go @@ -315,10 +315,12 @@ func TestVSchemaColumns(t *testing.T) { "unsharded": { Tables: map[string]*vschemapb.Table{ "t1": { - Columns: []*vschemapb.Column{{ - Name: "c1"}, { - Name: "c2", - Type: sqltypes.VarChar}}}}}}} + Columns: []*vschemapb.Column{ + {Name: "c1"}, + {Name: "c2", Type: sqltypes.VarChar}, + {Name: "c3", Type: sqltypes.VarChar, Default: "''"}, + {Name: "c4", Type: sqltypes.TypeJSON, Default: "json_array()"}, + }}}}}} got := BuildVSchema(&good) require.NoError(t, got.Keyspaces["unsharded"].Error) @@ -327,6 +329,8 @@ func TestVSchemaColumns(t *testing.T) { require.NoError(t, err) assertColumn(t, t1.Columns[0], "c1", sqltypes.Null) assertColumn(t, t1.Columns[1], "c2", sqltypes.VarChar) + assertColumnWithDefault(t, t1.Columns[2], "c3", sqltypes.VarChar, sqlparser.NewStrLiteral("")) + assertColumnWithDefault(t, t1.Columns[3], "c4", sqltypes.TypeJSON, &sqlparser.JSONArrayExpr{}) } func TestVSchemaViews(t *testing.T) { @@ -2687,8 +2691,9 @@ func TestVSchemaJSON(t *testing.T) { Columns: []Column{{ Name: sqlparser.NewIdentifierCI("c1"), }, { - Name: sqlparser.NewIdentifierCI("c2"), - Type: sqltypes.VarChar, + Name: sqlparser.NewIdentifierCI("c2"), + Type: sqltypes.VarChar, + Invisible: true, }}, }, "t2": { @@ -2761,7 +2766,8 @@ func TestVSchemaJSON(t *testing.T) { }, { "name": "c2", - "type": "VARCHAR" + "type": "VARCHAR", + "invisible": true } ] }, @@ -3165,5 +3171,11 @@ func assertVindexMatches(t *testing.T, cv *ColumnVindex, v Vindex, name string, func assertColumn(t *testing.T, col Column, expectedName string, expectedType querypb.Type) { assert.True(t, col.Name.EqualString(expectedName), "column name does not match") assert.Equal(t, expectedType, col.Type, "column type does not match") +} +func assertColumnWithDefault(t *testing.T, col Column, expectedName string, expectedType querypb.Type, expDefault sqlparser.Expr) { + assertColumn(t, col, expectedName, expectedType) + if expDefault != nil { + assert.Equal(t, expDefault, col.Default, "column default does not match") + } } diff --git a/go/vt/vtgate/vschema_manager.go b/go/vt/vtgate/vschema_manager.go index 7f2b7267dc0..20c11634b54 100644 --- a/go/vt/vtgate/vschema_manager.go +++ b/go/vt/vtgate/vschema_manager.go @@ -210,19 +210,37 @@ func (vm *VSchemaManager) updateFromSchema(vschema *vindexes.VSchema) { // Now that we have ensured that all the tables are created, we can start populating the foreign keys // in the tables. for tblName, tblInfo := range m { + rTbl, err := vschema.FindRoutedTable(ksName, tblName, topodatapb.TabletType_PRIMARY) + if err != nil { + log.Errorf("error finding routed table %s: %v", tblName, err) + continue + } for _, fkDef := range tblInfo.ForeignKeys { parentTbl, err := vschema.FindRoutedTable(ksName, fkDef.ReferenceDefinition.ReferencedTable.Name.String(), topodatapb.TabletType_PRIMARY) if err != nil { log.Errorf("error finding parent table %s: %v", fkDef.ReferenceDefinition.ReferencedTable.Name.String(), err) continue } - childTbl, err := vschema.FindRoutedTable(ksName, tblName, topodatapb.TabletType_PRIMARY) - if err != nil { - log.Errorf("error finding child table %s: %v", tblName, err) - continue + rTbl.ParentForeignKeys = append(rTbl.ParentForeignKeys, vindexes.NewParentFkInfo(parentTbl, fkDef)) + parentTbl.ChildForeignKeys = append(parentTbl.ChildForeignKeys, vindexes.NewChildFkInfo(rTbl, fkDef)) + } + for _, idxDef := range tblInfo.Indexes { + switch idxDef.Info.Type { + case sqlparser.IndexTypePrimary: + for _, idxCol := range idxDef.Columns { + rTbl.PrimaryKey = append(rTbl.PrimaryKey, idxCol.Column) + } + case sqlparser.IndexTypeUnique: + var uniqueKey sqlparser.Exprs + for _, idxCol := range idxDef.Columns { + if idxCol.Expression == nil { + uniqueKey = append(uniqueKey, sqlparser.NewColName(idxCol.Column.String())) + } else { + uniqueKey = append(uniqueKey, idxCol.Expression) + } + } + rTbl.UniqueKeys = append(rTbl.UniqueKeys, uniqueKey) } - childTbl.ParentForeignKeys = append(childTbl.ParentForeignKeys, vindexes.NewParentFkInfo(parentTbl, fkDef)) - parentTbl.ChildForeignKeys = append(parentTbl.ChildForeignKeys, vindexes.NewChildFkInfo(childTbl, fkDef)) } } diff --git a/go/vt/vtgate/vschema_manager_test.go b/go/vt/vtgate/vschema_manager_test.go index 9c51266c26a..38e22fee0a2 100644 --- a/go/vt/vtgate/vschema_manager_test.go +++ b/go/vt/vtgate/vschema_manager_test.go @@ -82,6 +82,27 @@ func TestVSchemaUpdate(t *testing.T) { ParentColumns: sqlparserCols1, }) + idxTbl1 := &vindexes.Table{ + Name: sqlparser.NewIdentifierCS("idxTbl1"), + Keyspace: ks, + ColumnListAuthoritative: true, + PrimaryKey: sqlparser.Columns{sqlparser.NewIdentifierCI("a")}, + UniqueKeys: []sqlparser.Exprs{ + {sqlparser.NewColName("b")}, + {sqlparser.NewColName("c"), sqlparser.NewColName("d")}, + }, + } + idxTbl2 := &vindexes.Table{ + Name: sqlparser.NewIdentifierCS("idxTbl2"), + Keyspace: ks, + ColumnListAuthoritative: true, + PrimaryKey: sqlparser.Columns{sqlparser.NewIdentifierCI("a")}, + UniqueKeys: []sqlparser.Exprs{ + {&sqlparser.BinaryExpr{Operator: sqlparser.DivOp, Left: sqlparser.NewColName("b"), Right: sqlparser.NewIntLiteral("2")}}, + {sqlparser.NewColName("c"), &sqlparser.BinaryExpr{Operator: sqlparser.PlusOp, Left: sqlparser.NewColName("d"), Right: sqlparser.NewColName("e")}}, + }, + } + tcases := []struct { name string srvVschema *vschemapb.SrvVSchema @@ -192,41 +213,18 @@ func TestVSchemaUpdate(t *testing.T) { Sharded: false, ForeignKeyMode: vschemapb.Keyspace_managed, Tables: map[string]*vschemapb.Table{ - "t1": { - Columns: []*vschemapb.Column{ - { - Name: "id", - Type: querypb.Type_INT64, - }, - }, - }, - "t2": { - Columns: []*vschemapb.Column{ - { - Name: "id", - Type: querypb.Type_INT64, - }, - }, - }, + "t1": {Columns: []*vschemapb.Column{{Name: "id", Type: querypb.Type_INT64}}}, + "t2": {Columns: []*vschemapb.Column{{Name: "id", Type: querypb.Type_INT64}}}, "multicol_t1": { Columns: []*vschemapb.Column{ - { - Name: "uid", - Type: querypb.Type_INT64, - }, { - Name: "name", - Type: querypb.Type_VARCHAR, - }, + {Name: "uid", Type: querypb.Type_INT64}, + {Name: "name", Type: querypb.Type_VARCHAR}, }, - }, "multicol_t2": { + }, + "multicol_t2": { Columns: []*vschemapb.Column{ - { - Name: "uid", - Type: querypb.Type_INT64, - }, { - Name: "name", - Type: querypb.Type_VARCHAR, - }, + {Name: "uid", Type: querypb.Type_INT64}, + {Name: "name", Type: querypb.Type_VARCHAR}, }, }, }, @@ -249,6 +247,69 @@ func TestVSchemaUpdate(t *testing.T) { }, }, }, + }, { + name: "indexes in schema using columns", + currentVSchema: &vindexes.VSchema{}, + schema: map[string]*vindexes.TableInfo{ + "idxTbl1": { + Indexes: []*sqlparser.IndexDefinition{{ + Info: &sqlparser.IndexInfo{Type: sqlparser.IndexTypePrimary}, + Columns: []*sqlparser.IndexColumn{ + {Column: sqlparser.NewIdentifierCI("a")}, + }, + }, { + Info: &sqlparser.IndexInfo{Type: sqlparser.IndexTypeUnique}, + Columns: []*sqlparser.IndexColumn{ + {Column: sqlparser.NewIdentifierCI("b")}, + }, + }, { + Info: &sqlparser.IndexInfo{Type: sqlparser.IndexTypeDefault}, + Columns: []*sqlparser.IndexColumn{ + {Column: sqlparser.NewIdentifierCI("x")}, + {Column: sqlparser.NewIdentifierCI("y")}, + }, + }, { + Info: &sqlparser.IndexInfo{Type: sqlparser.IndexTypeUnique}, + Columns: []*sqlparser.IndexColumn{ + {Column: sqlparser.NewIdentifierCI("c")}, + {Column: sqlparser.NewIdentifierCI("d")}, + }, + }}, + }, + }, + srvVschema: makeTestSrvVSchema("ks", false, nil), + expected: makeTestVSchema("ks", false, map[string]*vindexes.Table{"idxTbl1": idxTbl1}), + }, { + name: "indexes in schema using expressions", + currentVSchema: &vindexes.VSchema{}, + schema: map[string]*vindexes.TableInfo{ + "idxTbl2": { + Indexes: []*sqlparser.IndexDefinition{{ + Info: &sqlparser.IndexInfo{Type: sqlparser.IndexTypePrimary}, + Columns: []*sqlparser.IndexColumn{ + {Column: sqlparser.NewIdentifierCI("a")}, + }, + }, { + Info: &sqlparser.IndexInfo{Type: sqlparser.IndexTypeUnique}, + Columns: []*sqlparser.IndexColumn{ + {Expression: &sqlparser.BinaryExpr{Operator: sqlparser.DivOp, Left: sqlparser.NewColName("b"), Right: sqlparser.NewIntLiteral("2")}}, + }, + }, { + Info: &sqlparser.IndexInfo{Type: sqlparser.IndexTypeDefault}, + Columns: []*sqlparser.IndexColumn{ + {Expression: &sqlparser.BinaryExpr{Operator: sqlparser.PlusOp, Left: sqlparser.NewColName("x"), Right: sqlparser.NewColName("y")}}, + }, + }, { + Info: &sqlparser.IndexInfo{Type: sqlparser.IndexTypeUnique}, + Columns: []*sqlparser.IndexColumn{ + {Column: sqlparser.NewIdentifierCI("c")}, + {Expression: &sqlparser.BinaryExpr{Operator: sqlparser.PlusOp, Left: sqlparser.NewColName("d"), Right: sqlparser.NewColName("e")}}, + }, + }}, + }, + }, + srvVschema: makeTestSrvVSchema("ks", false, nil), + expected: makeTestVSchema("ks", false, map[string]*vindexes.Table{"idxTbl2": idxTbl2}), }} vm := &VSchemaManager{} diff --git a/proto/vschema.proto b/proto/vschema.proto index 067be686db5..c6665688c23 100644 --- a/proto/vschema.proto +++ b/proto/vschema.proto @@ -127,6 +127,7 @@ message Column { string name = 1; query.Type type = 2; bool invisible = 3; + string default = 4; } // SrvVSchema is the roll-up of all the Keyspace schema for a cell. diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index 398d93080dc..bda230c6570 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -41592,6 +41592,9 @@ export namespace vschema { /** Column invisible */ invisible?: (boolean|null); + + /** Column default */ + "default"?: (string|null); } /** Represents a Column. */ @@ -41612,6 +41615,9 @@ export namespace vschema { /** Column invisible. */ public invisible: boolean; + /** Column default. */ + public default: string; + /** * Creates a new Column instance using the specified properties. * @param [properties] Properties to set diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index 9ddce1d0059..dc1679ee3c0 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -101273,6 +101273,7 @@ export const vschema = $root.vschema = (() => { * @property {string|null} [name] Column name * @property {query.Type|null} [type] Column type * @property {boolean|null} [invisible] Column invisible + * @property {string|null} ["default"] Column default */ /** @@ -101314,6 +101315,14 @@ export const vschema = $root.vschema = (() => { */ Column.prototype.invisible = false; + /** + * Column default. + * @member {string} default + * @memberof vschema.Column + * @instance + */ + Column.prototype["default"] = ""; + /** * Creates a new Column instance using the specified properties. * @function create @@ -101344,6 +101353,8 @@ export const vschema = $root.vschema = (() => { writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type); if (message.invisible != null && Object.hasOwnProperty.call(message, "invisible")) writer.uint32(/* id 3, wireType 0 =*/24).bool(message.invisible); + if (message["default"] != null && Object.hasOwnProperty.call(message, "default")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message["default"]); return writer; }; @@ -101390,6 +101401,10 @@ export const vschema = $root.vschema = (() => { message.invisible = reader.bool(); break; } + case 4: { + message["default"] = reader.string(); + break; + } default: reader.skipType(tag & 7); break; @@ -101472,6 +101487,9 @@ export const vschema = $root.vschema = (() => { if (message.invisible != null && message.hasOwnProperty("invisible")) if (typeof message.invisible !== "boolean") return "invisible: boolean expected"; + if (message["default"] != null && message.hasOwnProperty("default")) + if (!$util.isString(message["default"])) + return "default: string expected"; return null; }; @@ -101639,6 +101657,8 @@ export const vschema = $root.vschema = (() => { } if (object.invisible != null) message.invisible = Boolean(object.invisible); + if (object["default"] != null) + message["default"] = String(object["default"]); return message; }; @@ -101659,6 +101679,7 @@ export const vschema = $root.vschema = (() => { object.name = ""; object.type = options.enums === String ? "NULL_TYPE" : 0; object.invisible = false; + object["default"] = ""; } if (message.name != null && message.hasOwnProperty("name")) object.name = message.name; @@ -101666,6 +101687,8 @@ export const vschema = $root.vschema = (() => { object.type = options.enums === String ? $root.query.Type[message.type] === undefined ? message.type : $root.query.Type[message.type] : message.type; if (message.invisible != null && message.hasOwnProperty("invisible")) object.invisible = message.invisible; + if (message["default"] != null && message.hasOwnProperty("default")) + object["default"] = message["default"]; return object; }; From 09bd94a8abae6c5061334339bed9c501c41223b7 Mon Sep 17 00:00:00 2001 From: Dirkjan Bussink Date: Wed, 15 Nov 2023 22:10:27 +0100 Subject: [PATCH 31/39] Reduce wait time in test helpers (#14476) Signed-off-by: Dirkjan Bussink Signed-off-by: Manan Gupta Co-authored-by: Manan Gupta --- go/test/endtoend/utils/utils.go | 50 +++++++++++++++---- .../foreignkey/stress/fk_stress_test.go | 8 +++ 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/go/test/endtoend/utils/utils.go b/go/test/endtoend/utils/utils.go index fa270ba30a0..0231cae7baf 100644 --- a/go/test/endtoend/utils/utils.go +++ b/go/test/endtoend/utils/utils.go @@ -236,16 +236,17 @@ func WaitForAuthoritative(t *testing.T, ks, tbl string, readVSchema func() (*int case <-timeout: return fmt.Errorf("schema tracking didn't mark table t2 as authoritative until timeout") default: - time.Sleep(1 * time.Second) res, err := readVSchema() require.NoError(t, err, res) t2Map := getTableT2Map(res, ks, tbl) authoritative, fieldPresent := t2Map["column_list_authoritative"] if !fieldPresent { + time.Sleep(100 * time.Millisecond) continue } authoritativeBool, isBool := authoritative.(bool) if !isBool || !authoritativeBool { + time.Sleep(100 * time.Millisecond) continue } return nil @@ -262,24 +263,46 @@ func WaitForKsError(t *testing.T, vtgateProcess cluster.VtgateProcess, ks string t.Fatalf("schema tracking did not find error in '%s'", ks) return "" default: - time.Sleep(1 * time.Second) res, err := vtgateProcess.ReadVSchema() require.NoError(t, err, res) kss := convertToMap(*res)["keyspaces"] ksMap := convertToMap(convertToMap(kss)[ks]) ksErr, fieldPresent := ksMap["error"] if !fieldPresent { - break + time.Sleep(100 * time.Millisecond) + continue } errString, isErr := ksErr.(string) if !isErr { - break + time.Sleep(100 * time.Millisecond) + continue } return errString } } } +// WaitForTableDeletions waits for a table to be deleted +func WaitForTableDeletions(ctx context.Context, t *testing.T, vtgateProcess cluster.VtgateProcess, ks, tbl string) error { + for { + select { + case <-ctx.Done(): + return fmt.Errorf("schema tracking still found the table '%s'", tbl) + default: + res, err := vtgateProcess.ReadVSchema() + require.NoError(t, err, res) + keyspacesMap := convertToMap(*res)["keyspaces"] + ksMap := convertToMap(keyspacesMap)[ks] + tablesMap := convertToMap(ksMap)["tables"] + _, isPresent := convertToMap(tablesMap)[tbl] + if !isPresent { + return nil + } + time.Sleep(100 * time.Millisecond) + } + } +} + // WaitForColumn waits for a table's column to be present func WaitForColumn(t *testing.T, vtgateProcess cluster.VtgateProcess, ks, tbl, col string) error { timeout := time.After(60 * time.Second) @@ -288,25 +311,28 @@ func WaitForColumn(t *testing.T, vtgateProcess cluster.VtgateProcess, ks, tbl, c case <-timeout: return fmt.Errorf("schema tracking did not find column '%s' in table '%s'", col, tbl) default: - time.Sleep(1 * time.Second) res, err := vtgateProcess.ReadVSchema() require.NoError(t, err, res) t2Map := getTableT2Map(res, ks, tbl) authoritative, fieldPresent := t2Map["column_list_authoritative"] if !fieldPresent { - break + time.Sleep(100 * time.Millisecond) + continue } authoritativeBool, isBool := authoritative.(bool) if !isBool || !authoritativeBool { - break + time.Sleep(100 * time.Millisecond) + continue } colMap, exists := t2Map["columns"] if !exists { - break + time.Sleep(100 * time.Millisecond) + continue } colList, isSlice := colMap.([]interface{}) if !isSlice { - break + time.Sleep(100 * time.Millisecond) + continue } for _, c := range colList { colDef, isMap := c.(map[string]interface{}) @@ -317,6 +343,7 @@ func WaitForColumn(t *testing.T, vtgateProcess cluster.VtgateProcess, ks, tbl, c return nil } } + time.Sleep(100 * time.Millisecond) } } } @@ -330,7 +357,10 @@ func getTableT2Map(res *interface{}, ks, tbl string) map[string]interface{} { } func convertToMap(input interface{}) map[string]interface{} { - output := input.(map[string]interface{}) + output, ok := input.(map[string]interface{}) + if !ok { + return make(map[string]interface{}) + } return output } diff --git a/go/test/endtoend/vtgate/foreignkey/stress/fk_stress_test.go b/go/test/endtoend/vtgate/foreignkey/stress/fk_stress_test.go index e9f0602d235..91e64e67d1e 100644 --- a/go/test/endtoend/vtgate/foreignkey/stress/fk_stress_test.go +++ b/go/test/endtoend/vtgate/foreignkey/stress/fk_stress_test.go @@ -704,6 +704,14 @@ func createInitialSchema(t *testing.T, tcase *testCase) { require.NoError(t, err) } }) + t.Run("waiting for vschema deletions to apply", func(t *testing.T) { + timeoutCtx, cancel := context.WithTimeout(ctx, 1*time.Minute) + defer cancel() + for _, tableName := range tableNames { + err := utils.WaitForTableDeletions(timeoutCtx, t, clusterInstance.VtgateProcess, keyspaceName, tableName) + require.NoError(t, err) + } + }) t.Run("creating tables", func(t *testing.T) { // Create the stress tables var b strings.Builder From 5a93514b7516e4492b5afdcb079d1e8ea6530f3d Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Wed, 15 Nov 2023 22:40:09 +0100 Subject: [PATCH 32/39] VReplication: VTTablet flag cleanup (#14297) Signed-off-by: Matt Lord Signed-off-by: Andrew Mason Co-authored-by: Andrew Mason --- changelog/19.0/19.0.0/summary.md | 7 +++++++ go/flags/endtoend/vtcombo.txt | 4 ---- go/flags/endtoend/vttablet.txt | 4 ---- go/test/endtoend/backup/vtbackup/main_test.go | 2 -- .../endtoend/backup/vtctlbackup/backup_utils.go | 2 -- go/test/endtoend/cellalias/cell_alias_test.go | 2 -- go/test/endtoend/cluster/vttablet_process.go | 3 --- .../endtoend/recovery/pitr/shardedpitr_test.go | 5 ----- .../recovery/unshardedrecovery/recovery.go | 2 -- go/test/endtoend/topoconncache/main_test.go | 2 -- go/test/endtoend/vault/vault_test.go | 2 -- go/test/endtoend/vreplication/cluster_test.go | 5 ++--- .../vtgate/foreignkey/stress/fk_stress_test.go | 1 - go/vt/vtctl/vtctl.go | 2 +- .../tabletmanager/vreplication/flags.go | 17 ++++++----------- go/vt/wrangler/traffic_switcher.go | 5 +---- vitess-mixin/e2e/vttablet-up.sh | 1 - 17 files changed, 17 insertions(+), 49 deletions(-) diff --git a/changelog/19.0/19.0.0/summary.md b/changelog/19.0/19.0.0/summary.md index aa0d1a90227..be560d50f58 100644 --- a/changelog/19.0/19.0.0/summary.md +++ b/changelog/19.0/19.0.0/summary.md @@ -4,6 +4,7 @@ - **[Major Changes](#major-changes)** - **[Deprecations and Deletions](#deprecations-and-deletions)** + - [VTTablet Flags](#vttablet-flags) - **[Docker](#docker)** - [New MySQL Image](#mysql-image) - **[Query Compatibility](#query-compatibility)** @@ -15,6 +16,12 @@ - The `MYSQL_FLAVOR` environment variable is now removed from all Docker Images. +#### VTTablet Flags + +- The following flags — which were deprecated in Vitess 7.0 — have been removed: +`--vreplication_healthcheck_topology_refresh`, `--vreplication_healthcheck_retry_delay`, and `--vreplication_healthcheck_timeout`. +- The `--vreplication_tablet_type` flag is now deprecated and ignored. + ### Docker #### New MySQL Image diff --git a/go/flags/endtoend/vtcombo.txt b/go/flags/endtoend/vtcombo.txt index 5a029b8dd84..c416af11e31 100644 --- a/go/flags/endtoend/vtcombo.txt +++ b/go/flags/endtoend/vtcombo.txt @@ -401,9 +401,6 @@ Flags: --vreplication_copy_phase_max_innodb_history_list_length int The maximum InnoDB transaction history that can exist on a vstreamer (source) before starting another round of copying rows. This helps to limit the impact on the source tablet. (default 1000000) --vreplication_copy_phase_max_mysql_replication_lag int The maximum MySQL replication lag (in seconds) that can exist on a vstreamer (source) before starting another round of copying rows. This helps to limit the impact on the source tablet. (default 43200) --vreplication_experimental_flags int (Bitmask) of experimental features in vreplication to enable (default 3) - --vreplication_healthcheck_retry_delay duration healthcheck retry delay (default 5s) - --vreplication_healthcheck_timeout duration healthcheck retry delay (default 1m0s) - --vreplication_healthcheck_topology_refresh duration refresh interval for re-reading the topology (default 30s) --vreplication_heartbeat_update_interval int Frequency (in seconds, default 1, max 60) at which the time_updated column of a vreplication stream when idling (default 1) --vreplication_max_time_to_retry_on_error duration stop automatically retrying when we've had consecutive failures with the same error for this long after the first occurrence --vreplication_net_read_timeout int Session value of net_read_timeout for vreplication, in seconds (default 300) @@ -411,7 +408,6 @@ Flags: --vreplication_replica_lag_tolerance duration Replica lag threshold duration: once lag is below this we switch from copy phase to the replication (streaming) phase (default 1m0s) --vreplication_retry_delay duration delay before retrying a failed workflow event in the replication phase (default 5s) --vreplication_store_compressed_gtid Store compressed gtids in the pos column of the sidecar database's vreplication table - --vreplication_tablet_type string comma separated list of tablet types used as a source (default "in_order:REPLICA,PRIMARY") --vschema-persistence-dir string If set, per-keyspace vschema will be persisted in this directory and reloaded into the in-memory topology server across restarts. Bookkeeping is performed using a simple watcher goroutine. This is useful when running vtcombo as an application development container (e.g. vttestserver) where you want to keep the same vschema even if developer's machine reboots. This works in tandem with vttestserver's --persistent_mode flag. Needless to say, this is neither a perfect nor a production solution for vschema persistence. Consider using the --external_topo_server flag if you require a more complete solution. This flag is ignored if --external_topo_server is set. --vschema_ddl_authorized_users string List of users authorized to execute vschema ddl operations, or '%' to allow all users. --vstream-binlog-rotation-threshold int Byte size at which a VStreamer will attempt to rotate the source's open binary log before starting a GTID snapshot based stream (e.g. a ResultStreamer or RowStreamer) (default 67108864) diff --git a/go/flags/endtoend/vttablet.txt b/go/flags/endtoend/vttablet.txt index 7f18d8dc76b..c0926a6f701 100644 --- a/go/flags/endtoend/vttablet.txt +++ b/go/flags/endtoend/vttablet.txt @@ -406,9 +406,6 @@ Flags: --vreplication_copy_phase_max_innodb_history_list_length int The maximum InnoDB transaction history that can exist on a vstreamer (source) before starting another round of copying rows. This helps to limit the impact on the source tablet. (default 1000000) --vreplication_copy_phase_max_mysql_replication_lag int The maximum MySQL replication lag (in seconds) that can exist on a vstreamer (source) before starting another round of copying rows. This helps to limit the impact on the source tablet. (default 43200) --vreplication_experimental_flags int (Bitmask) of experimental features in vreplication to enable (default 3) - --vreplication_healthcheck_retry_delay duration healthcheck retry delay (default 5s) - --vreplication_healthcheck_timeout duration healthcheck retry delay (default 1m0s) - --vreplication_healthcheck_topology_refresh duration refresh interval for re-reading the topology (default 30s) --vreplication_heartbeat_update_interval int Frequency (in seconds, default 1, max 60) at which the time_updated column of a vreplication stream when idling (default 1) --vreplication_max_time_to_retry_on_error duration stop automatically retrying when we've had consecutive failures with the same error for this long after the first occurrence --vreplication_net_read_timeout int Session value of net_read_timeout for vreplication, in seconds (default 300) @@ -416,7 +413,6 @@ Flags: --vreplication_replica_lag_tolerance duration Replica lag threshold duration: once lag is below this we switch from copy phase to the replication (streaming) phase (default 1m0s) --vreplication_retry_delay duration delay before retrying a failed workflow event in the replication phase (default 5s) --vreplication_store_compressed_gtid Store compressed gtids in the pos column of the sidecar database's vreplication table - --vreplication_tablet_type string comma separated list of tablet types used as a source (default "in_order:REPLICA,PRIMARY") --vstream-binlog-rotation-threshold int Byte size at which a VStreamer will attempt to rotate the source's open binary log before starting a GTID snapshot based stream (e.g. a ResultStreamer or RowStreamer) (default 67108864) --vstream_dynamic_packet_size Enable dynamic packet sizing for VReplication. This will adjust the packet size during replication to improve performance. (default true) --vstream_packet_size int Suggested packet size for VReplication streamer. This is used only as a recommendation. The actual packet size may be more or less than this amount. (default 250000) diff --git a/go/test/endtoend/backup/vtbackup/main_test.go b/go/test/endtoend/backup/vtbackup/main_test.go index 36bfae123d8..367956c9827 100644 --- a/go/test/endtoend/backup/vtbackup/main_test.go +++ b/go/test/endtoend/backup/vtbackup/main_test.go @@ -43,8 +43,6 @@ var ( shardKsName = fmt.Sprintf("%s/%s", keyspaceName, shardName) dbCredentialFile string commonTabletArg = []string{ - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", "--vreplication_retry_delay", "1s", "--degraded_threshold", "5s", "--lock_tables_timeout", "5s", diff --git a/go/test/endtoend/backup/vtctlbackup/backup_utils.go b/go/test/endtoend/backup/vtctlbackup/backup_utils.go index 1ca56db68c2..e470652f7ee 100644 --- a/go/test/endtoend/backup/vtctlbackup/backup_utils.go +++ b/go/test/endtoend/backup/vtctlbackup/backup_utils.go @@ -74,8 +74,6 @@ var ( dbCredentialFile string shardName = "0" commonTabletArg = []string{ - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", "--vreplication_retry_delay", "1s", "--degraded_threshold", "5s", "--lock_tables_timeout", "5s", diff --git a/go/test/endtoend/cellalias/cell_alias_test.go b/go/test/endtoend/cellalias/cell_alias_test.go index 9c2a29d2eb1..d357331d8cd 100644 --- a/go/test/endtoend/cellalias/cell_alias_test.go +++ b/go/test/endtoend/cellalias/cell_alias_test.go @@ -53,8 +53,6 @@ var ( ) Engine=InnoDB ` commonTabletArg = []string{ - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", "--vreplication_retry_delay", "1s", "--degraded_threshold", "5s", "--lock_tables_timeout", "5s", diff --git a/go/test/endtoend/cluster/vttablet_process.go b/go/test/endtoend/cluster/vttablet_process.go index 517f4bf3874..ed6a97a15c2 100644 --- a/go/test/endtoend/cluster/vttablet_process.go +++ b/go/test/endtoend/cluster/vttablet_process.go @@ -76,7 +76,6 @@ type VttabletProcess struct { ServingStatus string DbPassword string DbPort int - VreplicationTabletType string DbFlavor string Charset string ConsolidationsURL string @@ -109,7 +108,6 @@ func (vttablet *VttabletProcess) Setup() (err error) { "--backup_storage_implementation", vttablet.BackupStorageImplementation, "--file_backup_storage_root", vttablet.FileBackupStorageRoot, "--service_map", vttablet.ServiceMap, - "--vreplication_tablet_type", vttablet.VreplicationTabletType, "--db_charset", vttablet.Charset, ) if v, err := GetMajorVersion("vttablet"); err != nil { @@ -659,7 +657,6 @@ func VttabletProcessInstance(port, grpcPort, tabletUID int, cell, shard, keyspac ServingStatus: "NOT_SERVING", BackupStorageImplementation: "file", FileBackupStorageRoot: path.Join(os.Getenv("VTDATAROOT"), "/backups"), - VreplicationTabletType: "replica", TabletUID: tabletUID, Charset: charset, } diff --git a/go/test/endtoend/recovery/pitr/shardedpitr_test.go b/go/test/endtoend/recovery/pitr/shardedpitr_test.go index d04b5600362..7f70a926be3 100644 --- a/go/test/endtoend/recovery/pitr/shardedpitr_test.go +++ b/go/test/endtoend/recovery/pitr/shardedpitr_test.go @@ -89,8 +89,6 @@ var ( } }` commonTabletArg = []string{ - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", "--vreplication_retry_delay", "1s", "--degraded_threshold", "5s", "--lock_tables_timeout", "5s", @@ -558,9 +556,6 @@ func launchRecoveryTablet(t *testing.T, tablet *cluster.Vttablet, binlogServer * "--binlog_user", binlogServer.username, "--binlog_password", binlogServer.password, "--pitr_gtid_lookup_timeout", lookupTimeout, - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", - "--vreplication_tablet_type", "replica", "--vreplication_retry_delay", "1s", "--degraded_threshold", "5s", "--lock_tables_timeout", "5s", diff --git a/go/test/endtoend/recovery/unshardedrecovery/recovery.go b/go/test/endtoend/recovery/unshardedrecovery/recovery.go index f4db74bbf4e..8966e66ed47 100644 --- a/go/test/endtoend/recovery/unshardedrecovery/recovery.go +++ b/go/test/endtoend/recovery/unshardedrecovery/recovery.go @@ -51,8 +51,6 @@ var ( dbCredentialFile string shardName = "0" commonTabletArg = []string{ - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", "--vreplication_retry_delay", "1s", "--degraded_threshold", "5s", "--lock_tables_timeout", "5s", diff --git a/go/test/endtoend/topoconncache/main_test.go b/go/test/endtoend/topoconncache/main_test.go index 7cfea8839b0..4c17481ec84 100644 --- a/go/test/endtoend/topoconncache/main_test.go +++ b/go/test/endtoend/topoconncache/main_test.go @@ -48,8 +48,6 @@ var ( ) Engine=InnoDB ` commonTabletArg = []string{ - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", "--vreplication_retry_delay", "1s", "--degraded_threshold", "5s", "--lock_tables_timeout", "5s", diff --git a/go/test/endtoend/vault/vault_test.go b/go/test/endtoend/vault/vault_test.go index 9bc5b9cb977..73b5a89b156 100644 --- a/go/test/endtoend/vault/vault_test.go +++ b/go/test/endtoend/vault/vault_test.go @@ -56,8 +56,6 @@ var ( vtgateUser = "vtgate_user" vtgatePassword = "password123" commonTabletArg = []string{ - "--vreplication_healthcheck_topology_refresh", "1s", - "--vreplication_healthcheck_retry_delay", "1s", "--vreplication_retry_delay", "1s", "--degraded_threshold", "5s", "--lock_tables_timeout", "5s", diff --git a/go/test/endtoend/vreplication/cluster_test.go b/go/test/endtoend/vreplication/cluster_test.go index af93ac40726..4735e94560f 100644 --- a/go/test/endtoend/vreplication/cluster_test.go +++ b/go/test/endtoend/vreplication/cluster_test.go @@ -541,7 +541,6 @@ func (vc *VitessCluster) AddShards(t *testing.T, cells []*Cell, keyspace *Keyspa require.NoError(t, err) require.NotNil(t, primary) tabletIndex++ - primary.Vttablet.VreplicationTabletType = "PRIMARY" tablets = append(tablets, primary) dbProcesses = append(dbProcesses, proc) primaryTabletUID = primary.Vttablet.TabletUID @@ -776,7 +775,7 @@ func (vc *VitessCluster) getVttabletsInKeyspace(t *testing.T, cell *Cell, ksName tablets := make(map[string]*cluster.VttabletProcess) for _, shard := range keyspace.Shards { for _, tablet := range shard.Tablets { - if tablet.Vttablet.GetTabletStatus() == "SERVING" && strings.EqualFold(tablet.Vttablet.VreplicationTabletType, tabletType) { + if tablet.Vttablet.GetTabletStatus() == "SERVING" { log.Infof("Serving status of tablet %s is %s, %s", tablet.Name, tablet.Vttablet.ServingStatus, tablet.Vttablet.GetTabletStatus()) tablets[tablet.Name] = tablet.Vttablet } @@ -796,7 +795,7 @@ func (vc *VitessCluster) getPrimaryTablet(t *testing.T, ksName, shardName string continue } for _, tablet := range shard.Tablets { - if tablet.Vttablet.GetTabletStatus() == "SERVING" && strings.EqualFold(tablet.Vttablet.VreplicationTabletType, "primary") { + if tablet.Vttablet.GetTabletStatus() == "SERVING" { return tablet.Vttablet } } diff --git a/go/test/endtoend/vtgate/foreignkey/stress/fk_stress_test.go b/go/test/endtoend/vtgate/foreignkey/stress/fk_stress_test.go index 91e64e67d1e..00b7d9ca0cc 100644 --- a/go/test/endtoend/vtgate/foreignkey/stress/fk_stress_test.go +++ b/go/test/endtoend/vtgate/foreignkey/stress/fk_stress_test.go @@ -333,7 +333,6 @@ func TestMain(m *testing.M) { "--heartbeat_on_demand_duration", "5s", "--migration_check_interval", "5s", "--watch_replication_stream", - "--vreplication_tablet_type", "primary", } clusterInstance.VtGateExtraArgs = []string{} diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 11d3cf85e68..90e5d0d8ddd 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -2089,7 +2089,7 @@ func commandVReplicationWorkflow(ctx context.Context, wr *wrangler.Wrangler, sub const defaultMaxReplicationLagAllowed = defaultWaitTime cells := subFlags.String("cells", "", "Cell(s) or CellAlias(es) (comma-separated) to replicate from.") - tabletTypesStr := subFlags.String("tablet_types", "in_order:REPLICA,PRIMARY", "Source tablet types to replicate from (e.g. PRIMARY, REPLICA, RDONLY). Defaults to --vreplication_tablet_type parameter value for the tablet, which has the default value of in_order:REPLICA,PRIMARY. Note: SwitchTraffic overrides this default and uses in_order:RDONLY,REPLICA,PRIMARY to switch all traffic by default.") + tabletTypesStr := subFlags.String("tablet_types", "in_order:REPLICA,PRIMARY", "Source tablet types to replicate from (e.g. PRIMARY, REPLICA, RDONLY). Note: SwitchTraffic overrides this default and uses in_order:RDONLY,REPLICA,PRIMARY to switch all traffic by default.") dryRun := subFlags.Bool("dry_run", false, "Does a dry run of SwitchTraffic and only reports the actions to be taken. --dry_run is only supported for SwitchTraffic, ReverseTraffic and Complete.") timeout := subFlags.Duration("timeout", defaultWaitTime, "Specifies the maximum time to wait, in seconds, for vreplication to catch up on primary migrations. The migration will be cancelled on a timeout. --timeout is only supported for SwitchTraffic and ReverseTraffic.") reverseReplication := subFlags.Bool("reverse_replication", true, "Also reverse the replication (default true). --reverse_replication is only supported for SwitchTraffic.") diff --git a/go/vt/vttablet/tabletmanager/vreplication/flags.go b/go/vt/vttablet/tabletmanager/vreplication/flags.go index 44f07f87a0f..9f328f48a68 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/flags.go +++ b/go/vt/vttablet/tabletmanager/vreplication/flags.go @@ -26,9 +26,9 @@ import ( var ( retryDelay = 5 * time.Second - maxTimeToRetryError time.Duration // default behavior is to keep retrying, for backward compatibility + maxTimeToRetryError time.Duration // Default behavior is to keep retrying, for backward compatibility - tabletTypesStr = "in_order:REPLICA,PRIMARY" + tabletTypesStr = "in_order:REPLICA,PRIMARY" // Default value relayLogMaxSize = 250000 relayLogMaxItems = 5000 @@ -45,10 +45,6 @@ func registerVReplicationFlags(fs *pflag.FlagSet) { fs.DurationVar(&retryDelay, "vreplication_retry_delay", retryDelay, "delay before retrying a failed workflow event in the replication phase") fs.DurationVar(&maxTimeToRetryError, "vreplication_max_time_to_retry_on_error", maxTimeToRetryError, "stop automatically retrying when we've had consecutive failures with the same error for this long after the first occurrence") - // these are the default tablet_types that will be used by the tablet picker to find source tablets for a vreplication stream - // it can be overridden by passing a different list to the MoveTables or Reshard commands - fs.StringVar(&tabletTypesStr, "vreplication_tablet_type", tabletTypesStr, "comma separated list of tablet types used as a source") - fs.IntVar(&relayLogMaxSize, "relay_log_max_size", relayLogMaxSize, "Maximum buffer size (in bytes) for VReplication target buffering. If single rows are larger than this, a single row is buffered at a time.") fs.IntVar(&relayLogMaxItems, "relay_log_max_items", relayLogMaxItems, "Maximum number of rows for VReplication target buffering.") @@ -62,12 +58,11 @@ func registerVReplicationFlags(fs *pflag.FlagSet) { fs.IntVar(&vreplicationHeartbeatUpdateInterval, "vreplication_heartbeat_update_interval", vreplicationHeartbeatUpdateInterval, "Frequency (in seconds, default 1, max 60) at which the time_updated column of a vreplication stream when idling") fs.BoolVar(&vreplicationStoreCompressedGTID, "vreplication_store_compressed_gtid", vreplicationStoreCompressedGTID, "Store compressed gtids in the pos column of the sidecar database's vreplication table") - // deprecated flags (7.0), however there are several e2e tests that still depend on them - fs.Duration("vreplication_healthcheck_topology_refresh", 30*time.Second, "refresh interval for re-reading the topology") - fs.Duration("vreplication_healthcheck_retry_delay", 5*time.Second, "healthcheck retry delay") - fs.Duration("vreplication_healthcheck_timeout", 1*time.Minute, "healthcheck retry delay") - fs.IntVar(&vreplicationParallelInsertWorkers, "vreplication-parallel-insert-workers", vreplicationParallelInsertWorkers, "Number of parallel insertion workers to use during copy phase. Set <= 1 to disable parallelism, or > 1 to enable concurrent insertion during copy phase.") + + // Deprecated and ignored in v19. + fs.String("vreplication_tablet_type", tabletTypesStr, "Comma-separated list of tablet types used as a source.") + fs.MarkDeprecated("vreplication_tablet_type", "As of v19 this is ignored and will be removed in a future release.") } func init() { diff --git a/go/vt/wrangler/traffic_switcher.go b/go/vt/wrangler/traffic_switcher.go index 654a5bd1588..ccbcee9c3b0 100644 --- a/go/vt/wrangler/traffic_switcher.go +++ b/go/vt/wrangler/traffic_switcher.go @@ -437,11 +437,8 @@ func (wr *Wrangler) areTabletsAvailableToStreamFrom(ctx context.Context, ts *tra if ts.optCells != "" { cells = strings.Split(ts.optCells, ",") } - // FIXME: currently there is a default setting in the tablet that is used if user does not specify a tablet type, - // we use the value specified in the tablet flag `-vreplication_tablet_type` - // but ideally we should populate the vreplication table with a default value when we setup the workflow if tabletTypes == "" { - tabletTypes = "PRIMARY,REPLICA" + tabletTypes = "in_order:REPLICA,PRIMARY" // default } var wg sync.WaitGroup diff --git a/vitess-mixin/e2e/vttablet-up.sh b/vitess-mixin/e2e/vttablet-up.sh index f41b31f025c..89709cf750f 100755 --- a/vitess-mixin/e2e/vttablet-up.sh +++ b/vitess-mixin/e2e/vttablet-up.sh @@ -133,7 +133,6 @@ if [ $tablet_role = "externalprimary" ]; then --enable_replication_reporter=false \ --enforce_strict_trans_tables=false \ --track_schema_versions=true \ - --vreplication_tablet_type=primary \ --watch_replication_stream=true" else external_db_args="--init_db_name_override $DB_NAME \ From a40a89b42e31f2c588094a10a63b3fc7ccaf0c77 Mon Sep 17 00:00:00 2001 From: aquarapid Date: Wed, 15 Nov 2023 16:24:05 -0800 Subject: [PATCH 33/39] Fix #14414: resilient_server metrics name/prefix logic is inverted, leading to no metrics being recorded (#14415) Signed-off-by: Jacques Grove Signed-off-by: deepthi Co-authored-by: deepthi --- go/vt/srvtopo/resilient_server.go | 6 ++---- go/vt/srvtopo/resilient_server_test.go | 2 +- go/vt/vttablet/tabletserver/vstreamer/testenv/testenv.go | 5 ++++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/go/vt/srvtopo/resilient_server.go b/go/vt/srvtopo/resilient_server.go index d1521952ab0..0cbccbdb31c 100644 --- a/go/vt/srvtopo/resilient_server.go +++ b/go/vt/srvtopo/resilient_server.go @@ -84,11 +84,9 @@ func NewResilientServer(ctx context.Context, base *topo.Server, counterPrefix st log.Fatalf("srv_topo_cache_refresh must be less than or equal to srv_topo_cache_ttl") } - var metric string - if counterPrefix == "" { + metric := "" + if counterPrefix != "" { metric = counterPrefix + "Counts" - } else { - metric = "" } counts := stats.NewCountersWithSingleLabel(metric, "Resilient srvtopo server operations", "type") diff --git a/go/vt/srvtopo/resilient_server_test.go b/go/vt/srvtopo/resilient_server_test.go index c237d43f300..fe248f56087 100644 --- a/go/vt/srvtopo/resilient_server_test.go +++ b/go/vt/srvtopo/resilient_server_test.go @@ -811,7 +811,7 @@ func TestSrvKeyspaceListener(t *testing.T) { srvTopoCacheRefresh = 1 * time.Second }() - rs := NewResilientServer(ctx, ts, "TestGetSrvKeyspaceWatcher") + rs := NewResilientServer(ctx, ts, "TestGetSrvKeyspaceListener") cancelCtx, cancelFunc := context.WithCancel(context.Background()) var callbackCount atomic.Int32 diff --git a/go/vt/vttablet/tabletserver/vstreamer/testenv/testenv.go b/go/vt/vttablet/tabletserver/vstreamer/testenv/testenv.go index c40e180110f..a05dc3b2c05 100644 --- a/go/vt/vttablet/tabletserver/vstreamer/testenv/testenv.go +++ b/go/vt/vttablet/tabletserver/vstreamer/testenv/testenv.go @@ -20,6 +20,7 @@ package testenv import ( "context" "fmt" + "math/rand" "os" "regexp" "strings" @@ -75,7 +76,9 @@ func Init(ctx context.Context) (*Env, error) { if err := te.TopoServ.CreateShard(ctx, te.KeyspaceName, te.ShardName); err != nil { panic(err) } - te.SrvTopo = srvtopo.NewResilientServer(ctx, te.TopoServ, "TestTopo") + // Add a random suffix to metric name to avoid panic. Another option would have been to generate a random string. + suffix := rand.Int() + te.SrvTopo = srvtopo.NewResilientServer(ctx, te.TopoServ, "TestTopo"+fmt.Sprint(suffix)) cfg := vttest.Config{ Topology: &vttestpb.VTTestTopology{ From f8066f6aa88b8473c98b6424cfb3f5afb4d49580 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 15 Nov 2023 20:40:22 -0600 Subject: [PATCH 34/39] Add HealthCheck's `healthy` map to the VTGate UI (#14521) --- go/cmd/vtcombo/cli/status.go | 5 +- go/cmd/vtgate/cli/status.go | 5 +- go/vt/discovery/fake_healthcheck.go | 11 +++ go/vt/discovery/healthcheck.go | 67 +++++++++++++++---- go/vt/discovery/healthcheck_test.go | 4 +- go/vt/vtgate/tabletgateway.go | 5 ++ .../txthrottler/mock_healthcheck_test.go | 8 +++ 7 files changed, 87 insertions(+), 18 deletions(-) diff --git a/go/cmd/vtcombo/cli/status.go b/go/cmd/vtcombo/cli/status.go index 8069fc72606..80176d4a11a 100644 --- a/go/cmd/vtcombo/cli/status.go +++ b/go/cmd/vtcombo/cli/status.go @@ -41,7 +41,10 @@ func addStatusParts(vtg *vtgate.VTGate) { servenv.AddStatusPart("Gateway Status", vtgate.StatusTemplate, func() any { return vtg.GetGatewayCacheStatus() }) - servenv.AddStatusPart("Health Check Cache", discovery.HealthCheckTemplate, func() any { + servenv.AddStatusPart("Health Check - Cache", discovery.HealthCheckCacheTemplate, func() any { return vtg.Gateway().TabletsCacheStatus() }) + servenv.AddStatusPart("Health Check - Healthy Tablets", discovery.HealthCheckHealthyTemplate, func() any { + return vtg.Gateway().TabletsHealthyStatus() + }) } diff --git a/go/cmd/vtgate/cli/status.go b/go/cmd/vtgate/cli/status.go index 2fdab073d5a..9652392dc65 100644 --- a/go/cmd/vtgate/cli/status.go +++ b/go/cmd/vtgate/cli/status.go @@ -37,7 +37,10 @@ func addStatusParts(vtg *vtgate.VTGate) { servenv.AddStatusPart("Gateway Status", vtgate.StatusTemplate, func() any { return vtg.GetGatewayCacheStatus() }) - servenv.AddStatusPart("Health Check Cache", discovery.HealthCheckTemplate, func() any { + servenv.AddStatusPart("Health Check - Cache", discovery.HealthCheckCacheTemplate, func() any { return vtg.Gateway().TabletsCacheStatus() }) + servenv.AddStatusPart("Health Check - Healthy Tablets", discovery.HealthCheckHealthyTemplate, func() any { + return vtg.Gateway().TabletsHealthyStatus() + }) } diff --git a/go/vt/discovery/fake_healthcheck.go b/go/vt/discovery/fake_healthcheck.go index cb959902c19..1c83de5b149 100644 --- a/go/vt/discovery/fake_healthcheck.go +++ b/go/vt/discovery/fake_healthcheck.go @@ -252,6 +252,17 @@ func (fhc *FakeHealthCheck) CacheStatus() TabletsCacheStatusList { return tcsl } +// HealthyStatus returns the status for each healthy tablet +func (fhc *FakeHealthCheck) HealthyStatus() TabletsCacheStatusList { + tcsMap := fhc.CacheStatusMap() + tcsl := make(TabletsCacheStatusList, 0, len(tcsMap)) + for _, tcs := range tcsMap { + tcsl = append(tcsl, tcs) + } + sort.Sort(tcsl) + return tcsl +} + // CacheStatusMap returns a map of the health check cache. func (fhc *FakeHealthCheck) CacheStatusMap() map[string]*TabletsCacheStatus { tcsMap := make(map[string]*TabletsCacheStatus) diff --git a/go/vt/discovery/healthcheck.go b/go/vt/discovery/healthcheck.go index 9d17005d0ad..20e16875748 100644 --- a/go/vt/discovery/healthcheck.go +++ b/go/vt/discovery/healthcheck.go @@ -92,6 +92,14 @@ var ( // How much to sleep between each check. waitAvailableTabletInterval = 100 * time.Millisecond + + // HealthCheckCacheTemplate uses healthCheckTemplate with the `HealthCheck Tablet - Cache` title to create the + // HTML code required to render the cache of the HealthCheck. + HealthCheckCacheTemplate = fmt.Sprintf(healthCheckTemplate, "HealthCheck - Cache") + + // HealthCheckHealthyTemplate uses healthCheckTemplate with the `HealthCheck Tablet - Healthy Tablets` title to + // create the HTML code required to render the list of healthy tablets from the HealthCheck. + HealthCheckHealthyTemplate = fmt.Sprintf(healthCheckTemplate, "HealthCheck - Healthy Tablets") ) // See the documentation for NewHealthCheck below for an explanation of these parameters. @@ -104,8 +112,9 @@ const ( // DefaultTopologyWatcherRefreshInterval is used as the default value for // the refresh interval of a topology watcher. DefaultTopologyWatcherRefreshInterval = 1 * time.Minute - // HealthCheckTemplate is the HTML code to display a TabletsCacheStatusList - HealthCheckTemplate = ` + // healthCheckTemplate is the HTML code to display a TabletsCacheStatusList, it takes a parameter for the title + // as the template can be used for both HealthCheck's cache and healthy tablets list. + healthCheckTemplate = ` - + @@ -193,6 +202,9 @@ type HealthCheck interface { // CacheStatus returns a displayable version of the health check cache. CacheStatus() TabletsCacheStatusList + // HealthyStatus returns a displayable version of the health check healthy list. + HealthyStatus() TabletsCacheStatusList + // CacheStatusMap returns a map of the health check cache. CacheStatusMap() map[string]*TabletsCacheStatus @@ -622,28 +634,55 @@ func (hc *HealthCheckImpl) CacheStatus() TabletsCacheStatusList { return tcsl } +// HealthyStatus returns a displayable version of the cache. +func (hc *HealthCheckImpl) HealthyStatus() TabletsCacheStatusList { + tcsMap := hc.HealthyStatusMap() + tcsl := make(TabletsCacheStatusList, 0, len(tcsMap)) + for _, tcs := range tcsMap { + tcsl = append(tcsl, tcs) + } + sort.Sort(tcsl) + return tcsl +} + func (hc *HealthCheckImpl) CacheStatusMap() map[string]*TabletsCacheStatus { tcsMap := make(map[string]*TabletsCacheStatus) hc.mu.Lock() defer hc.mu.Unlock() for _, ths := range hc.healthData { for _, th := range ths { - key := fmt.Sprintf("%v.%v.%v.%v", th.Tablet.Alias.Cell, th.Target.Keyspace, th.Target.Shard, th.Target.TabletType.String()) - var tcs *TabletsCacheStatus - var ok bool - if tcs, ok = tcsMap[key]; !ok { - tcs = &TabletsCacheStatus{ - Cell: th.Tablet.Alias.Cell, - Target: th.Target, - } - tcsMap[key] = tcs - } - tcs.TabletsStats = append(tcs.TabletsStats, th) + tabletHealthToTabletCacheStatus(th, tcsMap) } } return tcsMap } +func (hc *HealthCheckImpl) HealthyStatusMap() map[string]*TabletsCacheStatus { + tcsMap := make(map[string]*TabletsCacheStatus) + hc.mu.Lock() + defer hc.mu.Unlock() + for _, ths := range hc.healthy { + for _, th := range ths { + tabletHealthToTabletCacheStatus(th, tcsMap) + } + } + return tcsMap +} + +func tabletHealthToTabletCacheStatus(th *TabletHealth, tcsMap map[string]*TabletsCacheStatus) { + key := fmt.Sprintf("%v.%v.%v.%v", th.Tablet.Alias.Cell, th.Target.Keyspace, th.Target.Shard, th.Target.TabletType.String()) + var tcs *TabletsCacheStatus + var ok bool + if tcs, ok = tcsMap[key]; !ok { + tcs = &TabletsCacheStatus{ + Cell: th.Tablet.Alias.Cell, + Target: th.Target, + } + tcsMap[key] = tcs + } + tcs.TabletsStats = append(tcs.TabletsStats, th) +} + // Close stops the healthcheck. func (hc *HealthCheckImpl) Close() error { hc.mu.Lock() diff --git a/go/vt/discovery/healthcheck_test.go b/go/vt/discovery/healthcheck_test.go index 5fadc57eb2e..9563d9bfdc5 100644 --- a/go/vt/discovery/healthcheck_test.go +++ b/go/vt/discovery/healthcheck_test.go @@ -1267,7 +1267,7 @@ func TestTemplate(t *testing.T) { TabletsStats: ts, } templ := template.New("") - templ, err := templ.Parse(HealthCheckTemplate) + templ, err := templ.Parse(healthCheckTemplate) require.Nil(t, err, "error parsing template: %v", err) wr := &bytes.Buffer{} err = templ.Execute(wr, []*TabletsCacheStatus{tcs}) @@ -1295,7 +1295,7 @@ func TestDebugURLFormatting(t *testing.T) { TabletsStats: ts, } templ := template.New("") - templ, err := templ.Parse(HealthCheckTemplate) + templ, err := templ.Parse(healthCheckTemplate) require.Nil(t, err, "error parsing template") wr := &bytes.Buffer{} err = templ.Execute(wr, []*TabletsCacheStatus{tcs}) diff --git a/go/vt/vtgate/tabletgateway.go b/go/vt/vtgate/tabletgateway.go index de63da87907..9d62be2d357 100644 --- a/go/vt/vtgate/tabletgateway.go +++ b/go/vt/vtgate/tabletgateway.go @@ -428,6 +428,11 @@ func (gw *TabletGateway) TabletsCacheStatus() discovery.TabletsCacheStatusList { return gw.hc.CacheStatus() } +// TabletsHealthyStatus returns a displayable version of the health check healthy list. +func (gw *TabletGateway) TabletsHealthyStatus() discovery.TabletsCacheStatusList { + return gw.hc.HealthyStatus() +} + func (gw *TabletGateway) updateDefaultConnCollation(tablet *topodatapb.Tablet) { if atomic.CompareAndSwapUint32(&gw.defaultConnCollation, 0, tablet.DefaultConnCollation) { return diff --git a/go/vt/vttablet/tabletserver/txthrottler/mock_healthcheck_test.go b/go/vt/vttablet/tabletserver/txthrottler/mock_healthcheck_test.go index 1e503dc7020..3b298cacddf 100644 --- a/go/vt/vttablet/tabletserver/txthrottler/mock_healthcheck_test.go +++ b/go/vt/vttablet/tabletserver/txthrottler/mock_healthcheck_test.go @@ -59,6 +59,14 @@ func (m *MockHealthCheck) CacheStatus() discovery.TabletsCacheStatusList { return ret0 } +// HealthyStatus mocks base method. +func (m *MockHealthCheck) HealthyStatus() discovery.TabletsCacheStatusList { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HealthyStatus") + ret0, _ := ret[0].(discovery.TabletsCacheStatusList) + return ret0 +} + // CacheStatus indicates an expected call of CacheStatus. func (mr *MockHealthCheckMockRecorder) CacheStatus() *gomock.Call { mr.mock.ctrl.T.Helper() From ae5d2de024cc656c0de897db2ad19460157f1bb0 Mon Sep 17 00:00:00 2001 From: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Date: Wed, 15 Nov 2023 21:09:30 -0600 Subject: [PATCH 35/39] Fix missing query serving error code (#14520) Signed-off-by: Florent Poinsard --- go/vt/vterrors/code.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/go/vt/vterrors/code.go b/go/vt/vterrors/code.go index 80e1b0edd34..e619c6fff59 100644 --- a/go/vt/vterrors/code.go +++ b/go/vt/vterrors/code.go @@ -22,6 +22,9 @@ import ( vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) +// Errors added to the list of variables below must be added to the Errors slice a little below in this same file. +// This will enable the auto-documentation of error code in the website repository. + var ( VT03001 = errorWithState("VT03001", vtrpcpb.Code_INVALID_ARGUMENT, SyntaxError, "aggregate functions take a single argument '%s'", "This aggregation function only takes a single argument.") VT03002 = errorWithState("VT03002", vtrpcpb.Code_INVALID_ARGUMENT, ForbidSchemaChange, "changing schema from '%s' to '%s' is not allowed", "This schema change is not allowed. You cannot change the keyspace of a table.") @@ -99,6 +102,8 @@ var ( VT14004 = errorWithoutState("VT14004", vtrpcpb.Code_UNAVAILABLE, "cannot find keyspace for: %s", "The specified keyspace could not be found.") VT14005 = errorWithoutState("VT14005", vtrpcpb.Code_UNAVAILABLE, "cannot lookup sidecar database for keyspace: %s", "Failed to read sidecar database identifier.") + // Errors is a list of errors that must match all the variables + // defined above to enable auto-documentation of error codes. Errors = []func(args ...any) *VitessError{ VT03001, VT03002, @@ -154,6 +159,7 @@ var ( VT09016, VT09017, VT09018, + VT09019, VT10001, VT10002, VT12001, From fe14d97754157e885f28f018852d9ef4fd673cd6 Mon Sep 17 00:00:00 2001 From: Manan Gupta <35839558+GuptaManan100@users.noreply.github.com> Date: Thu, 16 Nov 2023 12:10:22 +0530 Subject: [PATCH 36/39] Fix type coercion in cascading non-literal updates (#14524) Signed-off-by: Manan Gupta --- go/test/endtoend/vtgate/foreignkey/fk_test.go | 7 ++++ go/vt/vtgate/engine/cached_size.go | 4 +-- go/vt/vtgate/engine/fk_cascade.go | 27 ++++++++++---- go/vt/vtgate/planbuilder/operators/update.go | 8 +++++ .../testdata/foreignkey_cases.json | 35 +++++++++++-------- 5 files changed, 59 insertions(+), 22 deletions(-) diff --git a/go/test/endtoend/vtgate/foreignkey/fk_test.go b/go/test/endtoend/vtgate/foreignkey/fk_test.go index a05f0de7ac1..7a29136e915 100644 --- a/go/test/endtoend/vtgate/foreignkey/fk_test.go +++ b/go/test/endtoend/vtgate/foreignkey/fk_test.go @@ -880,6 +880,13 @@ func TestFkQueries(t *testing.T) { "insert into fk_multicol_t16 (id, cola, colb) values (1,1,1),(2,2,2)", "update fk_multicol_t15 set cola = 3, colb = (id * 2) - 2", }, + }, { + name: "Update that sets to 0 and -0 values", + queries: []string{ + "insert into fk_t15 (id, col) values (1,'-0'), (2, '0'), (3, '5'), (4, '-5')", + "insert into fk_t16 (id, col) values (1,'-0'), (2, '0'), (3, '5'), (4, '-5')", + "update fk_t15 set col = col * (col - (col))", + }, }, } diff --git a/go/vt/vtgate/engine/cached_size.go b/go/vt/vtgate/engine/cached_size.go index 6121ad5f675..a18e2108c4a 100644 --- a/go/vt/vtgate/engine/cached_size.go +++ b/go/vt/vtgate/engine/cached_size.go @@ -290,7 +290,7 @@ func (cached *FkChild) CachedSize(alloc bool) int64 { } // field NonLiteralInfo []vitess.io/vitess/go/vt/vtgate/engine.NonLiteralUpdateInfo { - size += hack.RuntimeAllocSize(int64(cap(cached.NonLiteralInfo)) * int64(32)) + size += hack.RuntimeAllocSize(int64(cap(cached.NonLiteralInfo)) * int64(40)) for _, elem := range cached.NonLiteralInfo { size += elem.CachedSize(false) } @@ -625,7 +625,7 @@ func (cached *NonLiteralUpdateInfo) CachedSize(alloc bool) int64 { } size := int64(0) if alloc { - size += int64(32) + size += int64(48) } // field UpdateExprBvName string size += hack.RuntimeAllocSize(int64(len(cached.UpdateExprBvName))) diff --git a/go/vt/vtgate/engine/fk_cascade.go b/go/vt/vtgate/engine/fk_cascade.go index 691e326fec7..94732ae161b 100644 --- a/go/vt/vtgate/engine/fk_cascade.go +++ b/go/vt/vtgate/engine/fk_cascade.go @@ -25,6 +25,7 @@ import ( querypb "vitess.io/vitess/go/vt/proto/query" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vtgate/evalengine" ) // FkChild contains the Child Primitive to be executed collecting the values from the Selection Primitive using the column indexes. @@ -40,14 +41,16 @@ type FkChild struct { } // NonLiteralUpdateInfo stores the information required to process non-literal update queries. -// It stores 3 information- -// 1. UpdateExprCol- The index of the updated expression in the select query. -// 2. UpdateExprBvName- The bind variable name to store the updated expression into. -// 3. CompExprCol- The index of the comparison expression in the select query to know if the row value is actually being changed or not. +// It stores 4 information- +// 1. ExprCol- The index of the column being updated in the select query. +// 2. CompExprCol- The index of the comparison expression in the select query to know if the row value is actually being changed or not. +// 3. UpdateExprCol- The index of the updated expression in the select query. +// 4. UpdateExprBvName- The bind variable name to store the updated expression into. type NonLiteralUpdateInfo struct { + ExprCol int + CompExprCol int UpdateExprCol int UpdateExprBvName string - CompExprCol int } // FkCascade is a primitive that implements foreign key cascading using Selection as values required to execute the FkChild Primitives. @@ -185,7 +188,19 @@ func (fkc *FkCascade) executeNonLiteralExprFkChild(ctx context.Context, vcursor // Next, we need to copy the updated expressions value into the bind variables map. for _, info := range child.NonLiteralInfo { - bindVars[info.UpdateExprBvName] = sqltypes.ValueBindVariable(row[info.UpdateExprCol]) + // Type case the value to that of the column that we are updating. + // This is required for example when we receive an updated float value of -0, but + // the column being updated is a varchar column, then if we don't coerce the value of -0 to + // varchar, MySQL ends up setting it to '0' instead of '-0'. + finalVal := row[info.UpdateExprCol] + if !finalVal.IsNull() { + var err error + finalVal, err = evalengine.CoerceTo(finalVal, selectionRes.Fields[info.ExprCol].Type) + if err != nil { + return err + } + } + bindVars[info.UpdateExprBvName] = sqltypes.ValueBindVariable(finalVal) } _, err := vcursor.ExecutePrimitive(ctx, child.Exec, bindVars, wantfields) if err != nil { diff --git a/go/vt/vtgate/planbuilder/operators/update.go b/go/vt/vtgate/planbuilder/operators/update.go index b7a3a4da2d6..9d39b2f4fc7 100644 --- a/go/vt/vtgate/planbuilder/operators/update.go +++ b/go/vt/vtgate/planbuilder/operators/update.go @@ -334,6 +334,7 @@ func addNonLiteralUpdExprToSelect(ctx *plancontext.PlanningContext, updExpr *sql info := engine.NonLiteralUpdateInfo{ CompExprCol: -1, UpdateExprCol: -1, + ExprCol: -1, } // Add the expressions to the select expressions. We make sure to reuse the offset if it has already been added once. for idx, selectExpr := range exprs { @@ -343,6 +344,9 @@ func addNonLiteralUpdExprToSelect(ctx *plancontext.PlanningContext, updExpr *sql if ctx.SemTable.EqualsExpr(selectExpr.(*sqlparser.AliasedExpr).Expr, updExpr.Expr) { info.UpdateExprCol = idx } + if ctx.SemTable.EqualsExpr(selectExpr.(*sqlparser.AliasedExpr).Expr, updExpr.Name) { + info.ExprCol = idx + } } // If the expression doesn't exist, then we add the expression and store the offset. if info.CompExprCol == -1 { @@ -353,6 +357,10 @@ func addNonLiteralUpdExprToSelect(ctx *plancontext.PlanningContext, updExpr *sql info.UpdateExprCol = len(exprs) exprs = append(exprs, aeWrap(updExpr.Expr)) } + if info.ExprCol == -1 { + info.ExprCol = len(exprs) + exprs = append(exprs, aeWrap(updExpr.Name)) + } return info, exprs } diff --git a/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json b/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json index 0a57806cb1d..f77cb4aeac3 100644 --- a/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/foreignkey_cases.json @@ -840,9 +840,10 @@ ], "NonLiteralUpdateInfo": [ { + "ExprCol": 0, + "CompExprCol": 1, "UpdateExprCol": 2, - "UpdateExprBvName": "fkc_upd", - "CompExprCol": 1 + "UpdateExprBvName": "fkc_upd" } ], "Query": "update u_tbl3 set col3 = null where (col3) in ::fkc_vals and (:fkc_upd is null or (u_tbl3.col3) not in ((:fkc_upd)))", @@ -901,9 +902,10 @@ ], "NonLiteralUpdateInfo": [ { + "ExprCol": 0, + "CompExprCol": 1, "UpdateExprCol": 2, - "UpdateExprBvName": "fkc_upd", - "CompExprCol": 1 + "UpdateExprBvName": "fkc_upd" } ], "Inputs": [ @@ -958,9 +960,10 @@ ], "NonLiteralUpdateInfo": [ { + "ExprCol": 0, + "CompExprCol": 1, "UpdateExprCol": 2, - "UpdateExprBvName": "fkc_upd1", - "CompExprCol": 1 + "UpdateExprBvName": "fkc_upd1" } ], "Inputs": [ @@ -2102,9 +2105,10 @@ ], "NonLiteralUpdateInfo": [ { + "ExprCol": 0, + "CompExprCol": 1, "UpdateExprCol": 2, - "UpdateExprBvName": "fkc_upd", - "CompExprCol": 1 + "UpdateExprBvName": "fkc_upd" } ], "Inputs": [ @@ -2199,9 +2203,10 @@ ], "NonLiteralUpdateInfo": [ { + "ExprCol": 0, + "CompExprCol": 2, "UpdateExprCol": 3, - "UpdateExprBvName": "fkc_upd", - "CompExprCol": 2 + "UpdateExprBvName": "fkc_upd" } ], "Inputs": [ @@ -2327,14 +2332,16 @@ ], "NonLiteralUpdateInfo": [ { + "ExprCol": 0, + "CompExprCol": 2, "UpdateExprCol": 3, - "UpdateExprBvName": "fkc_upd", - "CompExprCol": 2 + "UpdateExprBvName": "fkc_upd" }, { + "ExprCol": 1, + "CompExprCol": 4, "UpdateExprCol": 5, - "UpdateExprBvName": "fkc_upd1", - "CompExprCol": 4 + "UpdateExprBvName": "fkc_upd1" } ], "Query": "update /*+ SET_VAR(foreign_key_checks=OFF) */ u_multicol_tbl3 set cola = :fkc_upd, colb = :fkc_upd1 where (cola, colb) in ::fkc_vals", From 09715e377ccf2756279f98d42c04fbc8e105ba9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Taylor?= Date: Thu, 16 Nov 2023 10:43:54 +0100 Subject: [PATCH 37/39] Use hash joins when nested loop joins are not feasible (#14448) --- go/sqltypes/type.go | 4 + .../queries/aggregation/distinct_test.go | 8 +- .../vtgate/queries/derived/derived_test.go | 35 +- .../vtgate/queries/derived/schema.sql | 4 +- .../vtgate/queries/orderby/orderby_test.go | 4 +- .../vtgate/queries/random/simplifier_test.go | 32 +- .../queries/reference/reference_test.go | 2 +- .../vtgate/queries/subquery/subquery_test.go | 2 +- go/vt/vtgate/engine/fake_vcursor_test.go | 30 +- go/vt/vtgate/engine/hash_join.go | 266 +++++---- go/vt/vtgate/engine/hash_join_test.go | 244 ++++---- go/vt/vtgate/engine/insert_test.go | 16 +- go/vt/vtgate/engine/join.go | 2 +- go/vt/vtgate/engine/join_test.go | 12 +- go/vt/vtgate/engine/route_test.go | 112 ++-- go/vt/vtgate/engine/semi_join_test.go | 2 +- go/vt/vtgate/engine/simple_projection_test.go | 6 +- .../engine/uncorrelated_subquery_test.go | 4 +- go/vt/vtgate/evalengine/api_coerce.go | 68 +++ go/vt/vtgate/evalengine/api_hash_test.go | 10 +- go/vt/vtgate/evalengine/collation.go | 4 +- go/vt/vtgate/evalengine/compiler.go | 2 +- go/vt/vtgate/evalengine/eval.go | 2 +- go/vt/vtgate/evalengine/expr_compare.go | 2 +- go/vt/vtgate/planbuilder/join.go | 13 + .../planbuilder/operator_transformers.go | 57 ++ .../operators/aggregation_pushing.go | 20 +- .../planbuilder/operators/aggregator.go | 7 +- .../planbuilder/operators/apply_join.go | 14 +- .../vtgate/planbuilder/operators/ast_to_op.go | 2 +- .../vtgate/planbuilder/operators/distinct.go | 3 +- .../planbuilder/operators/expressions.go | 4 +- go/vt/vtgate/planbuilder/operators/filter.go | 7 +- .../vtgate/planbuilder/operators/hash_join.go | 327 +++++++++++ .../planbuilder/operators/hash_join_test.go | 100 ++++ .../operators/horizon_expanding.go | 6 +- go/vt/vtgate/planbuilder/operators/join.go | 5 +- go/vt/vtgate/planbuilder/operators/joins.go | 7 +- .../planbuilder/operators/offset_planning.go | 11 +- .../vtgate/planbuilder/operators/ordering.go | 3 +- go/vt/vtgate/planbuilder/operators/phases.go | 21 +- .../planbuilder/operators/projection.go | 13 +- .../planbuilder/operators/query_planning.go | 48 +- .../operators/rewrite/rewriters.go | 20 +- go/vt/vtgate/planbuilder/operators/route.go | 7 +- .../planbuilder/operators/route_planning.go | 22 +- .../vtgate/planbuilder/operators/subquery.go | 5 +- .../operators/subquery_planning.go | 18 +- .../planbuilder/operators/union_merging.go | 2 +- .../planbuilder/operators/utils_test.go | 90 +++ .../planbuilder/testdata/from_cases.json | 125 +++++ .../planbuilder/testdata/hash_joins.txt | 531 ------------------ .../testdata/unsupported_cases.json | 9 +- go/vt/vtgate/semantics/semantic_state.go | 10 +- go/vt/vttablet/tabletserver/rules/rules.go | 15 +- 55 files changed, 1391 insertions(+), 1004 deletions(-) create mode 100644 go/vt/vtgate/planbuilder/operators/hash_join.go create mode 100644 go/vt/vtgate/planbuilder/operators/hash_join_test.go create mode 100644 go/vt/vtgate/planbuilder/operators/utils_test.go delete mode 100644 go/vt/vtgate/planbuilder/testdata/hash_joins.txt diff --git a/go/sqltypes/type.go b/go/sqltypes/type.go index 9157db685e9..d3436ed8718 100644 --- a/go/sqltypes/type.go +++ b/go/sqltypes/type.go @@ -89,6 +89,10 @@ func IsText(t querypb.Type) bool { return int(t)&flagIsText == flagIsText } +func IsTextOrBinary(t querypb.Type) bool { + return int(t)&flagIsText == flagIsText || int(t)&flagIsBinary == flagIsBinary +} + // IsBinary returns true if querypb.Type is a binary. // If you have a Value object, use its member function. func IsBinary(t querypb.Type) bool { diff --git a/go/test/endtoend/vtgate/queries/aggregation/distinct_test.go b/go/test/endtoend/vtgate/queries/aggregation/distinct_test.go index 0a06190923c..3ec27dae6a6 100644 --- a/go/test/endtoend/vtgate/queries/aggregation/distinct_test.go +++ b/go/test/endtoend/vtgate/queries/aggregation/distinct_test.go @@ -46,9 +46,9 @@ func TestDistinctIt(t *testing.T) { mcmp.AssertMatchesNoOrder("select distinct id from aggr_test", `[[INT64(1)] [INT64(2)] [INT64(3)] [INT64(5)] [INT64(4)] [INT64(6)] [INT64(7)] [INT64(8)]]`) if utils.BinaryIsAtLeastAtVersion(17, "vtgate") { - mcmp.AssertMatches("select /*vt+ PLANNER=Gen4 */ distinct val1 from aggr_test order by val1 desc", `[[VARCHAR("e")] [VARCHAR("d")] [VARCHAR("c")] [VARCHAR("b")] [VARCHAR("a")]]`) - mcmp.AssertMatchesNoOrder("select /*vt+ PLANNER=Gen4 */ distinct val1, count(*) from aggr_test group by val1", `[[VARCHAR("a") INT64(2)] [VARCHAR("b") INT64(1)] [VARCHAR("c") INT64(2)] [VARCHAR("d") INT64(1)] [VARCHAR("e") INT64(2)]]`) - mcmp.AssertMatchesNoOrder("select /*vt+ PLANNER=Gen4 */ distinct val1+val2 from aggr_test", `[[NULL] [FLOAT64(1)] [FLOAT64(3)] [FLOAT64(4)]]`) - mcmp.AssertMatchesNoOrder("select /*vt+ PLANNER=Gen4 */ distinct count(*) from aggr_test group by val1", `[[INT64(2)] [INT64(1)]]`) + mcmp.AssertMatches("select distinct val1 from aggr_test order by val1 desc", `[[VARCHAR("e")] [VARCHAR("d")] [VARCHAR("c")] [VARCHAR("b")] [VARCHAR("a")]]`) + mcmp.AssertMatchesNoOrder("select distinct val1, count(*) from aggr_test group by val1", `[[VARCHAR("a") INT64(2)] [VARCHAR("b") INT64(1)] [VARCHAR("c") INT64(2)] [VARCHAR("d") INT64(1)] [VARCHAR("e") INT64(2)]]`) + mcmp.AssertMatchesNoOrder("select distinct val1+val2 from aggr_test", `[[NULL] [FLOAT64(1)] [FLOAT64(3)] [FLOAT64(4)]]`) + mcmp.AssertMatchesNoOrder("select distinct count(*) from aggr_test group by val1", `[[INT64(2)] [INT64(1)]]`) } } diff --git a/go/test/endtoend/vtgate/queries/derived/derived_test.go b/go/test/endtoend/vtgate/queries/derived/derived_test.go index c3360ee4135..293dddb355c 100644 --- a/go/test/endtoend/vtgate/queries/derived/derived_test.go +++ b/go/test/endtoend/vtgate/queries/derived/derived_test.go @@ -52,7 +52,7 @@ func TestDerivedTableWithOrderByLimit(t *testing.T) { mcmp, closer := start(t) defer closer() - mcmp.Exec("select /*vt+ PLANNER=Gen4 */ music.id from music join (select id,name from user order by id limit 2) as d on music.user_id = d.id") + mcmp.Exec("select music.id from music join (select id,name from user order by id limit 2) as d on music.user_id = d.id") } func TestDerivedAggregationOnRHS(t *testing.T) { @@ -60,14 +60,14 @@ func TestDerivedAggregationOnRHS(t *testing.T) { defer closer() mcmp.Exec("set sql_mode = ''") - mcmp.Exec("select /*vt+ PLANNER=Gen4 */ d.a from music join (select id, count(*) as a from user) as d on music.user_id = d.id group by 1") + mcmp.Exec("select d.a from music join (select id, count(*) as a from user) as d on music.user_id = d.id group by 1") } func TestDerivedRemoveInnerOrderBy(t *testing.T) { mcmp, closer := start(t) defer closer() - mcmp.Exec("select /*vt+ PLANNER=Gen4 */ count(*) from (select user.id as oui, music.id as non from user join music on user.id = music.user_id order by user.name) as toto") + mcmp.Exec("select count(*) from (select user.id as oui, music.id as non from user join music on user.id = music.user_id order by user.name) as toto") } func TestDerivedTableWithHaving(t *testing.T) { @@ -76,7 +76,7 @@ func TestDerivedTableWithHaving(t *testing.T) { mcmp.Exec("set sql_mode = ''") // For the given query, we can get any id back, because we aren't grouping by it. - mcmp.AssertMatchesAnyNoCompare("select /*vt+ PLANNER=Gen4 */ * from (select id from user having count(*) >= 1) s", + mcmp.AssertMatchesAnyNoCompare("select * from (select id from user having count(*) >= 1) s", "[[INT64(1)]]", "[[INT64(2)]]", "[[INT64(3)]]", "[[INT64(4)]]", "[[INT64(5)]]") } @@ -84,6 +84,31 @@ func TestDerivedTableColumns(t *testing.T) { mcmp, closer := start(t) defer closer() - mcmp.AssertMatches(`SELECT /*vt+ PLANNER=gen4 */ t.id FROM (SELECT id FROM user) AS t(id) ORDER BY t.id DESC`, + mcmp.AssertMatches(`SELECT t.id FROM (SELECT id FROM user) AS t(id) ORDER BY t.id DESC`, `[[INT64(5)] [INT64(4)] [INT64(3)] [INT64(2)] [INT64(1)]]`) } + +// TestDerivedTablesWithLimit tests queries where we have to limit the right hand side of the join. +// We do this by not using the apply join we usually use, and instead use the hash join engine primitive +// These tests exercise these situations +func TestDerivedTablesWithLimit(t *testing.T) { + // We need full type info before planning this, so we wait for the schema tracker + require.NoError(t, + utils.WaitForAuthoritative(t, keyspaceName, "user", clusterInstance.VtgateProcess.ReadVSchema)) + + mcmp, closer := start(t) + defer closer() + + mcmp.Exec("insert into user(id, name) values(6,'pikachu')") + + mcmp.AssertMatchesNoOrder( + `SELECT u.id, m.id FROM + (SELECT id, name FROM user LIMIT 10) AS u JOIN + (SELECT id, user_id FROM music LIMIT 10) as m on u.id = m.user_id`, + `[[INT64(1) INT64(1)] [INT64(5) INT64(2)] [INT64(1) INT64(3)] [INT64(2) INT64(4)] [INT64(3) INT64(5)] [INT64(5) INT64(7)] [INT64(4) INT64(6)]]`) + + mcmp.AssertMatchesNoOrder( + `SELECT u.id, m.id FROM user AS u LEFT JOIN + (SELECT id, user_id FROM music LIMIT 10) as m on u.id = m.user_id`, + `[[INT64(1) INT64(1)] [INT64(5) INT64(2)] [INT64(1) INT64(3)] [INT64(2) INT64(4)] [INT64(3) INT64(5)] [INT64(5) INT64(7)] [INT64(4) INT64(6)] [INT64(6) NULL]]`) +} diff --git a/go/test/endtoend/vtgate/queries/derived/schema.sql b/go/test/endtoend/vtgate/queries/derived/schema.sql index cf608028ed5..3cb8619d93b 100644 --- a/go/test/endtoend/vtgate/queries/derived/schema.sql +++ b/go/test/endtoend/vtgate/queries/derived/schema.sql @@ -1,13 +1,13 @@ create table user ( - id bigint, + id bigint, name varchar(255), primary key (id) ) Engine = InnoDB; create table music ( - id bigint, + id bigint, user_id bigint, primary key (id) ) Engine = InnoDB; diff --git a/go/test/endtoend/vtgate/queries/orderby/orderby_test.go b/go/test/endtoend/vtgate/queries/orderby/orderby_test.go index dd48a09fec7..43f800ee24c 100644 --- a/go/test/endtoend/vtgate/queries/orderby/orderby_test.go +++ b/go/test/endtoend/vtgate/queries/orderby/orderby_test.go @@ -68,7 +68,7 @@ func TestOrderBy(t *testing.T) { mcmp.AssertMatches("select id1, id2 from t4 order by id1 desc", `[[INT64(8) VARCHAR("F")] [INT64(7) VARCHAR("e")] [INT64(6) VARCHAR("d")] [INT64(5) VARCHAR("test")] [INT64(4) VARCHAR("c")] [INT64(3) VARCHAR("b")] [INT64(2) VARCHAR("Abc")] [INT64(1) VARCHAR("a")]]`) // test ordering of complex column if utils.BinaryIsAtLeastAtVersion(17, "vtgate") { - mcmp.AssertMatches("select /*vt+ PLANNER=Gen4 */ id1, id2 from t4 order by reverse(id2) desc", `[[INT64(5) VARCHAR("test")] [INT64(8) VARCHAR("F")] [INT64(7) VARCHAR("e")] [INT64(6) VARCHAR("d")] [INT64(2) VARCHAR("Abc")] [INT64(4) VARCHAR("c")] [INT64(3) VARCHAR("b")] [INT64(1) VARCHAR("a")]]`) + mcmp.AssertMatches("select id1, id2 from t4 order by reverse(id2) desc", `[[INT64(5) VARCHAR("test")] [INT64(8) VARCHAR("F")] [INT64(7) VARCHAR("e")] [INT64(6) VARCHAR("d")] [INT64(2) VARCHAR("Abc")] [INT64(4) VARCHAR("c")] [INT64(3) VARCHAR("b")] [INT64(1) VARCHAR("a")]]`) } defer func() { @@ -80,6 +80,6 @@ func TestOrderBy(t *testing.T) { mcmp.AssertMatches("select id1, id2 from t4 order by id2 desc", `[[INT64(5) VARCHAR("test")] [INT64(8) VARCHAR("F")] [INT64(7) VARCHAR("e")] [INT64(6) VARCHAR("d")] [INT64(4) VARCHAR("c")] [INT64(3) VARCHAR("b")] [INT64(2) VARCHAR("Abc")] [INT64(1) VARCHAR("a")]]`) mcmp.AssertMatches("select id1, id2 from t4 order by id1 desc", `[[INT64(8) VARCHAR("F")] [INT64(7) VARCHAR("e")] [INT64(6) VARCHAR("d")] [INT64(5) VARCHAR("test")] [INT64(4) VARCHAR("c")] [INT64(3) VARCHAR("b")] [INT64(2) VARCHAR("Abc")] [INT64(1) VARCHAR("a")]]`) if utils.BinaryIsAtLeastAtVersion(17, "vtgate") { - mcmp.AssertMatches("select /*vt+ PLANNER=Gen4 */ id1, id2 from t4 order by reverse(id2) desc", `[[INT64(5) VARCHAR("test")] [INT64(8) VARCHAR("F")] [INT64(7) VARCHAR("e")] [INT64(6) VARCHAR("d")] [INT64(2) VARCHAR("Abc")] [INT64(4) VARCHAR("c")] [INT64(3) VARCHAR("b")] [INT64(1) VARCHAR("a")]]`) + mcmp.AssertMatches("select id1, id2 from t4 order by reverse(id2) desc", `[[INT64(5) VARCHAR("test")] [INT64(8) VARCHAR("F")] [INT64(7) VARCHAR("e")] [INT64(6) VARCHAR("d")] [INT64(2) VARCHAR("Abc")] [INT64(4) VARCHAR("c")] [INT64(3) VARCHAR("b")] [INT64(1) VARCHAR("a")]]`) } } diff --git a/go/test/endtoend/vtgate/queries/random/simplifier_test.go b/go/test/endtoend/vtgate/queries/random/simplifier_test.go index 478ee355d34..2be9ef8ab93 100644 --- a/go/test/endtoend/vtgate/queries/random/simplifier_test.go +++ b/go/test/endtoend/vtgate/queries/random/simplifier_test.go @@ -36,22 +36,22 @@ func TestSimplifyResultsMismatchedQuery(t *testing.T) { t.Skip("Skip CI") var queries []string - queries = append(queries, "select /*vt+ PLANNER=Gen4 */ (68 - -16) / case false when -45 then 3 when 28 then -43 else -62 end as crandom0 from dept as tbl0, (select /*vt+ PLANNER=Gen4 */ distinct not not false and count(*) from emp as tbl0, emp as tbl1 where tbl1.ename) as tbl1 limit 1", - "select /*vt+ PLANNER=Gen4 */ distinct case true when 'burro' then 'trout' else 'elf' end < case count(distinct true) when 'bobcat' then 'turkey' else 'penguin' end from dept as tbl0, emp as tbl1 where 'spider'", - "select /*vt+ PLANNER=Gen4 */ distinct sum(distinct tbl1.deptno) from dept as tbl0, emp as tbl1 where tbl0.deptno and tbl1.comm in (12, tbl0.deptno, case false when 67 then -17 when -78 then -35 end, -76 >> -68)", - "select /*vt+ PLANNER=Gen4 */ count(*) + 1 from emp as tbl0 order by count(*) desc", - "select /*vt+ PLANNER=Gen4 */ count(2 >> tbl2.mgr), sum(distinct tbl2.empno <=> 15) from emp as tbl0 left join emp as tbl2 on -32", - "select /*vt+ PLANNER=Gen4 */ sum(case false when true then tbl1.deptno else -154 / 132 end) as caggr1 from emp as tbl0, dept as tbl1", - "select /*vt+ PLANNER=Gen4 */ tbl1.dname as cgroup0, tbl1.dname as cgroup1 from dept as tbl0, dept as tbl1 group by tbl1.dname, tbl1.deptno order by tbl1.deptno desc", - "select /*vt+ PLANNER=Gen4 */ tbl0.ename as cgroup1 from emp as tbl0 group by tbl0.job, tbl0.ename having sum(tbl0.mgr) = sum(tbl0.mgr) order by tbl0.job desc, tbl0.ename asc limit 8", - "select /*vt+ PLANNER=Gen4 */ distinct count(*) as caggr1 from dept as tbl0, emp as tbl1 group by tbl1.sal having max(tbl1.comm) != true", - "select /*vt+ PLANNER=Gen4 */ distinct sum(tbl1.loc) as caggr0 from dept as tbl0, dept as tbl1 group by tbl1.deptno having max(tbl1.dname) <= 1", - "select /*vt+ PLANNER=Gen4 */ min(tbl0.deptno) as caggr0 from dept as tbl0, emp as tbl1 where case when false then tbl0.dname end group by tbl1.comm", - "select /*vt+ PLANNER=Gen4 */ count(*) as caggr0, 1 as crandom0 from dept as tbl0, emp as tbl1 where 1 = 0", - "select /*vt+ PLANNER=Gen4 */ count(*) as caggr0, 1 as crandom0 from dept as tbl0, emp as tbl1 where 'octopus'", - "select /*vt+ PLANNER=Gen4 */ distinct 'octopus' as crandom0 from dept as tbl0, emp as tbl1 where tbl0.deptno = tbl1.empno having count(*) = count(*)", - "select /*vt+ PLANNER=Gen4 */ max(tbl0.deptno) from dept as tbl0 right join emp as tbl1 on tbl0.deptno = tbl1.empno and tbl0.deptno = tbl1.deptno group by tbl0.deptno", - "select /*vt+ PLANNER=Gen4 */ count(tbl1.comm) from emp as tbl1 right join emp as tbl2 on tbl1.mgr = tbl2.sal") + queries = append(queries, "select (68 - -16) / case false when -45 then 3 when 28 then -43 else -62 end as crandom0 from dept as tbl0, (select distinct not not false and count(*) from emp as tbl0, emp as tbl1 where tbl1.ename) as tbl1 limit 1", + "select distinct case true when 'burro' then 'trout' else 'elf' end < case count(distinct true) when 'bobcat' then 'turkey' else 'penguin' end from dept as tbl0, emp as tbl1 where 'spider'", + "select distinct sum(distinct tbl1.deptno) from dept as tbl0, emp as tbl1 where tbl0.deptno and tbl1.comm in (12, tbl0.deptno, case false when 67 then -17 when -78 then -35 end, -76 >> -68)", + "select count(*) + 1 from emp as tbl0 order by count(*) desc", + "select count(2 >> tbl2.mgr), sum(distinct tbl2.empno <=> 15) from emp as tbl0 left join emp as tbl2 on -32", + "select sum(case false when true then tbl1.deptno else -154 / 132 end) as caggr1 from emp as tbl0, dept as tbl1", + "select tbl1.dname as cgroup0, tbl1.dname as cgroup1 from dept as tbl0, dept as tbl1 group by tbl1.dname, tbl1.deptno order by tbl1.deptno desc", + "select tbl0.ename as cgroup1 from emp as tbl0 group by tbl0.job, tbl0.ename having sum(tbl0.mgr) = sum(tbl0.mgr) order by tbl0.job desc, tbl0.ename asc limit 8", + "select distinct count(*) as caggr1 from dept as tbl0, emp as tbl1 group by tbl1.sal having max(tbl1.comm) != true", + "select distinct sum(tbl1.loc) as caggr0 from dept as tbl0, dept as tbl1 group by tbl1.deptno having max(tbl1.dname) <= 1", + "select min(tbl0.deptno) as caggr0 from dept as tbl0, emp as tbl1 where case when false then tbl0.dname end group by tbl1.comm", + "select count(*) as caggr0, 1 as crandom0 from dept as tbl0, emp as tbl1 where 1 = 0", + "select count(*) as caggr0, 1 as crandom0 from dept as tbl0, emp as tbl1 where 'octopus'", + "select distinct 'octopus' as crandom0 from dept as tbl0, emp as tbl1 where tbl0.deptno = tbl1.empno having count(*) = count(*)", + "select max(tbl0.deptno) from dept as tbl0 right join emp as tbl1 on tbl0.deptno = tbl1.empno and tbl0.deptno = tbl1.deptno group by tbl0.deptno", + "select count(tbl1.comm) from emp as tbl1 right join emp as tbl2 on tbl1.mgr = tbl2.sal") for _, query := range queries { var simplified string diff --git a/go/test/endtoend/vtgate/queries/reference/reference_test.go b/go/test/endtoend/vtgate/queries/reference/reference_test.go index 75efc840880..9c2508a889f 100644 --- a/go/test/endtoend/vtgate/queries/reference/reference_test.go +++ b/go/test/endtoend/vtgate/queries/reference/reference_test.go @@ -114,7 +114,7 @@ func TestReferenceRouting(t *testing.T) { utils.AssertMatches( t, conn, - `SELECT /*vt+ PLANNER=gen4 */ COUNT(zd.id) + `SELECT COUNT(zd.id) FROM delivery_failure df JOIN zip_detail zd ON zd.id = df.zip_detail_id WHERE zd.id = 3`, `[[INT64(0)]]`, diff --git a/go/test/endtoend/vtgate/queries/subquery/subquery_test.go b/go/test/endtoend/vtgate/queries/subquery/subquery_test.go index 01cc7b2ee54..371de19dbe6 100644 --- a/go/test/endtoend/vtgate/queries/subquery/subquery_test.go +++ b/go/test/endtoend/vtgate/queries/subquery/subquery_test.go @@ -106,7 +106,7 @@ func TestSubqueryInUpdate(t *testing.T) { utils.Exec(t, conn, `insert into t1(id1, id2) values (1, 10), (2, 20), (3, 30), (4, 40), (5, 50)`) utils.Exec(t, conn, `insert into t2(id3, id4) values (1, 3), (2, 4)`) utils.AssertMatches(t, conn, `SELECT id2, keyspace_id FROM t1_id2_idx WHERE id2 IN (2,10)`, `[[INT64(10) VARBINARY("\x16k@\xb4J\xbaK\xd6")]]`) - utils.Exec(t, conn, `update /*vt+ PLANNER=gen4 */ t1 set id2 = (select count(*) from t2) where id1 = 1`) + utils.Exec(t, conn, `update t1 set id2 = (select count(*) from t2) where id1 = 1`) utils.AssertMatches(t, conn, `SELECT id2 FROM t1 WHERE id1 = 1`, `[[INT64(2)]]`) utils.AssertMatches(t, conn, `SELECT id2, keyspace_id FROM t1_id2_idx WHERE id2 IN (2,10)`, `[[INT64(2) VARBINARY("\x16k@\xb4J\xbaK\xd6")]]`) } diff --git a/go/vt/vtgate/engine/fake_vcursor_test.go b/go/vt/vtgate/engine/fake_vcursor_test.go index 6c99af33313..9776572f1a5 100644 --- a/go/vt/vtgate/engine/fake_vcursor_test.go +++ b/go/vt/vtgate/engine/fake_vcursor_test.go @@ -21,12 +21,15 @@ import ( "context" "fmt" "reflect" + "slices" "sort" "strings" "sync" "testing" "time" + "github.com/google/go-cmp/cmp" + "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/test/utils" @@ -806,18 +809,39 @@ func (t *noopVCursor) GetLogs() ([]ExecuteEntry, error) { return nil, nil } -func expectResult(t *testing.T, msg string, result, want *sqltypes.Result) { +func expectResult(t *testing.T, result, want *sqltypes.Result) { t.Helper() fieldsResult := fmt.Sprintf("%v", result.Fields) fieldsWant := fmt.Sprintf("%v", want.Fields) if fieldsResult != fieldsWant { - t.Errorf("%s (mismatch in Fields):\n%s\nwant:\n%s", msg, fieldsResult, fieldsWant) + t.Errorf("mismatch in Fields\n%s\nwant:\n%s", fieldsResult, fieldsWant) } rowsResult := fmt.Sprintf("%v", result.Rows) rowsWant := fmt.Sprintf("%v", want.Rows) if rowsResult != rowsWant { - t.Errorf("%s (mismatch in Rows):\n%s\nwant:\n%s", msg, rowsResult, rowsWant) + t.Errorf("mismatch in Rows:\n%s\nwant:\n%s", rowsResult, rowsWant) + } +} + +func expectResultAnyOrder(t *testing.T, result, want *sqltypes.Result) { + t.Helper() + f := func(a, b sqltypes.Row) int { + for i := range a { + l := a[i].RawStr() + r := b[i].RawStr() + x := strings.Compare(l, r) + if x == 0 { + continue + } + return x + } + return 0 + } + slices.SortFunc(result.Rows, f) + slices.SortFunc(want.Rows, f) + if diff := cmp.Diff(want, result); diff != "" { + t.Errorf("result: %+v, want %+v\ndiff: %s", result, want, diff) } } diff --git a/go/vt/vtgate/engine/hash_join.go b/go/vt/vtgate/engine/hash_join.go index a38fc21bf97..4f205f1bcdc 100644 --- a/go/vt/vtgate/engine/hash_join.go +++ b/go/vt/vtgate/engine/hash_join.go @@ -20,48 +20,69 @@ import ( "context" "fmt" "strings" + "sync" + "sync/atomic" "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vtgate/evalengine" + "vitess.io/vitess/go/vt/vthash" ) var _ Primitive = (*HashJoin)(nil) -// HashJoin specifies the parameters for a join primitive -// Hash joins work by fetch all the input from the LHS, and building a hash map, known as the probe table, for this input. -// The key to the map is the hashcode of the value for column that we are joining by. -// Then the RHS is fetched, and we can check if the rows from the RHS matches any from the LHS. -// When they match by hash code, we double-check that we are not working with a false positive by comparing the values. -type HashJoin struct { - Opcode JoinOpcode - - // Left and Right are the LHS and RHS primitives - // of the Join. They can be any primitive. - Left, Right Primitive `json:",omitempty"` - - // Cols defines which columns from the left - // or right results should be used to build the - // return result. For results coming from the - // left query, the index values go as -1, -2, etc. - // For the right query, they're 1, 2, etc. - // If Cols is {-1, -2, 1, 2}, it means that - // the returned result will be {Left0, Left1, Right0, Right1}. - Cols []int `json:",omitempty"` - - // The keys correspond to the column offset in the inputs where - // the join columns can be found - LHSKey, RHSKey int - - // The join condition. Used for plan descriptions - ASTPred sqlparser.Expr - - // collation and type are used to hash the incoming values correctly - Collation collations.ID - ComparisonType querypb.Type -} +type ( + // HashJoin specifies the parameters for a join primitive + // Hash joins work by fetch all the input from the LHS, and building a hash map, known as the probe table, for this input. + // The key to the map is the hashcode of the value for column that we are joining by. + // Then the RHS is fetched, and we can check if the rows from the RHS matches any from the LHS. + // When they match by hash code, we double-check that we are not working with a false positive by comparing the values. + HashJoin struct { + Opcode JoinOpcode + + // Left and Right are the LHS and RHS primitives + // of the Join. They can be any primitive. + Left, Right Primitive `json:",omitempty"` + + // Cols defines which columns from the left + // or right results should be used to build the + // return result. For results coming from the + // left query, the index values go as -1, -2, etc. + // For the right query, they're 1, 2, etc. + // If Cols is {-1, -2, 1, 2}, it means that + // the returned result will be {Left0, Left1, Right0, Right1}. + Cols []int `json:",omitempty"` + + // The keys correspond to the column offset in the inputs where + // the join columns can be found + LHSKey, RHSKey int + + // The join condition. Used for plan descriptions + ASTPred sqlparser.Expr + + // collation and type are used to hash the incoming values correctly + Collation collations.ID + ComparisonType querypb.Type + } + + hashJoinProbeTable struct { + innerMap map[vthash.Hash]*probeTableEntry + + coll collations.ID + typ querypb.Type + lhsKey, rhsKey int + cols []int + hasher vthash.Hasher + } + + probeTableEntry struct { + row sqltypes.Row + next *probeTableEntry + seen bool + } +) // TryExecute implements the Primitive interface func (hj *HashJoin) TryExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool) (*sqltypes.Result, error) { @@ -70,10 +91,13 @@ func (hj *HashJoin) TryExecute(ctx context.Context, vcursor VCursor, bindVars ma return nil, err } + pt := newHashJoinProbeTable(hj.Collation, hj.ComparisonType, hj.LHSKey, hj.RHSKey, hj.Cols) // build the probe table from the LHS result - probeTable, err := hj.buildProbeTable(lresult) - if err != nil { - return nil, err + for _, row := range lresult.Rows { + err := pt.addLeftRow(row) + if err != nil { + return nil, err + } } rresult, err := vcursor.ExecutePrimitive(ctx, hj.Right, bindVars, wantfields) @@ -86,68 +110,37 @@ func (hj *HashJoin) TryExecute(ctx context.Context, vcursor VCursor, bindVars ma } for _, currentRHSRow := range rresult.Rows { - joinVal := currentRHSRow[hj.RHSKey] - if joinVal.IsNull() { - continue - } - hashcode, err := evalengine.NullsafeHashcode(joinVal, hj.Collation, hj.ComparisonType) + matches, err := pt.get(currentRHSRow) if err != nil { return nil, err } - lftRows := probeTable[hashcode] - for _, currentLHSRow := range lftRows { - lhsVal := currentLHSRow[hj.LHSKey] - // hash codes can give false positives, so we need to check with a real comparison as well - cmp, err := evalengine.NullsafeCompare(joinVal, lhsVal, hj.Collation) - if err != nil { - return nil, err - } + result.Rows = append(result.Rows, matches...) + } - if cmp == 0 { - // we have a match! - result.Rows = append(result.Rows, joinRows(currentLHSRow, currentRHSRow, hj.Cols)) - } - } + if hj.Opcode == LeftJoin { + result.Rows = append(result.Rows, pt.notFetched()...) } return result, nil } -func (hj *HashJoin) buildProbeTable(lresult *sqltypes.Result) (map[evalengine.HashCode][]sqltypes.Row, error) { - probeTable := map[evalengine.HashCode][]sqltypes.Row{} - for _, current := range lresult.Rows { - joinVal := current[hj.LHSKey] - if joinVal.IsNull() { - continue - } - hashcode, err := evalengine.NullsafeHashcode(joinVal, hj.Collation, hj.ComparisonType) - if err != nil { - return nil, err - } - probeTable[hashcode] = append(probeTable[hashcode], current) - } - return probeTable, nil -} - // TryStreamExecute implements the Primitive interface func (hj *HashJoin) TryStreamExecute(ctx context.Context, vcursor VCursor, bindVars map[string]*querypb.BindVariable, wantfields bool, callback func(*sqltypes.Result) error) error { // build the probe table from the LHS result - probeTable := map[evalengine.HashCode][]sqltypes.Row{} + pt := newHashJoinProbeTable(hj.Collation, hj.ComparisonType, hj.LHSKey, hj.RHSKey, hj.Cols) var lfields []*querypb.Field + var mu sync.Mutex err := vcursor.StreamExecutePrimitive(ctx, hj.Left, bindVars, wantfields, func(result *sqltypes.Result) error { + mu.Lock() + defer mu.Unlock() if len(lfields) == 0 && len(result.Fields) != 0 { lfields = result.Fields } for _, current := range result.Rows { - joinVal := current[hj.LHSKey] - if joinVal.IsNull() { - continue - } - hashcode, err := evalengine.NullsafeHashcode(joinVal, hj.Collation, hj.ComparisonType) + err := pt.addLeftRow(current) if err != nil { return err } - probeTable[hashcode] = append(probeTable[hashcode], current) } return nil }) @@ -155,43 +148,50 @@ func (hj *HashJoin) TryStreamExecute(ctx context.Context, vcursor VCursor, bindV return err } - return vcursor.StreamExecutePrimitive(ctx, hj.Right, bindVars, wantfields, func(result *sqltypes.Result) error { + var sendFields atomic.Bool + sendFields.Store(wantfields) + + err = vcursor.StreamExecutePrimitive(ctx, hj.Right, bindVars, sendFields.Load(), func(result *sqltypes.Result) error { + mu.Lock() + defer mu.Unlock() // compare the results coming from the RHS with the probe-table res := &sqltypes.Result{} - if len(result.Fields) != 0 { - res = &sqltypes.Result{ - Fields: joinFields(lfields, result.Fields, hj.Cols), - } + if len(result.Fields) != 0 && sendFields.CompareAndSwap(true, false) { + res.Fields = joinFields(lfields, result.Fields, hj.Cols) } for _, currentRHSRow := range result.Rows { - joinVal := currentRHSRow[hj.RHSKey] - if joinVal.IsNull() { - continue - } - hashcode, err := evalengine.NullsafeHashcode(joinVal, hj.Collation, hj.ComparisonType) + results, err := pt.get(currentRHSRow) if err != nil { return err } - lftRows := probeTable[hashcode] - for _, currentLHSRow := range lftRows { - lhsVal := currentLHSRow[hj.LHSKey] - // hash codes can give false positives, so we need to check with a real comparison as well - cmp, err := evalengine.NullsafeCompare(joinVal, lhsVal, hj.Collation) - if err != nil { - return err - } - - if cmp == 0 { - // we have a match! - res.Rows = append(res.Rows, joinRows(currentLHSRow, currentRHSRow, hj.Cols)) - } - } + res.Rows = append(res.Rows, results...) } if len(res.Rows) != 0 || len(res.Fields) != 0 { return callback(res) } return nil }) + if err != nil { + return err + } + + if hj.Opcode == LeftJoin { + res := &sqltypes.Result{} + if sendFields.CompareAndSwap(true, false) { + // If we still have not sent the fields, we need to fetch + // the fields from the RHS to be able to build the result fields + rres, err := hj.Right.GetFields(ctx, vcursor, bindVars) + if err != nil { + return err + } + res.Fields = joinFields(lfields, rres.Fields, hj.Cols) + } + // this will only be called when all the concurrent access to the pt has + // ceased, so we don't need to lock it here + res.Rows = pt.notFetched() + return callback(res) + } + return nil } // RouteType implements the Primitive interface @@ -256,3 +256,69 @@ func (hj *HashJoin) description() PrimitiveDescription { Other: other, } } + +func newHashJoinProbeTable(coll collations.ID, typ querypb.Type, lhsKey, rhsKey int, cols []int) *hashJoinProbeTable { + return &hashJoinProbeTable{ + innerMap: map[vthash.Hash]*probeTableEntry{}, + coll: coll, + typ: typ, + lhsKey: lhsKey, + rhsKey: rhsKey, + cols: cols, + hasher: vthash.New(), + } +} + +func (pt *hashJoinProbeTable) addLeftRow(r sqltypes.Row) error { + hash, err := pt.hash(r[pt.lhsKey]) + if err != nil { + return err + } + pt.innerMap[hash] = &probeTableEntry{ + row: r, + next: pt.innerMap[hash], + } + + return nil +} + +func (pt *hashJoinProbeTable) hash(val sqltypes.Value) (vthash.Hash, error) { + err := evalengine.NullsafeHashcode128(&pt.hasher, val, pt.coll, pt.typ) + if err != nil { + return vthash.Hash{}, err + } + + res := pt.hasher.Sum128() + pt.hasher.Reset() + return res, nil +} + +func (pt *hashJoinProbeTable) get(rrow sqltypes.Row) (result []sqltypes.Row, err error) { + val := rrow[pt.rhsKey] + if val.IsNull() { + return + } + + hash, err := pt.hash(val) + if err != nil { + return nil, err + } + + for e := pt.innerMap[hash]; e != nil; e = e.next { + e.seen = true + result = append(result, joinRows(e.row, rrow, pt.cols)) + } + + return +} + +func (pt *hashJoinProbeTable) notFetched() (rows []sqltypes.Row) { + for _, e := range pt.innerMap { + for ; e != nil; e = e.next { + if !e.seen { + rows = append(rows, joinRows(e.row, nil, pt.cols)) + } + } + } + return +} diff --git a/go/vt/vtgate/engine/hash_join_test.go b/go/vt/vtgate/engine/hash_join_test.go index 8add0b78fa2..c0a3075c6ad 100644 --- a/go/vt/vtgate/engine/hash_join_test.go +++ b/go/vt/vtgate/engine/hash_join_test.go @@ -22,126 +22,152 @@ import ( "github.com/stretchr/testify/require" + "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/sqltypes" querypb "vitess.io/vitess/go/vt/proto/query" + "vitess.io/vitess/go/vt/vtgate/evalengine" ) -func TestHashJoinExecuteSameType(t *testing.T) { - leftPrim := &fakePrimitive{ - results: []*sqltypes.Result{ - sqltypes.MakeTestResult( - sqltypes.MakeTestFields( - "col1|col2|col3", - "int64|varchar|varchar", +func TestHashJoinVariations(t *testing.T) { + // This test tries the different variations of hash-joins: + // comparing values of same type and different types, and both left and right outer joins + lhs := func() Primitive { + return &fakePrimitive{ + results: []*sqltypes.Result{ + sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "col1|col2", + "int64|varchar", + ), + "1|1", + "2|2", + "3|b", + "null|b", ), - "1|a|aa", - "2|b|bb", - "3|c|cc", - ), - }, + }, + } } - rightPrim := &fakePrimitive{ - results: []*sqltypes.Result{ - sqltypes.MakeTestResult( - sqltypes.MakeTestFields( - "col4|col5|col6", - "int64|varchar|varchar", + rhs := func() Primitive { + return &fakePrimitive{ + results: []*sqltypes.Result{ + sqltypes.MakeTestResult( + sqltypes.MakeTestFields( + "col4|col5", + "int64|varchar", + ), + "1|1", + "3|2", + "5|null", + "4|b", ), - "1|d|dd", - "3|e|ee", - "4|f|ff", - "3|g|gg", - ), - }, + }, + } } - // Normal join - jn := &HashJoin{ - Opcode: InnerJoin, - Left: leftPrim, - Right: rightPrim, - Cols: []int{-1, -2, 1, 2}, - LHSKey: 0, - RHSKey: 0, - } - r, err := jn.TryExecute(context.Background(), &noopVCursor{}, map[string]*querypb.BindVariable{}, true) - require.NoError(t, err) - leftPrim.ExpectLog(t, []string{ - `Execute true`, - }) - rightPrim.ExpectLog(t, []string{ - `Execute true`, - }) - expectResult(t, "jn.Execute", r, sqltypes.MakeTestResult( - sqltypes.MakeTestFields( - "col1|col2|col4|col5", - "int64|varchar|int64|varchar", - ), - "1|a|1|d", - "3|c|3|e", - "3|c|3|g", - )) -} + rows := func(r ...string) []string { return r } -func TestHashJoinExecuteDifferentType(t *testing.T) { - leftPrim := &fakePrimitive{ - results: []*sqltypes.Result{ - sqltypes.MakeTestResult( - sqltypes.MakeTestFields( - "col1|col2|col3", - "int64|varchar|varchar", - ), - "1|a|aa", - "2|b|bb", - "3|c|cc", - "5|c|cc", - ), - }, - } - rightPrim := &fakePrimitive{ - results: []*sqltypes.Result{ - sqltypes.MakeTestResult( - sqltypes.MakeTestFields( - "col4|col5|col6", - "varchar|varchar|varchar", - ), - "1.00|d|dd", - "3|e|ee", - "2.89|z|zz", - "4|f|ff", - "3|g|gg", - " 5.0toto|g|gg", - "w|ww|www", - ), - }, + tests := []struct { + name string + typ JoinOpcode + lhs, rhs int + expected []string + reverse bool + }{{ + name: "inner join, same type", + typ: InnerJoin, + lhs: 0, + rhs: 0, + expected: rows("1|1|1|1", "3|b|3|2"), + }, { + name: "inner join, coercion", + typ: InnerJoin, + lhs: 0, + rhs: 1, + expected: rows("1|1|1|1", "2|2|3|2"), + }, { + name: "left join, same type", + typ: LeftJoin, + lhs: 0, + rhs: 0, + expected: rows("1|1|1|1", "3|b|3|2", "2|2|null|null", "null|b|null|null"), + }, { + name: "left join, coercion", + typ: LeftJoin, + lhs: 0, + rhs: 1, + expected: rows("1|1|1|1", "2|2|3|2", "3|b|null|null", "null|b|null|null"), + }, { + name: "right join, same type", + typ: LeftJoin, + lhs: 0, + rhs: 0, + expected: rows("1|1|1|1", "3|2|3|b", "4|b|null|null", "5|null|null|null"), + reverse: true, + }, { + name: "right join, coercion", + typ: LeftJoin, + lhs: 0, + rhs: 1, + reverse: true, + expected: rows("1|1|1|1", "3|2|null|null", "4|b|null|null", "5|null|null|null"), + }} + + for _, tc := range tests { + + var fields []*querypb.Field + var first, last func() Primitive + if tc.reverse { + first, last = rhs, lhs + fields = sqltypes.MakeTestFields( + "col4|col5|col1|col2", + "int64|varchar|int64|varchar", + ) + } else { + first, last = lhs, rhs + fields = sqltypes.MakeTestFields( + "col1|col2|col4|col5", + "int64|varchar|int64|varchar", + ) + } + + expected := sqltypes.MakeTestResult(fields, tc.expected...) + + typ, err := evalengine.CoerceTypes(typeForOffset(tc.lhs), typeForOffset(tc.rhs)) + require.NoError(t, err) + + jn := &HashJoin{ + Opcode: tc.typ, + Cols: []int{-1, -2, 1, 2}, + LHSKey: tc.lhs, + RHSKey: tc.rhs, + Collation: typ.Coll, + ComparisonType: typ.Type, + } + + t.Run(tc.name, func(t *testing.T) { + jn.Left = first() + jn.Right = last() + r, err := jn.TryExecute(context.Background(), &noopVCursor{}, map[string]*querypb.BindVariable{}, true) + require.NoError(t, err) + expectResultAnyOrder(t, r, expected) + }) + t.Run("Streaming "+tc.name, func(t *testing.T) { + jn.Left = first() + jn.Right = last() + r, err := wrapStreamExecute(jn, &noopVCursor{}, map[string]*querypb.BindVariable{}, true) + require.NoError(t, err) + expectResultAnyOrder(t, r, expected) + }) } +} - // Normal join - jn := &HashJoin{ - Opcode: InnerJoin, - Left: leftPrim, - Right: rightPrim, - Cols: []int{-1, -2, 1, 2}, - LHSKey: 0, - RHSKey: 0, - ComparisonType: querypb.Type_FLOAT64, +func typeForOffset(i int) evalengine.Type { + switch i { + case 0: + return evalengine.Type{Type: sqltypes.Int64, Coll: collations.CollationBinaryID} + case 1: + return evalengine.Type{Type: sqltypes.VarChar, Coll: collations.Default()} + default: + panic(i) } - r, err := jn.TryExecute(context.Background(), &noopVCursor{}, map[string]*querypb.BindVariable{}, true) - require.NoError(t, err) - leftPrim.ExpectLog(t, []string{ - `Execute true`, - }) - rightPrim.ExpectLog(t, []string{ - `Execute true`, - }) - expectResult(t, "jn.Execute", r, sqltypes.MakeTestResult( - sqltypes.MakeTestFields( - "col1|col2|col4|col5", - "int64|varchar|varchar|varchar", - ), - "1|a|1.00|d", - "3|c|3|e", - "3|c|3|g", - "5|c| 5.0toto|g", - )) } diff --git a/go/vt/vtgate/engine/insert_test.go b/go/vt/vtgate/engine/insert_test.go index 014654f37d6..d08ef856275 100644 --- a/go/vt/vtgate/engine/insert_test.go +++ b/go/vt/vtgate/engine/insert_test.go @@ -55,7 +55,7 @@ func TestInsertUnsharded(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAllShards()`, `ExecuteMultiShard ks.0: dummy_insert {} true true`, }) - expectResult(t, "Execute", result, &sqltypes.Result{InsertID: 4}) + expectResult(t, result, &sqltypes.Result{InsertID: 4}) // Failure cases vc = &loggingVCursor{shardErr: errors.New("shard_error")} @@ -117,7 +117,7 @@ func TestInsertUnshardedGenerate(t *testing.T) { }) // The insert id returned by ExecuteMultiShard should be overwritten by processGenerateFromValues. - expectResult(t, "Execute", result, &sqltypes.Result{InsertID: 4}) + expectResult(t, result, &sqltypes.Result{InsertID: 4}) } func TestInsertUnshardedGenerate_Zeros(t *testing.T) { @@ -170,7 +170,7 @@ func TestInsertUnshardedGenerate_Zeros(t *testing.T) { }) // The insert id returned by ExecuteMultiShard should be overwritten by processGenerateFromValues. - expectResult(t, "Execute", result, &sqltypes.Result{InsertID: 4}) + expectResult(t, result, &sqltypes.Result{InsertID: 4}) } func TestInsertShardedSimple(t *testing.T) { @@ -462,7 +462,7 @@ func TestInsertShardedGenerate(t *testing.T) { }) // The insert id returned by ExecuteMultiShard should be overwritten by processGenerateFromValues. - expectResult(t, "Execute", result, &sqltypes.Result{InsertID: 2}) + expectResult(t, result, &sqltypes.Result{InsertID: 2}) } func TestInsertShardedOwned(t *testing.T) { @@ -1797,7 +1797,7 @@ func TestInsertSelectGenerate(t *testing.T) { }) // The insert id returned by ExecuteMultiShard should be overwritten by processGenerateFromValues. - expectResult(t, "Execute", result, &sqltypes.Result{InsertID: 2}) + expectResult(t, result, &sqltypes.Result{InsertID: 2}) } func TestStreamingInsertSelectGenerate(t *testing.T) { @@ -1893,7 +1893,7 @@ func TestStreamingInsertSelectGenerate(t *testing.T) { }) // The insert id returned by ExecuteMultiShard should be overwritten by processGenerateFromValues. - expectResult(t, "Execute", output, &sqltypes.Result{InsertID: 2}) + expectResult(t, output, &sqltypes.Result{InsertID: 2}) } func TestInsertSelectGenerateNotProvided(t *testing.T) { @@ -1981,7 +1981,7 @@ func TestInsertSelectGenerateNotProvided(t *testing.T) { }) // The insert id returned by ExecuteMultiShard should be overwritten by processGenerateFromValues. - expectResult(t, "Execute", result, &sqltypes.Result{InsertID: 10}) + expectResult(t, result, &sqltypes.Result{InsertID: 10}) } func TestStreamingInsertSelectGenerateNotProvided(t *testing.T) { @@ -2073,7 +2073,7 @@ func TestStreamingInsertSelectGenerateNotProvided(t *testing.T) { }) // The insert id returned by ExecuteMultiShard should be overwritten by processGenerateFromValues. - expectResult(t, "Execute", output, &sqltypes.Result{InsertID: 10}) + expectResult(t, output, &sqltypes.Result{InsertID: 10}) } func TestInsertSelectUnowned(t *testing.T) { diff --git a/go/vt/vtgate/engine/join.go b/go/vt/vtgate/engine/join.go index ef50389c989..45b0d182dd7 100644 --- a/go/vt/vtgate/engine/join.go +++ b/go/vt/vtgate/engine/join.go @@ -225,7 +225,7 @@ func joinFields(lfields, rfields []*querypb.Field, cols []int) []*querypb.Field return fields } -func joinRows(lrow, rrow []sqltypes.Value, cols []int) []sqltypes.Value { +func joinRows(lrow, rrow sqltypes.Row, cols []int) sqltypes.Row { row := make([]sqltypes.Value, len(cols)) for i, index := range cols { if index < 0 { diff --git a/go/vt/vtgate/engine/join_test.go b/go/vt/vtgate/engine/join_test.go index 2df507f9512..eef5810ce69 100644 --- a/go/vt/vtgate/engine/join_test.go +++ b/go/vt/vtgate/engine/join_test.go @@ -89,7 +89,7 @@ func TestJoinExecute(t *testing.T) { `Execute a: type:INT64 value:"10" bv: type:VARCHAR value:"b" false`, `Execute a: type:INT64 value:"10" bv: type:VARCHAR value:"c" false`, }) - expectResult(t, "jn.Execute", r, sqltypes.MakeTestResult( + expectResult(t, r, sqltypes.MakeTestResult( sqltypes.MakeTestFields( "col1|col2|col4|col5", "int64|varchar|int64|varchar", @@ -116,7 +116,7 @@ func TestJoinExecute(t *testing.T) { `Execute a: type:INT64 value:"10" bv: type:VARCHAR value:"b" false`, `Execute a: type:INT64 value:"10" bv: type:VARCHAR value:"c" false`, }) - expectResult(t, "jn.Execute", r, sqltypes.MakeTestResult( + expectResult(t, r, sqltypes.MakeTestResult( sqltypes.MakeTestFields( "col1|col2|col4|col5", "int64|varchar|int64|varchar", @@ -251,7 +251,7 @@ func TestJoinExecuteNoResult(t *testing.T) { "int64|varchar|int64|varchar", ), ) - expectResult(t, "jn.Execute", r, wantResult) + expectResult(t, r, wantResult) } func TestJoinExecuteErrors(t *testing.T) { @@ -389,7 +389,7 @@ func TestJoinStreamExecute(t *testing.T) { `StreamExecute bv: type:VARCHAR value:"b" false`, `StreamExecute bv: type:VARCHAR value:"c" false`, }) - expectResult(t, "jn.Execute", r, sqltypes.MakeTestResult( + expectResult(t, r, sqltypes.MakeTestResult( sqltypes.MakeTestFields( "col1|col2|col4|col5", "int64|varchar|int64|varchar", @@ -418,7 +418,7 @@ func TestJoinStreamExecute(t *testing.T) { `StreamExecute bv: type:VARCHAR value:"b" false`, `StreamExecute bv: type:VARCHAR value:"c" false`, }) - expectResult(t, "jn.Execute", r, sqltypes.MakeTestResult( + expectResult(t, r, sqltypes.MakeTestResult( sqltypes.MakeTestFields( "col1|col2|col4|col5", "int64|varchar|int64|varchar", @@ -475,7 +475,7 @@ func TestGetFields(t *testing.T) { `GetFields bv: `, `Execute bv: true`, }) - expectResult(t, "jn.Execute", r, sqltypes.MakeTestResult( + expectResult(t, r, sqltypes.MakeTestResult( sqltypes.MakeTestFields( "col1|col2|col4|col5", "int64|varchar|int64|varchar", diff --git a/go/vt/vtgate/engine/route_test.go b/go/vt/vtgate/engine/route_test.go index 274ac58c7d4..54c7b5c6fb4 100644 --- a/go/vt/vtgate/engine/route_test.go +++ b/go/vt/vtgate/engine/route_test.go @@ -74,7 +74,7 @@ func TestSelectUnsharded(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAllShards()`, `ExecuteMultiShard ks.0: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -83,7 +83,7 @@ func TestSelectUnsharded(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAllShards()`, `StreamExecuteMulti dummy_select ks.0: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestInformationSchemaWithTableAndSchemaWithRoutedTables(t *testing.T) { @@ -219,7 +219,7 @@ func TestSelectScatter(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAllShards()`, `ExecuteMultiShard ks.-20: dummy_select {} ks.20-: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -228,7 +228,7 @@ func TestSelectScatter(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAllShards()`, `StreamExecuteMulti dummy_select ks.-20: {} ks.20-: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestSelectEqualUnique(t *testing.T) { @@ -257,7 +257,7 @@ func TestSelectEqualUnique(t *testing.T) { `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(166b40b44aba4bd6)`, `ExecuteMultiShard ks.-20: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -266,7 +266,7 @@ func TestSelectEqualUnique(t *testing.T) { `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationKeyspaceID(166b40b44aba4bd6)`, `StreamExecuteMulti dummy_select ks.-20: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestSelectNone(t *testing.T) { @@ -290,7 +290,7 @@ func TestSelectNone(t *testing.T) { result, err := sel.TryExecute(context.Background(), vc, map[string]*querypb.BindVariable{}, false) require.NoError(t, err) require.Empty(t, vc.log) - expectResult(t, "sel.Execute", result, &sqltypes.Result{}) + expectResult(t, result, &sqltypes.Result{}) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -308,7 +308,7 @@ func TestSelectNone(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `ExecuteMultiShard ks.-20: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, &sqltypes.Result{}) + expectResult(t, result, &sqltypes.Result{}) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -317,7 +317,7 @@ func TestSelectNone(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `StreamExecuteMulti dummy_select ks.-20: {} `, }) - expectResult(t, "sel.StreamExecute", result, &sqltypes.Result{}) + expectResult(t, result, &sqltypes.Result{}) } func TestSelectEqualUniqueScatter(t *testing.T) { @@ -351,7 +351,7 @@ func TestSelectEqualUniqueScatter(t *testing.T) { `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationKeyRange(-)`, `ExecuteMultiShard ks.-20: dummy_select {} ks.20-: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -360,7 +360,7 @@ func TestSelectEqualUniqueScatter(t *testing.T) { `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationKeyRange(-)`, `StreamExecuteMulti dummy_select ks.-20: {} ks.20-: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestSelectEqual(t *testing.T) { @@ -403,7 +403,7 @@ func TestSelectEqual(t *testing.T) { `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationKeyspaceIDs(00,80)`, `ExecuteMultiShard ks.-20: dummy_select {} ks.20-: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -413,7 +413,7 @@ func TestSelectEqual(t *testing.T) { `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationKeyspaceIDs(00,80)`, `StreamExecuteMulti dummy_select ks.-20: {} ks.20-: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestSelectEqualNoRoute(t *testing.T) { @@ -443,7 +443,7 @@ func TestSelectEqualNoRoute(t *testing.T) { `Execute select from, toc from lkp where from in ::from from: type:TUPLE values:{type:INT64 value:"1"} false`, `ResolveDestinations ks [type:INT64 value:"1"] Destinations:DestinationNone()`, }) - expectResult(t, "sel.Execute", result, &sqltypes.Result{}) + expectResult(t, result, &sqltypes.Result{}) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -466,7 +466,7 @@ func TestSelectEqualNoRoute(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `ExecuteMultiShard ks.-20: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, &sqltypes.Result{}) + expectResult(t, result, &sqltypes.Result{}) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -477,7 +477,7 @@ func TestSelectEqualNoRoute(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `StreamExecuteMulti dummy_select ks.-20: {} `, }) - expectResult(t, "sel.StreamExecute", result, &sqltypes.Result{}) + expectResult(t, result, &sqltypes.Result{}) } func TestINUnique(t *testing.T) { @@ -513,7 +513,7 @@ func TestINUnique(t *testing.T) { `ks.20-: dummy_select {__vals: type:TUPLE values:{type:INT64 value:"4"}} ` + `false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -522,7 +522,7 @@ func TestINUnique(t *testing.T) { `ResolveDestinations ks [type:INT64 value:"1" type:INT64 value:"2" type:INT64 value:"4"] Destinations:DestinationKeyspaceID(166b40b44aba4bd6),DestinationKeyspaceID(06e7ea22ce92708f),DestinationKeyspaceID(d2fd8867d50d2dfe)`, `StreamExecuteMulti dummy_select ks.-20: {__vals: type:TUPLE values:{type:INT64 value:"1"} values:{type:INT64 value:"2"}} ks.20-: {__vals: type:TUPLE values:{type:INT64 value:"4"}} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestINNonUnique(t *testing.T) { @@ -579,7 +579,7 @@ func TestINNonUnique(t *testing.T) { `ks.20-: dummy_select {__vals: type:TUPLE values:{type:INT64 value:"1"} values:{type:INT64 value:"4"}} ` + `false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -589,7 +589,7 @@ func TestINNonUnique(t *testing.T) { `ResolveDestinations ks [type:INT64 value:"1" type:INT64 value:"2" type:INT64 value:"4"] Destinations:DestinationKeyspaceIDs(00,80),DestinationKeyspaceIDs(00),DestinationKeyspaceIDs(80)`, `StreamExecuteMulti dummy_select ks.-20: {__vals: type:TUPLE values:{type:INT64 value:"1"} values:{type:INT64 value:"2"}} ks.20-: {__vals: type:TUPLE values:{type:INT64 value:"1"} values:{type:INT64 value:"4"}} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestMultiEqual(t *testing.T) { @@ -623,7 +623,7 @@ func TestMultiEqual(t *testing.T) { `ResolveDestinations ks [type:INT64 value:"1" type:INT64 value:"2" type:INT64 value:"4"] Destinations:DestinationKeyspaceID(166b40b44aba4bd6),DestinationKeyspaceID(06e7ea22ce92708f),DestinationKeyspaceID(d2fd8867d50d2dfe)`, `ExecuteMultiShard ks.-20: dummy_select {} ks.20-: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -632,7 +632,7 @@ func TestMultiEqual(t *testing.T) { `ResolveDestinations ks [type:INT64 value:"1" type:INT64 value:"2" type:INT64 value:"4"] Destinations:DestinationKeyspaceID(166b40b44aba4bd6),DestinationKeyspaceID(06e7ea22ce92708f),DestinationKeyspaceID(d2fd8867d50d2dfe)`, `StreamExecuteMulti dummy_select ks.-20: {} ks.20-: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestSelectLike(t *testing.T) { @@ -670,7 +670,7 @@ func TestSelectLike(t *testing.T) { `ResolveDestinations ks [type:VARCHAR value:"a%"] Destinations:DestinationKeyRange(0c-0d)`, `ExecuteMultiShard ks.-0c80: dummy_select {} ks.0c80-0d: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() @@ -681,7 +681,7 @@ func TestSelectLike(t *testing.T) { `ResolveDestinations ks [type:VARCHAR value:"a%"] Destinations:DestinationKeyRange(0c-0d)`, `StreamExecuteMulti dummy_select ks.-0c80: {} ks.0c80-0d: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() @@ -700,7 +700,7 @@ func TestSelectLike(t *testing.T) { `ResolveDestinations ks [type:VARCHAR value:"ab%"] Destinations:DestinationKeyRange(0c92-0c93)`, `ExecuteMultiShard ks.0c80-0d: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() @@ -711,7 +711,7 @@ func TestSelectLike(t *testing.T) { `ResolveDestinations ks [type:VARCHAR value:"ab%"] Destinations:DestinationKeyRange(0c92-0c93)`, `StreamExecuteMulti dummy_select ks.0c80-0d: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } @@ -736,7 +736,7 @@ func TestSelectNext(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAllShards()`, `ExecuteMultiShard ks.-: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, _ = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -744,7 +744,7 @@ func TestSelectNext(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAllShards()`, `StreamExecuteMulti dummy_select ks.-: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestSelectDBA(t *testing.T) { @@ -768,7 +768,7 @@ func TestSelectDBA(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `ExecuteMultiShard ks.-20: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, _ = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -776,7 +776,7 @@ func TestSelectDBA(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `StreamExecuteMulti dummy_select ks.-20: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestSelectReference(t *testing.T) { @@ -800,7 +800,7 @@ func TestSelectReference(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `ExecuteMultiShard ks.-20: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, _ = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -808,7 +808,7 @@ func TestSelectReference(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `StreamExecuteMulti dummy_select ks.-20: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestRouteGetFields(t *testing.T) { @@ -840,7 +840,7 @@ func TestRouteGetFields(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `ExecuteMultiShard ks.-20: dummy_select_field {} false false`, }) - expectResult(t, "sel.Execute", result, &sqltypes.Result{}) + expectResult(t, result, &sqltypes.Result{}) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, true) @@ -851,7 +851,7 @@ func TestRouteGetFields(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `ExecuteMultiShard ks.-20: dummy_select_field {} false false`, }) - expectResult(t, "sel.StreamExecute", result, &sqltypes.Result{}) + expectResult(t, result, &sqltypes.Result{}) vc.Rewind() // test with special no-routes handling @@ -864,7 +864,7 @@ func TestRouteGetFields(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `ExecuteMultiShard ks.-20: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, &sqltypes.Result{}) + expectResult(t, result, &sqltypes.Result{}) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, true) @@ -875,7 +875,7 @@ func TestRouteGetFields(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAnyShard()`, `StreamExecuteMulti dummy_select ks.-20: {} `, }) - expectResult(t, "sel.StreamExecute", result, &sqltypes.Result{}) + expectResult(t, result, &sqltypes.Result{}) } func TestRouteSort(t *testing.T) { @@ -924,7 +924,7 @@ func TestRouteSort(t *testing.T) { "2", "3", ) - expectResult(t, "sel.Execute", result, wantResult) + expectResult(t, result, wantResult) sel.OrderBy[0].Desc = true vc.Rewind() @@ -940,7 +940,7 @@ func TestRouteSort(t *testing.T) { "1", "1", ) - expectResult(t, "sel.Execute", result, wantResult) + expectResult(t, result, wantResult) vc = &loggingVCursor{ shards: []string{"0"}, @@ -1013,7 +1013,7 @@ func TestRouteSortWeightStrings(t *testing.T) { "g|d", "v|x", ) - expectResult(t, "sel.Execute", result, wantResult) + expectResult(t, result, wantResult) }) t.Run("Descending ordering using weighted strings", func(t *testing.T) { @@ -1032,7 +1032,7 @@ func TestRouteSortWeightStrings(t *testing.T) { "c|t", "a|a", ) - expectResult(t, "sel.Execute", result, wantResult) + expectResult(t, result, wantResult) }) t.Run("Error when no weight string set", func(t *testing.T) { @@ -1118,7 +1118,7 @@ func TestRouteSortCollation(t *testing.T) { "cs", "d", ) - expectResult(t, "sel.Execute", result, wantResult) + expectResult(t, result, wantResult) }) t.Run("Descending ordering using Collation", func(t *testing.T) { @@ -1137,7 +1137,7 @@ func TestRouteSortCollation(t *testing.T) { "c", "c", ) - expectResult(t, "sel.Execute", result, wantResult) + expectResult(t, result, wantResult) }) t.Run("Error when Unknown Collation", func(t *testing.T) { @@ -1239,7 +1239,7 @@ func TestRouteSortTruncate(t *testing.T) { "2", "3", ) - expectResult(t, "sel.Execute", result, wantResult) + expectResult(t, result, wantResult) } func TestRouteStreamTruncate(t *testing.T) { @@ -1281,7 +1281,7 @@ func TestRouteStreamTruncate(t *testing.T) { "1", "2", ) - expectResult(t, "sel.Execute", result, wantResult) + expectResult(t, result, wantResult) } func TestRouteStreamSortTruncate(t *testing.T) { @@ -1330,7 +1330,7 @@ func TestRouteStreamSortTruncate(t *testing.T) { "1", "2", ) - expectResult(t, "sel.Execute", result, wantResult) + expectResult(t, result, wantResult) } func TestParamsFail(t *testing.T) { @@ -1432,7 +1432,7 @@ func TestExecFail(t *testing.T) { `ResolveDestinations ks [] Destinations:DestinationAllShards()`, `ExecuteMultiShard ks.-20: dummy_select {} ks.20-: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() vc.resultErr = sqlerror.NewSQLError(sqlerror.ERQueryInterrupted, "", "query timeout -20") @@ -1474,7 +1474,7 @@ func TestSelectEqualUniqueMultiColumnVindex(t *testing.T) { `ResolveDestinationsMultiCol ks [[INT64(1) INT64(2)]] Destinations:DestinationKeyspaceID(0106e7ea22ce92708f)`, `ExecuteMultiShard ks.-20: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -1483,7 +1483,7 @@ func TestSelectEqualUniqueMultiColumnVindex(t *testing.T) { `ResolveDestinationsMultiCol ks [[INT64(1) INT64(2)]] Destinations:DestinationKeyspaceID(0106e7ea22ce92708f)`, `StreamExecuteMulti dummy_select ks.-20: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestSelectEqualMultiColumnVindex(t *testing.T) { @@ -1511,7 +1511,7 @@ func TestSelectEqualMultiColumnVindex(t *testing.T) { `ResolveDestinationsMultiCol ks [[INT64(32)]] Destinations:DestinationKeyRange(20-21)`, `ExecuteMultiShard ks.-20: dummy_select {} ks.20-: dummy_select {} false false`, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -1520,7 +1520,7 @@ func TestSelectEqualMultiColumnVindex(t *testing.T) { `ResolveDestinationsMultiCol ks [[INT64(32)]] Destinations:DestinationKeyRange(20-21)`, `StreamExecuteMulti dummy_select ks.-20: {} ks.20-: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestINMultiColumnVindex(t *testing.T) { @@ -1557,7 +1557,7 @@ func TestINMultiColumnVindex(t *testing.T) { `ResolveDestinationsMultiCol ks [[INT64(1) INT64(3)] [INT64(1) INT64(4)] [INT64(2) INT64(3)] [INT64(2) INT64(4)]] Destinations:DestinationKeyspaceID(014eb190c9a2fa169c),DestinationKeyspaceID(01d2fd8867d50d2dfe),DestinationKeyspaceID(024eb190c9a2fa169c),DestinationKeyspaceID(02d2fd8867d50d2dfe)`, `ExecuteMultiShard ks.-20: dummy_select {__vals0: type:TUPLE values:{type:INT64 value:"1"} __vals1: type:TUPLE values:{type:INT64 value:"3"}} ks.20-: dummy_select {__vals0: type:TUPLE values:{type:INT64 value:"1"} values:{type:INT64 value:"2"} __vals1: type:TUPLE values:{type:INT64 value:"4"} values:{type:INT64 value:"3"}} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -1566,7 +1566,7 @@ func TestINMultiColumnVindex(t *testing.T) { `ResolveDestinationsMultiCol ks [[INT64(1) INT64(3)] [INT64(1) INT64(4)] [INT64(2) INT64(3)] [INT64(2) INT64(4)]] Destinations:DestinationKeyspaceID(014eb190c9a2fa169c),DestinationKeyspaceID(01d2fd8867d50d2dfe),DestinationKeyspaceID(024eb190c9a2fa169c),DestinationKeyspaceID(02d2fd8867d50d2dfe)`, `StreamExecuteMulti dummy_select ks.-20: {__vals0: type:TUPLE values:{type:INT64 value:"1"} __vals1: type:TUPLE values:{type:INT64 value:"3"}} ks.20-: {__vals0: type:TUPLE values:{type:INT64 value:"1"} values:{type:INT64 value:"2"} __vals1: type:TUPLE values:{type:INT64 value:"4"} values:{type:INT64 value:"3"}} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestINMixedMultiColumnComparision(t *testing.T) { @@ -1600,7 +1600,7 @@ func TestINMixedMultiColumnComparision(t *testing.T) { `ResolveDestinationsMultiCol ks [[INT64(1) INT64(3)] [INT64(1) INT64(4)]] Destinations:DestinationKeyspaceID(014eb190c9a2fa169c),DestinationKeyspaceID(01d2fd8867d50d2dfe)`, `ExecuteMultiShard ks.-20: dummy_select {__vals1: type:TUPLE values:{type:INT64 value:"3"}} ks.20-: dummy_select {__vals1: type:TUPLE values:{type:INT64 value:"4"}} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -1609,7 +1609,7 @@ func TestINMixedMultiColumnComparision(t *testing.T) { `ResolveDestinationsMultiCol ks [[INT64(1) INT64(3)] [INT64(1) INT64(4)]] Destinations:DestinationKeyspaceID(014eb190c9a2fa169c),DestinationKeyspaceID(01d2fd8867d50d2dfe)`, `StreamExecuteMulti dummy_select ks.-20: {__vals1: type:TUPLE values:{type:INT64 value:"3"}} ks.20-: {__vals1: type:TUPLE values:{type:INT64 value:"4"}} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestMultiEqualMultiCol(t *testing.T) { @@ -1643,7 +1643,7 @@ func TestMultiEqualMultiCol(t *testing.T) { `ResolveDestinationsMultiCol ks [[INT64(1) INT64(2)] [INT64(3) INT64(4)]] Destinations:DestinationKeyspaceID(0106e7ea22ce92708f),DestinationKeyspaceID(03d2fd8867d50d2dfe)`, `ExecuteMultiShard ks.-20: dummy_select {} ks.40-: dummy_select {} false false`, }) - expectResult(t, "sel.Execute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) vc.Rewind() result, err = wrapStreamExecute(sel, vc, map[string]*querypb.BindVariable{}, false) @@ -1652,7 +1652,7 @@ func TestMultiEqualMultiCol(t *testing.T) { `ResolveDestinationsMultiCol ks [[INT64(1) INT64(2)] [INT64(3) INT64(4)]] Destinations:DestinationKeyspaceID(0106e7ea22ce92708f),DestinationKeyspaceID(03d2fd8867d50d2dfe)`, `StreamExecuteMulti dummy_select ks.-20: {} ks.40-: {} `, }) - expectResult(t, "sel.StreamExecute", result, defaultSelectResult) + expectResult(t, result, defaultSelectResult) } func TestBuildRowColValues(t *testing.T) { diff --git a/go/vt/vtgate/engine/semi_join_test.go b/go/vt/vtgate/engine/semi_join_test.go index ca89882ab8a..9cf55d4f78f 100644 --- a/go/vt/vtgate/engine/semi_join_test.go +++ b/go/vt/vtgate/engine/semi_join_test.go @@ -152,7 +152,7 @@ func TestSemiJoinStreamExecute(t *testing.T) { `StreamExecute bv: type:VARCHAR value:"c" false`, `StreamExecute bv: type:VARCHAR value:"d" false`, }) - expectResult(t, "jn.Execute", r, sqltypes.MakeTestResult( + expectResult(t, r, sqltypes.MakeTestResult( sqltypes.MakeTestFields( "col1|col2|col3", "int64|varchar|varchar", diff --git a/go/vt/vtgate/engine/simple_projection_test.go b/go/vt/vtgate/engine/simple_projection_test.go index 99d644c93af..6fdc288095c 100644 --- a/go/vt/vtgate/engine/simple_projection_test.go +++ b/go/vt/vtgate/engine/simple_projection_test.go @@ -59,7 +59,7 @@ func TestSubqueryExecute(t *testing.T) { prim.ExpectLog(t, []string{ `Execute a: type:INT64 value:"1" true`, }) - expectResult(t, "sq.Execute", r, sqltypes.MakeTestResult( + expectResult(t, r, sqltypes.MakeTestResult( sqltypes.MakeTestFields( "col1|col3", "int64|varchar", @@ -108,7 +108,7 @@ func TestSubqueryStreamExecute(t *testing.T) { prim.ExpectLog(t, []string{ `StreamExecute a: type:INT64 value:"1" true`, }) - expectResult(t, "sq.Execute", r, sqltypes.MakeTestResult( + expectResult(t, r, sqltypes.MakeTestResult( sqltypes.MakeTestFields( "col1|col3", "int64|varchar", @@ -158,7 +158,7 @@ func TestSubqueryGetFields(t *testing.T) { `GetFields a: type:INT64 value:"1"`, `Execute a: type:INT64 value:"1" true`, }) - expectResult(t, "sq.Execute", r, sqltypes.MakeTestResult( + expectResult(t, r, sqltypes.MakeTestResult( sqltypes.MakeTestFields( "col1|col3", "int64|varchar", diff --git a/go/vt/vtgate/engine/uncorrelated_subquery_test.go b/go/vt/vtgate/engine/uncorrelated_subquery_test.go index 3e80c6369a7..085fe09238f 100644 --- a/go/vt/vtgate/engine/uncorrelated_subquery_test.go +++ b/go/vt/vtgate/engine/uncorrelated_subquery_test.go @@ -65,7 +65,7 @@ func TestPulloutSubqueryValueGood(t *testing.T) { require.NoError(t, err) sfp.ExpectLog(t, []string{`Execute aa: type:INT64 value:"1" false`}) ufp.ExpectLog(t, []string{`Execute aa: type:INT64 value:"1" sq: type:INT64 value:"1" false`}) - expectResult(t, "ps.Execute", result, underlyingResult) + expectResult(t, result, underlyingResult) } func TestPulloutSubqueryValueNone(t *testing.T) { @@ -279,7 +279,7 @@ func TestPulloutSubqueryStream(t *testing.T) { require.NoError(t, err) sfp.ExpectLog(t, []string{`Execute aa: type:INT64 value:"1" false`}) ufp.ExpectLog(t, []string{`StreamExecute aa: type:INT64 value:"1" sq: type:INT64 value:"1" true`}) - expectResult(t, "ps.StreamExecute", result, underlyingResult) + expectResult(t, result, underlyingResult) } func TestPulloutSubqueryGetFields(t *testing.T) { diff --git a/go/vt/vtgate/evalengine/api_coerce.go b/go/vt/vtgate/evalengine/api_coerce.go index 130727d8f31..5e92431e555 100644 --- a/go/vt/vtgate/evalengine/api_coerce.go +++ b/go/vt/vtgate/evalengine/api_coerce.go @@ -19,6 +19,8 @@ package evalengine import ( "vitess.io/vitess/go/mysql/collations" "vitess.io/vitess/go/sqltypes" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" + "vitess.io/vitess/go/vt/vterrors" ) func CoerceTo(value sqltypes.Value, typ sqltypes.Type) (sqltypes.Value, error) { @@ -28,3 +30,69 @@ func CoerceTo(value sqltypes.Value, typ sqltypes.Type) (sqltypes.Value, error) { } return evalToSQLValueWithType(cast, typ), nil } + +// CoerceTypes takes two input types, and decides how they should be coerced before compared +func CoerceTypes(v1, v2 Type) (out Type, err error) { + if v1 == v2 { + return v1, nil + } + if sqltypes.IsNull(v1.Type) || sqltypes.IsNull(v2.Type) { + return Type{Type: sqltypes.Null, Coll: collations.CollationBinaryID, Nullable: true}, nil + } + fail := func() error { + return vterrors.Errorf(vtrpcpb.Code_UNIMPLEMENTED, "types does not support hashcode yet: %v vs %v", v1.Type, v2.Type) + } + + out = Type{Nullable: v1.Nullable || v2.Nullable} + + switch { + case sqltypes.IsTextOrBinary(v1.Type) && sqltypes.IsTextOrBinary(v2.Type): + out.Type = sqltypes.VarChar + mergedCollation, _, _, ferr := mergeCollations(typedCoercionCollation(v1.Type, v1.Coll), typedCoercionCollation(v2.Type, v2.Coll), v1.Type, v2.Type) + if err != nil { + return Type{}, ferr + } + out.Coll = mergedCollation.Collation + return + + case sqltypes.IsDateOrTime(v1.Type): + out.Coll = collations.CollationBinaryID + out.Type = v1.Type + return + + case sqltypes.IsDateOrTime(v2.Type): + out.Coll = collations.CollationBinaryID + out.Type = v2.Type + return + + case sqltypes.IsNumber(v1.Type) || sqltypes.IsNumber(v2.Type): + out.Coll = collations.CollationBinaryID + switch { + case sqltypes.IsTextOrBinary(v1.Type) || sqltypes.IsFloat(v1.Type) || sqltypes.IsDecimal(v1.Type) || + sqltypes.IsTextOrBinary(v2.Type) || sqltypes.IsFloat(v2.Type) || sqltypes.IsDecimal(v2.Type): + out.Type = sqltypes.Float64 + return + case sqltypes.IsSigned(v1.Type): + switch { + case sqltypes.IsUnsigned(v2.Type): + out.Type = sqltypes.Uint64 + return + case sqltypes.IsSigned(v2.Type): + out.Type = sqltypes.Int64 + return + default: + return Type{}, fail() + } + case sqltypes.IsUnsigned(v1.Type): + switch { + case sqltypes.IsSigned(v2.Type) || sqltypes.IsUnsigned(v2.Type): + out.Type = sqltypes.Uint64 + return + default: + return Type{}, fail() + } + } + } + + return Type{}, fail() +} diff --git a/go/vt/vtgate/evalengine/api_hash_test.go b/go/vt/vtgate/evalengine/api_hash_test.go index 832a1ed3b88..0add16de89d 100644 --- a/go/vt/vtgate/evalengine/api_hash_test.go +++ b/go/vt/vtgate/evalengine/api_hash_test.go @@ -24,13 +24,11 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "vitess.io/vitess/go/mysql/collations" + "vitess.io/vitess/go/sqltypes" vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/vterrors" - "vitess.io/vitess/go/vt/vthash" - - "vitess.io/vitess/go/mysql/collations" - "vitess.io/vitess/go/sqltypes" ) func TestHashCodes(t *testing.T) { @@ -197,7 +195,7 @@ func coerceTo(v1, v2 sqltypes.Type) (sqltypes.Type, error) { if sqltypes.IsNull(v1) || sqltypes.IsNull(v2) { return sqltypes.Null, nil } - if (sqltypes.IsText(v1) || sqltypes.IsBinary(v1)) && (sqltypes.IsText(v2) || sqltypes.IsBinary(v2)) { + if (sqltypes.IsTextOrBinary(v1)) && (sqltypes.IsTextOrBinary(v2)) { return sqltypes.VarChar, nil } if sqltypes.IsDateOrTime(v1) { @@ -209,7 +207,7 @@ func coerceTo(v1, v2 sqltypes.Type) (sqltypes.Type, error) { if sqltypes.IsNumber(v1) || sqltypes.IsNumber(v2) { switch { - case sqltypes.IsText(v1) || sqltypes.IsBinary(v1) || sqltypes.IsText(v2) || sqltypes.IsBinary(v2): + case sqltypes.IsTextOrBinary(v1) || sqltypes.IsTextOrBinary(v2): return sqltypes.Float64, nil case sqltypes.IsFloat(v2) || v2 == sqltypes.Decimal || sqltypes.IsFloat(v1) || v1 == sqltypes.Decimal: return sqltypes.Float64, nil diff --git a/go/vt/vtgate/evalengine/collation.go b/go/vt/vtgate/evalengine/collation.go index 7cb341f52b0..b4e589c9724 100644 --- a/go/vt/vtgate/evalengine/collation.go +++ b/go/vt/vtgate/evalengine/collation.go @@ -59,8 +59,8 @@ func mergeCollations(c1, c2 collations.TypedCollation, t1, t2 sqltypes.Type) (co return c1, nil, nil, nil } - lt := sqltypes.IsText(t1) || sqltypes.IsBinary(t1) - rt := sqltypes.IsText(t2) || sqltypes.IsBinary(t2) + lt := sqltypes.IsTextOrBinary(t1) + rt := sqltypes.IsTextOrBinary(t2) if !lt || !rt { if lt { return c1, nil, nil, nil diff --git a/go/vt/vtgate/evalengine/compiler.go b/go/vt/vtgate/evalengine/compiler.go index 21a25ad3163..1c2feeb5f15 100644 --- a/go/vt/vtgate/evalengine/compiler.go +++ b/go/vt/vtgate/evalengine/compiler.go @@ -67,7 +67,7 @@ func (ct ctype) nullable() bool { } func (ct ctype) isTextual() bool { - return sqltypes.IsText(ct.Type) || sqltypes.IsBinary(ct.Type) + return sqltypes.IsTextOrBinary(ct.Type) } func (ct ctype) isHexOrBitLiteral() bool { diff --git a/go/vt/vtgate/evalengine/eval.go b/go/vt/vtgate/evalengine/eval.go index e327b9d5651..82f1ec688c7 100644 --- a/go/vt/vtgate/evalengine/eval.go +++ b/go/vt/vtgate/evalengine/eval.go @@ -312,7 +312,7 @@ func valueToEvalCast(v sqltypes.Value, typ sqltypes.Type, collation collations.I return newEvalUint64(uint64(i.i)), nil } - case sqltypes.IsText(typ) || sqltypes.IsBinary(typ): + case sqltypes.IsTextOrBinary(typ): switch { case v.IsText() || v.IsBinary(): return newEvalRaw(v.Type(), v.Raw(), typedCoercionCollation(v.Type(), collation)), nil diff --git a/go/vt/vtgate/evalengine/expr_compare.go b/go/vt/vtgate/evalengine/expr_compare.go index 6639bb7f7e2..90c2d313b07 100644 --- a/go/vt/vtgate/evalengine/expr_compare.go +++ b/go/vt/vtgate/evalengine/expr_compare.go @@ -114,7 +114,7 @@ func (compareNullSafeEQ) compare(left, right eval) (boolean, error) { } func typeIsTextual(tt sqltypes.Type) bool { - return sqltypes.IsText(tt) || sqltypes.IsBinary(tt) || tt == sqltypes.Time + return sqltypes.IsTextOrBinary(tt) || tt == sqltypes.Time } func compareAsStrings(l, r sqltypes.Type) bool { diff --git a/go/vt/vtgate/planbuilder/join.go b/go/vt/vtgate/planbuilder/join.go index 02027a8b49e..462b45fa00a 100644 --- a/go/vt/vtgate/planbuilder/join.go +++ b/go/vt/vtgate/planbuilder/join.go @@ -55,3 +55,16 @@ func (j *join) Primitive() engine.Primitive { Opcode: j.Opcode, } } + +type hashJoin struct { + lhs, rhs logicalPlan + inner *engine.HashJoin +} + +func (hj *hashJoin) Primitive() engine.Primitive { + lhs := hj.lhs.Primitive() + rhs := hj.rhs.Primitive() + hj.inner.Left = lhs + hj.inner.Right = rhs + return hj.inner +} diff --git a/go/vt/vtgate/planbuilder/operator_transformers.go b/go/vt/vtgate/planbuilder/operator_transformers.go index 5f59a96000a..7d3223a48e9 100644 --- a/go/vt/vtgate/planbuilder/operator_transformers.go +++ b/go/vt/vtgate/planbuilder/operator_transformers.go @@ -68,6 +68,8 @@ func transformToLogicalPlan(ctx *plancontext.PlanningContext, op ops.Operator) ( return transformFkVerify(ctx, op) case *operators.InsertSelection: return transformInsertionSelection(ctx, op) + case *operators.HashJoin: + return transformHashJoin(ctx, op) case *operators.Sequential: return transformSequential(ctx, op) } @@ -810,3 +812,58 @@ func createLimit(input logicalPlan, limit *sqlparser.Limit) (logicalPlan, error) return plan, nil } + +func transformHashJoin(ctx *plancontext.PlanningContext, op *operators.HashJoin) (logicalPlan, error) { + lhs, err := transformToLogicalPlan(ctx, op.LHS) + if err != nil { + return nil, err + } + rhs, err := transformToLogicalPlan(ctx, op.RHS) + if err != nil { + return nil, err + } + + if len(op.LHSKeys) != 1 { + return nil, vterrors.VT12001("hash joins must have exactly one join predicate") + } + + joinOp := engine.InnerJoin + if op.LeftJoin { + joinOp = engine.LeftJoin + } + + var missingTypes []string + + ltyp, found := ctx.SemTable.TypeForExpr(op.JoinComparisons[0].LHS) + if !found { + missingTypes = append(missingTypes, sqlparser.String(op.JoinComparisons[0].LHS)) + } + rtyp, found := ctx.SemTable.TypeForExpr(op.JoinComparisons[0].RHS) + if !found { + missingTypes = append(missingTypes, sqlparser.String(op.JoinComparisons[0].RHS)) + } + + if len(missingTypes) > 0 { + return nil, vterrors.VT12001( + fmt.Sprintf("missing type information for [%s]", strings.Join(missingTypes, ", "))) + } + + comparisonType, err := evalengine.CoerceTypes(ltyp, rtyp) + if err != nil { + return nil, err + } + + return &hashJoin{ + lhs: lhs, + rhs: rhs, + inner: &engine.HashJoin{ + Opcode: joinOp, + Cols: op.ColumnOffsets, + LHSKey: op.LHSKeys[0], + RHSKey: op.RHSKeys[0], + ASTPred: op.JoinPredicate(), + Collation: comparisonType.Coll, + ComparisonType: comparisonType.Type, + }, + }, nil +} diff --git a/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go b/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go index 0127e81b4c4..edba5c51256 100644 --- a/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go +++ b/go/vt/vtgate/planbuilder/operators/aggregation_pushing.go @@ -116,12 +116,12 @@ func pushAggregationThroughSubquery( src.Outer = pushedAggr if !rootAggr.Original { - return src, rewrite.NewTree("push Aggregation under subquery - keep original", rootAggr), nil + return src, rewrite.NewTree("push Aggregation under subquery - keep original"), nil } rootAggr.aggregateTheAggregates() - return rootAggr, rewrite.NewTree("push Aggregation under subquery", rootAggr), nil + return rootAggr, rewrite.NewTree("push Aggregation under subquery"), nil } func (a *Aggregator) aggregateTheAggregates() { @@ -161,10 +161,10 @@ func pushAggregationThroughRoute( if !aggregator.Original { // we only keep the root aggregation, if this aggregator was created // by splitting one and pushing under a join, we can get rid of this one - return aggregator.Source, rewrite.NewTree("push aggregation under route - remove original", aggregator), nil + return aggregator.Source, rewrite.NewTree("push aggregation under route - remove original"), nil } - return aggregator, rewrite.NewTree("push aggregation under route - keep original", aggregator), nil + return aggregator, rewrite.NewTree("push aggregation under route - keep original"), nil } // pushAggregations splits aggregations between the original aggregator and the one we are pushing down @@ -264,10 +264,10 @@ withNextColumn: if !aggregator.Original { // we only keep the root aggregation, if this aggregator was created // by splitting one and pushing under a join, we can get rid of this one - return aggregator.Source, rewrite.NewTree("push aggregation under filter - remove original", aggregator), nil + return aggregator.Source, rewrite.NewTree("push aggregation under filter - remove original"), nil } aggregator.aggregateTheAggregates() - return aggregator, rewrite.NewTree("push aggregation under filter - keep original", aggregator), nil + return aggregator, rewrite.NewTree("push aggregation under filter - keep original"), nil } func collectColNamesNeeded(ctx *plancontext.PlanningContext, f *Filter) (columnsNeeded []*sqlparser.ColName) { @@ -411,12 +411,12 @@ func pushAggregationThroughJoin(ctx *plancontext.PlanningContext, rootAggr *Aggr if !rootAggr.Original { // we only keep the root aggregation, if this aggregator was created // by splitting one and pushing under a join, we can get rid of this one - return output, rewrite.NewTree("push Aggregation under join - keep original", rootAggr), nil + return output, rewrite.NewTree("push Aggregation under join - keep original"), nil } rootAggr.aggregateTheAggregates() rootAggr.Source = output - return rootAggr, rewrite.NewTree("push Aggregation under join", rootAggr), nil + return rootAggr, rewrite.NewTree("push Aggregation under join"), nil } var errAbortAggrPushing = fmt.Errorf("abort aggregation pushing") @@ -473,7 +473,7 @@ func splitGroupingToLeftAndRight(ctx *plancontext.PlanningContext, rootAggr *Agg RHSExpr: expr, }) case deps.IsSolvedBy(lhs.tableID.Merge(rhs.tableID)): - jc, err := BreakExpressionInLHSandRHS(ctx, groupBy.SimplifiedExpr, lhs.tableID) + jc, err := breakExpressionInLHSandRHSForApplyJoin(ctx, groupBy.SimplifiedExpr, lhs.tableID) if err != nil { return nil, err } @@ -877,5 +877,5 @@ func splitAvgAggregations(ctx *plancontext.PlanningContext, aggr *Aggregator) (o aggr.Columns = append(aggr.Columns, columns...) aggr.Aggregations = append(aggr.Aggregations, aggregations...) - return proj, rewrite.NewTree("split avg aggregation", proj), nil + return proj, rewrite.NewTree("split avg aggregation"), nil } diff --git a/go/vt/vtgate/planbuilder/operators/aggregator.go b/go/vt/vtgate/planbuilder/operators/aggregator.go index 33846f83365..685a418339a 100644 --- a/go/vt/vtgate/planbuilder/operators/aggregator.go +++ b/go/vt/vtgate/planbuilder/operators/aggregator.go @@ -259,16 +259,16 @@ func (a *Aggregator) GetOrdering(ctx *plancontext.PlanningContext) []ops.OrderBy return a.Source.GetOrdering(ctx) } -func (a *Aggregator) planOffsets(ctx *plancontext.PlanningContext) { +func (a *Aggregator) planOffsets(ctx *plancontext.PlanningContext) ops.Operator { if a.offsetPlanned { - return + return nil } defer func() { a.offsetPlanned = true }() if !a.Pushed { a.planOffsetsNotPushed(ctx) - return + return nil } for idx, gb := range a.Grouping { @@ -291,6 +291,7 @@ func (a *Aggregator) planOffsets(ctx *plancontext.PlanningContext) { offset := a.internalAddColumn(ctx, aeWrap(weightStringFor(aggr.Func.GetArg())), true) a.Aggregations[idx].WSOffset = offset } + return nil } func (aggr Aggr) getPushColumn() sqlparser.Expr { diff --git a/go/vt/vtgate/planbuilder/operators/apply_join.go b/go/vt/vtgate/planbuilder/operators/apply_join.go index 138c17f2da7..95d7d962738 100644 --- a/go/vt/vtgate/planbuilder/operators/apply_join.go +++ b/go/vt/vtgate/planbuilder/operators/apply_join.go @@ -148,18 +148,16 @@ func (aj *ApplyJoin) IsInner() bool { return !aj.LeftJoin } -func (aj *ApplyJoin) AddJoinPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) error { +func (aj *ApplyJoin) AddJoinPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) { aj.Predicate = ctx.SemTable.AndExpressions(expr, aj.Predicate) - col, err := BreakExpressionInLHSandRHS(ctx, expr, TableID(aj.LHS)) + col, err := breakExpressionInLHSandRHSForApplyJoin(ctx, expr, TableID(aj.LHS)) if err != nil { - return err + panic(err) } aj.JoinPredicates = append(aj.JoinPredicates, col) rhs := aj.RHS.AddPredicate(ctx, col.RHSExpr) aj.RHS = rhs - - return nil } func (aj *ApplyJoin) pushColRight(ctx *plancontext.PlanningContext, e *sqlparser.AliasedExpr, addToGroupBy bool) (int, error) { @@ -203,7 +201,7 @@ func (aj *ApplyJoin) getJoinColumnFor(ctx *plancontext.PlanningContext, orig *sq case deps.IsSolvedBy(rhs): col.RHSExpr = e case deps.IsSolvedBy(both): - col, err = BreakExpressionInLHSandRHS(ctx, e, TableID(aj.LHS)) + col, err = breakExpressionInLHSandRHSForApplyJoin(ctx, e, TableID(aj.LHS)) if err != nil { return JoinColumn{}, err } @@ -243,7 +241,7 @@ func (aj *ApplyJoin) AddColumn( return offset } -func (aj *ApplyJoin) planOffsets(ctx *plancontext.PlanningContext) { +func (aj *ApplyJoin) planOffsets(ctx *plancontext.PlanningContext) ops.Operator { for _, col := range aj.JoinColumns { // Read the type description for JoinColumn to understand the following code for _, lhsExpr := range col.LHSExprs { @@ -272,6 +270,8 @@ func (aj *ApplyJoin) planOffsets(ctx *plancontext.PlanningContext) { offset := aj.LHS.AddColumn(ctx, true, false, aeWrap(lhsExpr.Expr)) aj.Vars[lhsExpr.Name] = offset } + + return nil } func (aj *ApplyJoin) addOffset(offset int) { diff --git a/go/vt/vtgate/planbuilder/operators/ast_to_op.go b/go/vt/vtgate/planbuilder/operators/ast_to_op.go index 64d9826a80e..46286b2778f 100644 --- a/go/vt/vtgate/planbuilder/operators/ast_to_op.go +++ b/go/vt/vtgate/planbuilder/operators/ast_to_op.go @@ -165,7 +165,7 @@ func (jpc *joinPredicateCollector) inspectPredicate( // then we can use this predicate to connect the subquery to the outer query if !deps.IsSolvedBy(jpc.subqID) && deps.IsSolvedBy(jpc.totalID) { jpc.predicates = append(jpc.predicates, predicate) - jc, err := BreakExpressionInLHSandRHS(ctx, predicate, jpc.outerID) + jc, err := breakExpressionInLHSandRHSForApplyJoin(ctx, predicate, jpc.outerID) if err != nil { return err } diff --git a/go/vt/vtgate/planbuilder/operators/distinct.go b/go/vt/vtgate/planbuilder/operators/distinct.go index 88503514615..d7aad08d206 100644 --- a/go/vt/vtgate/planbuilder/operators/distinct.go +++ b/go/vt/vtgate/planbuilder/operators/distinct.go @@ -46,7 +46,7 @@ type ( } ) -func (d *Distinct) planOffsets(ctx *plancontext.PlanningContext) { +func (d *Distinct) planOffsets(ctx *plancontext.PlanningContext) ops.Operator { columns := d.GetColumns(ctx) for idx, col := range columns { e, err := d.QP.GetSimplifiedExpr(ctx, col.Expr) @@ -68,6 +68,7 @@ func (d *Distinct) planOffsets(ctx *plancontext.PlanningContext) { Type: typ, }) } + return nil } func (d *Distinct) Clone(inputs []ops.Operator) ops.Operator { diff --git a/go/vt/vtgate/planbuilder/operators/expressions.go b/go/vt/vtgate/planbuilder/operators/expressions.go index 7ab27e787e8..0df875a6fbd 100644 --- a/go/vt/vtgate/planbuilder/operators/expressions.go +++ b/go/vt/vtgate/planbuilder/operators/expressions.go @@ -22,9 +22,9 @@ import ( "vitess.io/vitess/go/vt/vtgate/semantics" ) -// BreakExpressionInLHSandRHS takes an expression and +// breakExpressionInLHSandRHSForApplyJoin takes an expression and // extracts the parts that are coming from one of the sides into `ColName`s that are needed -func BreakExpressionInLHSandRHS( +func breakExpressionInLHSandRHSForApplyJoin( ctx *plancontext.PlanningContext, expr sqlparser.Expr, lhs semantics.TableSet, diff --git a/go/vt/vtgate/planbuilder/operators/filter.go b/go/vt/vtgate/planbuilder/operators/filter.go index ed43910b75d..cee57c74943 100644 --- a/go/vt/vtgate/planbuilder/operators/filter.go +++ b/go/vt/vtgate/planbuilder/operators/filter.go @@ -107,7 +107,7 @@ func (f *Filter) GetOrdering(ctx *plancontext.PlanningContext) []ops.OrderBy { func (f *Filter) Compact(*plancontext.PlanningContext) (ops.Operator, *rewrite.ApplyResult, error) { if len(f.Predicates) == 0 { - return f.Source, rewrite.NewTree("filter with no predicates removed", f), nil + return f.Source, rewrite.NewTree("filter with no predicates removed"), nil } other, isFilter := f.Source.(*Filter) @@ -116,10 +116,10 @@ func (f *Filter) Compact(*plancontext.PlanningContext) (ops.Operator, *rewrite.A } f.Source = other.Source f.Predicates = append(f.Predicates, other.Predicates...) - return f, rewrite.NewTree("two filters merged into one", f), nil + return f, rewrite.NewTree("two filters merged into one"), nil } -func (f *Filter) planOffsets(ctx *plancontext.PlanningContext) { +func (f *Filter) planOffsets(ctx *plancontext.PlanningContext) ops.Operator { cfg := &evalengine.Config{ ResolveType: ctx.SemTable.TypeForExpr, Collation: ctx.SemTable.Collation, @@ -136,6 +136,7 @@ func (f *Filter) planOffsets(ctx *plancontext.PlanningContext) { } f.PredicateWithOffsets = eexpr + return nil } func (f *Filter) ShortDescription() string { diff --git a/go/vt/vtgate/planbuilder/operators/hash_join.go b/go/vt/vtgate/planbuilder/operators/hash_join.go new file mode 100644 index 00000000000..e9cfeb7d107 --- /dev/null +++ b/go/vt/vtgate/planbuilder/operators/hash_join.go @@ -0,0 +1,327 @@ +/* +Copyright 2023 The Vitess Authors. + +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 operators + +import ( + "fmt" + "slices" + "strings" + + "vitess.io/vitess/go/slice" + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vterrors" + "vitess.io/vitess/go/vt/vtgate/evalengine" + "vitess.io/vitess/go/vt/vtgate/planbuilder/operators/ops" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/vtgate/semantics" +) + +type ( + HashJoin struct { + LHS, RHS ops.Operator + + // LeftJoin will be true in the case of an outer join + LeftJoin bool + + // Before offset planning + JoinComparisons []Comparison + + // These columns are the output columns of the hash join. While in operator mode we keep track of complex expression, + // but once we move to the engine primitives, the hash join only passes through column from either left or right. + // anything more complex will be solved by a projection on top of the hash join + columns []sqlparser.Expr + + // After offset planning + + // Columns stores the column indexes of the columns coming from the left and right side + // negative value comes from LHS and positive from RHS + ColumnOffsets []int + + // These are the values that will be hashed together + LHSKeys, RHSKeys []int + + offset bool + } + + Comparison struct { + LHS, RHS sqlparser.Expr + } +) + +var _ ops.Operator = (*HashJoin)(nil) +var _ JoinOp = (*HashJoin)(nil) + +func NewHashJoin(lhs, rhs ops.Operator, outerJoin bool) *HashJoin { + hj := &HashJoin{ + LHS: lhs, + RHS: rhs, + LeftJoin: outerJoin, + } + return hj +} + +func (hj *HashJoin) Clone(inputs []ops.Operator) ops.Operator { + kopy := *hj + kopy.LHS, kopy.RHS = inputs[0], inputs[1] + kopy.columns = slices.Clone(hj.columns) + kopy.LHSKeys = slices.Clone(hj.LHSKeys) + kopy.RHSKeys = slices.Clone(hj.RHSKeys) + return &kopy +} + +func (hj *HashJoin) Inputs() []ops.Operator { + return []ops.Operator{hj.LHS, hj.RHS} +} + +func (hj *HashJoin) SetInputs(operators []ops.Operator) { + hj.LHS, hj.RHS = operators[0], operators[1] +} + +func (hj *HashJoin) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) ops.Operator { + return AddPredicate(ctx, hj, expr, false, newFilter) +} + +func (hj *HashJoin) AddColumn(ctx *plancontext.PlanningContext, reuseExisting bool, addToGroupBy bool, expr *sqlparser.AliasedExpr) int { + if reuseExisting { + offset := hj.FindCol(ctx, expr.Expr, false) + if offset >= 0 { + return offset + } + } + + hj.columns = append(hj.columns, expr.Expr) + return len(hj.columns) - 1 +} + +func (hj *HashJoin) planOffsets(ctx *plancontext.PlanningContext) ops.Operator { + if hj.offset { + return nil + } + hj.offset = true + for _, cmp := range hj.JoinComparisons { + lOffset := hj.LHS.AddColumn(ctx, true, false, aeWrap(cmp.LHS)) + hj.LHSKeys = append(hj.LHSKeys, lOffset) + rOffset := hj.RHS.AddColumn(ctx, true, false, aeWrap(cmp.RHS)) + hj.RHSKeys = append(hj.RHSKeys, rOffset) + } + + eexprs := slice.Map(hj.columns, func(in sqlparser.Expr) *ProjExpr { + return hj.addColumn(ctx, in) + }) + + proj := newAliasedProjection(hj) + _, err := proj.addProjExpr(eexprs...) + if err != nil { + panic(err) + } + + return proj +} + +func (hj *HashJoin) FindCol(ctx *plancontext.PlanningContext, expr sqlparser.Expr, underRoute bool) int { + for offset, col := range hj.columns { + if ctx.SemTable.EqualsExprWithDeps(expr, col) { + return offset + } + } + return -1 +} + +func (hj *HashJoin) GetColumns(*plancontext.PlanningContext) []*sqlparser.AliasedExpr { + return slice.Map(hj.columns, aeWrap) +} + +func (hj *HashJoin) GetSelectExprs(ctx *plancontext.PlanningContext) sqlparser.SelectExprs { + return transformColumnsToSelectExprs(ctx, hj) +} + +func (hj *HashJoin) ShortDescription() string { + comparisons := slice.Map(hj.JoinComparisons, func(from Comparison) string { + return from.String() + }) + cmp := strings.Join(comparisons, " AND ") + + if len(hj.columns) > 0 { + return fmt.Sprintf("%s columns %v", cmp, hj.columns) + } + + return cmp +} + +func (hj *HashJoin) GetOrdering(ctx *plancontext.PlanningContext) []ops.OrderBy { + return nil // hash joins will never promise an output order +} + +func (hj *HashJoin) GetLHS() ops.Operator { + return hj.LHS +} + +func (hj *HashJoin) GetRHS() ops.Operator { + return hj.RHS +} + +func (hj *HashJoin) SetLHS(op ops.Operator) { + hj.LHS = op +} + +func (hj *HashJoin) SetRHS(op ops.Operator) { + hj.RHS = op +} + +func (hj *HashJoin) MakeInner() { + hj.LeftJoin = false +} + +func (hj *HashJoin) IsInner() bool { + return !hj.LeftJoin +} + +func (hj *HashJoin) AddJoinPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) { + cmp, ok := expr.(*sqlparser.ComparisonExpr) + if !ok || !canBeSolvedWithHashJoin(cmp.Operator) { + panic(vterrors.VT12001(fmt.Sprintf("can't use [%s] with hash joins", sqlparser.String(expr)))) + } + lExpr := cmp.Left + lDeps := ctx.SemTable.RecursiveDeps(lExpr) + rExpr := cmp.Right + rDeps := ctx.SemTable.RecursiveDeps(rExpr) + lID := TableID(hj.LHS) + rID := TableID(hj.RHS) + if !lDeps.IsSolvedBy(lID) || !rDeps.IsSolvedBy(rID) { + // we'll switch and see if things work out then + lExpr, rExpr = rExpr, lExpr + lDeps, rDeps = rDeps, lDeps + } + + if !lDeps.IsSolvedBy(lID) || !rDeps.IsSolvedBy(rID) { + panic(vterrors.VT12001(fmt.Sprintf("can't use [%s] with hash joins", sqlparser.String(expr)))) + } + + hj.JoinComparisons = append(hj.JoinComparisons, Comparison{ + LHS: lExpr, + RHS: rExpr, + }) +} + +func canBeSolvedWithHashJoin(op sqlparser.ComparisonExprOperator) bool { + switch op { + case sqlparser.EqualOp, sqlparser.NullSafeEqualOp: + return true + default: + return false + } +} + +func (c Comparison) String() string { + return sqlparser.String(c.LHS) + " = " + sqlparser.String(c.RHS) +} + +func (hj *HashJoin) addColumn(ctx *plancontext.PlanningContext, in sqlparser.Expr) *ProjExpr { + lId, rId := TableID(hj.LHS), TableID(hj.RHS) + var replaceExpr sqlparser.Expr // this is the expression we will put in instead of whatever we find there + pre := func(node, parent sqlparser.SQLNode) bool { + expr, ok := node.(sqlparser.Expr) + if !ok { + return true + } + deps := ctx.SemTable.RecursiveDeps(expr) + check := func(id semantics.TableSet, op ops.Operator, offsetter func(int) int) int { + if !deps.IsSolvedBy(id) { + return -1 + } + inOffset := op.FindCol(ctx, expr, false) + if inOffset == -1 { + if !fetchByOffset(expr) { + return -1 + } + + // aha! this is an expression that we have to get from the input. let's force it in there + inOffset = op.AddColumn(ctx, false, false, aeWrap(expr)) + } + + // we turn the + internalOffset := offsetter(inOffset) + + // ok, we have an offset from the input operator. Let's check if we already have it + // in our list of incoming columns + + for idx, offset := range hj.ColumnOffsets { + if internalOffset == offset { + return idx + } + } + + hj.ColumnOffsets = append(hj.ColumnOffsets, internalOffset) + + return len(hj.ColumnOffsets) - 1 + } + + f := func(i int) int { return (i * -1) - 1 } + if lOffset := check(lId, hj.LHS, f); lOffset >= 0 { + replaceExpr = sqlparser.NewOffset(lOffset, expr) + return false // we want to stop going down the expression tree and start coming back up again + } + + f = func(i int) int { return i + 1 } + if rOffset := check(rId, hj.RHS, f); rOffset >= 0 { + replaceExpr = sqlparser.NewOffset(rOffset, expr) + return false + } + + return true + } + + post := func(cursor *sqlparser.CopyOnWriteCursor) { + if replaceExpr != nil { + node := cursor.Node() + _, ok := node.(sqlparser.Expr) + if !ok { + panic(fmt.Sprintf("can't replace this node with an expression: %s", sqlparser.String(node))) + } + cursor.Replace(replaceExpr) + replaceExpr = nil + } + } + + rewrittenExpr := sqlparser.CopyOnRewrite(in, pre, post, ctx.SemTable.CopySemanticInfo).(sqlparser.Expr) + cfg := &evalengine.Config{ + ResolveType: ctx.SemTable.TypeForExpr, + Collation: ctx.SemTable.Collation, + } + eexpr, err := evalengine.Translate(rewrittenExpr, cfg) + if err != nil { + panic(err) + } + + return &ProjExpr{ + Original: aeWrap(in), + EvalExpr: rewrittenExpr, + ColExpr: rewrittenExpr, + Info: &EvalEngine{EExpr: eexpr}, + } +} + +// JoinPredicate produces an AST representation of the join condition this join has +func (hj *HashJoin) JoinPredicate() sqlparser.Expr { + exprs := slice.Map(hj.JoinComparisons, func(from Comparison) sqlparser.Expr { + return &sqlparser.ComparisonExpr{ + Left: from.LHS, + Right: from.RHS, + } + }) + return sqlparser.AndExpressions(exprs...) +} diff --git a/go/vt/vtgate/planbuilder/operators/hash_join_test.go b/go/vt/vtgate/planbuilder/operators/hash_join_test.go new file mode 100644 index 00000000000..69f21bd4b78 --- /dev/null +++ b/go/vt/vtgate/planbuilder/operators/hash_join_test.go @@ -0,0 +1,100 @@ +/* +Copyright 2023 The Vitess Authors. + +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 operators + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/vtgate/semantics" +) + +func TestJoinPredicates(t *testing.T) { + lcol := sqlparser.NewColName("lhs") + rcol := sqlparser.NewColName("rhs") + ctx := &plancontext.PlanningContext{SemTable: semantics.EmptySemTable()} + lid := semantics.SingleTableSet(0) + rid := semantics.SingleTableSet(1) + ctx.SemTable.Recursive[lcol] = lid + ctx.SemTable.Recursive[rcol] = rid + lhs := &fakeOp{id: lid} + rhs := &fakeOp{id: rid} + hj := &HashJoin{ + LHS: lhs, + RHS: rhs, + LeftJoin: false, + } + + cmp := &sqlparser.ComparisonExpr{ + Operator: sqlparser.EqualOp, + Left: lcol, + Right: rcol, + } + hj.AddJoinPredicate(ctx, cmp) + require.Len(t, hj.JoinComparisons, 1) + hj.planOffsets(ctx) + require.Len(t, hj.LHSKeys, 1) + require.Len(t, hj.RHSKeys, 1) +} + +func TestOffsetPlanning(t *testing.T) { + lcol1, lcol2 := sqlparser.NewColName("lhs1"), sqlparser.NewColName("lhs2") + rcol1, rcol2 := sqlparser.NewColName("rhs1"), sqlparser.NewColName("rhs2") + ctx := &plancontext.PlanningContext{SemTable: semantics.EmptySemTable()} + lid := semantics.SingleTableSet(0) + rid := semantics.SingleTableSet(1) + ctx.SemTable.Recursive[lcol1] = lid + ctx.SemTable.Recursive[lcol2] = lid + ctx.SemTable.Recursive[rcol1] = rid + ctx.SemTable.Recursive[rcol2] = rid + lhs := &fakeOp{id: lid} + rhs := &fakeOp{id: rid} + + tests := []struct { + expr sqlparser.Expr + expectedColOffsets []int + }{{ + expr: lcol1, + expectedColOffsets: []int{-1}, + }, { + expr: rcol1, + expectedColOffsets: []int{1}, + }, { + expr: sqlparser.AndExpressions(lcol1, lcol2), + expectedColOffsets: []int{-1, -2}, + }, { + expr: sqlparser.AndExpressions(lcol1, rcol1, lcol2, rcol2), + expectedColOffsets: []int{-1, 1, -2, 2}, + }} + + for _, test := range tests { + t.Run(sqlparser.String(test.expr), func(t *testing.T) { + hj := &HashJoin{ + LHS: lhs, + RHS: rhs, + LeftJoin: false, + } + hj.AddColumn(ctx, true, false, aeWrap(test.expr)) + hj.planOffsets(ctx) + assert.Equal(t, test.expectedColOffsets, hj.ColumnOffsets) + }) + } +} diff --git a/go/vt/vtgate/planbuilder/operators/horizon_expanding.go b/go/vt/vtgate/planbuilder/operators/horizon_expanding.go index 7ec141a1b8b..06bcf2aaeb5 100644 --- a/go/vt/vtgate/planbuilder/operators/horizon_expanding.go +++ b/go/vt/vtgate/planbuilder/operators/horizon_expanding.go @@ -72,10 +72,10 @@ func expandUnionHorizon(ctx *plancontext.PlanningContext, horizon *Horizon, unio } if op == horizon.Source { - return op, rewrite.NewTree("removed UNION horizon not used", op), nil + return op, rewrite.NewTree("removed UNION horizon not used"), nil } - return op, rewrite.NewTree("expand UNION horizon into smaller components", op), nil + return op, rewrite.NewTree("expand UNION horizon into smaller components"), nil } func expandSelectHorizon(ctx *plancontext.PlanningContext, horizon *Horizon, sel *sqlparser.Select) (ops.Operator, *rewrite.ApplyResult, error) { @@ -126,7 +126,7 @@ func expandSelectHorizon(ctx *plancontext.PlanningContext, horizon *Horizon, sel extracted = append(extracted, "Limit") } - return op, rewrite.NewTree(fmt.Sprintf("expand SELECT horizon into (%s)", strings.Join(extracted, ", ")), op), nil + return op, rewrite.NewTree(fmt.Sprintf("expand SELECT horizon into (%s)", strings.Join(extracted, ", "))), nil } func createProjectionFromSelect(ctx *plancontext.PlanningContext, horizon *Horizon) (out ops.Operator) { diff --git a/go/vt/vtgate/planbuilder/operators/join.go b/go/vt/vtgate/planbuilder/operators/join.go index 828b15f5b79..1d50a688df4 100644 --- a/go/vt/vtgate/planbuilder/operators/join.go +++ b/go/vt/vtgate/planbuilder/operators/join.go @@ -82,7 +82,7 @@ func (j *Join) Compact(ctx *plancontext.PlanningContext) (ops.Operator, *rewrite if j.Predicate != nil { newOp.collectPredicate(ctx, j.Predicate) } - return newOp, rewrite.NewTree("merge querygraphs into a single one", newOp), nil + return newOp, rewrite.NewTree("merge querygraphs into a single one"), nil } func createOuterJoin(tableExpr *sqlparser.JoinTableExpr, lhs, rhs ops.Operator) (ops.Operator, error) { @@ -162,9 +162,8 @@ func (j *Join) IsInner() bool { return !j.LeftJoin } -func (j *Join) AddJoinPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) error { +func (j *Join) AddJoinPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) { j.Predicate = ctx.SemTable.AndExpressions(j.Predicate, expr) - return nil } func (j *Join) ShortDescription() string { diff --git a/go/vt/vtgate/planbuilder/operators/joins.go b/go/vt/vtgate/planbuilder/operators/joins.go index 3b5c31c5dce..ad61a6c5a00 100644 --- a/go/vt/vtgate/planbuilder/operators/joins.go +++ b/go/vt/vtgate/planbuilder/operators/joins.go @@ -31,7 +31,7 @@ type JoinOp interface { SetRHS(ops.Operator) MakeInner() IsInner() bool - AddJoinPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) error + AddJoinPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) } func AddPredicate( @@ -79,10 +79,7 @@ func AddPredicate( return newFilter(join, expr) } - err := join.AddJoinPredicate(ctx, expr) - if err != nil { - panic(err) - } + join.AddJoinPredicate(ctx, expr) return join } diff --git a/go/vt/vtgate/planbuilder/operators/offset_planning.go b/go/vt/vtgate/planbuilder/operators/offset_planning.go index 7e7be49874a..d2fc266790c 100644 --- a/go/vt/vtgate/planbuilder/operators/offset_planning.go +++ b/go/vt/vtgate/planbuilder/operators/offset_planning.go @@ -30,7 +30,7 @@ import ( // planOffsets will walk the tree top down, adding offset information to columns in the tree for use in further optimization, func planOffsets(ctx *plancontext.PlanningContext, root ops.Operator) (ops.Operator, error) { type offsettable interface { - planOffsets(ctx *plancontext.PlanningContext) + planOffsets(ctx *plancontext.PlanningContext) ops.Operator } visitor := func(in ops.Operator, _ semantics.TableSet, _ bool) (ops.Operator, *rewrite.ApplyResult, error) { @@ -39,7 +39,10 @@ func planOffsets(ctx *plancontext.PlanningContext, root ops.Operator) (ops.Opera case *Horizon: return nil, nil, vterrors.VT13001(fmt.Sprintf("should not see %T here", in)) case offsettable: - op.planOffsets(ctx) + newOp := op.planOffsets(ctx) + if newOp != nil { + return newOp, rewrite.NewTree("new operator after offset planning"), nil + } } if err != nil { return nil, nil, err @@ -116,7 +119,7 @@ func addColumnsToInput(ctx *plancontext.PlanningContext, root ops.Operator) (ops _ = sqlparser.CopyOnRewrite(expr, visitor, nil, ctx.SemTable.CopySemanticInfo) } if addedColumns { - return in, rewrite.NewTree("added columns because filter needs it", in), nil + return in, rewrite.NewTree("added columns because filter needs it"), nil } return in, rewrite.SameTree, nil @@ -140,7 +143,7 @@ func pullDistinctFromUNION(_ *plancontext.PlanningContext, root ops.Operator) (o Required: true, Source: union, } - return distinct, rewrite.NewTree("pulled out DISTINCT from union", union), nil + return distinct, rewrite.NewTree("pulled out DISTINCT from union"), nil } return rewrite.TopDown(root, TableID, visitor, stopAtRoute) diff --git a/go/vt/vtgate/planbuilder/operators/ordering.go b/go/vt/vtgate/planbuilder/operators/ordering.go index b3d0310eadb..66436f6a47d 100644 --- a/go/vt/vtgate/planbuilder/operators/ordering.go +++ b/go/vt/vtgate/planbuilder/operators/ordering.go @@ -78,7 +78,7 @@ func (o *Ordering) GetOrdering(*plancontext.PlanningContext) []ops.OrderBy { return o.Order } -func (o *Ordering) planOffsets(ctx *plancontext.PlanningContext) { +func (o *Ordering) planOffsets(ctx *plancontext.PlanningContext) ops.Operator { for _, order := range o.Order { offset := o.Source.AddColumn(ctx, true, false, aeWrap(order.SimplifiedExpr)) o.Offset = append(o.Offset, offset) @@ -92,6 +92,7 @@ func (o *Ordering) planOffsets(ctx *plancontext.PlanningContext) { offset = o.Source.AddColumn(ctx, true, false, aeWrap(wsExpr)) o.WOffset = append(o.WOffset, offset) } + return nil } func (o *Ordering) ShortDescription() string { diff --git a/go/vt/vtgate/planbuilder/operators/phases.go b/go/vt/vtgate/planbuilder/operators/phases.go index 36149f89985..f180cfc2ce0 100644 --- a/go/vt/vtgate/planbuilder/operators/phases.go +++ b/go/vt/vtgate/planbuilder/operators/phases.go @@ -96,15 +96,18 @@ func (p Phase) act(ctx *plancontext.PlanningContext, op ops.Operator) (ops.Opera } } -// getPhases returns the ordered phases that the planner will undergo. -// These phases ensure the appropriate collaboration between rewriters. -func getPhases(ctx *plancontext.PlanningContext) (phases []Phase) { - for p := Phase(0); p < DONE; p++ { - if p.shouldRun(ctx.SemTable.QuerySignature) { - phases = append(phases, p) +type phaser struct { + current Phase +} + +func (p *phaser) next(ctx *plancontext.PlanningContext) Phase { + for phas := p.current; phas < DONE; phas++ { + if phas.shouldRun(ctx.SemTable.QuerySignature) { + p.current = p.current + 1 + return phas } } - return + return DONE } func removePerformanceDistinctAboveRoute(_ *plancontext.PlanningContext, op ops.Operator) (ops.Operator, error) { @@ -114,7 +117,7 @@ func removePerformanceDistinctAboveRoute(_ *plancontext.PlanningContext, op ops. return innerOp, rewrite.SameTree, nil } - return d.Source, rewrite.NewTree("removed distinct not required that was not pushed under route", d), nil + return d.Source, rewrite.NewTree("removed distinct not required that was not pushed under route"), nil }, stopAtRoute) } @@ -138,7 +141,7 @@ func addOrderingForAllAggregations(ctx *plancontext.PlanningContext, root ops.Op var res *rewrite.ApplyResult if requireOrdering { addOrderingFor(aggrOp) - res = rewrite.NewTree("added ordering before aggregation", in) + res = rewrite.NewTree("added ordering before aggregation") } return in, res, nil } diff --git a/go/vt/vtgate/planbuilder/operators/projection.go b/go/vt/vtgate/planbuilder/operators/projection.go index bad9cb0e87e..7e9f2d71a71 100644 --- a/go/vt/vtgate/planbuilder/operators/projection.go +++ b/go/vt/vtgate/planbuilder/operators/projection.go @@ -263,14 +263,14 @@ func (p *Projection) FindCol(ctx *plancontext.PlanningContext, expr sqlparser.Ex return -1 } -func (p *Projection) addProjExpr(pe *ProjExpr) (int, error) { +func (p *Projection) addProjExpr(pe ...*ProjExpr) (int, error) { ap, err := p.GetAliasedProjections() if err != nil { return 0, err } offset := len(ap) - ap = append(ap, pe) + ap = append(ap, pe...) p.Columns = ap return offset, nil @@ -471,7 +471,7 @@ func (p *Projection) Compact(ctx *plancontext.PlanningContext) (ops.Operator, *r } if !needed { - return p.Source, rewrite.NewTree("removed projection only passing through the input", p), nil + return p.Source, rewrite.NewTree("removed projection only passing through the input"), nil } switch src := p.Source.(type) { @@ -517,7 +517,7 @@ func (p *Projection) compactWithJoin(ctx *plancontext.PlanningContext, join *App } join.Columns = newColumns join.JoinColumns = newColumnsAST - return join, rewrite.NewTree("remove projection from before join", join), nil + return join, rewrite.NewTree("remove projection from before join"), nil } func (p *Projection) compactWithRoute(ctx *plancontext.PlanningContext, rb *Route) (ops.Operator, *rewrite.ApplyResult, error) { @@ -538,7 +538,7 @@ func (p *Projection) compactWithRoute(ctx *plancontext.PlanningContext, rb *Rout } if len(columns) == len(ap) { - return rb, rewrite.NewTree("remove projection from before route", rb), nil + return rb, rewrite.NewTree("remove projection from before route"), nil } rb.ResultColumns = len(columns) return rb, rewrite.SameTree, nil @@ -561,7 +561,7 @@ func (p *Projection) needsEvaluation(ctx *plancontext.PlanningContext, e sqlpars return false } -func (p *Projection) planOffsets(ctx *plancontext.PlanningContext) { +func (p *Projection) planOffsets(ctx *plancontext.PlanningContext) ops.Operator { ap, err := p.GetAliasedProjections() if err != nil { panic(err) @@ -597,6 +597,7 @@ func (p *Projection) planOffsets(ctx *plancontext.PlanningContext) { EExpr: eexpr, } } + return nil } func (p *Projection) introducesTableID() semantics.TableSet { diff --git a/go/vt/vtgate/planbuilder/operators/query_planning.go b/go/vt/vtgate/planbuilder/operators/query_planning.go index e66abd02feb..1f239a31973 100644 --- a/go/vt/vtgate/planbuilder/operators/query_planning.go +++ b/go/vt/vtgate/planbuilder/operators/query_planning.go @@ -65,7 +65,9 @@ func planQuery(ctx *plancontext.PlanningContext, root ops.Operator) (output ops. // smaller operators and try to push these down as far as possible func runPhases(ctx *plancontext.PlanningContext, root ops.Operator) (op ops.Operator, err error) { op = root - for _, phase := range getPhases(ctx) { + + p := phaser{} + for phase := p.next(ctx); phase != DONE; phase = p.next(ctx) { ctx.CurrentPhase = int(phase) if rewrite.DebugOperatorTree { fmt.Printf("PHASE: %s\n", phase.String()) @@ -134,7 +136,7 @@ func pushLockAndComment(l *LockAndComment) (ops.Operator, *rewrite.ApplyResult, case *Route: src.Comments = l.Comments src.Lock = l.Lock - return src, rewrite.NewTree("put lock and comment into route", l), nil + return src, rewrite.NewTree("put lock and comment into route"), nil default: inputs := src.Inputs() for i, op := range inputs { @@ -145,7 +147,7 @@ func pushLockAndComment(l *LockAndComment) (ops.Operator, *rewrite.ApplyResult, } } src.SetInputs(inputs) - return src, rewrite.NewTree("pushed down lock and comments", l), nil + return src, rewrite.NewTree("pushed down lock and comments"), nil } } @@ -256,7 +258,7 @@ func pushProjectionToOuter(ctx *plancontext.PlanningContext, p *Projection, sq * } // all projections can be pushed to the outer sq.Outer, p.Source = p, sq.Outer - return sq, rewrite.NewTree("push projection into outer side of subquery", p), nil + return sq, rewrite.NewTree("push projection into outer side of subquery"), nil } func pushProjectionInVindex( @@ -271,7 +273,7 @@ func pushProjectionInVindex( for _, pe := range ap { src.AddColumn(ctx, true, false, aeWrap(pe.EvalExpr)) } - return src, rewrite.NewTree("push projection into vindex", p), nil + return src, rewrite.NewTree("push projection into vindex"), nil } func (p *projector) add(pe *ProjExpr, col *sqlparser.IdentifierCI) { @@ -331,7 +333,7 @@ func pushProjectionInApplyJoin( return nil, nil, err } - return src, rewrite.NewTree("split projection to either side of join", src), nil + return src, rewrite.NewTree("split projection to either side of join"), nil } // splitProjectionAcrossJoin creates JoinPredicates for all projections, @@ -521,7 +523,7 @@ func setUpperLimit(in *Limit) (ops.Operator, *rewrite.ApplyResult, error) { Pushed: false, } op.Source = newSrc - result = result.Merge(rewrite.NewTree("push limit under route", newSrc)) + result = result.Merge(rewrite.NewTree("push limit under route")) return rewrite.SkipChildren default: return rewrite.VisitChildren @@ -544,12 +546,12 @@ func tryPushOrdering(ctx *plancontext.PlanningContext, in *Ordering) (ops.Operat // ApplyJoin is stable in regard to the columns coming from the LHS, // so if all the ordering columns come from the LHS, we can push down the Ordering there src.LHS, in.Source = in, src.LHS - return src, rewrite.NewTree("push down ordering on the LHS of a join", in), nil + return src, rewrite.NewTree("push down ordering on the LHS of a join"), nil } case *Ordering: // we'll just remove the order underneath. The top order replaces whatever was incoming in.Source = src.Source - return in, rewrite.NewTree("remove double ordering", src), nil + return in, rewrite.NewTree("remove double ordering"), nil case *Projection: // we can move ordering under a projection if it's not introducing a column we're sorting by for _, by := range in.Order { @@ -573,7 +575,7 @@ func tryPushOrdering(ctx *plancontext.PlanningContext, in *Ordering) (ops.Operat } } src.Outer, in.Source = in, src.Outer - return src, rewrite.NewTree("push ordering into outer side of subquery", in), nil + return src, rewrite.NewTree("push ordering into outer side of subquery"), nil case *SubQuery: outerTableID := TableID(src.Outer) for _, order := range in.Order { @@ -583,7 +585,7 @@ func tryPushOrdering(ctx *plancontext.PlanningContext, in *Ordering) (ops.Operat } } src.Outer, in.Source = in, src.Outer - return src, rewrite.NewTree("push ordering into outer side of subquery", in), nil + return src, rewrite.NewTree("push ordering into outer side of subquery"), nil } return in, rewrite.SameTree, nil } @@ -662,7 +664,7 @@ func pushOrderingUnderAggr(ctx *plancontext.PlanningContext, order *Ordering, ag order.Source = aggrSource.Source aggrSource.Source = nil // removing from plan tree aggregator.Source = order - return aggregator, rewrite.NewTree("push ordering under aggregation, removing extra ordering", aggregator), nil + return aggregator, rewrite.NewTree("push ordering under aggregation, removing extra ordering"), nil } return rewrite.Swap(order, aggregator, "push ordering under aggregation") } @@ -719,7 +721,7 @@ func tryPushFilter(ctx *plancontext.PlanningContext, in *Filter) (ops.Operator, } } src.Outer, in.Source = in, src.Outer - return src, rewrite.NewTree("push filter to outer query in subquery container", in), nil + return src, rewrite.NewTree("push filter to outer query in subquery container"), nil } return in, rewrite.SameTree, nil @@ -756,7 +758,7 @@ func tryPushDistinct(in *Distinct) (ops.Operator, *rewrite.ApplyResult, error) { switch src := in.Source.(type) { case *Route: if isDistinct(src.Source) && src.IsSingleShard() { - return src, rewrite.NewTree("distinct not needed", in), nil + return src, rewrite.NewTree("distinct not needed"), nil } if src.IsSingleShard() || !in.Required { return rewrite.Swap(in, src, "push distinct under route") @@ -769,31 +771,31 @@ func tryPushDistinct(in *Distinct) (ops.Operator, *rewrite.ApplyResult, error) { src.Source = &Distinct{Source: src.Source} in.PushedPerformance = true - return in, rewrite.NewTree("added distinct under route - kept original", src), nil + return in, rewrite.NewTree("added distinct under route - kept original"), nil case *Distinct: src.Required = false src.PushedPerformance = false - return src, rewrite.NewTree("remove double distinct", src), nil + return src, rewrite.NewTree("remove double distinct"), nil case *Union: for i := range src.Sources { src.Sources[i] = &Distinct{Source: src.Sources[i]} } in.PushedPerformance = true - return in, rewrite.NewTree("push down distinct under union", src), nil + return in, rewrite.NewTree("push down distinct under union"), nil case *ApplyJoin: src.LHS = &Distinct{Source: src.LHS} src.RHS = &Distinct{Source: src.RHS} in.PushedPerformance = true if in.Required { - return in, rewrite.NewTree("push distinct under join - kept original", in.Source), nil + return in, rewrite.NewTree("push distinct under join - kept original"), nil } - return in.Source, rewrite.NewTree("push distinct under join", in.Source), nil + return in.Source, rewrite.NewTree("push distinct under join"), nil case *Ordering: in.Source = src.Source - return in, rewrite.NewTree("remove ordering under distinct", in), nil + return in, rewrite.NewTree("remove ordering under distinct"), nil } return in, rewrite.SameTree, nil @@ -835,19 +837,19 @@ func tryPushUnion(ctx *plancontext.PlanningContext, op *Union) (ops.Operator, *r if len(sources) == 1 { result := sources[0].(*Route) if result.IsSingleShard() || !op.distinct { - return result, rewrite.NewTree("push union under route", op), nil + return result, rewrite.NewTree("push union under route"), nil } return &Distinct{ Source: result, Required: true, - }, rewrite.NewTree("push union under route", op), nil + }, rewrite.NewTree("push union under route"), nil } if len(sources) == len(op.Sources) { return op, rewrite.SameTree, nil } - return newUnion(sources, selects, op.unionColumns, op.distinct), rewrite.NewTree("merge union inputs", op), nil + return newUnion(sources, selects, op.unionColumns, op.distinct), rewrite.NewTree("merge union inputs"), nil } // addTruncationOrProjectionToReturnOutput uses the original Horizon to make sure that the output columns line up with what the user asked for diff --git a/go/vt/vtgate/planbuilder/operators/rewrite/rewriters.go b/go/vt/vtgate/planbuilder/operators/rewrite/rewriters.go index c5a8b0a6fa2..1ecc0cd8e76 100644 --- a/go/vt/vtgate/planbuilder/operators/rewrite/rewriters.go +++ b/go/vt/vtgate/planbuilder/operators/rewrite/rewriters.go @@ -45,7 +45,6 @@ type ( Rewrite struct { Message string - Op ops.Operator } // VisitRule signals to the rewriter if the children of this operator should be visited or not @@ -61,11 +60,11 @@ const ( SkipChildren VisitRule = false ) -func NewTree(message string, op ops.Operator) *ApplyResult { +func NewTree(message string) *ApplyResult { if DebugOperatorTree { fmt.Println(">>>>>>>> " + message) } - return &ApplyResult{Transformations: []Rewrite{{Message: message, Op: op}}} + return &ApplyResult{Transformations: []Rewrite{{Message: message}}} } func (ar *ApplyResult) Merge(other *ApplyResult) *ApplyResult { @@ -145,19 +144,6 @@ func FixedPointBottomUp( return op, nil } -// BottomUpAll rewrites an operator tree from the bottom up. BottomUp applies a transformation function to -// the given operator tree from the bottom up. Each callback [f] returns a ApplyResult that is aggregated -// into a final output indicating whether the operator tree was changed. -func BottomUpAll( - root ops.Operator, - resolveID func(ops.Operator) semantics.TableSet, - visit VisitF, -) (ops.Operator, error) { - return BottomUp(root, resolveID, visit, func(ops.Operator) VisitRule { - return VisitChildren - }) -} - // TopDown rewrites an operator tree from the bottom up. BottomUp applies a transformation function to // the given operator tree from the bottom up. Each callback [f] returns a ApplyResult that is aggregated // into a final output indicating whether the operator tree was changed. @@ -208,7 +194,7 @@ func Swap(parent, child ops.Operator, message string) (ops.Operator, *ApplyResul child.SetInputs([]ops.Operator{parent}) parent.SetInputs(aInputs) - return child, NewTree(message, parent), nil + return child, NewTree(message), nil } func bottomUp( diff --git a/go/vt/vtgate/planbuilder/operators/route.go b/go/vt/vtgate/planbuilder/operators/route.go index d4b2c43ecff..acbc28553dd 100644 --- a/go/vt/vtgate/planbuilder/operators/route.go +++ b/go/vt/vtgate/planbuilder/operators/route.go @@ -681,17 +681,17 @@ func isSpecialOrderBy(o ops.OrderBy) bool { return isFunction && f.Name.Lowered() == "rand" } -func (r *Route) planOffsets(ctx *plancontext.PlanningContext) { +func (r *Route) planOffsets(ctx *plancontext.PlanningContext) ops.Operator { // if operator is returning data from a single shard, we don't need to do anything more if r.IsSingleShard() { - return + return nil } // if we are getting results from multiple shards, we need to do a merge-sort // between them to get the final output correctly sorted ordering := r.Source.GetOrdering(ctx) if len(ordering) == 0 { - return + return nil } for _, order := range ordering { @@ -713,6 +713,7 @@ func (r *Route) planOffsets(ctx *plancontext.PlanningContext) { } r.Ordering = append(r.Ordering, o) } + return nil } func weightStringFor(expr sqlparser.Expr) sqlparser.Expr { diff --git a/go/vt/vtgate/planbuilder/operators/route_planning.go b/go/vt/vtgate/planbuilder/operators/route_planning.go index 306158a06da..5bce334a609 100644 --- a/go/vt/vtgate/planbuilder/operators/route_planning.go +++ b/go/vt/vtgate/planbuilder/operators/route_planning.go @@ -75,7 +75,7 @@ func optimizeQueryGraph(ctx *plancontext.PlanningContext, op *QueryGraph) (resul result = newFilter(result, ctx.SemTable.AndExpressions(unresolved...)) } - changed = rewrite.NewTree("solved query graph", result) + changed = rewrite.NewTree("solved query graph") return } @@ -365,16 +365,18 @@ func requiresSwitchingSides(ctx *plancontext.PlanningContext, op ops.Operator) b func mergeOrJoin(ctx *plancontext.PlanningContext, lhs, rhs ops.Operator, joinPredicates []sqlparser.Expr, inner bool) (ops.Operator, *rewrite.ApplyResult, error) { newPlan := mergeJoinInputs(ctx, lhs, rhs, joinPredicates, newJoinMerge(joinPredicates, inner)) if newPlan != nil { - return newPlan, rewrite.NewTree("merge routes into single operator", newPlan), nil + return newPlan, rewrite.NewTree("merge routes into single operator"), nil } if len(joinPredicates) > 0 && requiresSwitchingSides(ctx, rhs) { - if !inner { - return nil, nil, vterrors.VT12001("LEFT JOIN with LIMIT on the outer side") - } - - if requiresSwitchingSides(ctx, lhs) { - return nil, nil, vterrors.VT12001("JOIN between derived tables with LIMIT") + if !inner || requiresSwitchingSides(ctx, lhs) { + // we can't switch sides, so let's see if we can use a HashJoin to solve it + join := NewHashJoin(lhs, rhs, !inner) + for _, pred := range joinPredicates { + join.AddJoinPredicate(ctx, pred) + } + ctx.SemTable.QuerySignature.HashJoin = true + return join, rewrite.NewTree("use a hash join because we have LIMIT on the LHS"), nil } join := NewApplyJoin(Clone(rhs), Clone(lhs), nil, !inner) @@ -382,7 +384,7 @@ func mergeOrJoin(ctx *plancontext.PlanningContext, lhs, rhs ops.Operator, joinPr if err != nil { return nil, nil, err } - return newOp, rewrite.NewTree("logical join to applyJoin, switching side because LIMIT", newOp), nil + return newOp, rewrite.NewTree("logical join to applyJoin, switching side because LIMIT"), nil } join := NewApplyJoin(Clone(lhs), Clone(rhs), nil, !inner) @@ -390,7 +392,7 @@ func mergeOrJoin(ctx *plancontext.PlanningContext, lhs, rhs ops.Operator, joinPr if err != nil { return nil, nil, err } - return newOp, rewrite.NewTree("logical join to applyJoin ", newOp), nil + return newOp, rewrite.NewTree("logical join to applyJoin "), nil } func operatorsToRoutes(a, b ops.Operator) (*Route, *Route) { diff --git a/go/vt/vtgate/planbuilder/operators/subquery.go b/go/vt/vtgate/planbuilder/operators/subquery.go index e06e595f689..ae28dd8d9c6 100644 --- a/go/vt/vtgate/planbuilder/operators/subquery.go +++ b/go/vt/vtgate/planbuilder/operators/subquery.go @@ -54,7 +54,7 @@ type SubQuery struct { IsProjection bool } -func (sq *SubQuery) planOffsets(ctx *plancontext.PlanningContext) { +func (sq *SubQuery) planOffsets(ctx *plancontext.PlanningContext) ops.Operator { sq.Vars = make(map[string]int) columns, err := sq.GetJoinColumns(ctx, sq.Outer) if err != nil { @@ -66,6 +66,7 @@ func (sq *SubQuery) planOffsets(ctx *plancontext.PlanningContext) { sq.Vars[lhsExpr.Name] = offset } } + return nil } func (sq *SubQuery) OuterExpressionsNeeded(ctx *plancontext.PlanningContext, outer ops.Operator) (result []*sqlparser.ColName, err error) { @@ -97,7 +98,7 @@ func (sq *SubQuery) GetJoinColumns(ctx *plancontext.PlanningContext, outer ops.O } sq.outerID = outerID mapper := func(in sqlparser.Expr) (JoinColumn, error) { - return BreakExpressionInLHSandRHS(ctx, in, outerID) + return breakExpressionInLHSandRHSForApplyJoin(ctx, in, outerID) } joinPredicates, err := slice.MapWithError(sq.Predicates, mapper) if err != nil { diff --git a/go/vt/vtgate/planbuilder/operators/subquery_planning.go b/go/vt/vtgate/planbuilder/operators/subquery_planning.go index 7740ca3d46d..74761aef5c5 100644 --- a/go/vt/vtgate/planbuilder/operators/subquery_planning.go +++ b/go/vt/vtgate/planbuilder/operators/subquery_planning.go @@ -87,7 +87,7 @@ func settleSubqueries(ctx *plancontext.PlanningContext, op ops.Operator) ops.Ope subq.Outer = newOuter outer = subq } - return outer, rewrite.NewTree("extracted subqueries from subquery container", outer), nil + return outer, rewrite.NewTree("extracted subqueries from subquery container"), nil case *Projection: ap, err := op.GetAliasedProjections() if err != nil { @@ -233,7 +233,7 @@ func tryPushSubQueryInJoin( if deps.IsSolvedBy(lhs) { // we can safely push down the subquery on the LHS outer.LHS = addSubQuery(outer.LHS, inner) - return outer, rewrite.NewTree("push subquery into LHS of join", inner), nil + return outer, rewrite.NewTree("push subquery into LHS of join"), nil } if outer.LeftJoin || len(inner.Predicates) == 0 { @@ -245,7 +245,7 @@ func tryPushSubQueryInJoin( if deps.IsSolvedBy(rhs) { // we can push down the subquery filter on RHS of the join outer.RHS = addSubQuery(outer.RHS, inner) - return outer, rewrite.NewTree("push subquery into RHS of join", inner), nil + return outer, rewrite.NewTree("push subquery into RHS of join"), nil } if deps.IsSolvedBy(joinID) { @@ -258,7 +258,7 @@ func tryPushSubQueryInJoin( } outer.RHS = addSubQuery(outer.RHS, inner) - return outer, rewrite.NewTree("push subquery into RHS of join rewriting predicates", inner), nil + return outer, rewrite.NewTree("push subquery into RHS of join rewriting predicates"), nil } return nil, rewrite.SameTree, nil @@ -272,7 +272,7 @@ func extractLHSExpr( lhs semantics.TableSet, ) func(expr sqlparser.Expr) (sqlparser.Expr, error) { return func(expr sqlparser.Expr) (sqlparser.Expr, error) { - col, err := BreakExpressionInLHSandRHS(ctx, expr, lhs) + col, err := breakExpressionInLHSandRHSForApplyJoin(ctx, expr, lhs) if err != nil { return nil, err } @@ -316,7 +316,7 @@ func tryMergeWithRHS(ctx *plancontext.PlanningContext, inner *SubQuery, outer *A outer.RHS = newOp ctx.MergedSubqueries = append(ctx.MergedSubqueries, inner.originalSubquery) - return outer, rewrite.NewTree("merged subquery with rhs of join", inner), nil + return outer, rewrite.NewTree("merged subquery with rhs of join"), nil } // addSubQuery adds a SubQuery to the given operator. If the operator is a SubQueryContainer, @@ -387,7 +387,7 @@ func pushProjectionToOuterContainer(ctx *plancontext.PlanningContext, p *Project } // all projections can be pushed to the outer src.Outer, p.Source = p, src.Outer - return src, rewrite.NewTree("push projection into outer side of subquery container", p), nil + return src, rewrite.NewTree("push projection into outer side of subquery container"), nil } func rewriteColNameToArgument(ctx *plancontext.PlanningContext, in sqlparser.Expr, se SubQueryExpression, subqueries ...*SubQuery) sqlparser.Expr { @@ -512,7 +512,7 @@ func tryMergeSubqueriesRecursively( } op.Source = &Filter{Source: outer.Source, Predicates: []sqlparser.Expr{subQuery.Original}} - return op, finalResult.Merge(rewrite.NewTree("merge outer of two subqueries", subQuery)), nil + return op, finalResult.Merge(rewrite.NewTree("merge outer of two subqueries")), nil } func tryMergeSubqueryWithOuter(ctx *plancontext.PlanningContext, subQuery *SubQuery, outer *Route, inner ops.Operator) (ops.Operator, *rewrite.ApplyResult, error) { @@ -533,7 +533,7 @@ func tryMergeSubqueryWithOuter(ctx *plancontext.PlanningContext, subQuery *SubQu op.Source = &Filter{Source: outer.Source, Predicates: []sqlparser.Expr{subQuery.Original}} } ctx.MergedSubqueries = append(ctx.MergedSubqueries, subQuery.originalSubquery) - return op, rewrite.NewTree("merged subquery with outer", subQuery), nil + return op, rewrite.NewTree("merged subquery with outer"), nil } // This checked if subquery is part of the changed vindex values. Subquery cannot be merged with the outer route. diff --git a/go/vt/vtgate/planbuilder/operators/union_merging.go b/go/vt/vtgate/planbuilder/operators/union_merging.go index 4c8b02f76d8..03b7a212893 100644 --- a/go/vt/vtgate/planbuilder/operators/union_merging.go +++ b/go/vt/vtgate/planbuilder/operators/union_merging.go @@ -255,5 +255,5 @@ func compactUnion(u *Union) *rewrite.ApplyResult { u.Sources = newSources u.Selects = newSelects - return rewrite.NewTree("merged UNIONs", u) + return rewrite.NewTree("merged UNIONs") } diff --git a/go/vt/vtgate/planbuilder/operators/utils_test.go b/go/vt/vtgate/planbuilder/operators/utils_test.go new file mode 100644 index 00000000000..a7e25c1337c --- /dev/null +++ b/go/vt/vtgate/planbuilder/operators/utils_test.go @@ -0,0 +1,90 @@ +/* +Copyright 2023 The Vitess Authors. + +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 operators + +import ( + "slices" + + "vitess.io/vitess/go/vt/sqlparser" + "vitess.io/vitess/go/vt/vtgate/planbuilder/operators/ops" + "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/vtgate/semantics" +) + +type fakeOp struct { + id semantics.TableSet + inputs []ops.Operator + cols []*sqlparser.AliasedExpr +} + +var _ ops.Operator = (*fakeOp)(nil) + +func (f *fakeOp) Clone(inputs []ops.Operator) ops.Operator { + return f +} + +func (f *fakeOp) Inputs() []ops.Operator { + return f.inputs +} + +func (f *fakeOp) SetInputs(operators []ops.Operator) { + // TODO implement me + panic("implement me") +} + +func (f *fakeOp) AddPredicate(ctx *plancontext.PlanningContext, expr sqlparser.Expr) ops.Operator { + // TODO implement me + panic("implement me") +} + +func (f *fakeOp) AddColumn(ctx *plancontext.PlanningContext, reuseExisting bool, _ bool, expr *sqlparser.AliasedExpr) int { + if offset := f.FindCol(ctx, expr.Expr, false); reuseExisting && offset >= 0 { + return offset + } + f.cols = append(f.cols, expr) + return len(f.cols) - 1 +} + +func (f *fakeOp) FindCol(ctx *plancontext.PlanningContext, a sqlparser.Expr, underRoute bool) int { + return slices.IndexFunc(f.cols, func(b *sqlparser.AliasedExpr) bool { + return a == b.Expr + }) +} + +func (f *fakeOp) GetColumns(ctx *plancontext.PlanningContext) []*sqlparser.AliasedExpr { + // TODO implement me + panic("implement me") +} + +func (f *fakeOp) GetSelectExprs(ctx *plancontext.PlanningContext) sqlparser.SelectExprs { + // TODO implement me + panic("implement me") +} + +func (f *fakeOp) ShortDescription() string { + // TODO implement me + panic("implement me") +} + +func (f *fakeOp) GetOrdering(ctx *plancontext.PlanningContext) []ops.OrderBy { + // TODO implement me + panic("implement me") +} + +func (f *fakeOp) introducesTableID() semantics.TableSet { + return f.id +} diff --git a/go/vt/vtgate/planbuilder/testdata/from_cases.json b/go/vt/vtgate/planbuilder/testdata/from_cases.json index 7a3c13c3635..476a16f8a11 100644 --- a/go/vt/vtgate/planbuilder/testdata/from_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/from_cases.json @@ -4050,5 +4050,130 @@ "comment": "select with a target destination", "query": "select * from `user[-]`.user_metadata", "plan": "VT09017: SELECT with a target destination is not allowed" + }, + { + "comment": "query that needs a hash join", + "query": "select id from user left join (select col from user_extra limit 10) ue on user.col = ue.col", + "plan": { + "QueryType": "SELECT", + "Original": "select id from user left join (select col from user_extra limit 10) ue on user.col = ue.col", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + "id as id" + ], + "Inputs": [ + { + "OperatorType": "Join", + "Variant": "HashLeftJoin", + "Collation": "binary", + "ComparisonType": "INT16", + "JoinColumnIndexes": "-2", + "Predicate": "`user`.col = ue.col", + "TableName": "`user`_user_extra", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select `user`.col, id from `user` where 1 != 1", + "Query": "select `user`.col, id from `user`", + "Table": "`user`" + }, + { + "OperatorType": "Limit", + "Count": "10", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select col from (select col from user_extra where 1 != 1) as ue where 1 != 1", + "Query": "select col from (select col from user_extra) as ue limit :__upper_limit", + "Table": "user_extra" + } + ] + } + ] + } + ] + }, + "TablesUsed": [ + "user.user", + "user.user_extra" + ] + } + }, + { + "comment": "query that needs a hash join - both sides have limits", + "query": "select id, user_id from (select id, col from user limit 10) u join (select col, user_id from user_extra limit 10) ue on u.col = ue.col", + "plan": { + "QueryType": "SELECT", + "Original": "select id, user_id from (select id, col from user limit 10) u join (select col, user_id from user_extra limit 10) ue on u.col = ue.col", + "Instructions": { + "OperatorType": "Projection", + "Expressions": [ + "id as id", + "user_id as user_id" + ], + "Inputs": [ + { + "OperatorType": "Join", + "Variant": "HashJoin", + "Collation": "binary", + "ComparisonType": "INT16", + "JoinColumnIndexes": "-1,2", + "Predicate": "u.col = ue.col", + "TableName": "`user`_user_extra", + "Inputs": [ + { + "OperatorType": "Limit", + "Count": "10", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id, col from (select id, col from `user` where 1 != 1) as u where 1 != 1", + "Query": "select id, col from (select id, col from `user`) as u limit :__upper_limit", + "Table": "`user`" + } + ] + }, + { + "OperatorType": "Limit", + "Count": "10", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select col, user_id from (select col, user_id from user_extra where 1 != 1) as ue where 1 != 1", + "Query": "select col, user_id from (select col, user_id from user_extra) as ue limit :__upper_limit", + "Table": "user_extra" + } + ] + } + ] + } + ] + }, + "TablesUsed": [ + "user.user", + "user.user_extra" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/testdata/hash_joins.txt b/go/vt/vtgate/planbuilder/testdata/hash_joins.txt deleted file mode 100644 index afc175a581c..00000000000 --- a/go/vt/vtgate/planbuilder/testdata/hash_joins.txt +++ /dev/null @@ -1,531 +0,0 @@ -# Test cases in this file are currently turned off -# Multi-route unique vindex constraint (with hash join) -"select /*vt+ ALLOW_HASH_JOIN */ user_extra.id from user join user_extra on user.col = user_extra.col where user.id = 5" -{ - "QueryType": "SELECT", - "Original": "select /*vt+ ALLOW_HASH_JOIN */ user_extra.id from user join user_extra on user.col = user_extra.col where user.id = 5", - "Instructions": { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "1", - "JoinVars": { - "user_col": 0 - }, - "TableName": "`user`_user_extra", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "EqualUnique", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select `user`.col from `user` where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ `user`.col from `user` where `user`.id = 5", - "Table": "`user`", - "Values": [ - "INT64(5)" - ], - "Vindex": "user_index" - }, - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select user_extra.id from user_extra where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ user_extra.id from user_extra where user_extra.col = :user_col", - "Table": "user_extra" - } - ] - } -} -{ - "QueryType": "SELECT", - "Original": "select /*vt+ ALLOW_HASH_JOIN */ user_extra.id from user join user_extra on user.col = user_extra.col where user.id = 5", - "Instructions": { - "OperatorType": "Join", - "Variant": "HashJoin", - "ComparisonType": "INT16", - "JoinColumnIndexes": "2", - "Predicate": "`user`.col = user_extra.col", - "TableName": "`user`_user_extra", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "EqualUnique", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select `user`.col from `user` where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ `user`.col from `user` where `user`.id = 5", - "Table": "`user`", - "Values": [ - "INT64(5)" - ], - "Vindex": "user_index" - }, - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select user_extra.col, user_extra.id from user_extra where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ user_extra.col, user_extra.id from user_extra", - "Table": "user_extra" - } - ] - } -} - - -# Multi-route with non-route constraint, should use first route. -"select /*vt+ ALLOW_HASH_JOIN */ user_extra.id from user join user_extra on user.col = user_extra.col where 1 = 1" -{ - "QueryType": "SELECT", - "Original": "select /*vt+ ALLOW_HASH_JOIN */ user_extra.id from user join user_extra on user.col = user_extra.col where 1 = 1", - "Instructions": { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "1", - "JoinVars": { - "user_col": 0 - }, - "TableName": "`user`_user_extra", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select `user`.col from `user` where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ `user`.col from `user` where 1 = 1", - "Table": "`user`" - }, - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select user_extra.id from user_extra where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ user_extra.id from user_extra where user_extra.col = :user_col", - "Table": "user_extra" - } - ] - } -} -{ - "QueryType": "SELECT", - "Original": "select /*vt+ ALLOW_HASH_JOIN */ user_extra.id from user join user_extra on user.col = user_extra.col where 1 = 1", - "Instructions": { - "OperatorType": "Join", - "Variant": "HashJoin", - "ComparisonType": "INT16", - "JoinColumnIndexes": "2", - "Predicate": "`user`.col = user_extra.col", - "TableName": "`user`_user_extra", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select `user`.col from `user` where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ `user`.col from `user` where 1 = 1", - "Table": "`user`" - }, - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select user_extra.col, user_extra.id from user_extra where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ user_extra.col, user_extra.id from user_extra where 1 = 1", - "Table": "user_extra" - } - ] - } -} - -# wire-up on within cross-shard derived table (hash-join version) -"select /*vt+ ALLOW_HASH_JOIN */ t.id from (select user.id, user.col1 from user join user_extra on user_extra.col = user.col) as t" -{ - "QueryType": "SELECT", - "Original": "select /*vt+ ALLOW_HASH_JOIN */ t.id from (select user.id, user.col1 from user join user_extra on user_extra.col = user.col) as t", - "Instructions": { - "OperatorType": "SimpleProjection", - "Columns": [ - 0 - ], - "Inputs": [ - { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "-1,-2", - "JoinVars": { - "user_col": 2 - }, - "TableName": "`user`_user_extra", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select `user`.id, `user`.col1, `user`.col from `user` where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ `user`.id, `user`.col1, `user`.col from `user`", - "Table": "`user`" - }, - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select 1 from user_extra where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ 1 from user_extra where user_extra.col = :user_col", - "Table": "user_extra" - } - ] - } - ] - } -} -{ - "QueryType": "SELECT", - "Original": "select /*vt+ ALLOW_HASH_JOIN */ t.id from (select user.id, user.col1 from user join user_extra on user_extra.col = user.col) as t", - "Instructions": { - "OperatorType": "SimpleProjection", - "Columns": [ - 0 - ], - "Inputs": [ - { - "OperatorType": "Join", - "Variant": "HashJoin", - "ComparisonType": "INT16", - "JoinColumnIndexes": "-2,-3", - "Predicate": "user_extra.col = `user`.col", - "TableName": "`user`_user_extra", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select `user`.col, `user`.id, `user`.col1 from `user` where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ `user`.col, `user`.id, `user`.col1 from `user`", - "Table": "`user`" - }, - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select user_extra.col from user_extra where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ user_extra.col from user_extra", - "Table": "user_extra" - } - ] - } - ] - } -} - -# hash join on int columns -"select /*vt+ ALLOW_HASH_JOIN */ u.id from user as u join user as uu on u.intcol = uu.intcol" -{ - "QueryType": "SELECT", - "Original": "select /*vt+ ALLOW_HASH_JOIN */ u.id from user as u join user as uu on u.intcol = uu.intcol", - "Instructions": { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "-1", - "JoinVars": { - "u_intcol": 1 - }, - "TableName": "`user`_`user`", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select u.id, u.intcol from `user` as u where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ u.id, u.intcol from `user` as u", - "Table": "`user`" - }, - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select 1 from `user` as uu where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ 1 from `user` as uu where uu.intcol = :u_intcol", - "Table": "`user`" - } - ] - } -} -{ - "QueryType": "SELECT", - "Original": "select /*vt+ ALLOW_HASH_JOIN */ u.id from user as u join user as uu on u.intcol = uu.intcol", - "Instructions": { - "OperatorType": "Join", - "Variant": "HashJoin", - "ComparisonType": "INT16", - "JoinColumnIndexes": "-2", - "Predicate": "u.intcol = uu.intcol", - "TableName": "`user`_`user`", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select u.intcol, u.id from `user` as u where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ u.intcol, u.id from `user` as u", - "Table": "`user`" - }, - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select uu.intcol from `user` as uu where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ uu.intcol from `user` as uu", - "Table": "`user`" - } - ] - } -} - -# Author5.joins(books: [{orders: :customer}, :supplier]) (with hash join) -"select /*vt+ ALLOW_HASH_JOIN */ author5s.* from author5s join book6s on book6s.author5_id = author5s.id join book6s_order2s on book6s_order2s.book6_id = book6s.id join order2s on order2s.id = book6s_order2s.order2_id join customer2s on customer2s.id = order2s.customer2_id join supplier5s on supplier5s.id = book6s.supplier5_id" -{ - "QueryType": "SELECT", - "Original": "select /*vt+ ALLOW_HASH_JOIN */ author5s.* from author5s join book6s on book6s.author5_id = author5s.id join book6s_order2s on book6s_order2s.book6_id = book6s.id join order2s on order2s.id = book6s_order2s.order2_id join customer2s on customer2s.id = order2s.customer2_id join supplier5s on supplier5s.id = book6s.supplier5_id", - "Instructions": { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "-1,-2,-3,-4", - "JoinVars": { - "book6s_supplier5_id": 4 - }, - "TableName": "author5s, book6s_book6s_order2s_order2s_customer2s_supplier5s", - "Inputs": [ - { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "-1,-2,-3,-4,-5", - "JoinVars": { - "order2s_customer2_id": 5 - }, - "TableName": "author5s, book6s_book6s_order2s_order2s_customer2s", - "Inputs": [ - { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "-1,-2,-3,-4,-5,1", - "JoinVars": { - "book6s_order2s_order2_id": 5 - }, - "TableName": "author5s, book6s_book6s_order2s_order2s", - "Inputs": [ - { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "-1,-2,-3,-4,-5,1", - "JoinVars": { - "book6s_id": 5 - }, - "TableName": "author5s, book6s_book6s_order2s", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select author5s.id, author5s.`name`, author5s.created_at, author5s.updated_at, book6s.supplier5_id, book6s.id from author5s join book6s on book6s.author5_id = author5s.id where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ author5s.id, author5s.`name`, author5s.created_at, author5s.updated_at, book6s.supplier5_id, book6s.id from author5s join book6s on book6s.author5_id = author5s.id", - "Table": "author5s, book6s" - }, - { - "OperatorType": "Route", - "Variant": "EqualUnique", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select book6s_order2s.order2_id from book6s_order2s where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ book6s_order2s.order2_id from book6s_order2s where book6s_order2s.book6_id = :book6s_id", - "Table": "book6s_order2s", - "Values": [ - ":book6s_id" - ], - "Vindex": "binary_md5" - } - ] - }, - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select order2s.customer2_id from order2s where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ order2s.customer2_id from order2s where order2s.id = :book6s_order2s_order2_id", - "Table": "order2s" - } - ] - }, - { - "OperatorType": "Route", - "Variant": "EqualUnique", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select 1 from customer2s where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ 1 from customer2s where customer2s.id = :order2s_customer2_id", - "Table": "customer2s", - "Values": [ - ":order2s_customer2_id" - ], - "Vindex": "binary_md5" - } - ] - }, - { - "OperatorType": "Route", - "Variant": "EqualUnique", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select 1 from supplier5s where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ 1 from supplier5s where supplier5s.id = :book6s_supplier5_id", - "Table": "supplier5s", - "Values": [ - ":book6s_supplier5_id" - ], - "Vindex": "binary_md5" - } - ] - } -} -{ - "QueryType": "SELECT", - "Original": "select /*vt+ ALLOW_HASH_JOIN */ author5s.* from author5s join book6s on book6s.author5_id = author5s.id join book6s_order2s on book6s_order2s.book6_id = book6s.id join order2s on order2s.id = book6s_order2s.order2_id join customer2s on customer2s.id = order2s.customer2_id join supplier5s on supplier5s.id = book6s.supplier5_id", - "Instructions": { - "OperatorType": "Join", - "Variant": "HashJoin", - "ComparisonType": "INT64", - "JoinColumnIndexes": "2,3,4,5", - "Predicate": "order2s.id = book6s_order2s.order2_id", - "TableName": "customer2s, order2s_author5s, book6s_book6s_order2s_supplier5s", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select order2s.id from order2s, customer2s where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ order2s.id from order2s, customer2s where customer2s.id = order2s.customer2_id", - "Table": "customer2s, order2s" - }, - { - "OperatorType": "Join", - "Variant": "HashJoin", - "ComparisonType": "INT64", - "JoinColumnIndexes": "-1,-2,-3,-4,-5", - "Predicate": "supplier5s.id = book6s.supplier5_id", - "TableName": "author5s, book6s_book6s_order2s_supplier5s", - "Inputs": [ - { - "OperatorType": "Join", - "Variant": "Join", - "JoinColumnIndexes": "1,-3,-4,-5,-6", - "JoinVars": { - "book6s_id": 0 - }, - "Predicate": "book6s_order2s.book6_id = book6s.id", - "TableName": "author5s, book6s_book6s_order2s", - "Inputs": [ - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select book6s.id, book6s.supplier5_id, author5s.id as id, author5s.`name` as `name`, author5s.created_at as created_at, author5s.updated_at as updated_at from author5s, book6s where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ book6s.id, book6s.supplier5_id, author5s.id as id, author5s.`name` as `name`, author5s.created_at as created_at, author5s.updated_at as updated_at from author5s, book6s where book6s.author5_id = author5s.id", - "Table": "author5s, book6s" - }, - { - "OperatorType": "Route", - "Variant": "EqualUnique", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select book6s_order2s.order2_id from book6s_order2s where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ book6s_order2s.order2_id from book6s_order2s where book6s_order2s.book6_id = :book6s_id", - "Table": "book6s_order2s", - "Values": [ - ":book6s_id" - ], - "Vindex": "binary_md5" - } - ] - }, - { - "OperatorType": "Route", - "Variant": "Scatter", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select supplier5s.id from supplier5s where 1 != 1", - "Query": "select /*vt+ ALLOW_HASH_JOIN */ supplier5s.id from supplier5s", - "Table": "supplier5s" - } - ] - } - ] - } -} diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json index 1ea07455486..fdab7835738 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json @@ -330,14 +330,9 @@ "plan": "VT12001: unsupported: unmergable subquery can not be inside complex expression" }, { - "comment": "cant switch sides for outer joins", - "query": "select id from user left join (select user_id from user_extra limit 10) ue on user.id = ue.user_id", - "plan": "VT12001: unsupported: LEFT JOIN with LIMIT on the outer side" - }, - { - "comment": "limit on both sides means that we can't evaluate this at all", + "comment": "this query needs better type information to be able to use the hash join", "query": "select id from (select id from user limit 10) u join (select user_id from user_extra limit 10) ue on u.id = ue.user_id", - "plan": "VT12001: unsupported: JOIN between derived tables with LIMIT" + "plan": "VT12001: unsupported: missing type information for [u.id, ue.user_id]" }, { "comment": "multi-shard union", diff --git a/go/vt/vtgate/semantics/semantic_state.go b/go/vt/vtgate/semantics/semantic_state.go index 48ab4322bc8..48060524dba 100644 --- a/go/vt/vtgate/semantics/semantic_state.go +++ b/go/vt/vtgate/semantics/semantic_state.go @@ -76,10 +76,11 @@ type ( // QuerySignature is used to identify shortcuts in the planning process QuerySignature struct { - Union bool - Aggregation bool - Distinct bool - SubQueries bool + Union, + Aggregation, + Distinct, + SubQueries, + HashJoin bool } // SemTable contains semantic analysis information about the query. @@ -505,6 +506,7 @@ func EmptySemTable() *SemTable { Direct: map[sqlparser.Expr]TableSet{}, ColumnEqualities: map[columnName][]sqlparser.Expr{}, columns: map[*sqlparser.Union]sqlparser.SelectExprs{}, + ExprTypes: make(map[sqlparser.Expr]evalengine.Type), } } diff --git a/go/vt/vttablet/tabletserver/rules/rules.go b/go/vt/vttablet/tabletserver/rules/rules.go index efbfcdf87e4..c1e572caa2c 100644 --- a/go/vt/vttablet/tabletserver/rules/rules.go +++ b/go/vt/vttablet/tabletserver/rules/rules.go @@ -27,15 +27,14 @@ import ( "time" "vitess.io/vitess/go/sqltypes" + querypb "vitess.io/vitess/go/vt/proto/query" + vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" "vitess.io/vitess/go/vt/sqlparser" "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/vttablet/tabletserver/planbuilder" - - querypb "vitess.io/vitess/go/vt/proto/query" - vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc" ) -//----------------------------------------------- +// ----------------------------------------------- const ( bufferedTableRuleName = "buffered_table" @@ -189,7 +188,7 @@ func (qrs *Rules) GetAction( return QRContinue, nil, 0, "" } -//----------------------------------------------- +// ----------------------------------------------- // Rule represents one rule (conditions-action). // Name is meant to uniquely identify a rule. @@ -561,7 +560,7 @@ func bvMatch(bvcond BindVarCond, bindVars map[string]*querypb.BindVariable) bool return bvcond.value.eval(bv, bvcond.op, bvcond.onMismatch) } -//----------------------------------------------- +// ----------------------------------------------- // Support types for Rule // Action speficies the list of actions to perform @@ -852,13 +851,13 @@ func getint64(val *querypb.BindVariable) (iv int64, status int) { // TODO(sougou): this is inefficient. Optimize to use []byte. func getstring(val *querypb.BindVariable) (s string, status int) { - if sqltypes.IsIntegral(val.Type) || sqltypes.IsFloat(val.Type) || sqltypes.IsText(val.Type) || sqltypes.IsBinary(val.Type) { + if sqltypes.IsIntegral(val.Type) || sqltypes.IsFloat(val.Type) || sqltypes.IsTextOrBinary(val.Type) { return string(val.Value), QROK } return "", QRMismatch } -//----------------------------------------------- +// ----------------------------------------------- // Support functions for JSON // MapStrOperator maps a string representation to an Operator. From 4fb91202d88fa2febb8411307ce8cb0501e3884e Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 16 Nov 2023 13:37:21 +0100 Subject: [PATCH 38/39] Support cluster bootstrapping in vtctldclient (#14315) Signed-off-by: Matt Lord --- examples/common/scripts/consul-up.sh | 8 +-- examples/common/scripts/etcd-up.sh | 9 ++- examples/common/scripts/zk-up.sh | 8 +-- go/cmd/vtctldclient/command/root.go | 65 ++++++++++++++++++ go/cmd/vtctldclient/command/root_test.go | 67 +++++++++++++++++++ go/flags/endtoend/vtctldclient.txt | 7 ++ go/vt/vtctl/grpcvtctldserver/server.go | 4 +- .../vreplication/vcopier_atomic.go | 1 - 8 files changed, 153 insertions(+), 16 deletions(-) diff --git a/examples/common/scripts/consul-up.sh b/examples/common/scripts/consul-up.sh index 584a25f437a..fb75495b278 100755 --- a/examples/common/scripts/consul-up.sh +++ b/examples/common/scripts/consul-up.sh @@ -40,13 +40,13 @@ sleep 5 # Add the CellInfo description for the cell. # If the node already exists, it's fine, means we used existing data. -echo "add $cell CellInfo" +echo "add ${cell} CellInfo" set +e # shellcheck disable=SC2086 -vtctl $TOPOLOGY_FLAGS VtctldCommand AddCellInfo \ - --root "vitess/$cell" \ +command vtctldclient --server internal --topo-implementation consul --topo-global-server "${CONSUL_SERVER}:${consul_http_port}" AddCellInfo \ + --root "/vitess/${cell}" \ --server-address "${CONSUL_SERVER}:${consul_http_port}" \ - "$cell" + "${cell}" set -e echo "consul start done..." diff --git a/examples/common/scripts/etcd-up.sh b/examples/common/scripts/etcd-up.sh index ac81c1fbd28..1ed22ffce2e 100755 --- a/examples/common/scripts/etcd-up.sh +++ b/examples/common/scripts/etcd-up.sh @@ -32,13 +32,12 @@ sleep 5 # And also add the CellInfo description for the cell. # If the node already exists, it's fine, means we used existing data. -echo "add $cell CellInfo" +echo "add ${cell} CellInfo" set +e -# shellcheck disable=SC2086 -vtctl $TOPOLOGY_FLAGS VtctldCommand AddCellInfo \ - --root /vitess/$cell \ +command vtctldclient --server internal AddCellInfo \ + --root "/vitess/${cell}" \ --server-address "${ETCD_SERVER}" \ - $cell + "${cell}" set -e echo "etcd is running!" diff --git a/examples/common/scripts/zk-up.sh b/examples/common/scripts/zk-up.sh index 3137ed724cc..2b79053d2f6 100755 --- a/examples/common/scripts/zk-up.sh +++ b/examples/common/scripts/zk-up.sh @@ -52,10 +52,10 @@ echo "Started zk servers." # If the node already exists, it's fine, means we used existing data. set +e # shellcheck disable=SC2086 -vtctl $TOPOLOGY_FLAGS VtctldCommand AddCellInfo \ - --root /vitess/$cell \ - --server-address $ZK_SERVER \ - $cell +command vtctldclient --server internal --topo-implementation zk2 --topo-global-server "${ZK_SERVER}" AddCellInfo \ + --root "/vitess/${cell}" \ + --server-address "${ZK_SERVER}" \ + "${cell}" set -e echo "Configured zk servers." diff --git a/go/cmd/vtctldclient/command/root.go b/go/cmd/vtctldclient/command/root.go index 1194b49ec8f..a5848a7b42a 100644 --- a/go/cmd/vtctldclient/command/root.go +++ b/go/cmd/vtctldclient/command/root.go @@ -22,6 +22,8 @@ import ( "fmt" "io" "strconv" + "strings" + "sync" "time" "github.com/spf13/cobra" @@ -29,7 +31,11 @@ import ( "vitess.io/vitess/go/trace" "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/servenv" + "vitess.io/vitess/go/vt/topo" + "vitess.io/vitess/go/vt/vtctl/grpcvtctldserver" + "vitess.io/vitess/go/vt/vtctl/localvtctldclient" "vitess.io/vitess/go/vt/vtctl/vtctldclient" + "vitess.io/vitess/go/vt/vttablet/tmclient" // These imports ensure init()s within them get called and they register their commands/subcommands. "vitess.io/vitess/go/cmd/vtctldclient/cli" @@ -42,8 +48,16 @@ import ( _ "vitess.io/vitess/go/cmd/vtctldclient/command/vreplication/reshard" _ "vitess.io/vitess/go/cmd/vtctldclient/command/vreplication/vdiff" _ "vitess.io/vitess/go/cmd/vtctldclient/command/vreplication/workflow" + + // These imports register the topo factories to use when --server=internal. + _ "vitess.io/vitess/go/vt/topo/consultopo" + _ "vitess.io/vitess/go/vt/topo/etcd2topo" + _ "vitess.io/vitess/go/vt/topo/zk2topo" ) +// The --server value if you want to use a "local" vtctld server. +const useInternalVtctld = "internal" + var ( // VtctldClientProtocol is the protocol to use when creating the vtctldclient.VtctldClient. VtctldClientProtocol = "grpc" @@ -54,14 +68,37 @@ var ( commandCtx context.Context commandCancel func() + // Register functions to be called when the command completes. + onTerm = []func(){} + + // Register our nil tmclient grpc handler only one time. + // This is primarily for tests where we execute the root + // command multiple times. + once = sync.Once{} + server string actionTimeout time.Duration compactOutput bool + topoOptions = struct { + implementation string + globalServerAddresses []string + globalRoot string + }{ // Set defaults + implementation: "etcd2", + globalServerAddresses: []string{"localhost:2379"}, + globalRoot: "/vitess/global", + } + // Root is the main entrypoint to the vtctldclient CLI. Root = &cobra.Command{ Use: "vtctldclient", Short: "Executes a cluster management command on the remote vtctld server.", + Long: fmt.Sprintf(`Executes a cluster management command on the remote vtctld server. +If there are no running vtctld servers -- for example when bootstrapping +a new Vitess cluster -- you can specify a --server value of '%s'. +When doing so, you would use the --topo* flags so that the client can +connect directly to the topo server(s).`, useInternalVtctld), // We use PersistentPreRun to set up the tracer, grpc client, and // command context for every command. PersistentPreRunE: func(cmd *cobra.Command, args []string) (err error) { @@ -87,6 +124,10 @@ var ( if client != nil { err = client.Close() } + // Execute any registered onTerm functions. + for _, f := range onTerm { + f() + } trace.LogErrorsWhenClosing(traceCloser) return err }, @@ -152,6 +193,27 @@ func getClientForCommand(cmd *cobra.Command) (vtctldclient.VtctldClient, error) return nil, errNoServer } + if server == useInternalVtctld { + ts, err := topo.OpenServer(topoOptions.implementation, strings.Join(topoOptions.globalServerAddresses, ","), topoOptions.globalRoot) + if err != nil { + return nil, fmt.Errorf("failed to connect to the topology server: %v", err) + } + onTerm = append(onTerm, ts.Close) + + // Use internal vtctld server implementation. + // Register a nil grpc handler -- we will not use tmclient at all but + // a factory still needs to be registered. + once.Do(func() { + tmclient.RegisterTabletManagerClientFactory("grpc", func() tmclient.TabletManagerClient { + return nil + }) + }) + vtctld := grpcvtctldserver.NewVtctldServer(ts) + localvtctldclient.SetServer(vtctld) + VtctldClientProtocol = "local" + server = "" + } + return vtctldclient.New(VtctldClientProtocol, server) } @@ -159,5 +221,8 @@ func init() { Root.PersistentFlags().StringVar(&server, "server", "", "server to use for the connection (required)") Root.PersistentFlags().DurationVar(&actionTimeout, "action_timeout", time.Hour, "timeout to use for the command") Root.PersistentFlags().BoolVar(&compactOutput, "compact", false, "use compact format for otherwise verbose outputs") + Root.PersistentFlags().StringVar(&topoOptions.implementation, "topo-implementation", topoOptions.implementation, "the topology implementation to use") + Root.PersistentFlags().StringSliceVar(&topoOptions.globalServerAddresses, "topo-global-server-address", topoOptions.globalServerAddresses, "the address of the global topology server(s)") + Root.PersistentFlags().StringVar(&topoOptions.globalRoot, "topo-global-root", topoOptions.globalRoot, "the path of the global topology data in the global topology server") vreplcommon.RegisterCommands(Root) } diff --git a/go/cmd/vtctldclient/command/root_test.go b/go/cmd/vtctldclient/command/root_test.go index 155fac78705..5efe844e1a1 100644 --- a/go/cmd/vtctldclient/command/root_test.go +++ b/go/cmd/vtctldclient/command/root_test.go @@ -17,13 +17,19 @@ limitations under the License. package command_test import ( + "context" + "fmt" "os" + "strings" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "vitess.io/vitess/go/cmd/vtctldclient/command" + "vitess.io/vitess/go/vt/topo" + "vitess.io/vitess/go/vt/topo/memorytopo" "vitess.io/vitess/go/vt/vtctl/localvtctldclient" vtctlservicepb "vitess.io/vitess/go/vt/proto/vtctlservice" @@ -52,3 +58,64 @@ func TestRoot(t *testing.T) { assert.Contains(t, err.Error(), "unknown command") }) } + +// TestRootWithInternalVtctld tests that the internal VtctldServer +// implementation -- used with --server=internal -- works for +// commands as expected. +func TestRootWithInternalVtctld(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + cell := "zone1" + ts, factory := memorytopo.NewServerAndFactory(ctx, cell) + topo.RegisterFactory("test", factory) + command.VtctldClientProtocol = "local" + baseArgs := []string{"vtctldclient", "--server", "internal", "--topo-implementation", "test"} + + args := append([]string{}, os.Args...) + protocol := command.VtctldClientProtocol + t.Cleanup(func() { + ts.Close() + os.Args = append([]string{}, args...) + command.VtctldClientProtocol = protocol + }) + + testCases := []struct { + command string + args []string + expectErr string + }{ + { + command: "AddCellInfo", + args: []string{"--root", fmt.Sprintf("/vitess/%s", cell), "--server-address", "", cell}, + expectErr: "node already exists", // Cell already exists + }, + { + command: "GetTablets", + }, + { + command: "NoCommandDrJones", + expectErr: "unknown command", // Invalid command + }, + } + + for _, tc := range testCases { + t.Run(tc.command, func(t *testing.T) { + defer func() { + // Reset the OS args. + os.Args = append([]string{}, args...) + }() + + os.Args = append(baseArgs, tc.command) + os.Args = append(os.Args, tc.args...) + + err := command.Root.Execute() + if tc.expectErr != "" { + if !strings.Contains(err.Error(), tc.expectErr) { + t.Errorf(fmt.Sprintf("%s error = %v, expectErr = %v", tc.command, err, tc.expectErr)) + } + } else { + require.NoError(t, err, "unexpected error: %v", err) + } + }) + } +} diff --git a/go/flags/endtoend/vtctldclient.txt b/go/flags/endtoend/vtctldclient.txt index f70f17f8136..86c1bb3bfa2 100644 --- a/go/flags/endtoend/vtctldclient.txt +++ b/go/flags/endtoend/vtctldclient.txt @@ -1,4 +1,8 @@ Executes a cluster management command on the remote vtctld server. +If there are no running vtctld servers -- for example when bootstrapping +a new Vitess cluster -- you can specify a --server value of 'internal'. +When doing so, you would use the --topo* flags so that the client can +connect directly to the topo server(s). Usage: vtctldclient [flags] @@ -126,6 +130,9 @@ Flags: --security_policy string the name of a registered security policy to use for controlling access to URLs - empty means allow all for anyone (built-in policies: deny-all, read-only) --server string server to use for the connection (required) --stderrthreshold severityFlag logs at or above this threshold go to stderr (default 1) + --topo-global-root string the path of the global topology data in the global topology server (default "/vitess/global") + --topo-global-server-address strings the address of the global topology server(s) (default [localhost:2379]) + --topo-implementation string the topology implementation to use (default "etcd2") -v, --v Level log level for V logs --version version for vtctldclient --vmodule vModuleFlag comma-separated list of pattern=N settings for file-filtered logging diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index 25b711e1019..21c4dc272f6 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -2018,7 +2018,7 @@ func (s *VtctldServer) GetTablets(ctx context.Context, req *vtctldatapb.GetTable tablets := make([]*topodatapb.Tablet, 0, len(tabletMap)) for _, ti := range tabletMap { - if req.TabletType != 0 && ti.Type != req.TabletType { + if req.TabletType != topodatapb.TabletType_UNKNOWN && ti.Type != req.TabletType { continue } adjustTypeForStalePrimary(ti, truePrimaryTimestamp) @@ -2086,7 +2086,7 @@ func (s *VtctldServer) GetTablets(ctx context.Context, req *vtctldatapb.GetTable if req.Keyspace != "" && tablet.Keyspace != req.Keyspace { continue } - if req.TabletType != 0 && tablet.Type != req.TabletType { + if req.TabletType != topodatapb.TabletType_UNKNOWN && tablet.Type != req.TabletType { continue } diff --git a/go/vt/vttablet/tabletmanager/vreplication/vcopier_atomic.go b/go/vt/vttablet/tabletmanager/vreplication/vcopier_atomic.go index 4da072e3955..fe92f284ce8 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vcopier_atomic.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vcopier_atomic.go @@ -303,7 +303,6 @@ func (vc *vcopier) copyAll(ctx context.Context, settings binlogplayer.VRSettings // deleteCopyState deletes the copy state entry for a table, signifying that the copy phase is complete for that table. func (vc *vcopier) deleteCopyState(tableName string) error { log.Infof("Deleting copy state for table %s", tableName) - //FIXME get sidecar db name delQuery := fmt.Sprintf("delete from _vt.copy_state where table_name=%s and vrepl_id = %d", encodeString(tableName), vc.vr.id) if _, err := vc.vr.dbClient.Execute(delQuery); err != nil { return err From 29a9bf4ef4ceaf503ece831a79ca2b73d79efea1 Mon Sep 17 00:00:00 2001 From: Arthur Schreiber Date: Thu, 16 Nov 2023 16:37:21 +0100 Subject: [PATCH 39/39] Add support for new lock syntax in MySQL8 (#13965) Signed-off-by: Patrick Carnahan Signed-off-by: Arthur Schreiber Signed-off-by: Harshit Gangal Co-authored-by: Patrick Carnahan Co-authored-by: Harshit Gangal --- go/vt/sqlparser/ast_funcs.go | 10 + go/vt/sqlparser/constants.go | 16 +- go/vt/sqlparser/keywords.go | 3 + go/vt/sqlparser/parse_test.go | 10 + go/vt/sqlparser/sql.go | 11774 ++++++++-------- go/vt/sqlparser/sql.y | 20 + go/vt/sqlparser/testdata/union_cases.txt | 2 +- .../planbuilder/testdata/lock_cases.json | 90 + 8 files changed, 6064 insertions(+), 5861 deletions(-) diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index 4885f33ccec..5ab4e0ba98c 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -1325,6 +1325,16 @@ func (lock Lock) ToString() string { return NoLockStr case ForUpdateLock: return ForUpdateStr + case ForUpdateLockNoWait: + return ForUpdateNoWaitStr + case ForUpdateLockSkipLocked: + return ForUpdateSkipLockedStr + case ForShareLock: + return ForShareStr + case ForShareLockNoWait: + return ForShareNoWaitStr + case ForShareLockSkipLocked: + return ForShareSkipLockedStr case ShareModeLock: return ShareModeStr default: diff --git a/go/vt/sqlparser/constants.go b/go/vt/sqlparser/constants.go index 30effe51586..56e8d4637b0 100644 --- a/go/vt/sqlparser/constants.go +++ b/go/vt/sqlparser/constants.go @@ -27,9 +27,14 @@ const ( SQLCalcFoundRowsStr = "sql_calc_found_rows " // Select.Lock - NoLockStr = "" - ForUpdateStr = " for update" - ShareModeStr = " lock in share mode" + NoLockStr = "" + ForUpdateStr = " for update" + ForUpdateNoWaitStr = " for update nowait" + ForUpdateSkipLockedStr = " for update skip locked" + ForShareStr = " for share" + ForShareNoWaitStr = " for share nowait" + ForShareSkipLockedStr = " for share skip locked" + ShareModeStr = " lock in share mode" // Select.Cache SQLCacheStr = "sql_cache " @@ -516,6 +521,11 @@ const ( NoLock Lock = iota ForUpdateLock ShareModeLock + ForShareLock + ForShareLockNoWait + ForShareLockSkipLocked + ForUpdateLockNoWait + ForUpdateLockSkipLocked ) // Constants for Enum Type - TrimType diff --git a/go/vt/sqlparser/keywords.go b/go/vt/sqlparser/keywords.go index 36c329d8e0a..6eaa41a0386 100644 --- a/go/vt/sqlparser/keywords.go +++ b/go/vt/sqlparser/keywords.go @@ -413,6 +413,7 @@ var keywords = []keyword{ {"localtimestamp", LOCALTIMESTAMP}, {"locate", LOCATE}, {"lock", LOCK}, + {"locked", LOCKED}, {"logs", LOGS}, {"long", UNUSED}, {"longblob", LONGBLOB}, @@ -457,6 +458,7 @@ var keywords = []keyword{ {"none", NONE}, {"not", NOT}, {"now", NOW}, + {"nowait", NOWAIT}, {"no_write_to_binlog", NO_WRITE_TO_BINLOG}, {"nth_value", NTH_VALUE}, {"ntile", NTILE}, @@ -575,6 +577,7 @@ var keywords = []keyword{ {"signal", UNUSED}, {"signed", SIGNED}, {"simple", SIMPLE}, + {"skip", SKIP}, {"slow", SLOW}, {"smallint", SMALLINT}, {"snapshot", SNAPSHOT}, diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index ce5a5e14a3a..a6c9d9ccf88 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -693,8 +693,18 @@ var ( input: "select /* distinct */ distinct 1 from t", }, { input: "select /* straight_join */ straight_join 1 from t", + }, { + input: "select /* for share */ 1 from t for share", + }, { + input: "select /* for share */ 1 from t for share nowait", + }, { + input: "select /* for share */ 1 from t for share skip locked", }, { input: "select /* for update */ 1 from t for update", + }, { + input: "select /* for update */ 1 from t for update nowait", + }, { + input: "select /* for update */ 1 from t for update skip locked", }, { input: "select /* lock in share mode */ 1 from t lock in share mode", }, { diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index d4949c76839..aef17b630f1 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -1515,7 +1515,7 @@ var yyExca = [...]int{ 243, 813, -2, 811, -1, 122, - 240, 1588, + 240, 1593, -2, 133, -1, 124, 1, 160, @@ -1534,76 +1534,76 @@ var yyExca = [...]int{ 164, 41, -2, 45, -1, 939, - 87, 1605, + 87, 1610, -2, 1459, -1, 940, - 87, 1606, - 223, 1610, + 87, 1611, + 223, 1615, -2, 1460, -1, 941, - 223, 1609, + 223, 1614, -2, 42, -1, 1024, 60, 887, -2, 902, - -1, 1111, + -1, 1112, 251, 43, 256, 43, -2, 419, - -1, 1196, + -1, 1197, 1, 580, 732, 580, -2, 167, - -1, 1499, - 223, 1610, + -1, 1500, + 223, 1615, -2, 1460, - -1, 1708, + -1, 1709, 60, 888, -2, 907, - -1, 1709, + -1, 1710, 60, 889, -2, 908, - -1, 1760, + -1, 1765, 136, 167, 178, 167, 347, 167, -2, 458, - -1, 1841, + -1, 1846, 137, 408, 246, 408, -2, 512, - -1, 1850, + -1, 1855, 251, 44, 256, 44, -2, 420, - -1, 2288, - 223, 1614, - -2, 1608, - -1, 2289, - 223, 1610, - -2, 1606, - -1, 2389, + -1, 2293, + 223, 1619, + -2, 1613, + -1, 2294, + 223, 1615, + -2, 1611, + -1, 2396, 136, 167, 178, 167, 347, 167, -2, 459, - -1, 2396, + -1, 2403, 26, 188, -2, 190, - -1, 2850, + -1, 2857, 78, 98, 88, 98, -2, 966, - -1, 2919, + -1, 2926, 707, 698, -2, 672, - -1, 3127, - 50, 1556, - -2, 1550, - -1, 3942, + -1, 3134, + 50, 1561, + -2, 1555, + -1, 3949, 707, 698, -2, 686, - -1, 4029, + -1, 4036, 90, 630, 95, 630, 105, 630, @@ -1649,1131 +1649,1134 @@ var yyExca = [...]int{ 219, 630, 220, 630, 221, 630, - -2, 1977, + -2, 1982, } const yyPrivate = 57344 -const yyLast = 55495 +const yyLast = 55650 var yyAct = [...]int{ - 955, 3604, 3605, 87, 3603, 4027, 4104, 3923, 943, 3279, - 4117, 4008, 4071, 1264, 950, 3555, 942, 2082, 4072, 2386, - 1969, 3996, 3907, 3832, 2317, 3179, 3408, 3186, 3228, 2094, - 3237, 3242, 3239, 3238, 3236, 3241, 1763, 1262, 3140, 2025, - 3905, 3240, 5, 3542, 2746, 2319, 3257, 3080, 2460, 737, - 3194, 3256, 3144, 3141, 3453, 3447, 3642, 2983, 2341, 3128, - 2810, 731, 3439, 764, 904, 2357, 903, 2423, 908, 3973, - 3259, 42, 1819, 732, 2884, 3286, 2965, 2916, 2448, 1723, - 3473, 2428, 2886, 2885, 2360, 2374, 1022, 1073, 87, 2491, - 2361, 1041, 163, 1143, 1019, 2835, 1866, 2816, 2362, 41, - 3138, 2272, 2786, 1710, 2802, 2240, 43, 1022, 2284, 2239, - 2078, 2117, 2469, 2957, 2447, 2033, 149, 2349, 2430, 1848, - 1106, 1101, 1083, 2508, 2877, 1752, 2852, 1732, 2364, 1119, - 100, 2823, 1689, 1511, 104, 2121, 2337, 105, 2053, 1438, - 1423, 1965, 1855, 747, 3143, 1077, 1080, 2445, 1109, 1112, - 1947, 1081, 2419, 2420, 1021, 1107, 1025, 1108, 1751, 1058, - 1737, 1060, 2190, 735, 3637, 2129, 1031, 2148, 1040, 742, - 3895, 2784, 2342, 107, 1471, 1043, 1028, 2024, 1252, 85, - 1977, 1814, 167, 127, 125, 126, 99, 1026, 1192, 905, - 1495, 1017, 1840, 132, 1027, 133, 1053, 741, 1029, 734, - 98, 4105, 1260, 3543, 84, 1238, 106, 1515, 2462, 2463, - 2464, 3958, 1520, 93, 3225, 2285, 2462, 2939, 2938, 2506, - 2907, 3535, 1016, 1048, 1052, 4054, 2973, 2974, 3954, 2040, - 1034, 3953, 2314, 2315, 669, 128, 3608, 3959, 724, 2039, - 1074, 3498, 2038, 2037, 2036, 1145, 134, 1148, 2035, 2008, - 1208, 1685, 666, 2554, 667, 2782, 4048, 1434, 1162, 1163, - 1164, 1932, 1167, 1168, 1169, 1170, 1123, 3124, 1173, 1174, - 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, - 1185, 1186, 1187, 1188, 1189, 1122, 1067, 1035, 1156, 1068, - 1020, 1018, 2812, 1717, 1209, 3608, 2, 4075, 1090, 1085, - 2495, 1098, 3084, 3932, 1149, 1152, 1153, 128, 1097, 1096, - 1095, 725, 3247, 2909, 1455, 4127, 4070, 4095, 3413, 3412, - 1042, 709, 4110, 3607, 2932, 709, 727, 3908, 4058, 1066, - 1070, 907, 3954, 4056, 95, 2747, 95, 909, 95, 3247, - 1165, 111, 112, 113, 2494, 116, 1015, 4109, 122, 190, - 2045, 191, 3244, 4057, 661, 703, 3305, 2056, 4055, 1066, - 1070, 907, 3828, 3827, 1147, 1146, 722, 723, 3245, 190, - 703, 4085, 3838, 129, 703, 128, 1010, 1011, 1012, 1013, - 4052, 95, 3607, 1024, 3567, 2929, 172, 959, 960, 961, - 1425, 3556, 3997, 129, 3251, 3245, 3548, 1099, 4005, 3549, - 2488, 3837, 2087, 4032, 703, 3325, 172, 2563, 1829, 3176, - 3177, 1055, 1056, 700, 959, 960, 961, 2783, 86, 3566, - 1094, 3251, 1201, 1202, 3175, 2493, 2381, 2382, 86, 2866, - 1089, 2972, 86, 1091, 1753, 2861, 1754, 4009, 2860, 4037, - 2560, 2862, 169, 2017, 2018, 170, 2380, 2956, 1228, 1257, - 1452, 1008, 1453, 1454, 1204, 1007, 2826, 4035, 1233, 1234, - 3924, 685, 169, 1229, 1216, 170, 4041, 4042, 189, 1217, - 1973, 1435, 2561, 1222, 683, 3196, 3197, 3655, 1092, 1216, - 2873, 2827, 4036, 3018, 1217, 2399, 2398, 703, 189, 3313, - 1191, 3311, 1215, 2439, 1214, 3283, 95, 3281, 2819, 2820, - 703, 703, 2552, 2316, 717, 703, 95, 2016, 3248, 2020, - 95, 721, 1749, 4013, 680, 715, 2433, 2942, 3287, 2958, - 1693, 2470, 3937, 695, 2917, 1953, 86, 1922, 3274, 88, - 2345, 4107, 1094, 2509, 1086, 3248, 3275, 3879, 690, 3880, - 4013, 1088, 1087, 2515, 2345, 1948, 2513, 1166, 693, 4076, - 1249, 1254, 1424, 1231, 1232, 1059, 1237, 1230, 1256, 1245, - 1197, 1247, 1235, 2960, 1255, 2511, 704, 1223, 3537, 3536, - 4077, 1923, 1236, 1924, 2533, 2555, 2556, 2558, 2557, 1172, - 1171, 704, 173, 1132, 3195, 704, 3812, 3284, 2512, 3282, - 1092, 179, 3533, 2530, 1696, 2531, 3198, 2532, 2516, 1244, - 1246, 2514, 173, 2473, 95, 1130, 1093, 1974, 1102, 3612, - 2358, 179, 1103, 1103, 1833, 704, 670, 4082, 672, 686, - 1141, 706, 1140, 705, 676, 1139, 674, 678, 687, 679, - 1138, 673, 1137, 684, 1136, 1135, 675, 688, 689, 692, - 696, 697, 698, 694, 691, 1142, 682, 707, 3019, 1069, - 1063, 1061, 4049, 2946, 2947, 1134, 1129, 3198, 4128, 1078, - 1114, 1472, 1486, 1486, 1115, 2432, 1151, 1078, 1078, 1966, - 2910, 1076, 1114, 2446, 1054, 2961, 1150, 3450, 3218, 1069, - 1063, 1061, 2499, 3302, 2498, 1473, 1474, 1475, 1476, 1477, - 1478, 1479, 1481, 1480, 1482, 1483, 1962, 1426, 704, 2941, - 1261, 1159, 1261, 1261, 1827, 1242, 1826, 3532, 1825, 1243, - 3083, 704, 704, 2927, 1963, 164, 704, 1823, 1093, 1248, - 1207, 660, 2343, 2344, 4050, 2522, 2518, 2520, 2521, 2519, - 2523, 2524, 1133, 1487, 1488, 164, 2343, 2344, 1750, 3920, - 1956, 3487, 1954, 1955, 1241, 1957, 1958, 3469, 2977, 2575, - 1022, 1496, 1501, 1502, 1131, 1505, 1507, 1508, 1509, 1510, - 2857, 1513, 1514, 1516, 1516, 2822, 1516, 1516, 1521, 1521, - 1521, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, - 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, - 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, - 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, - 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, - 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, - 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, - 1593, 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, - 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, - 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, - 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, - 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, - 1643, 1644, 1645, 1493, 3606, 1250, 3931, 1646, 2492, 1648, - 1649, 1650, 1651, 1652, 1417, 1418, 2908, 1489, 1490, 1491, - 1492, 1521, 1521, 1521, 1521, 1521, 1521, 1503, 1433, 1416, - 708, 3565, 3496, 3497, 1062, 1100, 1659, 1660, 1661, 1662, - 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, - 1497, 701, 1934, 1933, 1935, 1936, 1937, 956, 1439, 956, - 2875, 956, 165, 3606, 1062, 1506, 702, 1686, 4011, 177, - 1203, 1200, 2562, 4040, 1213, 1212, 2911, 1218, 1219, 1220, - 1221, 1517, 165, 1518, 1519, 3451, 3249, 3250, 2931, 177, - 3396, 1522, 1523, 1121, 2759, 4011, 89, 94, 1195, 3253, - 4010, 1258, 1259, 2436, 1158, 2561, 1854, 94, 1226, 2944, - 185, 94, 2964, 3249, 3250, 1716, 1121, 4039, 2787, 2789, - 1692, 2955, 2490, 2090, 2954, 1741, 3253, 4010, 1647, 1022, - 185, 1206, 2930, 1022, 1683, 3092, 1439, 3091, 1952, 1022, - 124, 2817, 668, 2437, 1121, 2387, 1486, 1483, 2586, 3174, - 2435, 1121, 1239, 166, 171, 168, 174, 175, 176, 178, - 180, 181, 182, 183, 4121, 1684, 1449, 1466, 1978, 184, - 186, 187, 188, 166, 171, 168, 174, 175, 176, 178, - 180, 181, 182, 183, 2438, 1037, 1717, 1253, 1121, 184, - 186, 187, 188, 3945, 2434, 3004, 1120, 1700, 1144, 119, - 3528, 1704, 1114, 1117, 1118, 94, 1078, 1021, 3303, 1211, - 1111, 1115, 3463, 2900, 2510, 1853, 1121, 2029, 1959, 1120, - 1755, 2122, 2122, 1702, 2595, 4086, 1703, 104, 2130, 1454, - 105, 1110, 1684, 1653, 1654, 1655, 1656, 1657, 1658, 3651, - 1453, 1454, 2131, 3503, 1449, 3502, 1690, 1120, 2047, 2049, - 2050, 2477, 1124, 1114, 1120, 1094, 1190, 1126, 1677, 1124, - 1114, 1127, 1125, 1863, 1126, 2586, 107, 2487, 1127, 1125, - 1862, 2967, 120, 2048, 1445, 2482, 2966, 1437, 2967, 1852, - 4078, 2485, 1128, 2966, 1132, 1130, 3488, 2788, 1949, 2482, - 1950, 1120, 1033, 1951, 2058, 4123, 1698, 1114, 1117, 1118, - 1240, 1078, 1830, 1831, 1832, 1111, 1115, 1846, 2059, 1484, - 1485, 2057, 1455, 1225, 2486, 3182, 1979, 4129, 2489, 1120, - 1194, 1157, 1701, 1719, 1227, 1154, 3820, 3975, 2484, 3913, - 1971, 1917, 1839, 1196, 3819, 3810, 1868, 1018, 1869, 1722, - 1871, 1873, 1699, 1020, 1877, 1879, 1881, 1883, 1885, 1858, - 3578, 1899, 1445, 1210, 3562, 1687, 3563, 1856, 1856, 1261, - 3183, 2157, 1746, 1747, 2567, 2568, 2569, 1472, 3577, 1907, - 1908, 1857, 3976, 2128, 3914, 1913, 1914, 1478, 1479, 1481, - 1480, 1482, 1483, 1822, 3185, 4119, 3510, 3509, 4120, 2634, - 4118, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, - 1482, 1483, 3180, 1849, 4130, 3499, 1942, 1836, 1837, 1455, - 1835, 1476, 1477, 1478, 1479, 1481, 1480, 1482, 1483, 3226, - 3196, 3197, 1860, 1940, 3214, 1193, 1455, 3181, 2882, 2881, - 1705, 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, 1482, - 1483, 1093, 1903, 1455, 959, 960, 961, 2880, 1452, 1895, - 1453, 1454, 1898, 2442, 1900, 1967, 1717, 3006, 1943, 2149, - 1929, 3187, 3320, 2127, 2151, 2984, 1455, 1927, 2156, 2152, - 1941, 1455, 2153, 2154, 2155, 1472, 1926, 2150, 2158, 2159, - 2160, 2161, 2162, 2163, 2164, 2165, 2166, 1939, 2622, 128, - 1097, 1096, 1095, 4091, 1717, 1925, 1915, 1828, 1909, 1473, - 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, 1482, 1483, - 4089, 1717, 1906, 1905, 1904, 1984, 1459, 1460, 1461, 1462, - 1463, 1464, 1465, 1457, 1928, 1875, 1261, 1261, 1717, 3195, - 1980, 1981, 1697, 1455, 3493, 709, 4079, 2277, 2006, 1455, - 87, 3198, 3278, 87, 1985, 1452, 1455, 1453, 1454, 2986, - 2592, 1992, 1993, 1994, 709, 4019, 1717, 2630, 2864, 709, - 1749, 2005, 1452, 1420, 1453, 1454, 2458, 2457, 1444, 1441, - 1442, 1443, 1448, 1450, 1447, 1455, 1446, 2456, 2455, 1452, - 3940, 1453, 1454, 2454, 2453, 3939, 1440, 3917, 1455, 2114, - 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, 1482, - 1483, 3916, 1452, 3915, 1453, 1454, 3815, 1452, 42, 1453, - 1454, 42, 2085, 2085, 2083, 2083, 2086, 4017, 1717, 2996, - 2995, 2994, 2632, 2591, 2988, 1717, 2992, 1982, 2987, 1455, - 2985, 1717, 1451, 1717, 1986, 2990, 1988, 1989, 1990, 1991, - 2808, 4106, 2051, 1995, 2989, 3799, 1444, 1441, 1442, 1443, - 1448, 1450, 1447, 3798, 1446, 2007, 3650, 3184, 3648, 4015, - 1717, 1726, 2991, 2993, 1440, 101, 4066, 1717, 3933, 1452, - 3574, 1453, 1454, 1717, 3846, 1452, 102, 1453, 1454, 1451, - 1717, 3845, 1452, 2168, 1453, 1454, 1683, 2106, 2095, 2096, - 2097, 2098, 2108, 2099, 2100, 2101, 2113, 2109, 2102, 2103, - 2110, 2111, 2112, 2104, 2105, 2107, 1682, 1727, 2808, 4004, - 3803, 1452, 1681, 1453, 1454, 1455, 85, 1684, 1680, 85, - 2030, 2055, 1455, 3507, 1452, 3492, 1453, 1454, 2013, 2014, - 1472, 1717, 3802, 1468, 3288, 1469, 3285, 1455, 3217, 2350, - 2351, 2808, 3983, 3554, 2062, 3216, 2808, 3979, 2918, 1470, - 1484, 1485, 1467, 2060, 1473, 1474, 1475, 1476, 1477, 1478, - 1479, 1481, 1480, 1482, 1483, 1452, 2891, 1453, 1454, 3966, - 1717, 2288, 3546, 3930, 3823, 1717, 2808, 3811, 2287, 2061, - 2878, 2063, 2064, 2065, 2066, 2067, 2068, 2070, 2072, 2073, - 2074, 2075, 2076, 2077, 1455, 2286, 1497, 2089, 1472, 1455, - 2976, 2132, 2133, 2134, 2135, 1679, 3892, 1717, 3546, 1717, - 2896, 2275, 2543, 2123, 2273, 2146, 1472, 2542, 2574, 2504, - 2167, 3841, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1481, - 1480, 1482, 1483, 2503, 2116, 2118, 2808, 3544, 2482, 1717, - 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, 1482, - 1483, 1452, 2340, 1453, 1454, 101, 2322, 2366, 1452, 2009, - 1453, 1454, 103, 2182, 1455, 2288, 102, 2277, 2291, 2292, - 1975, 2274, 2355, 1452, 1938, 1453, 1454, 2804, 3890, 1717, - 2276, 3467, 1717, 3887, 1717, 104, 1930, 110, 105, 2286, - 2714, 1717, 103, 2396, 954, 3207, 3206, 3188, 109, 1920, - 108, 3192, 3204, 3205, 2395, 110, 104, 1916, 3191, 105, - 3202, 3203, 3169, 2180, 1912, 2054, 109, 103, 108, 3202, - 3201, 1717, 2561, 2191, 2333, 2368, 1455, 103, 1911, 1083, - 1452, 1910, 1453, 1454, 1728, 1452, 1251, 1453, 1454, 2832, - 1717, 2483, 3193, 2405, 2406, 2407, 2408, 3189, 3869, 1717, - 2588, 2400, 3190, 2401, 2402, 2403, 2404, 2561, 2940, 2391, - 1034, 1455, 1083, 2390, 3462, 2321, 1818, 2921, 1717, 2411, - 2412, 2413, 2414, 2372, 2290, 1455, 1717, 2293, 2294, 2853, - 2327, 2309, 2328, 2914, 2915, 95, 1717, 109, 2853, 2808, - 2807, 2425, 2394, 2264, 2265, 2266, 2267, 2268, 2335, 2482, - 1452, 1451, 1453, 1454, 2471, 2824, 2431, 2824, 1455, 2353, - 3438, 1717, 86, 44, 45, 88, 1455, 3464, 2377, 2378, - 2376, 1455, 2588, 1717, 2088, 1717, 2831, 2393, 1067, 2392, - 3971, 1068, 92, 2332, 1455, 3944, 48, 76, 77, 1455, - 74, 78, 2854, 2468, 2808, 3431, 1717, 2441, 2311, 75, - 1455, 2854, 2856, 2832, 2191, 1455, 1451, 1730, 3417, 3428, - 1717, 2561, 1452, 3204, 1453, 1454, 1818, 1817, 1761, 1760, - 2426, 2415, 2417, 2418, 2422, 3112, 2379, 2832, 62, 3462, - 2440, 2832, 2476, 2444, 1123, 2479, 2452, 2480, 1455, 2588, - 95, 3139, 3426, 1717, 1856, 2714, 2496, 1452, 2619, 1453, - 1454, 4080, 3462, 1122, 2618, 2426, 3928, 2478, 2475, 2474, - 2582, 1452, 1455, 1453, 1454, 3511, 2482, 2465, 3388, 1717, - 1455, 2348, 2497, 1729, 2500, 1721, 2312, 190, 2501, 2502, - 2088, 2031, 2015, 1961, 3386, 1717, 83, 1748, 2912, 3382, - 1717, 1105, 1718, 1720, 1452, 1104, 1453, 1454, 4045, 3986, - 1023, 129, 1452, 151, 1453, 1454, 2566, 1452, 1891, 1453, - 1454, 3834, 1455, 1724, 172, 3800, 3512, 3513, 3514, 1455, - 1452, 2507, 1453, 1454, 3662, 1452, 1455, 1453, 1454, 3527, - 1507, 3524, 1507, 3505, 3330, 3329, 1452, 1820, 1453, 1454, - 1455, 1452, 2424, 1453, 1454, 162, 3379, 1717, 2578, 1455, - 3276, 150, 3231, 1455, 3377, 1717, 3229, 1455, 3227, 1892, - 1893, 1894, 2922, 4101, 2288, 2536, 2421, 2416, 2410, 1455, - 169, 2287, 2409, 170, 1452, 1455, 1453, 1454, 95, 1945, - 51, 54, 57, 56, 59, 1851, 73, 1847, 2581, 82, - 79, 1816, 1842, 1843, 161, 160, 189, 3807, 1452, 121, - 1453, 1454, 2888, 3375, 1717, 1195, 1452, 3280, 1453, 1454, - 3373, 1717, 3835, 61, 91, 90, 2551, 2439, 71, 72, - 58, 3474, 3475, 4099, 3371, 1717, 80, 81, 1455, 2887, - 2325, 2559, 2011, 3369, 1717, 4073, 3952, 3367, 1717, 1455, - 3874, 3365, 1717, 3477, 3223, 1455, 3222, 3221, 1452, 1455, - 1453, 1454, 3139, 3363, 1717, 1452, 2570, 1453, 1454, 3361, - 1717, 2055, 1452, 2901, 1453, 1454, 1455, 2537, 63, 64, - 1455, 65, 66, 67, 68, 1455, 1452, 2888, 1453, 1454, - 3480, 3161, 3479, 2572, 3948, 1452, 3162, 1453, 1454, 1452, - 3158, 1453, 1454, 1452, 2012, 1453, 1454, 155, 1844, 158, - 3157, 1841, 2584, 156, 157, 1452, 3836, 1453, 1454, 3515, - 173, 1452, 2583, 1453, 1454, 665, 2594, 3159, 2571, 179, - 2573, 2339, 3160, 3359, 1717, 1887, 1725, 2331, 3468, 2576, - 3529, 2577, 60, 3357, 1717, 2545, 2546, 3117, 2579, 1455, - 2548, 3116, 3912, 3163, 1455, 2841, 2842, 2758, 3641, 2549, - 3355, 1717, 1455, 3643, 3353, 1717, 3516, 3517, 3518, 3351, - 1717, 3129, 3131, 3455, 1452, 3126, 1453, 1454, 1455, 2628, - 3132, 3454, 1888, 1889, 1890, 1452, 1455, 1453, 1454, 2790, - 1455, 1452, 3458, 1453, 1454, 1452, 1455, 1453, 1454, 726, - 3632, 1455, 3631, 2892, 1960, 1038, 1006, 1022, 2085, 3200, - 2083, 2793, 1452, 1039, 1453, 1454, 1452, 2871, 1453, 1454, - 1455, 1452, 3296, 1453, 1454, 1455, 1161, 1160, 2829, 2830, - 2130, 101, 89, 3349, 1717, 1455, 2791, 2366, 3335, 1717, - 1022, 2849, 102, 2887, 2131, 101, 3318, 1717, 2970, 2928, - 3630, 2601, 103, 164, 3460, 2794, 102, 2796, 1419, 129, - 2350, 2351, 2779, 1717, 103, 2054, 4115, 2828, 2616, 2809, - 2777, 1717, 3219, 2540, 2752, 1717, 4024, 3929, 3830, 3199, - 2729, 1717, 2845, 1455, 110, 1452, 2883, 1453, 1454, 2336, - 1452, 2529, 1453, 1454, 2528, 109, 42, 108, 1452, 2527, - 1453, 1454, 2526, 1455, 3482, 2846, 103, 2805, 2848, 2721, - 1717, 1690, 2818, 2525, 1452, 2781, 1453, 1454, 3440, 2712, - 1717, 2847, 1452, 1455, 1453, 1454, 1452, 1455, 1453, 1454, - 2874, 2876, 1452, 2801, 1453, 1454, 1684, 1452, 2565, 1453, - 1454, 94, 1455, 3115, 1046, 1047, 2821, 108, 109, 159, - 2806, 3114, 2867, 3900, 2926, 3899, 1452, 2851, 1453, 1454, - 3877, 1452, 3649, 1453, 1454, 1455, 110, 2710, 1717, 1455, - 2855, 1452, 3647, 1453, 1454, 2858, 3646, 109, 2431, 108, - 2865, 4102, 2868, 3639, 3525, 1455, 3459, 2697, 1717, 3457, - 2937, 1455, 2125, 3232, 2466, 1834, 2890, 2126, 1455, 110, - 1045, 2893, 2894, 1455, 3638, 2879, 3448, 2695, 1717, 1455, - 109, 2693, 1717, 2824, 1455, 4103, 4102, 4103, 2889, 1452, - 3918, 1453, 1454, 3616, 2804, 3491, 2691, 1717, 3020, 2620, - 1455, 2897, 2323, 2186, 2902, 2903, 2904, 1742, 2898, 1452, - 1734, 1453, 1454, 114, 115, 2934, 1036, 70, 2028, 2689, - 1717, 10, 1839, 2687, 1717, 2026, 3, 152, 9, 1452, - 153, 1453, 1454, 1452, 97, 1453, 1454, 2923, 2924, 2685, - 1717, 2027, 1455, 2913, 8, 3433, 2980, 2981, 1452, 2933, - 1453, 1454, 2683, 1717, 1, 1014, 1422, 2681, 1717, 1455, - 165, 1421, 3495, 2679, 1717, 1455, 4034, 177, 2677, 1717, - 681, 1452, 2313, 1453, 1454, 1452, 1688, 1453, 1454, 4074, - 4030, 2997, 2959, 2270, 2675, 1717, 4031, 1931, 2978, 1455, - 1921, 1452, 2962, 1453, 1454, 3557, 2238, 1452, 3831, 1453, - 1454, 3235, 1455, 2472, 1452, 3523, 1453, 1454, 185, 1452, - 2429, 1453, 1454, 2303, 1113, 1452, 154, 1453, 1454, 2388, - 1452, 2389, 1453, 1454, 3999, 1455, 2673, 1717, 2935, 118, - 1718, 2310, 1071, 1455, 117, 2998, 1452, 1116, 1453, 1454, - 3001, 1224, 2467, 2671, 1717, 3547, 2872, 2397, 1767, 2669, - 1717, 166, 171, 168, 174, 175, 176, 178, 180, 181, - 182, 183, 1765, 1766, 1764, 2334, 1455, 184, 186, 187, - 188, 1769, 1768, 2667, 1717, 3304, 2621, 3395, 1452, 2979, - 1453, 1454, 2019, 3022, 716, 2844, 2665, 1717, 3078, 710, - 2968, 1715, 1711, 2969, 192, 1452, 1756, 1453, 1454, 1735, - 3409, 1452, 1155, 1453, 1454, 671, 1712, 3208, 2505, 2663, - 1717, 677, 1504, 2010, 3113, 2859, 1065, 3429, 2982, 1057, - 2324, 2795, 1064, 3808, 3147, 1452, 2999, 1453, 1454, 3452, - 3125, 2329, 2330, 1714, 3085, 1713, 3127, 3096, 1452, 3087, - 1453, 1454, 2811, 3130, 3123, 2366, 3911, 1455, 3013, 3640, - 2658, 1717, 2275, 3984, 2275, 2273, 2869, 2273, 1731, 3416, - 3058, 1452, 2593, 1453, 1454, 2120, 1494, 2443, 3146, 1452, - 87, 1453, 1454, 2366, 2366, 2366, 2366, 2366, 1455, 3000, - 3068, 3069, 3070, 3071, 3072, 2365, 3611, 1455, 2046, 739, - 738, 736, 3086, 2366, 3088, 2797, 2366, 2825, 1458, 944, - 3096, 2785, 1452, 1743, 1453, 1454, 2836, 3095, 1455, 2834, - 3151, 1971, 2833, 2368, 2538, 3168, 1455, 2373, 3476, 3472, - 4026, 1455, 2367, 2363, 2803, 895, 894, 3111, 3107, 3120, - 748, 2654, 1717, 740, 1455, 730, 893, 892, 1025, 3262, - 3263, 2368, 2368, 2368, 2368, 2368, 3118, 1455, 2943, 3121, - 3277, 3133, 3134, 1455, 2945, 2870, 3273, 3108, 3109, 3110, - 3252, 2368, 3394, 3152, 2368, 1436, 3155, 3150, 1707, 1026, - 3260, 3390, 3153, 3154, 3119, 3156, 1027, 3170, 104, 3164, - 3171, 105, 3172, 1452, 1455, 1453, 1454, 1084, 3301, 3935, - 2564, 3324, 2652, 1717, 1706, 3942, 3243, 3541, 3224, 3178, - 2645, 1717, 2919, 2459, 1455, 2643, 1717, 69, 3210, 3060, - 3211, 3062, 46, 3209, 1452, 3906, 1453, 1454, 3327, 3972, - 887, 3212, 3213, 1452, 884, 1453, 1454, 3073, 3074, 3075, - 3076, 3326, 3136, 3261, 3264, 3613, 3265, 3323, 3614, 3615, - 2431, 1455, 3233, 3254, 1452, 3081, 1453, 1454, 3082, 3955, - 3956, 3271, 1452, 883, 1453, 1454, 3142, 1452, 3957, 1453, - 1454, 3142, 1455, 2175, 1432, 1429, 4047, 2021, 2775, 96, - 1452, 36, 1453, 1454, 35, 3289, 34, 33, 3292, 3291, - 32, 26, 25, 1452, 24, 1453, 1454, 23, 2774, 1452, - 3299, 1453, 1454, 22, 29, 19, 3309, 3306, 3307, 3255, - 3308, 21, 20, 3310, 18, 3312, 3246, 3314, 2837, 2840, - 2841, 2842, 2838, 4069, 2839, 2843, 4114, 123, 3474, 3475, - 1452, 55, 1453, 1454, 52, 2770, 1472, 50, 131, 130, - 1507, 53, 49, 1198, 1507, 2580, 47, 31, 30, 2585, - 1452, 17, 1453, 1454, 16, 15, 2769, 3234, 14, 13, - 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1481, 1480, 1482, - 1483, 12, 2589, 11, 2590, 3411, 7, 6, 39, 2597, - 38, 37, 3415, 2599, 2600, 28, 27, 1452, 40, 1453, - 1454, 3300, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, - 2614, 2615, 4, 2617, 2906, 2461, 0, 0, 1452, 0, - 1453, 1454, 0, 0, 0, 3145, 0, 0, 0, 0, - 2366, 0, 3441, 3442, 3444, 0, 2623, 2624, 2625, 2626, - 2627, 0, 2629, 3489, 3449, 0, 2631, 3456, 0, 0, - 2636, 2637, 728, 2638, 0, 1455, 2641, 0, 2642, 2644, - 2646, 2647, 2648, 2649, 2650, 2651, 2653, 2655, 2656, 2657, - 2659, 1455, 2661, 2662, 2664, 2666, 2668, 2670, 2672, 2674, - 2676, 2678, 2680, 2682, 2684, 2686, 2688, 2690, 2692, 2694, - 2696, 2698, 2699, 2700, 3483, 2702, 3478, 2704, 2368, 2706, - 2707, 3461, 2709, 2711, 2713, 3481, 3261, 3264, 2716, 3265, - 3446, 0, 2720, 3490, 3484, 0, 2725, 2726, 2727, 2728, - 3506, 0, 3508, 3294, 3295, 0, 0, 0, 0, 2739, - 2740, 2741, 2742, 2743, 2744, 3551, 3552, 2748, 2749, 2768, - 1455, 0, 0, 3471, 0, 2751, 3500, 3501, 2114, 3418, - 2757, 3420, 3421, 3422, 1455, 2767, 2760, 2761, 2762, 2763, - 2764, 1044, 3485, 3486, 1050, 1050, 0, 2771, 2772, 0, - 2773, 0, 0, 2776, 2778, 2334, 0, 2780, 0, 0, - 0, 1455, 0, 0, 0, 1455, 0, 2792, 0, 0, - 0, 1452, 0, 1453, 1454, 0, 1455, 0, 0, 3534, - 1455, 0, 0, 3538, 3539, 3540, 0, 1452, 0, 1453, - 1454, 1455, 3553, 2837, 2840, 2841, 2842, 2838, 0, 2839, - 2843, 0, 0, 0, 2766, 1455, 3569, 0, 3530, 3531, - 0, 0, 0, 0, 1455, 0, 0, 0, 2765, 0, - 0, 0, 1455, 0, 0, 0, 2106, 2095, 2096, 2097, - 2098, 2108, 2099, 2100, 2101, 2113, 2109, 2102, 2103, 2110, - 2111, 2112, 2104, 2105, 2107, 2756, 0, 1455, 0, 2755, - 0, 1455, 0, 0, 0, 0, 1452, 0, 1453, 1454, - 2754, 1455, 0, 0, 2753, 1455, 0, 0, 0, 0, - 1452, 1455, 1453, 1454, 0, 2750, 0, 0, 0, 1455, - 3629, 0, 3633, 3634, 1455, 0, 0, 0, 3619, 2745, - 3620, 3621, 3622, 1455, 3609, 0, 0, 1452, 2738, 1453, - 1454, 1452, 0, 1453, 1454, 3146, 2737, 87, 3635, 3146, - 0, 0, 1452, 0, 1453, 1454, 1452, 0, 1453, 1454, - 0, 1455, 0, 0, 0, 0, 0, 1452, 0, 1453, - 1454, 2736, 0, 3573, 0, 2735, 0, 2085, 0, 2083, - 3664, 1452, 3636, 1453, 1454, 2734, 3656, 3645, 3644, 2733, - 1452, 0, 1453, 1454, 0, 2732, 3652, 3654, 1452, 1455, - 1453, 1454, 0, 2731, 0, 0, 0, 0, 2730, 0, - 1455, 0, 0, 0, 3814, 42, 0, 2724, 0, 0, - 0, 3668, 0, 1452, 0, 1453, 1454, 1452, 0, 1453, - 1454, 0, 0, 0, 0, 0, 0, 1452, 0, 1453, - 1454, 1452, 0, 1453, 1454, 2723, 0, 1452, 0, 1453, - 1454, 0, 0, 0, 3806, 1452, 3805, 1453, 1454, 0, - 1452, 0, 1453, 1454, 0, 0, 3821, 0, 0, 1452, - 0, 1453, 1454, 3826, 3833, 3825, 0, 1715, 1711, 3804, - 0, 0, 0, 2722, 0, 3871, 3872, 3008, 3009, 3010, - 3011, 3012, 1712, 3658, 2719, 3665, 3666, 1452, 0, 1453, - 1454, 0, 0, 2085, 0, 2083, 3875, 3017, 0, 3816, - 3817, 3818, 0, 0, 0, 0, 0, 1708, 1709, 1714, - 0, 1713, 3600, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3142, 0, 0, 1452, 3146, 1453, 1454, 0, - 0, 3878, 0, 3660, 3809, 3881, 1452, 0, 1453, 1454, - 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, - 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1544, - 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, - 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1564, - 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 1574, - 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, - 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, - 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 1604, - 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, - 1615, 1616, 1617, 1618, 1619, 1621, 1622, 1623, 1624, 1625, - 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, - 1636, 1642, 1643, 1644, 1645, 1659, 1660, 1661, 1662, 1663, - 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 3922, - 3919, 3904, 3145, 3876, 3901, 3902, 3145, 3903, 1455, 0, - 0, 0, 1455, 3936, 0, 0, 0, 1455, 0, 0, - 0, 0, 0, 0, 1455, 0, 0, 0, 0, 3921, - 0, 87, 0, 0, 0, 3148, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1455, - 0, 0, 0, 3166, 0, 0, 0, 3925, 0, 0, - 0, 0, 3938, 0, 0, 0, 0, 3941, 0, 0, - 3943, 3813, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1455, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3910, 2718, 0, 0, 0, 2717, 0, 0, 42, - 0, 2715, 0, 0, 0, 0, 0, 0, 2708, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1456, 3961, 0, 3981, 3962, 0, 0, 0, - 87, 0, 0, 2705, 0, 0, 0, 3927, 0, 0, - 0, 0, 0, 0, 1452, 3970, 1453, 1454, 1452, 0, - 1453, 1454, 1512, 1452, 0, 1453, 1454, 3977, 0, 0, - 1452, 3987, 1453, 1454, 0, 2703, 4012, 0, 3998, 3985, - 0, 3946, 0, 3990, 3995, 3992, 3991, 3989, 3994, 0, - 0, 3298, 3833, 4001, 3993, 1452, 0, 1453, 1454, 0, - 0, 0, 0, 3145, 4022, 0, 0, 0, 42, 0, - 0, 0, 0, 3315, 3316, 4025, 3317, 4043, 3319, 3321, - 4033, 0, 4038, 0, 4051, 0, 0, 1452, 4012, 1453, - 1454, 4053, 3328, 0, 0, 4064, 0, 3332, 3333, 3334, - 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, 3345, - 3346, 3347, 3348, 3350, 3352, 3354, 3356, 3358, 3360, 3362, - 3364, 3366, 3368, 3370, 3372, 3374, 3376, 3378, 3380, 3381, - 3383, 3384, 3385, 3387, 1971, 4068, 3389, 4084, 3391, 3392, - 3393, 4083, 4094, 3397, 3398, 3399, 3400, 3401, 3402, 3403, - 3404, 3405, 3406, 3407, 2085, 4100, 2083, 4097, 4096, 4087, - 4098, 4093, 3414, 4063, 3982, 4012, 3419, 1455, 4108, 0, - 3423, 3424, 0, 3425, 3427, 4116, 3430, 3432, 3142, 3434, - 3435, 3436, 3437, 4124, 4122, 0, 1455, 3443, 0, 0, - 1455, 3950, 0, 0, 0, 0, 0, 0, 0, 3960, - 1455, 0, 0, 4133, 4134, 3872, 4132, 0, 0, 1455, - 0, 0, 2085, 1455, 2083, 4131, 0, 1455, 0, 0, - 3934, 0, 3465, 3466, 0, 1455, 3470, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2701, 4081, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2660, 0, 0, 0, 2640, 1691, 0, 0, 0, 0, - 0, 0, 0, 4059, 2639, 0, 0, 0, 0, 0, - 0, 0, 0, 2635, 0, 0, 0, 2633, 0, 0, - 0, 2598, 0, 1452, 0, 1453, 1454, 0, 1733, 2587, - 0, 0, 0, 0, 0, 0, 0, 0, 957, 0, - 2277, 0, 1452, 958, 1453, 1454, 1452, 0, 1453, 1454, - 0, 0, 3545, 2084, 663, 0, 1452, 0, 1453, 1454, - 0, 0, 0, 0, 0, 1452, 1821, 1453, 1454, 1452, - 0, 1453, 1454, 1452, 1009, 1453, 1454, 0, 0, 0, - 0, 1452, 0, 1453, 1454, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3564, 0, 0, - 3568, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1079, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3579, 964, 965, - 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, - 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, - 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, - 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 940, 0, 0, 0, 0, 0, 0, 0, - 0, 3602, 0, 0, 1976, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3610, 0, 0, 0, 0, 0, - 0, 0, 3617, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 955, 3611, 3612, 87, 3610, 4034, 4111, 3930, 4015, 3286, + 4124, 943, 4078, 1265, 950, 3562, 942, 2087, 4079, 2393, + 1974, 4003, 3914, 3839, 2322, 3186, 3415, 3193, 3235, 2099, + 3244, 3249, 3246, 3245, 3243, 3248, 1768, 1263, 3147, 3912, + 2030, 3247, 2753, 5, 3549, 2324, 3264, 3087, 2467, 737, + 3201, 3263, 3151, 3148, 3649, 3460, 3454, 2990, 2348, 3135, + 904, 764, 908, 2430, 903, 42, 3266, 2364, 1724, 3980, + 1824, 2817, 732, 2891, 3293, 2367, 2972, 2923, 2455, 2435, + 2892, 2498, 3446, 3480, 1074, 2893, 1022, 163, 87, 2381, + 1042, 2842, 1144, 1871, 2823, 1019, 2368, 41, 1711, 2369, + 2809, 2793, 2245, 2122, 2277, 2289, 2083, 1022, 43, 2244, + 3145, 2964, 2476, 2038, 2454, 2356, 1853, 2515, 149, 2437, + 1102, 2884, 1084, 1107, 1757, 2859, 1737, 2371, 1512, 1690, + 2126, 100, 2058, 104, 1439, 731, 2342, 1424, 105, 1970, + 1081, 1078, 1860, 747, 1113, 3150, 2452, 1952, 1021, 1082, + 1025, 1120, 2426, 2427, 1108, 2830, 1110, 1109, 1756, 1059, + 1742, 1061, 2195, 2153, 99, 1031, 3644, 2134, 1041, 1044, + 1496, 3902, 2791, 2349, 107, 742, 1472, 2029, 1253, 1028, + 2290, 1982, 85, 167, 127, 1026, 125, 1819, 132, 905, + 1017, 126, 1845, 133, 1193, 1054, 1027, 93, 741, 734, + 1029, 98, 1261, 4112, 3550, 1239, 106, 1516, 3232, 84, + 2469, 1521, 724, 3965, 2914, 1049, 1053, 2469, 2470, 2471, + 2946, 2945, 2513, 3542, 1016, 1937, 1440, 4061, 2980, 2981, + 3961, 1034, 2319, 2320, 2045, 669, 128, 3505, 2044, 3966, + 2043, 2042, 1149, 1075, 1146, 3960, 134, 2041, 2040, 2013, + 1686, 1209, 666, 2561, 667, 2789, 4055, 1163, 1164, 1165, + 3131, 1168, 1169, 1170, 1171, 1035, 3615, 1174, 1175, 1176, + 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, + 1187, 1188, 1189, 1190, 2, 725, 4082, 735, 1124, 2819, + 1069, 1018, 1068, 1123, 1210, 1020, 3615, 3091, 4102, 1435, + 2502, 3939, 1099, 2916, 1043, 4134, 4077, 95, 128, 1098, + 1157, 1097, 1150, 1153, 1154, 1728, 1096, 1091, 3420, 3254, + 1726, 3254, 3419, 1718, 4117, 727, 4065, 709, 703, 111, + 112, 113, 3251, 116, 1450, 909, 122, 1086, 95, 191, + 95, 1166, 661, 709, 2501, 1729, 3961, 1456, 1015, 4116, + 1727, 4064, 2345, 3614, 722, 723, 4063, 2061, 2344, 2939, + 3915, 95, 2754, 2050, 1010, 1011, 1012, 1013, 3312, 3835, + 1100, 1024, 703, 3834, 1148, 3252, 128, 3252, 1147, 2936, + 4092, 4062, 3845, 3614, 4059, 959, 960, 961, 3555, 1426, + 3574, 3556, 959, 960, 961, 1067, 1071, 907, 3563, 1056, + 1057, 3258, 4004, 3258, 4012, 2495, 1067, 1071, 907, 86, + 3844, 2092, 4039, 86, 3332, 700, 1834, 3183, 3184, 3573, + 1095, 2790, 1202, 1203, 86, 2868, 3182, 2979, 2867, 2388, + 2389, 2869, 2567, 2833, 1440, 4016, 2022, 2023, 2387, 2570, + 703, 2963, 1446, 1090, 2500, 1438, 1092, 1758, 1229, 1759, + 1008, 703, 1217, 4044, 1205, 1007, 3931, 1218, 2834, 1217, + 1234, 1235, 3662, 685, 1218, 1216, 2880, 1215, 3320, 2917, + 1978, 4042, 1230, 1223, 703, 2446, 683, 703, 1093, 3290, + 4048, 4049, 703, 1453, 3318, 1454, 1455, 95, 3025, 3203, + 3204, 95, 2406, 2405, 2559, 3944, 4043, 2021, 2440, 1258, + 2826, 2827, 95, 2321, 2568, 3288, 717, 2025, 721, 1192, + 2965, 4020, 715, 1436, 3294, 3255, 680, 3255, 4020, 1754, + 2352, 1694, 2949, 2924, 1167, 695, 1927, 86, 2516, 2477, + 88, 2529, 2525, 2527, 2528, 2526, 2530, 2531, 4083, 704, + 690, 3886, 1450, 3887, 2537, 1095, 2538, 1087, 2539, 3281, + 693, 1425, 4114, 1953, 1089, 1088, 2162, 3282, 2520, 4084, + 1473, 1246, 2522, 1248, 1236, 1250, 1231, 1224, 1232, 1233, + 1928, 3291, 1929, 1255, 1237, 2562, 2563, 2565, 2564, 2953, + 2954, 1238, 3309, 704, 1474, 1475, 1476, 1477, 1478, 1479, + 1480, 1482, 1481, 1483, 1484, 3544, 1198, 3289, 3202, 2967, + 2519, 1245, 1247, 1093, 3543, 95, 1094, 1979, 1257, 2540, + 3205, 1173, 1172, 2521, 1256, 2518, 3819, 2523, 670, 3540, + 672, 686, 1697, 706, 2480, 705, 676, 3619, 674, 678, + 687, 679, 1060, 673, 2365, 684, 1104, 1142, 675, 688, + 689, 692, 696, 697, 698, 694, 691, 2439, 682, 707, + 1446, 704, 4056, 3026, 2154, 1141, 1103, 1140, 1838, 2156, + 1104, 1139, 704, 2161, 2157, 1138, 3457, 2158, 2159, 2160, + 1137, 1136, 2155, 2163, 2164, 2165, 2166, 2167, 2168, 2169, + 2170, 2171, 1135, 1130, 1143, 704, 1079, 3205, 704, 4135, + 1079, 1116, 4089, 704, 1077, 1079, 1115, 1971, 1152, 2453, + 1262, 2968, 1262, 1262, 1115, 3090, 1055, 1243, 1151, 2506, + 2505, 1244, 2350, 2351, 1967, 1070, 1064, 1062, 1427, 1160, + 3225, 1249, 2948, 1832, 1831, 1830, 1070, 1064, 1062, 4057, + 2934, 1094, 1968, 1828, 3539, 1208, 1445, 1442, 1443, 1444, + 1449, 1451, 1448, 660, 1447, 1755, 1242, 1488, 1489, 3927, + 1022, 1497, 1502, 1503, 1441, 1506, 1508, 1509, 1510, 1511, + 3494, 1514, 1515, 1517, 1517, 2918, 1517, 1517, 1522, 1522, + 1522, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, + 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, + 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 1553, + 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, + 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, + 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, + 1594, 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, + 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, + 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, + 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, + 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, + 1644, 1645, 1646, 1494, 3938, 1251, 2915, 1647, 1101, 1649, + 1650, 1651, 1652, 1653, 1418, 1419, 1939, 1938, 1940, 1941, + 1942, 1522, 1522, 1522, 1522, 1522, 1522, 2499, 3503, 3504, + 956, 3572, 708, 703, 3613, 2951, 1660, 1661, 1662, 1663, + 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, + 1498, 1417, 1196, 701, 1445, 1442, 1443, 1444, 1449, 1451, + 1448, 956, 1447, 956, 3613, 1507, 4018, 1687, 702, 3189, + 1434, 1214, 1441, 4018, 3458, 1213, 2352, 1219, 1220, 1221, + 1222, 1518, 2938, 1519, 1520, 2443, 1487, 4047, 94, 1204, + 1523, 1524, 94, 3256, 3257, 3256, 3257, 89, 4017, 1133, + 1063, 1259, 1260, 94, 2569, 4017, 3260, 3310, 3260, 1201, + 1487, 1063, 1131, 1122, 3190, 1717, 1859, 1227, 3099, 2568, + 1693, 2991, 2971, 3403, 2962, 2444, 2937, 2961, 1684, 1022, + 3476, 4046, 2442, 1022, 2497, 1958, 2864, 2829, 3192, 1022, + 1122, 1490, 1491, 1492, 1493, 2794, 2796, 2766, 2095, 1746, + 1648, 1504, 1207, 1122, 2394, 3098, 3187, 1957, 124, 2824, + 668, 1487, 1484, 1685, 3181, 4128, 2445, 1718, 2593, 1240, + 1467, 1038, 2984, 1254, 3203, 3204, 2441, 1159, 2135, 1983, + 3952, 3188, 1477, 1478, 1479, 1480, 1482, 1481, 1483, 1484, + 1145, 1701, 2136, 3535, 3470, 1705, 2582, 2063, 2517, 119, + 2034, 1021, 1964, 2127, 1760, 2993, 94, 1122, 3011, 1095, + 1191, 2064, 1485, 1486, 2062, 3194, 1121, 1212, 2907, 2127, + 4093, 2602, 1703, 3658, 2494, 1858, 104, 1704, 1456, 1455, + 1685, 105, 1654, 1655, 1656, 1657, 1658, 1659, 1454, 1455, + 3510, 3509, 2484, 1121, 704, 1691, 2593, 3327, 1134, 1115, + 1118, 1119, 1868, 1079, 1867, 1857, 1121, 1112, 1116, 1678, + 2489, 1132, 1115, 1118, 1119, 1122, 1079, 107, 2350, 2351, + 1112, 1116, 120, 2492, 1195, 3003, 3002, 3001, 1111, 1133, + 2995, 4085, 2999, 3202, 2994, 2974, 2992, 1131, 2974, 1122, + 2973, 2997, 3495, 2973, 1033, 3205, 1699, 4136, 4130, 2493, + 2996, 1720, 1835, 1836, 1837, 1851, 3569, 1954, 3570, 1955, + 1121, 3827, 1956, 1718, 2795, 1125, 1115, 1241, 2998, 3000, + 1127, 1702, 1226, 2133, 1128, 1126, 1700, 1984, 3826, 1688, + 2496, 1976, 1922, 1228, 1873, 1844, 1874, 1018, 1876, 1878, + 3982, 1723, 1882, 1884, 1886, 1888, 1890, 1863, 1020, 1904, + 1961, 1197, 1959, 1960, 2489, 1962, 1963, 1456, 1718, 2282, + 1262, 1211, 1751, 1752, 1453, 2132, 1454, 1455, 1121, 1912, + 1913, 1947, 1862, 1125, 1115, 1918, 1919, 1456, 1127, 1194, + 1861, 1861, 1128, 1126, 4137, 3983, 4126, 1945, 1934, 4127, + 1827, 4125, 1121, 2491, 1158, 1094, 3817, 3285, 1155, 1456, + 1473, 3920, 2983, 1129, 1842, 2574, 2575, 2576, 1841, 1840, + 1854, 3191, 1479, 1480, 1482, 1481, 1483, 1484, 1706, 3585, + 2052, 2054, 2055, 1865, 1474, 1475, 1476, 1477, 1478, 1479, + 1480, 1482, 1481, 1483, 1484, 1946, 3584, 190, 1473, 3517, + 3516, 1469, 1718, 1470, 1908, 2053, 3921, 959, 960, 961, + 1900, 1944, 1933, 1903, 1972, 1905, 3506, 1471, 1485, 1486, + 1468, 129, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1482, + 1481, 1483, 1484, 1456, 172, 3233, 1473, 3221, 2889, 2888, + 2887, 2449, 2882, 4098, 1718, 1948, 1833, 1932, 1931, 1930, + 1920, 128, 1098, 1453, 1097, 1454, 1455, 1914, 2641, 1096, + 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1482, 1481, 1483, + 1484, 1911, 190, 1453, 1910, 1454, 1455, 1989, 1460, 1461, + 1462, 1463, 1464, 1465, 1466, 1458, 1909, 1262, 1262, 1456, + 169, 1985, 1986, 170, 1880, 1453, 129, 1454, 1455, 2011, + 1473, 87, 1698, 1421, 87, 1990, 3500, 709, 709, 172, + 1754, 2629, 1997, 1998, 1999, 1473, 189, 2581, 2871, 709, + 4086, 1456, 2010, 3947, 1474, 1475, 1476, 1477, 1478, 1479, + 1480, 1482, 1481, 1483, 1484, 1456, 2465, 2464, 3946, 1474, + 1475, 1476, 1477, 1478, 1479, 1480, 1482, 1481, 1483, 1484, + 2463, 2462, 2873, 1475, 1476, 1477, 1478, 1479, 1480, 1482, + 1481, 1483, 1484, 42, 3924, 169, 42, 3923, 170, 1453, + 1456, 1454, 1455, 2090, 2090, 2088, 2088, 2091, 3013, 1456, + 2282, 2461, 2460, 1456, 2279, 1731, 3922, 1456, 1987, 2815, + 4113, 189, 2589, 2281, 3822, 1991, 3806, 1993, 1994, 1995, + 1996, 3805, 2056, 101, 2000, 4096, 1718, 954, 4073, 1718, + 103, 3195, 3657, 101, 102, 3199, 2012, 1452, 1718, 4026, + 1718, 1473, 3198, 110, 102, 1453, 3655, 1454, 1455, 3581, + 173, 1732, 2815, 4011, 109, 1683, 108, 2815, 3990, 179, + 1682, 1684, 1681, 1456, 2173, 1474, 1475, 1476, 1477, 1478, + 1479, 1480, 1482, 1481, 1483, 1484, 3200, 1453, 3514, 1454, + 1455, 3196, 3499, 4024, 1718, 1718, 3197, 4022, 1718, 1718, + 3940, 1453, 4087, 1454, 1455, 2639, 1685, 2815, 3986, 1718, + 85, 2035, 2060, 85, 3295, 1452, 1718, 3973, 1718, 2018, + 2019, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1482, 1481, + 1483, 1484, 2119, 1456, 1718, 173, 1453, 3292, 1454, 1455, + 3553, 3937, 3853, 1456, 179, 1453, 2065, 1454, 1455, 1453, + 3224, 1454, 1455, 1453, 3223, 1454, 1455, 3899, 1718, 3830, + 1718, 3852, 2293, 2815, 3818, 3553, 1718, 3810, 2094, 2292, + 2066, 2898, 2068, 2069, 2070, 2071, 2072, 2073, 2075, 2077, + 2078, 2079, 2080, 2081, 2082, 2885, 2291, 1498, 1680, 1456, + 2121, 2123, 2550, 164, 2137, 2138, 2139, 2140, 2815, 3551, + 3809, 2278, 110, 2549, 2128, 2489, 1718, 2172, 2151, 1453, + 2511, 1454, 1455, 109, 2510, 108, 2347, 3897, 1718, 3474, + 1718, 3561, 1456, 2327, 103, 2721, 1718, 3894, 1718, 2925, + 2111, 2100, 2101, 2102, 2103, 2113, 2104, 2105, 2106, 2118, + 2114, 2107, 2108, 2115, 2116, 2117, 2109, 2110, 2112, 3214, + 3213, 2903, 2373, 2014, 2187, 1980, 2296, 2297, 1456, 2067, + 2293, 3211, 3212, 3209, 3210, 3209, 3208, 2362, 164, 1453, + 103, 1454, 1455, 3876, 1718, 104, 2280, 2839, 1718, 1453, + 105, 1454, 1455, 1718, 2291, 2568, 2947, 1456, 2403, 1823, + 2928, 2921, 2922, 2815, 2814, 1456, 104, 2811, 2637, 2595, + 1718, 105, 1943, 2185, 2059, 2860, 3445, 1718, 109, 1456, + 2338, 1935, 103, 2196, 2375, 2093, 1718, 2490, 1456, 1925, + 2599, 2838, 1921, 1917, 1084, 1453, 1456, 1454, 1455, 1718, + 2295, 1916, 1915, 2298, 2299, 2860, 1823, 1822, 2412, 2413, + 2414, 2415, 3438, 1718, 2407, 1733, 2408, 2409, 2410, 2411, + 2314, 2398, 1034, 2397, 1766, 1765, 2326, 1084, 1453, 1252, + 1454, 1455, 2418, 2419, 2420, 2421, 2379, 2831, 2861, 2831, + 2595, 2332, 1718, 2333, 2402, 2489, 2839, 1452, 2863, 3435, + 1718, 3146, 2432, 2269, 2270, 2271, 2272, 2273, 2340, 2337, + 2401, 3469, 3469, 2598, 1453, 1452, 1454, 1455, 2861, 2478, + 3471, 2438, 3433, 1718, 2360, 1456, 4074, 3176, 2568, 1456, + 3395, 1718, 3978, 2384, 2385, 2383, 1789, 2568, 3951, 1456, + 2815, 2400, 2839, 1453, 2399, 1454, 1455, 1069, 3424, 1068, + 165, 1453, 3211, 1454, 1455, 2475, 3119, 177, 2316, 2839, + 2448, 3469, 2386, 2595, 2196, 1453, 2721, 1454, 1455, 2626, + 1456, 2625, 2489, 2472, 1453, 2355, 1454, 1455, 1722, 2317, + 2093, 2433, 1453, 2036, 1454, 1455, 2422, 2424, 2425, 2429, + 2020, 1023, 1966, 2447, 2483, 2451, 1753, 2486, 185, 2487, + 2459, 1456, 1106, 1105, 95, 1456, 4052, 3993, 2503, 3393, + 1718, 1456, 3236, 3389, 1718, 3841, 2433, 2482, 1456, 2481, + 1725, 1124, 2485, 3386, 1718, 165, 1123, 3807, 3669, 3534, + 3531, 1861, 177, 3512, 3337, 2507, 3336, 2504, 1825, 2508, + 2509, 166, 171, 168, 174, 175, 176, 178, 180, 181, + 182, 183, 1719, 1721, 3384, 1718, 2431, 184, 186, 187, + 188, 1453, 3283, 1454, 1455, 1453, 3238, 1454, 1455, 95, + 3234, 2573, 2929, 185, 2428, 1453, 2423, 1454, 1455, 2417, + 1456, 2416, 1777, 1950, 2514, 3382, 1718, 1856, 3287, 3380, + 1718, 1852, 1821, 121, 2119, 1508, 3935, 1508, 2894, 2895, + 1196, 3842, 3378, 1718, 3481, 3482, 1453, 3518, 1454, 1455, + 1896, 2446, 2330, 2585, 4108, 4106, 166, 171, 168, 174, + 175, 176, 178, 180, 181, 182, 183, 3522, 2543, 2293, + 4080, 3959, 184, 186, 187, 188, 2292, 1453, 3881, 1454, + 1455, 1453, 1456, 1454, 1455, 3484, 2895, 1453, 1456, 1454, + 1455, 3230, 2016, 2588, 1453, 3487, 1454, 1455, 3519, 3520, + 3521, 1897, 1898, 1899, 3376, 1718, 1790, 3229, 3228, 3146, + 2908, 2544, 2357, 2358, 3523, 3524, 3525, 1456, 2558, 3486, + 2844, 2847, 2848, 2849, 2845, 1456, 2846, 2850, 3165, 1456, + 3164, 2566, 2111, 2100, 2101, 2102, 2103, 2113, 2104, 2105, + 2106, 2118, 2114, 2107, 2108, 2115, 2116, 2117, 2109, 2110, + 2112, 3955, 3168, 1456, 2017, 2577, 1453, 3169, 1454, 1455, + 3166, 3170, 1456, 2848, 2849, 3167, 2060, 3814, 1803, 1806, + 1807, 1808, 1809, 1810, 1811, 1456, 1812, 1813, 1815, 1816, + 1814, 1817, 1818, 1791, 1792, 1793, 1794, 1775, 1776, 1804, + 3843, 1778, 665, 1779, 1780, 1781, 1782, 1783, 1784, 1785, + 1786, 1787, 3536, 1456, 1788, 1795, 1796, 1797, 1798, 3848, + 1799, 1800, 1801, 1802, 2890, 1456, 2601, 2346, 1453, 1730, + 1454, 1455, 2336, 2578, 1453, 2580, 1454, 1455, 3475, 3919, + 1892, 1456, 1036, 1735, 2583, 1456, 2584, 3374, 1718, 1456, + 2552, 2553, 3124, 2586, 1456, 2555, 3372, 1718, 3136, 3138, + 3123, 3648, 2765, 1453, 2556, 1454, 1455, 3139, 3650, 3370, + 1718, 1453, 1456, 1454, 1455, 1453, 726, 1454, 1455, 2635, + 3465, 3639, 1456, 3638, 3462, 1039, 1456, 1893, 1894, 1895, + 3133, 1037, 3461, 1040, 2797, 3207, 1965, 3368, 1718, 1453, + 1006, 1454, 1455, 2878, 2135, 2899, 1162, 1161, 1453, 1734, + 1454, 1455, 1022, 2090, 3303, 2088, 2800, 2894, 2136, 2977, + 1456, 1453, 2579, 1454, 1455, 3366, 1718, 1420, 1456, 3364, + 1718, 3637, 2935, 3362, 1718, 2836, 2837, 129, 3360, 1718, + 3467, 2798, 101, 101, 2373, 2357, 2358, 1022, 2856, 1453, + 103, 1454, 1455, 102, 102, 2608, 3358, 1718, 103, 4122, + 3226, 1453, 2547, 1454, 1455, 1456, 3356, 1718, 2059, 4031, + 3342, 1718, 2623, 3936, 3837, 2835, 2816, 1453, 110, 1454, + 1455, 1453, 3206, 1454, 1455, 1453, 1456, 1454, 1455, 109, + 1453, 108, 1454, 1455, 1456, 2852, 3447, 42, 2341, 1456, + 103, 1047, 1048, 2536, 3325, 1718, 2853, 2812, 1453, 2855, + 1454, 1455, 2786, 1718, 2572, 1691, 2825, 2788, 1453, 2854, + 1454, 1455, 1453, 3122, 1454, 1455, 1456, 2535, 2534, 1805, + 1456, 3121, 3907, 2533, 2801, 2532, 2803, 2881, 2883, 2808, + 110, 1685, 108, 1456, 3906, 3884, 3455, 3656, 3654, 2784, + 1718, 109, 2828, 108, 2874, 2813, 1453, 3653, 1454, 1455, + 1456, 2933, 2858, 3646, 1453, 1456, 1454, 1455, 3532, 1456, + 2759, 1718, 3466, 1456, 3464, 3239, 2862, 2473, 2736, 1718, + 1839, 2865, 1046, 2728, 1718, 2438, 2872, 109, 110, 3645, + 1456, 2831, 2875, 2130, 4110, 4109, 4109, 2944, 2131, 109, + 3623, 1453, 2897, 1454, 1455, 2811, 3027, 2900, 2901, 2886, + 2719, 1718, 2627, 2328, 2717, 1718, 1747, 1739, 114, 115, + 4110, 3925, 1453, 3498, 1454, 1455, 2896, 2704, 1718, 3, + 1453, 97, 1454, 1455, 2191, 1453, 2904, 1454, 1455, 2905, + 1, 2909, 2910, 2911, 2702, 1718, 1456, 1014, 1423, 2700, + 1718, 1456, 2941, 2698, 1718, 1456, 2033, 2696, 1718, 10, + 1422, 1844, 1453, 1456, 1454, 1455, 1453, 1456, 1454, 1455, + 3502, 2930, 2931, 1456, 2694, 1718, 4041, 681, 2318, 1453, + 2920, 1454, 1455, 2987, 2988, 2031, 2940, 1689, 9, 2032, + 1456, 4081, 8, 4037, 4038, 1456, 1453, 1936, 1454, 1455, + 1926, 1453, 3564, 1454, 1455, 1453, 2243, 1454, 1455, 1453, + 3838, 1454, 1455, 1456, 2275, 3242, 2479, 2966, 3004, 3530, + 2436, 1114, 154, 1456, 2985, 2395, 1453, 2969, 1454, 1455, + 2692, 1718, 2396, 4006, 1456, 2690, 1718, 118, 1072, 2688, + 1718, 117, 1117, 1225, 2308, 2474, 3554, 2686, 1718, 2879, + 2404, 2684, 1718, 1456, 1772, 1770, 1771, 2682, 1718, 1456, + 1769, 1719, 2315, 1774, 1773, 2942, 3311, 2628, 3005, 3008, + 1456, 3402, 2024, 716, 2680, 1718, 2851, 710, 192, 2678, + 1718, 1761, 1453, 1740, 1454, 1455, 3416, 1453, 1156, 1454, + 1455, 1453, 671, 1454, 1455, 3215, 2339, 2676, 1718, 1453, + 2512, 1454, 1455, 1453, 677, 1454, 1455, 2674, 1718, 1453, + 1505, 1454, 1455, 2015, 3120, 1456, 3029, 2866, 2672, 1718, + 1456, 1066, 1058, 2329, 2802, 3085, 1453, 2975, 1454, 1455, + 2976, 1453, 1065, 1454, 1455, 3815, 3154, 2670, 1718, 3459, + 3132, 3134, 2818, 2665, 1718, 3137, 3130, 3918, 3647, 1453, + 3991, 1454, 1455, 2876, 3489, 2989, 1736, 3423, 2600, 1453, + 2125, 1454, 1455, 3006, 1495, 2372, 3618, 2051, 739, 3092, + 1453, 738, 1454, 1455, 3103, 736, 3094, 2804, 2832, 1459, + 944, 2792, 2373, 1748, 3020, 2843, 1456, 2841, 2278, 1453, + 2278, 1454, 1455, 2840, 3065, 1453, 2545, 1454, 1455, 2661, + 1718, 2380, 2450, 3483, 3440, 3153, 1453, 87, 1454, 1455, + 2373, 2373, 2373, 2373, 2373, 3007, 1456, 3075, 3076, 3077, + 3078, 3079, 3479, 4033, 2374, 2370, 2810, 895, 894, 748, + 2373, 740, 3093, 2373, 3095, 730, 1456, 3103, 893, 892, + 2986, 3102, 3269, 1456, 2375, 3270, 2950, 3158, 1976, 3284, + 2952, 1453, 3175, 1454, 1455, 2877, 1453, 3127, 1454, 1455, + 3280, 3118, 1437, 2280, 3114, 2280, 1456, 1708, 1085, 1025, + 2659, 1718, 2375, 2375, 2375, 2375, 2375, 3308, 3942, 3125, + 2571, 3128, 3331, 1707, 3949, 3140, 3141, 3250, 3548, 1456, + 2591, 3231, 2375, 2926, 2466, 2375, 69, 3259, 46, 3913, + 2590, 3157, 3979, 887, 1026, 3177, 3159, 3267, 3178, 3162, + 3160, 3161, 3171, 3163, 104, 1027, 3115, 3116, 3117, 105, + 2652, 1718, 1453, 3179, 1454, 1455, 1456, 2650, 1718, 884, + 3620, 3185, 3621, 3622, 3088, 3126, 3089, 1456, 3962, 3963, + 883, 3964, 3216, 2180, 3218, 3067, 1433, 3069, 3217, 1430, + 3436, 4054, 1453, 1456, 1454, 1455, 2026, 3219, 3220, 96, + 36, 35, 34, 3080, 3081, 3082, 3083, 3271, 3268, 3143, + 33, 3272, 1453, 3401, 1454, 1455, 3240, 2438, 3261, 1453, + 32, 1454, 1455, 26, 25, 24, 23, 22, 3278, 29, + 19, 21, 20, 3149, 1456, 18, 3253, 4076, 3149, 1456, + 4121, 123, 1453, 1456, 1454, 1455, 55, 52, 50, 131, + 3397, 3296, 130, 53, 3299, 49, 3298, 1199, 47, 31, + 30, 3334, 17, 16, 15, 1453, 3306, 1454, 1455, 3316, + 14, 13, 3313, 3314, 12, 3315, 3262, 3333, 3317, 11, + 3319, 7, 3321, 2844, 2847, 2848, 2849, 2845, 6, 2846, + 2850, 39, 38, 3481, 3482, 37, 28, 27, 40, 4, + 2913, 2468, 1453, 0, 1454, 1455, 0, 1508, 0, 0, + 2587, 1508, 0, 1453, 2592, 1454, 1455, 0, 3330, 0, + 0, 0, 0, 2782, 3241, 0, 0, 2781, 0, 1453, + 0, 1454, 1455, 0, 0, 0, 0, 2596, 0, 2597, + 3418, 0, 0, 0, 2604, 0, 0, 3422, 2606, 2607, + 0, 0, 0, 0, 0, 0, 0, 2613, 2614, 2615, + 2616, 2617, 2618, 2619, 2620, 2621, 2622, 0, 2624, 0, + 1453, 0, 1454, 1455, 0, 1453, 0, 1454, 1455, 1453, + 3152, 1454, 1455, 0, 0, 0, 0, 2373, 0, 0, + 0, 2630, 2631, 2632, 2633, 2634, 0, 2636, 0, 1456, + 3496, 2638, 0, 0, 3463, 2643, 2644, 728, 2645, 3448, + 3449, 2648, 3456, 2649, 2651, 2653, 2654, 2655, 2656, 2657, + 2658, 2660, 2662, 2663, 2664, 2666, 0, 2668, 2669, 2671, + 2673, 2675, 2677, 2679, 2681, 2683, 2685, 2687, 2689, 2691, + 2693, 2695, 2697, 2699, 2701, 2703, 2705, 2706, 2707, 2375, + 2709, 3488, 2711, 3490, 2713, 2714, 3485, 2716, 2718, 2720, + 3271, 3268, 3491, 2723, 3272, 3451, 3497, 2727, 3468, 1456, + 0, 2732, 2733, 2734, 2735, 0, 0, 3513, 0, 3515, + 3301, 3302, 3307, 2777, 2746, 2747, 2748, 2749, 2750, 2751, + 0, 3453, 2755, 2756, 0, 3558, 3559, 0, 0, 0, + 2758, 0, 3507, 3508, 0, 2764, 3425, 0, 3427, 3428, + 3429, 2767, 2768, 2769, 2770, 2771, 1045, 1456, 0, 1051, + 1051, 957, 2778, 2779, 3478, 2780, 958, 0, 2783, 2785, + 2339, 0, 2787, 1716, 1712, 1453, 2089, 1454, 1455, 0, + 0, 0, 2799, 3492, 3493, 0, 0, 0, 1713, 0, + 0, 1716, 1712, 2776, 0, 3541, 0, 0, 3560, 3545, + 3546, 3547, 0, 0, 0, 0, 1713, 0, 0, 0, + 1456, 0, 0, 2334, 2335, 1715, 0, 1714, 0, 0, + 0, 0, 0, 3576, 0, 3537, 3538, 0, 0, 0, + 1456, 1709, 1710, 1715, 0, 1714, 0, 0, 0, 1456, + 0, 2775, 0, 1456, 0, 1453, 0, 1454, 1455, 1456, + 0, 964, 965, 966, 967, 968, 969, 970, 971, 972, + 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, + 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, + 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, + 1003, 1004, 1005, 1453, 2774, 1454, 1455, 3636, 0, 3640, + 3641, 0, 0, 0, 0, 3626, 0, 3627, 3628, 3629, + 1456, 3616, 0, 0, 2773, 0, 0, 1456, 0, 0, + 0, 1456, 3153, 2772, 87, 3642, 3153, 2763, 0, 0, + 0, 0, 0, 2762, 1456, 0, 0, 0, 1456, 0, + 0, 0, 0, 0, 0, 0, 1453, 0, 1454, 1455, + 3580, 0, 1456, 0, 2090, 0, 2088, 3671, 0, 0, + 3643, 0, 0, 3651, 3663, 3652, 1453, 0, 1454, 1455, + 0, 0, 0, 3659, 3661, 1453, 0, 1454, 1455, 1453, + 0, 1454, 1455, 0, 0, 1453, 42, 1454, 1455, 0, + 0, 3821, 0, 0, 2761, 0, 0, 0, 3675, 0, + 0, 2760, 0, 0, 0, 2757, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2752, 0, + 0, 0, 2745, 0, 0, 0, 0, 0, 0, 0, + 0, 3813, 0, 3812, 0, 0, 2744, 0, 0, 0, + 0, 0, 0, 3828, 0, 3811, 1453, 0, 1454, 1455, + 3833, 3840, 3832, 1453, 0, 1454, 1455, 1453, 0, 1454, + 1455, 0, 3878, 3879, 3015, 3016, 3017, 3018, 3019, 0, + 1453, 3665, 1454, 1455, 1453, 0, 1454, 1455, 0, 0, + 2090, 0, 2088, 3882, 3024, 3823, 3824, 3825, 1453, 0, + 1454, 1455, 0, 0, 0, 0, 3672, 3673, 3607, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3149, + 0, 0, 0, 3153, 0, 0, 0, 0, 3885, 3667, + 0, 3816, 3888, 0, 0, 0, 0, 1525, 1526, 1527, + 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, + 1538, 1539, 1540, 1541, 1542, 1543, 1545, 1546, 1547, 1548, + 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, + 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, + 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, + 1589, 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1598, + 1599, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, + 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 1620, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, + 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1643, 1644, + 1645, 1646, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, + 1668, 1669, 1670, 1671, 1672, 1673, 3929, 3152, 3926, 3883, + 3911, 3152, 3908, 3909, 1456, 3910, 0, 0, 0, 0, + 3943, 0, 1456, 0, 0, 0, 0, 1456, 0, 0, + 0, 1456, 0, 0, 0, 1456, 3928, 0, 87, 0, + 0, 0, 3155, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1456, 0, 0, 0, + 3173, 0, 0, 3932, 1456, 0, 0, 0, 0, 3945, + 1456, 0, 0, 0, 0, 3948, 3820, 0, 3950, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1456, 0, + 0, 0, 0, 0, 0, 0, 0, 3917, 2743, 0, + 42, 0, 0, 0, 0, 0, 2742, 0, 0, 0, + 0, 2741, 0, 0, 0, 2740, 0, 0, 0, 2739, + 0, 0, 0, 0, 0, 0, 0, 1457, 3968, 0, + 0, 3969, 3988, 0, 0, 0, 0, 87, 0, 0, + 2738, 0, 0, 0, 3934, 0, 0, 0, 2737, 0, + 1453, 3977, 1454, 1455, 2731, 0, 0, 1513, 1453, 0, + 1454, 1455, 0, 1453, 3984, 1454, 1455, 1453, 3994, 1454, + 1455, 1453, 2730, 1454, 1455, 4005, 4019, 3992, 3953, 0, + 3997, 4002, 3999, 3998, 3996, 4001, 0, 0, 3305, 3840, + 4008, 4000, 1453, 0, 1454, 1455, 0, 0, 3152, 42, + 1453, 4029, 1454, 1455, 0, 0, 1453, 0, 1454, 1455, + 3322, 3323, 4032, 3324, 4050, 3326, 3328, 4040, 0, 4045, + 0, 4058, 0, 0, 1453, 4060, 1454, 1455, 4019, 3335, + 0, 0, 4071, 0, 3339, 3340, 3341, 3343, 3344, 3345, + 3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355, + 3357, 3359, 3361, 3363, 3365, 3367, 3369, 3371, 3373, 3375, + 3377, 3379, 3381, 3383, 3385, 3387, 3388, 3390, 3391, 3392, + 3394, 1976, 4075, 3396, 4091, 3398, 3399, 3400, 4090, 4101, + 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, + 3414, 2090, 4107, 2088, 4104, 4103, 4094, 4105, 4100, 3421, + 4070, 3989, 4115, 3426, 1456, 4019, 0, 3430, 3431, 1456, + 3432, 3434, 4123, 3437, 3439, 3149, 3441, 3442, 3443, 3444, + 4131, 4129, 0, 1456, 3450, 0, 0, 3957, 1456, 0, + 0, 0, 0, 0, 0, 3967, 0, 1456, 0, 0, + 4140, 4141, 3879, 4139, 0, 0, 0, 1456, 0, 2090, + 0, 2088, 4138, 1456, 0, 3941, 0, 1456, 0, 3472, + 3473, 0, 1456, 3477, 0, 0, 1456, 0, 0, 0, + 1456, 0, 0, 0, 1789, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1456, 2729, 4088, + 0, 0, 0, 2726, 1456, 0, 0, 0, 0, 0, + 1456, 0, 0, 0, 0, 0, 0, 2725, 0, 0, + 0, 0, 2724, 0, 0, 0, 0, 0, 0, 0, + 4066, 2722, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2715, 0, 0, 0, 0, 0, 2712, 0, 0, + 1453, 2710, 1454, 1455, 1738, 1453, 2708, 1454, 1455, 0, + 2667, 1456, 0, 0, 2647, 957, 1456, 2282, 0, 1453, + 958, 1454, 1455, 0, 1453, 0, 1454, 1455, 0, 3552, + 2089, 2646, 0, 1453, 0, 1454, 1455, 0, 2642, 0, + 0, 0, 1826, 1453, 2640, 1454, 1455, 0, 0, 1453, + 0, 1454, 1455, 1453, 0, 1454, 1455, 0, 1453, 0, + 1454, 1455, 1453, 0, 1454, 1455, 1453, 0, 1454, 1455, + 0, 0, 0, 0, 3571, 0, 0, 3575, 0, 0, + 1777, 0, 0, 1453, 0, 1454, 1455, 0, 0, 0, + 1453, 0, 1454, 1455, 0, 2605, 1453, 0, 1454, 1455, + 2594, 0, 0, 940, 3586, 964, 965, 966, 967, 968, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, + 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, + 999, 1000, 1001, 1002, 1003, 1004, 1005, 1453, 0, 1454, + 1455, 0, 1453, 0, 1454, 1455, 0, 0, 0, 195, + 0, 0, 195, 0, 1790, 0, 714, 0, 3609, 0, + 1981, 720, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3617, 195, 0, 0, 0, 0, 0, 0, 3624, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, - 0, 195, 0, 0, 0, 714, 0, 0, 0, 0, - 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 720, 195, 720, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3822, 0, 0, - 0, 0, 0, 0, 0, 0, 3829, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3839, 3840, 0, 3842, - 0, 3843, 3844, 0, 0, 0, 3847, 3848, 3849, 3850, - 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, 3859, 3860, - 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 0, 3870, - 3873, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3882, 3883, 3884, 3885, 3886, - 3888, 3889, 3891, 3893, 3894, 3896, 0, 0, 0, 0, - 0, 0, 0, 0, 2041, 2042, 2043, 2044, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2052, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3926, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2091, 2092, 0, 0, 0, 0, - 2115, 1050, 1050, 2119, 0, 0, 0, 2124, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, - 2144, 2145, 0, 2147, 0, 0, 0, 2169, 2170, 2171, - 2172, 2173, 2174, 2176, 0, 2181, 0, 2183, 2184, 2185, - 0, 2187, 2188, 2189, 0, 2192, 2193, 2194, 2195, 2196, - 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, - 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, - 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, - 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, - 2237, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, - 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, - 2260, 2261, 2262, 2263, 0, 0, 0, 0, 0, 2269, - 0, 2271, 0, 2278, 2279, 2280, 2281, 2282, 2283, 1050, - 0, 1050, 1050, 1050, 1050, 1050, 0, 0, 0, 0, - 0, 0, 2295, 2296, 2297, 2298, 2299, 2300, 2301, 2302, - 0, 2304, 2305, 2306, 2307, 2308, 1199, 0, 1205, 0, - 0, 0, 0, 0, 0, 0, 0, 3951, 0, 0, - 0, 0, 0, 0, 0, 0, 4067, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1784, 0, 0, 0, - 1050, 3967, 0, 0, 0, 0, 0, 3968, 3969, 190, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2346, 2347, 0, 0, 0, 0, 1428, 3980, - 0, 0, 0, 129, 0, 151, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 172, 0, 2385, 0, - 0, 0, 0, 0, 0, 4006, 4007, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4014, - 4016, 4018, 0, 0, 0, 0, 0, 162, 0, 0, - 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4046, 0, 0, 0, 0, 0, - 0, 0, 169, 0, 0, 170, 0, 0, 0, 2427, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 138, 139, 161, 160, 189, 0, - 0, 0, 4065, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1772, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 195, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4088, 4090, 4092, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 720, 0, 720, 720, 0, 0, 0, 4113, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 720, 195, 0, 4125, 4126, 0, - 0, 0, 0, 0, 0, 0, 1785, 0, 0, 155, - 136, 158, 143, 135, 0, 156, 157, 0, 0, 0, - 0, 0, 173, 1499, 0, 0, 0, 0, 0, 0, - 0, 179, 144, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 147, 145, 140, 141, - 142, 146, 0, 0, 0, 0, 0, 0, 137, 0, - 0, 0, 0, 0, 0, 0, 0, 148, 1798, 1801, - 1802, 1803, 1804, 1805, 1806, 0, 1807, 1808, 1810, 1811, - 1809, 1812, 1813, 1786, 1787, 1788, 1789, 1770, 1771, 1799, - 0, 1773, 0, 1774, 1775, 1776, 1777, 1778, 1779, 1780, - 1781, 1782, 0, 0, 1783, 1790, 1791, 1792, 1793, 0, - 1794, 1795, 1796, 1797, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1745, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 164, 0, 0, 1762, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2596, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2602, 2603, 2604, 2605, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1499, 0, 0, 0, 0, 0, 0, - 0, 0, 1784, 0, 0, 0, 0, 0, 0, 0, - 0, 1901, 0, 0, 0, 0, 0, 0, 1512, 0, - 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1946, 0, 0, 0, - 195, 0, 0, 0, 720, 720, 0, 0, 0, 0, - 0, 0, 0, 1972, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 195, 0, 0, 0, 0, 0, 1983, - 0, 0, 0, 0, 0, 0, 1987, 0, 0, 1800, - 0, 0, 0, 720, 0, 0, 195, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 0, 0, 0, 0, 720, 0, - 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, - 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1772, 0, - 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 165, 0, 0, 1499, 0, 0, 0, 177, - 0, 720, 720, 0, 720, 0, 720, 720, 0, 720, - 720, 720, 720, 720, 720, 0, 0, 0, 0, 0, - 0, 1733, 1499, 0, 0, 1499, 720, 1499, 195, 0, + 0, 0, 0, 720, 195, 720, 1803, 1806, 1807, 1808, + 1809, 1810, 1811, 0, 1812, 1813, 1815, 1816, 1814, 1817, + 1818, 1791, 1792, 1793, 1794, 1775, 1776, 1804, 0, 1778, + 0, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, + 0, 0, 1788, 1795, 1796, 1797, 1798, 0, 1799, 1800, + 1801, 1802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 185, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 720, 1785, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 720, 0, 195, - 195, 0, 0, 166, 171, 168, 174, 175, 176, 178, - 180, 181, 182, 183, 0, 0, 195, 0, 0, 184, - 186, 187, 188, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 720, 0, 2034, 1798, 1801, 1802, 1803, 1804, 1805, - 1806, 0, 1807, 1808, 1810, 1811, 1809, 1812, 1813, 1786, - 1787, 1788, 1789, 1770, 1771, 1799, 0, 1773, 0, 1774, - 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 0, 0, - 1783, 1790, 1791, 1792, 1793, 0, 1794, 1795, 1796, 1797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3829, 0, 0, 0, 0, 0, + 0, 0, 0, 3836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3846, 3847, 0, 3849, 0, 3850, 3851, + 0, 0, 0, 3854, 3855, 3856, 3857, 3858, 3859, 3860, + 3861, 3862, 3863, 3864, 3865, 3866, 3867, 3868, 3869, 3870, + 3871, 3872, 3873, 3874, 3875, 0, 3877, 3880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3889, 3890, 3891, 3892, 3893, 3895, 3896, 3898, + 3900, 3901, 3903, 0, 0, 0, 0, 0, 0, 0, + 2046, 2047, 2048, 2049, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3933, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2096, 2097, 0, 0, 0, 0, 2120, 1051, 1051, 2124, + 0, 0, 0, 2129, 0, 0, 0, 1805, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2141, 2142, + 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 0, 2152, + 0, 0, 0, 2174, 2175, 2176, 2177, 2178, 2179, 2181, + 0, 2186, 0, 2188, 2189, 2190, 0, 2192, 2193, 2194, + 0, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, + 2206, 2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, + 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, + 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, + 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2246, 2247, 2248, + 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, + 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, + 0, 0, 0, 0, 0, 2274, 0, 2276, 0, 2283, + 2284, 2285, 2286, 2287, 2288, 1051, 0, 1051, 1051, 1051, + 1051, 1051, 0, 0, 0, 0, 0, 0, 2300, 2301, + 2302, 2303, 2304, 2305, 2306, 2307, 0, 2309, 2310, 2311, + 2312, 2313, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2975, + 0, 0, 0, 0, 0, 0, 1051, 0, 3974, 0, + 0, 0, 0, 0, 3975, 3976, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2353, 2354, 0, 0, 3987, 0, 0, 0, + 0, 0, 129, 0, 151, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 172, 0, 0, 2392, 0, + 0, 0, 4013, 4014, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4021, 4023, 4025, 0, + 0, 0, 0, 0, 0, 0, 162, 0, 1692, 0, + 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, + 0, 4053, 0, 0, 195, 0, 195, 0, 0, 0, + 0, 169, 0, 0, 170, 0, 0, 0, 0, 2434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1050, 0, 0, 3002, 3003, 0, 0, 3005, 0, - 0, 3007, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 720, 720, - 0, 3014, 3015, 3016, 0, 0, 0, 0, 0, 0, - 0, 720, 0, 3021, 0, 0, 3023, 3024, 3025, 0, - 195, 0, 3026, 3027, 0, 0, 3028, 0, 3029, 0, - 0, 0, 0, 0, 0, 3030, 0, 3031, 0, 0, - 0, 3032, 0, 3033, 0, 0, 3034, 0, 3035, 0, - 3036, 0, 3037, 0, 3038, 0, 3039, 0, 3040, 0, - 3041, 0, 3042, 0, 3043, 0, 3044, 0, 3045, 720, - 3046, 0, 3047, 0, 3048, 0, 3049, 0, 3050, 1499, - 3051, 0, 0, 0, 3052, 1800, 3053, 0, 3054, 0, - 0, 3055, 0, 3056, 0, 3057, 1499, 2241, 3059, 0, - 0, 3061, 0, 0, 3063, 3064, 3065, 3066, 0, 0, - 0, 0, 3067, 2241, 2241, 2241, 2241, 2241, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3077, 0, - 2352, 0, 0, 0, 0, 0, 3090, 0, 2356, 3094, - 2359, 1050, 0, 2034, 0, 0, 0, 0, 3097, 3098, - 3099, 3100, 3101, 3102, 0, 0, 0, 3103, 3104, 0, - 3105, 0, 3106, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 138, 139, 161, 160, 189, 0, 4072, + 0, 0, 0, 720, 0, 720, 720, 663, 0, 0, + 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2919, 720, 195, 1009, 0, 0, + 0, 0, 0, 4095, 4097, 4099, 0, 129, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 172, 0, 0, 0, 1500, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4120, 0, 0, 1080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 162, 0, 0, 4132, 4133, 0, 150, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 155, 136, + 158, 143, 135, 0, 156, 157, 169, 0, 0, 170, + 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 144, 0, 0, 0, 0, 0, 0, 1847, 1848, + 161, 160, 189, 0, 0, 147, 145, 140, 141, 142, + 146, 0, 0, 0, 0, 0, 0, 137, 0, 0, + 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2289, 0, 3167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 195, 190, 0, 0, 0, 720, - 0, 0, 0, 0, 0, 0, 1838, 0, 0, 0, - 0, 0, 0, 3230, 0, 0, 0, 0, 0, 129, - 0, 151, 0, 0, 195, 0, 0, 720, 0, 0, - 0, 0, 172, 0, 0, 0, 0, 195, 0, 0, - 0, 720, 0, 0, 2289, 195, 0, 195, 0, 195, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2034, 0, 162, 720, 0, 0, 0, 2517, 150, - 0, 0, 0, 0, 0, 0, 0, 2534, 2535, 0, - 0, 2539, 0, 0, 0, 0, 0, 0, 169, 0, - 0, 170, 0, 2544, 0, 0, 0, 0, 0, 0, - 2547, 0, 0, 0, 0, 0, 0, 0, 0, 3322, - 1842, 1843, 161, 160, 189, 0, 0, 0, 0, 0, - 0, 720, 0, 3331, 0, 0, 2550, 0, 0, 0, - 0, 939, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 720, 0, - 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 155, 1849, 158, 0, 1846, 0, 156, + 157, 0, 0, 0, 164, 0, 173, 0, 0, 0, + 0, 0, 0, 0, 1500, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 699, 0, 0, 0, 0, 0, 719, - 0, 720, 0, 0, 0, 0, 720, 0, 0, 0, - 720, 720, 0, 0, 0, 155, 1844, 158, 0, 1841, - 0, 156, 157, 0, 0, 0, 0, 0, 173, 0, - 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, - 0, 719, 0, 719, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 195, 195, 0, 0, 195, 0, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 0, 0, 0, 0, 195, 0, 0, + 0, 0, 0, 0, 0, 2603, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2609, 2610, 2611, 2612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 195, 0, 0, 0, 720, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, - 3526, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 195, 0, 0, 0, 1513, 0, + 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 720, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 720, 0, 0, 0, 0, 0, 0, 195, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 164, 0, 3550, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1499, 0, 2289, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1500, 0, 0, + 0, 0, 0, 720, 720, 0, 720, 0, 720, 720, + 0, 720, 720, 720, 720, 720, 720, 0, 152, 0, + 0, 153, 0, 0, 1500, 0, 0, 1500, 720, 1500, + 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, + 195, 165, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 0, 720, 0, 195, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 720, + 0, 195, 195, 1738, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 195, 185, + 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, + 0, 0, 0, 0, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 166, 171, 168, 174, 175, 176, 178, 180, + 181, 182, 183, 152, 0, 0, 153, 0, 184, 186, + 187, 188, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1200, + 0, 1206, 0, 0, 0, 0, 165, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3570, 0, 3571, 0, 0, 3572, 0, 0, 3575, - 3576, 0, 0, 0, 0, 0, 0, 0, 3580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3581, 0, 3582, 0, 3583, 159, 3584, 0, - 3585, 0, 3586, 0, 3587, 0, 3588, 0, 3589, 0, - 3590, 0, 3591, 0, 3592, 0, 3593, 0, 3594, 0, - 3595, 0, 3596, 0, 0, 3597, 0, 2850, 0, 3598, - 0, 3599, 0, 0, 0, 0, 0, 3601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, + 0, 1429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3618, 0, 0, 0, 0, 0, 0, 0, 0, 3623, - 0, 3624, 3625, 0, 3626, 0, 3627, 0, 0, 0, - 0, 3628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2899, 0, 0, 0, 152, 3653, 0, 153, 0, - 0, 0, 0, 0, 0, 0, 0, 3661, 0, 0, - 3663, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3667, 0, 0, 0, 0, 0, 165, 0, - 0, 0, 0, 0, 0, 177, 0, 0, 3801, 0, - 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 195, 0, 0, 0, 2948, 2949, 2950, - 2951, 2952, 2953, 0, 720, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 720, 185, 0, 0, 0, - 0, 0, 2034, 2963, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, - 0, 0, 0, 0, 195, 0, 0, 2971, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, - 171, 168, 174, 175, 176, 178, 180, 181, 182, 183, - 0, 0, 0, 0, 0, 184, 186, 187, 188, 0, + 0, 0, 0, 0, 0, 0, 0, 166, 171, 168, + 174, 175, 176, 178, 180, 181, 182, 183, 0, 0, + 720, 720, 0, 184, 186, 187, 188, 0, 0, 0, + 0, 2982, 0, 720, 0, 0, 0, 0, 0, 0, + 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1051, 0, 0, 3009, 3010, 0, 0, + 3012, 0, 0, 3014, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3021, 3022, 3023, 0, 0, 0, 0, + 0, 720, 0, 0, 0, 3028, 0, 0, 3030, 3031, + 3032, 1500, 0, 0, 3033, 3034, 0, 0, 3035, 0, + 3036, 0, 0, 0, 0, 0, 0, 3037, 1500, 3038, + 0, 0, 0, 3039, 0, 3040, 0, 0, 3041, 0, + 3042, 0, 3043, 0, 3044, 0, 3045, 0, 3046, 0, + 3047, 0, 3048, 0, 3049, 0, 3050, 0, 3051, 0, + 3052, 0, 3053, 0, 3054, 0, 3055, 0, 3056, 0, + 3057, 0, 3058, 0, 0, 0, 3059, 0, 3060, 0, + 3061, 0, 0, 3062, 0, 3063, 0, 3064, 0, 2246, + 3066, 0, 0, 3068, 0, 0, 3070, 3071, 3072, 3073, + 0, 0, 0, 0, 3074, 2246, 2246, 2246, 2246, 2246, + 0, 0, 0, 0, 0, 0, 0, 0, 939, 0, + 3084, 0, 0, 0, 0, 0, 0, 0, 3097, 0, + 0, 3101, 0, 1051, 0, 0, 0, 0, 0, 0, + 3104, 3105, 3106, 3107, 3108, 3109, 0, 0, 0, 3110, + 3111, 0, 3112, 0, 3113, 0, 0, 0, 0, 0, + 0, 0, 2294, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 699, 0, 0, 0, 0, 0, 719, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3144, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, + 0, 720, 0, 1750, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3174, 0, 0, 0, 0, 0, + 0, 0, 1767, 0, 0, 0, 195, 0, 719, 720, + 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 195, 0, 0, 0, 720, 0, 0, + 2294, 195, 0, 195, 0, 195, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 720, 0, 0, 0, 0, 3237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3909, 720, 0, 0, 0, 0, 0, 195, 0, - 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 720, - 0, 0, 0, 0, 0, 0, 720, 0, 0, 0, - 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 957, 0, - 0, 1499, 0, 958, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2084, 195, 195, 195, 195, 195, 195, + 0, 0, 0, 0, 0, 1906, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 719, 1415, 719, 719, 0, 0, 0, 0, 195, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1498, 0, 0, 0, 0, 720, 964, 965, - 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, - 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, - 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, - 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, - 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, - 897, 0, 0, 0, 3949, 0, 0, 0, 0, 0, + 1951, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 720, 0, 0, 1977, 0, 0, + 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3329, 0, 1988, 0, 0, 0, 0, 0, 0, + 1992, 0, 0, 0, 0, 3338, 0, 0, 0, 0, + 0, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 0, 0, + 86, 44, 45, 88, 0, 0, 0, 720, 0, 0, + 0, 0, 720, 0, 0, 0, 720, 720, 0, 0, + 92, 0, 0, 0, 48, 76, 77, 0, 74, 78, + 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, + 0, 195, 0, 0, 0, 0, 62, 0, 0, 0, + 195, 195, 0, 0, 195, 0, 195, 0, 95, 0, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, + 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, + 0, 0, 0, 0, 83, 0, 0, 0, 720, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 190, 0, 0, 0, 0, 0, 0, 2039, 0, 0, + 0, 1843, 3533, 0, 0, 0, 0, 1500, 0, 2294, + 0, 0, 0, 0, 129, 0, 151, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 172, 51, 54, + 57, 56, 59, 0, 73, 3557, 0, 82, 79, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, + 0, 61, 91, 90, 150, 0, 71, 72, 58, 0, + 0, 0, 0, 0, 80, 81, 0, 0, 0, 0, + 0, 0, 0, 169, 0, 0, 170, 0, 0, 0, + 0, 0, 0, 3577, 0, 3578, 0, 0, 3579, 0, + 0, 3582, 3583, 0, 0, 1847, 1848, 161, 160, 189, + 3587, 0, 0, 0, 0, 0, 63, 64, 0, 65, + 66, 67, 68, 0, 3588, 0, 3589, 0, 3590, 0, + 3591, 0, 3592, 0, 3593, 0, 3594, 0, 3595, 0, + 3596, 0, 3597, 0, 3598, 0, 3599, 0, 3600, 0, + 3601, 0, 3602, 0, 3603, 0, 0, 3604, 0, 0, + 0, 3605, 0, 3606, 0, 0, 0, 0, 0, 3608, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3625, 0, 0, 0, 0, 0, 0, 0, + 0, 3630, 0, 3631, 3632, 0, 3633, 0, 3634, 0, + 155, 1849, 158, 3635, 1846, 0, 156, 157, 719, 1416, + 719, 719, 0, 173, 0, 0, 0, 0, 0, 0, + 0, 195, 179, 0, 0, 0, 0, 0, 3660, 195, + 719, 0, 0, 0, 0, 0, 0, 0, 0, 3668, + 720, 0, 3670, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 720, 3674, 0, 0, 0, 0, 1499, + 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3808, 0, 0, 0, 0, 0, 0, 195, 0, 0, + 0, 0, 195, 0, 0, 0, 0, 0, 2359, 0, + 0, 0, 0, 0, 0, 0, 2363, 0, 2366, 0, + 0, 2039, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 164, 0, 0, 0, + 720, 0, 0, 0, 0, 0, 195, 0, 0, 0, + 0, 0, 0, 195, 0, 0, 0, 0, 0, 94, + 0, 0, 0, 0, 0, 0, 0, 720, 0, 0, + 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, + 0, 0, 0, 720, 0, 0, 0, 897, 0, 0, + 0, 0, 0, 3916, 0, 0, 0, 0, 0, 1500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 195, 195, 195, 195, 195, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3963, 0, 0, 3964, 0, 3965, 193, 0, 0, 664, + 0, 0, 159, 0, 0, 0, 0, 195, 195, 0, + 0, 0, 0, 193, 0, 0, 664, 0, 0, 1499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3220, 0, 664, + 0, 0, 195, 0, 0, 70, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, - 0, 0, 0, 3258, 0, 0, 0, 0, 0, 0, - 720, 0, 1051, 1051, 0, 0, 0, 3272, 0, 0, - 0, 664, 720, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3290, 0, 0, - 3293, 0, 1498, 0, 0, 0, 0, 0, 0, 4044, + 0, 0, 1032, 0, 0, 720, 0, 0, 0, 2039, + 0, 0, 0, 0, 0, 0, 2524, 0, 0, 1052, + 1052, 0, 0, 0, 0, 2541, 2542, 0, 664, 2546, + 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2551, 0, 0, 0, 0, 0, 0, 2554, 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, - 0, 720, 0, 0, 0, 0, 0, 0, 4060, 0, - 4061, 0, 4062, 0, 0, 720, 0, 0, 0, 1499, - 0, 0, 720, 720, 1499, 195, 195, 195, 195, 195, - 0, 0, 0, 719, 719, 0, 0, 195, 0, 0, - 0, 0, 0, 195, 0, 195, 0, 0, 195, 195, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 152, 0, 0, 153, 0, 0, 0, 0, 0, 0, + 719, 0, 0, 0, 2557, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, + 0, 0, 0, 165, 0, 0, 1820, 0, 0, 0, + 177, 0, 0, 0, 0, 0, 1829, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3956, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 719, + 0, 1855, 0, 0, 0, 0, 0, 0, 0, 1864, + 0, 185, 1499, 1866, 0, 0, 1869, 1870, 719, 719, + 0, 719, 0, 719, 719, 0, 719, 719, 719, 719, + 719, 719, 3970, 0, 0, 3971, 0, 3972, 720, 1499, + 1901, 1902, 1499, 719, 1499, 0, 1907, 0, 0, 0, + 720, 0, 0, 0, 166, 171, 168, 174, 175, 176, + 178, 180, 181, 182, 183, 0, 0, 0, 0, 0, + 184, 186, 187, 188, 0, 0, 0, 0, 719, 0, + 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1969, 0, 0, 719, 195, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4111, 0, 4112, 0, 0, 719, 0, 0, - 0, 0, 0, 0, 195, 0, 0, 0, 1815, 0, - 0, 0, 0, 0, 0, 0, 0, 720, 1824, 0, - 1499, 0, 0, 0, 0, 720, 0, 0, 0, 3445, - 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 719, 896, 1850, 195, 0, 0, 0, 0, 0, - 0, 1859, 0, 0, 1498, 1861, 0, 0, 1864, 1865, - 719, 719, 0, 719, 195, 719, 719, 195, 719, 719, - 719, 719, 719, 719, 0, 0, 0, 0, 0, 0, - 0, 1498, 1896, 1897, 1498, 719, 1498, 0, 1902, 0, + 0, 0, 0, 720, 0, 0, 0, 1500, 0, 0, + 720, 720, 1500, 195, 195, 195, 195, 195, 0, 0, + 0, 4051, 0, 0, 0, 195, 0, 0, 719, 0, + 0, 195, 0, 195, 0, 0, 195, 195, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4067, 0, 4068, 0, 4069, 0, 0, 0, 95, 0, + 0, 957, 0, 0, 0, 945, 958, 959, 960, 961, + 946, 0, 0, 947, 948, 0, 949, 0, 0, 0, + 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, + 954, 962, 963, 0, 0, 720, 0, 0, 1500, 0, + 0, 0, 0, 720, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 718, 0, 0, 0, 3504, 0, 0, 0, 0, 0, - 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1964, 3519, 0, 719, 3520, 3521, 3522, + 0, 0, 195, 0, 4118, 0, 4119, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3273, + 3274, 0, 195, 0, 0, 195, 0, 0, 0, 0, + 0, 964, 965, 966, 967, 968, 969, 970, 971, 972, + 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, + 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, + 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, + 1003, 1004, 1005, 0, 0, 719, 719, 2857, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1075, 0, 1082, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 719, 720, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 720, + 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, + 0, 2906, 0, 0, 0, 0, 1499, 0, 0, 0, + 0, 0, 0, 0, 0, 2098, 0, 0, 0, 0, + 0, 0, 0, 1499, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 896, 3276, 3277, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, + 664, 0, 0, 0, 0, 0, 0, 2955, 2956, 2957, + 2958, 2959, 2960, 0, 0, 0, 0, 0, 0, 0, + 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2039, 2970, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 718, 195, + 0, 0, 0, 0, 0, 0, 0, 2978, 0, 0, + 664, 0, 0, 0, 0, 910, 0, 0, 0, 195, + 0, 914, 195, 195, 195, 911, 912, 0, 0, 0, + 913, 915, 720, 720, 0, 0, 0, 0, 1501, 0, + 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, + 1076, 0, 1083, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 720, 720, 720, 720, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 719, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 195, 0, 0, 195, 195, 195, 0, 0, 0, - 0, 0, 0, 0, 720, 720, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 720, 720, 720, 720, 0, 0, 0, + 0, 0, 719, 0, 0, 0, 0, 0, 0, 2456, + 2457, 2458, 0, 0, 0, 0, 0, 0, 1501, 0, + 0, 0, 0, 0, 195, 0, 0, 0, 0, 719, + 0, 0, 0, 0, 0, 719, 1864, 0, 0, 1864, + 0, 1864, 0, 1500, 0, 0, 0, 2488, 720, 0, + 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 664, 0, 664, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1498, 0, - 0, 0, 0, 0, 0, 0, 0, 2093, 0, 0, - 0, 0, 0, 0, 0, 1498, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, + 0, 0, 719, 0, 0, 0, 0, 719, 0, 0, + 0, 719, 719, 0, 0, 0, 0, 0, 1032, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, + 0, 195, 664, 0, 720, 0, 0, 3227, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 720, 0, 0, + 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3265, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3297, 0, 0, + 3300, 1501, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, + 720, 0, 0, 0, 720, 720, 0, 0, 1501, 0, + 0, 1501, 0, 1501, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1500, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 720, 1923, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1499, 0, 719, 1975, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 664, 0, 0, 0, 0, 0, 0, 664, + 0, 0, 0, 0, 0, 0, 0, 0, 2001, 2002, + 664, 664, 664, 664, 664, 664, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1499, 0, 0, 0, 0, - 720, 0, 720, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1264, 0, 1264, 1264, 0, 720, 195, 0, 0, 0, + 0, 0, 0, 0, 3511, 0, 0, 0, 0, 0, + 0, 0, 1428, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3526, 0, 0, 3527, 3528, 3529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, - 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 195, 0, 0, 720, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 719, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 719, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1500, 0, 719, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 720, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1500, + 0, 720, 0, 0, 0, 0, 664, 0, 0, 0, + 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 720, 2294, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 195, 720, 0, 0, 1501, 0, 0, 0, 0, + 0, 0, 0, 2870, 0, 0, 0, 1052, 1052, 0, + 0, 0, 1501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 720, 0, 0, 0, 720, 720, 0, 0, - 0, 0, 1263, 0, 1263, 1263, 0, 0, 664, 0, - 719, 3947, 0, 0, 0, 0, 0, 2449, 2450, 2451, - 0, 0, 0, 0, 1427, 720, 0, 0, 0, 0, - 0, 1032, 0, 0, 0, 0, 0, 719, 0, 0, - 0, 0, 0, 719, 1859, 0, 0, 1859, 0, 1859, - 0, 0, 0, 0, 664, 2481, 0, 0, 0, 0, + 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 719, 720, 0, 0, 0, + 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 720, 0, 720, 0, 0, + 0, 0, 719, 0, 0, 0, 0, 0, 0, 719, + 0, 0, 0, 1864, 1864, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 719, 0, 0, 0, 0, 719, 0, 0, 0, 719, - 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1499, 2943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1052, 1975, 1052, 1052, 1052, + 1052, 1052, 1695, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1500, 0, 0, 1500, 0, 1500, 664, 0, 0, 0, - 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1918, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 664, 0, 0, 0, 0, 0, 720, 195, 0, - 0, 0, 0, 0, 0, 0, 0, 1970, 664, 0, - 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, - 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, - 1996, 1997, 664, 664, 664, 664, 664, 664, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1923, 0, 1744, 0, 0, 0, 0, 0, 0, 0, + 719, 0, 0, 0, 0, 0, 1052, 1762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, - 1498, 1499, 719, 720, 0, 0, 0, 0, 0, 0, + 1032, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, + 0, 0, 0, 0, 1975, 664, 0, 664, 719, 664, + 2382, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 720, 2289, 0, - 0, 0, 0, 0, 1694, 1695, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 720, + 1872, 1872, 0, 1872, 0, 1872, 1872, 0, 1881, 1872, + 1872, 1872, 1872, 1872, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 195, 720, 0, 0, 0, 0, 0, - 0, 0, 0, 1739, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 720, 0, - 0, 0, 1075, 195, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 720, 0, 720, - 0, 1867, 1867, 0, 1867, 0, 1867, 1867, 664, 1876, - 1867, 1867, 1867, 1867, 1867, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1075, 0, 0, 0, + 1949, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1264, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1944, 0, 0, 0, 0, 0, 1500, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1968, 0, 1051, - 1051, 0, 0, 0, 1500, 0, 0, 0, 0, 0, - 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, + 0, 0, 1499, 0, 0, 719, 719, 1499, 664, 0, + 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, + 0, 0, 0, 0, 664, 664, 0, 0, 664, 0, + 2548, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 664, 0, 0, 0, 0, 0, 0, 664, 0, 0, + 0, 3954, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3222, 0, + 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1263, 0, 0, 0, 0, 0, 0, 0, 0, + 719, 0, 0, 1499, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2863, + 0, 0, 0, 0, 0, 0, 0, 1264, 1264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2027, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3304, 1501, 0, 1975, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2084, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1051, 1970, 1051, - 1051, 1051, 1051, 1051, 0, 0, 0, 0, 719, 0, - 0, 0, 0, 0, 0, 719, 0, 0, 0, 1859, - 1859, 0, 0, 0, 719, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1498, 2936, 1918, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1051, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1263, 1263, - 0, 0, 1032, 0, 0, 0, 0, 0, 0, 0, - 0, 2022, 0, 0, 0, 664, 0, 0, 0, 0, - 0, 0, 1970, 664, 0, 664, 0, 664, 2375, 95, - 0, 0, 957, 0, 0, 0, 945, 958, 959, 960, - 961, 946, 0, 0, 947, 948, 0, 949, 0, 0, - 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, - 0, 954, 962, 963, 0, 0, 0, 0, 0, 2079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, - 3266, 3267, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 964, 965, 966, 967, 968, 969, 970, 971, - 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, - 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, - 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, - 1002, 1003, 1004, 1005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3268, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 719, - 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, - 1263, 719, 0, 664, 0, 0, 0, 0, 0, 0, - 0, 0, 664, 664, 0, 0, 664, 0, 2541, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, - 0, 0, 719, 0, 0, 664, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2326, - 719, 0, 3269, 3270, 0, 0, 0, 0, 0, 0, - 0, 664, 0, 0, 719, 0, 0, 0, 1498, 0, - 0, 719, 719, 1498, 0, 0, 0, 2338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1739, 0, 0, 1263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1075, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3215, 0, 910, 0, 0, 1500, - 0, 1970, 914, 0, 0, 0, 911, 912, 0, 0, - 0, 913, 915, 0, 0, 0, 719, 0, 0, 1498, - 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, - 0, 1082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1075, 0, - 0, 0, 0, 0, 1082, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3501, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, + 0, 0, 0, 1923, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2331, 0, + 0, 0, 0, 0, 0, 0, 0, 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1075, 0, 0, 0, 0, 2079, 0, 0, 0, - 2079, 2079, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2343, 0, 0, 0, + 0, 664, 0, 0, 0, 0, 664, 0, 0, 0, + 0, 0, 0, 0, 1744, 0, 0, 1264, 0, 0, + 0, 0, 0, 0, 0, 0, 719, 719, 719, 719, + 0, 0, 0, 0, 0, 0, 0, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 664, 0, 0, 0, 0, 0, 0, 2912, 0, 0, + 0, 0, 0, 0, 1083, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1076, 0, 0, 0, 0, 0, 1083, 0, 0, + 0, 0, 0, 1501, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 664, 664, 664, 664, + 664, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 664, 664, 0, 1076, 0, 0, 0, 0, 2084, + 0, 0, 0, 2084, 2084, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1499, 0, + 0, 0, 0, 719, 0, 719, 0, 0, 0, 0, + 0, 0, 0, 1052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, - 0, 1918, 2553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, - 0, 0, 664, 0, 0, 0, 0, 0, 0, 3494, + 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 719, + 0, 0, 0, 0, 0, 2560, 0, 0, 0, 0, + 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, - 0, 0, 0, 2905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 719, 719, 719, 719, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1264, 0, 0, 0, + 0, 0, 0, 0, 0, 719, 0, 0, 0, 719, + 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1052, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 664, 664, 664, 664, 664, 664, 0, 0, + 0, 1501, 0, 0, 0, 0, 1501, 664, 664, 664, + 664, 664, 0, 0, 0, 0, 0, 0, 0, 3172, + 0, 0, 0, 0, 0, 1923, 0, 664, 0, 0, + 664, 3180, 1975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 664, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, + 0, 0, 1501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, + 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 664, 0, 0, 664, + 0, 0, 0, 0, 0, 0, 0, 2805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1051, + 2820, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1499, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2798, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2813, 0, 0, 0, 0, - 0, 0, 0, 0, 1498, 0, 0, 0, 0, 719, - 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, + 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 719, 0, 0, 0, 0, 2902, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2343, 0, 0, 0, 664, 0, + 0, 2927, 0, 0, 0, 0, 0, 0, 0, 0, + 2932, 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 719, + 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, + 719, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, - 0, 0, 2895, 0, 0, 0, 0, 0, 719, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1051, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2338, - 0, 0, 0, 0, 0, 0, 2920, 0, 0, 0, - 0, 0, 0, 0, 0, 2925, 0, 0, 0, 0, + 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, + 0, 0, 0, 664, 0, 0, 664, 664, 664, 0, + 0, 0, 2084, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 719, 0, 0, 0, 719, 719, 1500, 0, 0, - 0, 0, 1500, 664, 664, 664, 664, 664, 0, 0, - 0, 0, 0, 0, 0, 3165, 0, 0, 0, 0, - 0, 1918, 0, 664, 719, 0, 664, 3173, 1970, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3696, + 3698, 3697, 3761, 3762, 3763, 3764, 3765, 3766, 3767, 789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2084, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1500, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, - 0, 0, 0, 0, 0, 2079, 0, 0, 0, 0, - 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 664, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3079, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3086, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1867, 0, 0, 0, 0, 0, 0, - 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1498, 3122, 719, 0, 664, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1263, 0, 0, 0, 0, - 0, 0, 3149, 1867, 0, 0, 719, 719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 719, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1872, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1923, 0, + 0, 0, 0, 0, 0, 0, 3129, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1501, 0, 0, + 1264, 0, 0, 0, 0, 0, 0, 3156, 1872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 664, 0, 0, 719, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 664, + 3710, 3711, 0, 0, 3786, 3785, 3784, 0, 0, 3782, + 3783, 3781, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 719, 0, 1075, 0, 664, - 0, 0, 664, 664, 664, 2338, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 719, 3689, 3691, - 3690, 3754, 3755, 3756, 3757, 3758, 3759, 3760, 789, 0, - 0, 0, 0, 0, 0, 0, 719, 0, 719, 0, + 0, 0, 0, 0, 0, 1923, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1076, 0, 0, 0, 0, 0, 0, 0, + 2343, 0, 0, 0, 3787, 910, 0, 765, 766, 3788, + 3789, 914, 3790, 768, 769, 911, 912, 0, 763, 767, + 913, 915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3693, 3694, 3695, 3699, + 3700, 3701, 3712, 3759, 3760, 3768, 3770, 866, 3769, 3771, + 3772, 3773, 3776, 3777, 3778, 3779, 3774, 3775, 3780, 3676, + 3680, 3677, 3678, 3679, 3691, 3681, 3682, 3683, 3684, 3685, + 3686, 3687, 3688, 3689, 3690, 3692, 3791, 3792, 3793, 3794, + 3795, 3796, 3705, 3709, 3708, 3706, 3707, 3703, 3704, 3731, + 3730, 3732, 3733, 3734, 3735, 3736, 3737, 3739, 3738, 3740, + 3741, 3742, 3743, 3744, 3745, 3713, 3714, 3717, 3718, 3716, + 3715, 3719, 3728, 3729, 3720, 3721, 3722, 3723, 3724, 3725, + 3727, 3726, 3746, 3747, 3748, 3749, 3750, 3752, 3751, 3755, + 3756, 3754, 3753, 3758, 3757, 0, 3417, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 916, 0, 917, + 0, 0, 921, 0, 0, 0, 923, 922, 0, 924, + 886, 885, 0, 0, 918, 919, 0, 920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1923, 3797, 3798, 3799, 3800, 3801, 3802, 3803, 3804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3410, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2343, + 2343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1501, 0, 0, 0, 0, 3565, 3566, + 3567, 3568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1500, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3695, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3703, - 3704, 0, 0, 3779, 3778, 3777, 0, 0, 3775, 3776, - 3774, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1923, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2338, 2338, 0, 0, 0, 0, - 0, 1918, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3780, 910, 0, 765, 766, 3781, 3782, - 914, 3783, 768, 769, 911, 912, 0, 763, 767, 913, - 915, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3558, 3559, 3560, 3561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3686, 3687, 3688, 3692, 3693, - 3694, 3705, 3752, 3753, 3761, 3763, 866, 3762, 3764, 3765, - 3766, 3769, 3770, 3771, 3772, 3767, 3768, 3773, 3669, 3673, - 3670, 3671, 3672, 3684, 3674, 3675, 3676, 3677, 3678, 3679, - 3680, 3681, 3682, 3683, 3685, 3784, 3785, 3786, 3787, 3788, - 3789, 3698, 3702, 3701, 3699, 3700, 3696, 3697, 3724, 3723, - 3725, 3726, 3727, 3728, 3729, 3730, 3732, 3731, 3733, 3734, - 3735, 3736, 3737, 3738, 3706, 3707, 3710, 3711, 3709, 3708, - 3712, 3721, 3722, 3713, 3714, 3715, 3716, 3717, 3718, 3720, - 3719, 3739, 3740, 3741, 3742, 3743, 3745, 3744, 3748, 3749, - 3747, 3746, 3751, 3750, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 916, 0, 917, 0, - 0, 921, 0, 0, 0, 923, 922, 0, 924, 886, - 885, 0, 0, 918, 919, 0, 920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3657, 0, 3659, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3790, 3791, 3792, 3793, 3794, 3795, 3796, 3797, 0, - 0, 0, 0, 0, 0, 0, 0, 1918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2338, 0, 0, 0, 0, 0, 664, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3824, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3664, 0, 3666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3897, 0, 0, 0, 3897, 3897, 0, 0, - 0, 0, 0, 0, 0, 0, 4000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2338, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1918, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3831, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1970, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3904, 0, 0, + 0, 3904, 3904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2781,1111 +2784,618 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3974, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3978, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1263, 1263, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4020, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4028, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 392, 3410, 0, 4028, - 1398, 1384, 520, 0, 1326, 1401, 1295, 1314, 1411, 1317, - 1320, 1363, 1273, 1341, 411, 1311, 1266, 1299, 1268, 1306, - 1269, 1297, 1328, 269, 1294, 1386, 1345, 1400, 362, 266, - 1275, 1300, 425, 1316, 203, 1365, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 1407, 366, 1351, 0, 491, 396, 0, 0, 0, 1330, - 1390, 1339, 1377, 1325, 1364, 1283, 1350, 1402, 1312, 1360, - 1403, 321, 247, 323, 202, 408, 492, 285, 0, 0, - 0, 0, 4002, 941, 0, 0, 0, 0, 4003, 0, - 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, - 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, - 1308, 1357, 1397, 1309, 1359, 264, 319, 271, 263, 572, - 1408, 1389, 1272, 1338, 1396, 1333, 0, 0, 228, 1399, - 1332, 0, 1362, 0, 1414, 1267, 1353, 0, 1270, 1274, - 1410, 1394, 1303, 274, 0, 0, 0, 0, 0, 0, - 0, 1329, 1340, 1374, 1378, 1323, 0, 0, 0, 0, - 0, 0, 0, 0, 1301, 0, 1349, 0, 0, 0, - 1279, 1271, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1327, 0, 0, 0, 0, 1282, - 0, 1302, 1375, 0, 1265, 296, 1276, 397, 256, 0, - 448, 1382, 1393, 1324, 616, 1395, 1322, 1321, 1369, 1280, - 1388, 1315, 361, 1278, 328, 197, 224, 0, 1313, 407, - 456, 468, 1387, 1298, 1307, 252, 1305, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 1348, 1367, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 581, 582, 255, 639, 227, 610, 219, 1277, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, - 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 1293, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 1383, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 1372, 1413, - 420, 467, 239, 596, 490, 199, 1287, 1292, 1285, 0, - 253, 254, 1354, 567, 1288, 1286, 1343, 1344, 1289, 1404, - 1405, 1406, 1391, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 1376, 1281, 0, 1290, 1291, 1385, 583, 584, 659, - 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, - 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, - 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, - 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, - 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, - 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, - 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, - 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, - 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, - 547, 558, 542, 530, 523, 531, 1347, 196, 220, 364, - 1409, 449, 287, 637, 606, 601, 205, 222, 1284, 261, - 1296, 1304, 0, 1310, 1318, 1319, 1331, 1334, 1335, 1336, - 1337, 1355, 1356, 1358, 1366, 1368, 1371, 1373, 1380, 1392, - 1412, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, - 634, 298, 590, 620, 588, 632, 614, 433, 374, 1346, - 1352, 377, 280, 303, 318, 1361, 605, 496, 226, 461, - 289, 250, 1379, 1381, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 1342, 1370, - 372, 568, 569, 314, 392, 0, 0, 0, 1398, 1384, - 520, 0, 1326, 1401, 1295, 1314, 1411, 1317, 1320, 1363, - 1273, 1341, 411, 1311, 1266, 1299, 1268, 1306, 1269, 1297, - 1328, 269, 1294, 1386, 1345, 1400, 362, 266, 1275, 1300, - 425, 1316, 203, 1365, 481, 251, 373, 370, 575, 281, - 272, 268, 249, 315, 381, 423, 510, 417, 1407, 366, - 1351, 0, 491, 396, 0, 0, 0, 1330, 1390, 1339, - 1377, 1325, 1364, 1283, 1350, 1402, 1312, 1360, 1403, 321, - 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, - 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, - 355, 336, 337, 339, 341, 346, 353, 359, 1308, 1357, - 1397, 1309, 1359, 264, 319, 271, 263, 572, 1408, 1389, - 1272, 1338, 1396, 1333, 0, 0, 228, 1399, 1332, 0, - 1362, 0, 1414, 1267, 1353, 0, 1270, 1274, 1410, 1394, - 1303, 274, 0, 0, 0, 0, 0, 0, 0, 1329, - 1340, 1374, 1378, 1323, 0, 0, 0, 0, 0, 0, - 3174, 0, 1301, 0, 1349, 0, 0, 0, 1279, 1271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3981, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1327, 0, 0, 0, 0, 1282, 0, 1302, - 1375, 0, 1265, 296, 1276, 397, 256, 0, 448, 1382, - 1393, 1324, 616, 1395, 1322, 1321, 1369, 1280, 1388, 1315, - 361, 1278, 328, 197, 224, 0, 1313, 407, 456, 468, - 1387, 1298, 1307, 252, 1305, 466, 421, 594, 232, 283, - 453, 427, 464, 435, 286, 1348, 1367, 465, 368, 577, - 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, - 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, - 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, - 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, - 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, - 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, - 581, 582, 255, 639, 227, 610, 219, 1277, 609, 403, - 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, - 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, - 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, - 211, 233, 234, 236, 1293, 278, 282, 290, 293, 301, - 302, 311, 363, 414, 441, 437, 446, 1383, 571, 592, - 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, - 629, 402, 309, 489, 331, 369, 1372, 1413, 420, 467, - 239, 596, 490, 199, 1287, 1292, 1285, 0, 253, 254, - 1354, 567, 1288, 1286, 1343, 1344, 1289, 1404, 1405, 1406, - 1391, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, - 500, 506, 501, 502, 503, 504, 505, 0, 507, 1376, - 1281, 0, 1290, 1291, 1385, 583, 584, 659, 380, 480, - 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, - 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, - 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, - 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, - 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, - 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, - 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, - 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, - 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, - 542, 530, 523, 531, 1347, 196, 220, 364, 1409, 449, - 287, 637, 606, 601, 205, 222, 1284, 261, 1296, 1304, - 0, 1310, 1318, 1319, 1331, 1334, 1335, 1336, 1337, 1355, - 1356, 1358, 1366, 1368, 1371, 1373, 1380, 1392, 1412, 198, - 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, - 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, - 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, - 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, - 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, - 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, - 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, - 590, 620, 588, 632, 614, 433, 374, 1346, 1352, 377, - 280, 303, 318, 1361, 605, 496, 226, 461, 289, 250, - 1379, 1381, 210, 245, 229, 258, 273, 276, 322, 387, - 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, - 512, 513, 515, 391, 265, 428, 1342, 1370, 372, 568, - 569, 314, 392, 0, 0, 0, 1398, 1384, 520, 0, - 1326, 1401, 1295, 1314, 1411, 1317, 1320, 1363, 1273, 1341, - 411, 1311, 1266, 1299, 1268, 1306, 1269, 1297, 1328, 269, - 1294, 1386, 1345, 1400, 362, 266, 1275, 1300, 425, 1316, - 203, 1365, 481, 251, 373, 370, 575, 281, 272, 268, - 249, 315, 381, 423, 510, 417, 1407, 366, 1351, 0, - 491, 396, 0, 0, 0, 1330, 1390, 1339, 1377, 1325, - 1364, 1283, 1350, 1402, 1312, 1360, 1403, 321, 247, 323, - 202, 408, 492, 285, 0, 0, 0, 0, 0, 709, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, - 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, - 337, 339, 341, 346, 353, 359, 1308, 1357, 1397, 1309, - 1359, 264, 319, 271, 263, 572, 1408, 1389, 1272, 1338, - 1396, 1333, 0, 0, 228, 1399, 1332, 0, 1362, 0, - 1414, 1267, 1353, 0, 1270, 1274, 1410, 1394, 1303, 274, - 0, 0, 0, 0, 0, 0, 0, 1329, 1340, 1374, - 1378, 1323, 0, 0, 0, 0, 0, 0, 3135, 0, - 1301, 0, 1349, 0, 0, 0, 1279, 1271, 0, 0, + 0, 0, 1264, 1264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4027, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1327, 0, 0, 0, 0, 1282, 0, 1302, 1375, 0, - 1265, 296, 1276, 397, 256, 0, 448, 1382, 1393, 1324, - 616, 1395, 1322, 1321, 1369, 1280, 1388, 1315, 361, 1278, - 328, 197, 224, 0, 1313, 407, 456, 468, 1387, 1298, - 1307, 252, 1305, 466, 421, 594, 232, 283, 453, 427, - 464, 435, 286, 1348, 1367, 465, 368, 577, 445, 591, - 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, - 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, - 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, - 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, - 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, - 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, - 255, 639, 227, 610, 219, 1277, 609, 403, 576, 587, - 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, - 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, - 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, - 234, 236, 1293, 278, 282, 290, 293, 301, 302, 311, - 363, 414, 441, 437, 446, 1383, 571, 592, 604, 615, - 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, - 309, 489, 331, 369, 1372, 1413, 420, 467, 239, 596, - 490, 199, 1287, 1292, 1285, 0, 253, 254, 1354, 567, - 1288, 1286, 1343, 1344, 1289, 1404, 1405, 1406, 1391, 641, - 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, - 501, 502, 503, 504, 505, 0, 507, 1376, 1281, 0, - 1290, 1291, 1385, 583, 584, 659, 380, 480, 593, 333, - 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, - 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, - 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, - 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, - 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, - 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, - 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, - 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, - 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, - 523, 531, 1347, 196, 220, 364, 1409, 449, 287, 637, - 606, 601, 205, 222, 1284, 261, 1296, 1304, 0, 1310, - 1318, 1319, 1331, 1334, 1335, 1336, 1337, 1355, 1356, 1358, - 1366, 1368, 1371, 1373, 1380, 1392, 1412, 198, 200, 208, - 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, - 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, - 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, - 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, - 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, - 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, - 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, - 588, 632, 614, 433, 374, 1346, 1352, 377, 280, 303, - 318, 1361, 605, 496, 226, 461, 289, 250, 1379, 1381, - 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, - 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 1342, 1370, 372, 568, 569, 314, - 392, 0, 0, 0, 1398, 1384, 520, 0, 1326, 1401, - 1295, 1314, 1411, 1317, 1320, 1363, 1273, 1341, 411, 1311, - 1266, 1299, 1268, 1306, 1269, 1297, 1328, 269, 1294, 1386, - 1345, 1400, 362, 266, 1275, 1300, 425, 1316, 203, 1365, - 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, - 381, 423, 510, 417, 1407, 366, 1351, 0, 491, 396, - 0, 0, 0, 1330, 1390, 1339, 1377, 1325, 1364, 1283, - 1350, 1402, 1312, 1360, 1403, 321, 247, 323, 202, 408, - 492, 285, 0, 0, 0, 0, 0, 941, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, - 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, - 341, 346, 353, 359, 1308, 1357, 1397, 1309, 1359, 264, - 319, 271, 263, 572, 1408, 1389, 1272, 1338, 1396, 1333, - 0, 0, 228, 1399, 1332, 0, 1362, 0, 1414, 1267, - 1353, 0, 1270, 1274, 1410, 1394, 1303, 274, 0, 0, - 0, 0, 0, 0, 0, 1329, 1340, 1374, 1378, 1323, - 0, 0, 0, 0, 0, 0, 2354, 0, 1301, 0, - 1349, 0, 0, 0, 1279, 1271, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1327, 0, - 0, 0, 0, 1282, 0, 1302, 1375, 0, 1265, 296, - 1276, 397, 256, 0, 448, 1382, 1393, 1324, 616, 1395, - 1322, 1321, 1369, 1280, 1388, 1315, 361, 1278, 328, 197, - 224, 0, 1313, 407, 456, 468, 1387, 1298, 1307, 252, - 1305, 466, 421, 594, 232, 283, 453, 427, 464, 435, - 286, 1348, 1367, 465, 368, 577, 445, 591, 617, 618, - 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, - 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, - 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, - 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, - 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, - 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, - 227, 610, 219, 1277, 609, 403, 576, 587, 390, 379, - 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, - 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, - 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, - 1293, 278, 282, 290, 293, 301, 302, 311, 363, 414, - 441, 437, 446, 1383, 571, 592, 604, 615, 621, 622, - 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, - 331, 369, 1372, 1413, 420, 467, 239, 596, 490, 199, - 1287, 1292, 1285, 0, 253, 254, 1354, 567, 1288, 1286, - 1343, 1344, 1289, 1404, 1405, 1406, 1391, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, - 503, 504, 505, 0, 507, 1376, 1281, 0, 1290, 1291, - 1385, 583, 584, 659, 380, 480, 593, 333, 345, 348, - 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, - 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, - 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, - 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, - 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, - 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, - 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, - 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, - 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, - 1347, 196, 220, 364, 1409, 449, 287, 637, 606, 601, - 205, 222, 1284, 261, 1296, 1304, 0, 1310, 1318, 1319, - 1331, 1334, 1335, 1336, 1337, 1355, 1356, 1358, 1366, 1368, - 1371, 1373, 1380, 1392, 1412, 198, 200, 208, 221, 231, - 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, - 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, - 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, - 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, - 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, - 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, - 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, - 614, 433, 374, 1346, 1352, 377, 280, 303, 318, 1361, - 605, 496, 226, 461, 289, 250, 1379, 1381, 210, 245, - 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, - 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, - 265, 428, 1342, 1370, 372, 568, 569, 314, 392, 0, - 0, 0, 1398, 1384, 520, 0, 1326, 1401, 1295, 1314, - 1411, 1317, 1320, 1363, 1273, 1341, 411, 1311, 1266, 1299, - 1268, 1306, 1269, 1297, 1328, 269, 1294, 1386, 1345, 1400, - 362, 266, 1275, 1300, 425, 1316, 203, 1365, 481, 251, - 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, - 510, 417, 1407, 366, 1351, 0, 491, 396, 0, 0, - 0, 1330, 1390, 1339, 1377, 1325, 1364, 1283, 1350, 1402, - 1312, 1360, 1403, 321, 247, 323, 202, 408, 492, 285, - 0, 95, 0, 0, 0, 709, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, - 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, - 353, 359, 1308, 1357, 1397, 1309, 1359, 264, 319, 271, - 263, 572, 1408, 1389, 1272, 1338, 1396, 1333, 0, 0, - 228, 1399, 1332, 0, 1362, 0, 1414, 1267, 1353, 0, - 1270, 1274, 1410, 1394, 1303, 274, 0, 0, 0, 0, - 0, 0, 0, 1329, 1340, 1374, 1378, 1323, 0, 0, - 0, 0, 0, 0, 0, 0, 1301, 0, 1349, 0, - 0, 0, 1279, 1271, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1327, 0, 0, 0, - 0, 1282, 0, 1302, 1375, 0, 1265, 296, 1276, 397, - 256, 0, 448, 1382, 1393, 1324, 616, 1395, 1322, 1321, - 1369, 1280, 1388, 1315, 361, 1278, 328, 197, 224, 0, - 1313, 407, 456, 468, 1387, 1298, 1307, 252, 1305, 466, - 421, 594, 232, 283, 453, 427, 464, 435, 286, 1348, - 1367, 465, 368, 577, 445, 591, 617, 618, 262, 401, - 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, - 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, - 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, - 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, - 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, - 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, - 219, 1277, 609, 403, 576, 587, 390, 379, 218, 585, - 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, - 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, - 493, 599, 640, 447, 211, 233, 234, 236, 1293, 278, - 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, - 446, 1383, 571, 592, 604, 615, 621, 622, 624, 625, - 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, - 1372, 1413, 420, 467, 239, 596, 490, 199, 1287, 1292, - 1285, 0, 253, 254, 1354, 567, 1288, 1286, 1343, 1344, - 1289, 1404, 1405, 1406, 1391, 641, 642, 643, 644, 645, - 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, - 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, - 505, 0, 507, 1376, 1281, 0, 1290, 1291, 1385, 583, - 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, - 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, - 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, - 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, - 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, - 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, - 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, - 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, - 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, - 555, 536, 547, 558, 542, 530, 523, 531, 1347, 196, - 220, 364, 1409, 449, 287, 637, 606, 601, 205, 222, - 1284, 261, 1296, 1304, 0, 1310, 1318, 1319, 1331, 1334, - 1335, 1336, 1337, 1355, 1356, 1358, 1366, 1368, 1371, 1373, - 1380, 1392, 1412, 198, 200, 208, 221, 231, 235, 242, - 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, - 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, - 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, - 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, - 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, - 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, - 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, - 374, 1346, 1352, 377, 280, 303, 318, 1361, 605, 496, - 226, 461, 289, 250, 1379, 1381, 210, 245, 229, 258, - 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, - 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, - 1342, 1370, 372, 568, 569, 314, 392, 0, 0, 0, - 1398, 1384, 520, 0, 1326, 1401, 1295, 1314, 1411, 1317, - 1320, 1363, 1273, 1341, 411, 1311, 1266, 1299, 1268, 1306, - 1269, 1297, 1328, 269, 1294, 1386, 1345, 1400, 362, 266, - 1275, 1300, 425, 1316, 203, 1365, 481, 251, 373, 370, - 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, - 1407, 366, 1351, 0, 491, 396, 0, 0, 0, 1330, - 1390, 1339, 1377, 1325, 1364, 1283, 1350, 1402, 1312, 1360, - 1403, 321, 247, 323, 202, 408, 492, 285, 0, 0, - 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, - 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, - 1308, 1357, 1397, 1309, 1359, 264, 319, 271, 263, 572, - 1408, 1389, 1272, 1338, 1396, 1333, 0, 0, 228, 1399, - 1332, 0, 1362, 0, 1414, 1267, 1353, 0, 1270, 1274, - 1410, 1394, 1303, 274, 0, 0, 0, 0, 0, 0, - 0, 1329, 1340, 1374, 1378, 1323, 0, 0, 0, 0, - 0, 0, 0, 0, 1301, 0, 1349, 0, 0, 0, - 1279, 1271, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1327, 0, 0, 0, 0, 1282, - 0, 1302, 1375, 0, 1265, 296, 1276, 397, 256, 0, - 448, 1382, 1393, 1324, 616, 1395, 1322, 1321, 1369, 1280, - 1388, 1315, 361, 1278, 328, 197, 224, 0, 1313, 407, - 456, 468, 1387, 1298, 1307, 252, 1305, 466, 421, 594, - 232, 283, 453, 427, 464, 435, 286, 1348, 1367, 465, - 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, - 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, - 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, - 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, - 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, - 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, - 257, 410, 581, 582, 255, 639, 227, 610, 219, 1277, - 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, - 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, - 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, - 640, 447, 211, 233, 234, 236, 1293, 278, 282, 290, - 293, 301, 302, 311, 363, 414, 441, 437, 446, 1383, - 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, - 628, 631, 629, 402, 309, 489, 331, 369, 1372, 1413, - 420, 467, 239, 596, 490, 199, 1287, 1292, 1285, 0, - 253, 254, 1354, 567, 1288, 1286, 1343, 1344, 1289, 1404, - 1405, 1406, 1391, 641, 642, 643, 644, 645, 646, 647, - 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, - 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, - 507, 1376, 1281, 0, 1290, 1291, 1385, 583, 584, 659, - 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, - 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, - 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, - 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, - 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, - 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, - 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, - 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, - 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, - 547, 558, 542, 530, 523, 531, 1347, 196, 220, 364, - 1409, 449, 287, 637, 606, 601, 205, 222, 1284, 261, - 1296, 1304, 0, 1310, 1318, 1319, 1331, 1334, 1335, 1336, - 1337, 1355, 1356, 1358, 1366, 1368, 1371, 1373, 1380, 1392, - 1412, 198, 200, 208, 221, 231, 235, 242, 260, 275, - 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, - 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, - 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, - 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, - 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, - 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, - 634, 298, 590, 620, 588, 632, 614, 433, 374, 1346, - 1352, 377, 280, 303, 318, 1361, 605, 496, 226, 461, - 289, 250, 1379, 1381, 210, 245, 229, 258, 273, 276, - 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, - 479, 511, 512, 513, 515, 391, 265, 428, 1342, 1370, - 372, 568, 569, 314, 392, 0, 0, 0, 1398, 1384, - 520, 0, 1326, 1401, 1295, 1314, 1411, 1317, 1320, 1363, - 1273, 1341, 411, 1311, 1266, 1299, 1268, 1306, 1269, 1297, - 1328, 269, 1294, 1386, 1345, 1400, 362, 266, 1275, 1300, - 425, 1316, 203, 1365, 481, 251, 373, 370, 575, 281, - 272, 268, 249, 315, 381, 423, 510, 417, 1407, 366, - 1351, 0, 491, 396, 0, 0, 0, 1330, 1390, 1339, - 1377, 1325, 1364, 1283, 1350, 1402, 1312, 1360, 1403, 321, - 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, - 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, - 355, 336, 337, 339, 341, 346, 353, 359, 1308, 1357, - 1397, 1309, 1359, 264, 319, 271, 263, 572, 1408, 1389, - 1272, 1338, 1396, 1333, 0, 0, 228, 1399, 1332, 0, - 1362, 0, 1414, 1267, 1353, 0, 1270, 1274, 1410, 1394, - 1303, 274, 0, 0, 0, 0, 0, 0, 0, 1329, - 1340, 1374, 1378, 1323, 0, 0, 0, 0, 0, 0, - 0, 0, 1301, 0, 1349, 0, 0, 0, 1279, 1271, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1327, 0, 0, 0, 0, 1282, 0, 1302, - 1375, 0, 1265, 296, 1276, 397, 256, 0, 448, 1382, - 1393, 1324, 616, 1395, 1322, 1321, 1369, 1280, 1388, 1315, - 361, 1278, 328, 197, 224, 0, 1313, 407, 456, 468, - 1387, 1298, 1307, 252, 1305, 466, 421, 594, 232, 283, - 453, 427, 464, 435, 286, 1348, 1367, 465, 368, 577, - 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, - 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, - 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, - 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, - 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, - 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, - 581, 582, 255, 639, 227, 610, 219, 1277, 609, 403, - 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, - 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, - 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, - 211, 233, 234, 236, 1293, 278, 282, 290, 293, 301, - 302, 311, 363, 414, 441, 437, 446, 1383, 571, 592, - 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, - 629, 402, 309, 489, 331, 369, 1372, 1413, 420, 467, - 239, 596, 490, 199, 1287, 1292, 1285, 0, 253, 254, - 1354, 567, 1288, 1286, 1343, 1344, 1289, 1404, 1405, 1406, - 1391, 641, 642, 643, 644, 645, 646, 647, 648, 649, - 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, - 500, 506, 501, 502, 503, 504, 505, 0, 507, 1376, - 1281, 0, 1290, 1291, 1385, 583, 584, 659, 380, 480, - 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, - 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, - 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, - 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, - 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, - 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, - 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, - 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, - 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, - 542, 530, 523, 531, 1347, 196, 220, 364, 1409, 449, - 287, 637, 606, 601, 205, 222, 1284, 261, 1296, 1304, - 0, 1310, 1318, 1319, 1331, 1334, 1335, 1336, 1337, 1355, - 1356, 1358, 1366, 1368, 1371, 1373, 1380, 1392, 1412, 198, - 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, - 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, - 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, - 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, - 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, - 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, - 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, - 590, 620, 588, 632, 614, 433, 374, 1346, 1352, 377, - 280, 303, 318, 1361, 605, 496, 226, 461, 289, 250, - 1379, 1381, 210, 245, 229, 258, 273, 276, 322, 387, - 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, - 512, 513, 515, 391, 265, 428, 1342, 1370, 372, 568, - 569, 314, 392, 0, 0, 0, 1398, 1384, 520, 0, - 1326, 1401, 1295, 1314, 1411, 1317, 1320, 1363, 1273, 1341, - 411, 1311, 1266, 1299, 1268, 1306, 1269, 1297, 1328, 269, - 1294, 1386, 1345, 1400, 362, 266, 1275, 1300, 425, 1316, - 203, 1365, 481, 251, 373, 370, 575, 281, 272, 268, - 249, 315, 381, 423, 510, 417, 1407, 366, 1351, 0, - 491, 396, 0, 0, 0, 1330, 1390, 1339, 1377, 1325, - 1364, 1283, 1350, 1402, 1312, 1360, 1403, 321, 247, 323, - 202, 408, 492, 285, 0, 0, 0, 0, 0, 941, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, - 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, - 337, 339, 341, 346, 353, 359, 1308, 1357, 1397, 1309, - 1359, 264, 319, 271, 263, 572, 1408, 1389, 1272, 1338, - 1396, 1333, 0, 0, 228, 1399, 1332, 0, 1362, 0, - 1414, 1267, 1353, 0, 1270, 1274, 1410, 1394, 1303, 274, - 0, 0, 0, 0, 0, 0, 0, 1329, 1340, 1374, - 1378, 1323, 0, 0, 0, 0, 0, 0, 0, 0, - 1301, 0, 1349, 0, 0, 0, 1279, 1271, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 392, 3417, 0, 4035, 1399, 1385, 520, 0, 1327, + 1402, 1296, 1315, 1412, 1318, 1321, 1364, 1274, 1342, 411, + 1312, 1267, 1300, 1269, 1307, 1270, 1298, 1329, 269, 1295, + 1387, 1346, 1401, 362, 266, 1276, 1301, 425, 1317, 203, + 1366, 481, 251, 373, 370, 575, 281, 272, 268, 249, + 315, 381, 423, 510, 417, 1408, 366, 1352, 0, 491, + 396, 0, 0, 0, 1331, 1391, 1340, 1378, 1326, 1365, + 1284, 1351, 1403, 1313, 1361, 1404, 321, 247, 323, 202, + 408, 492, 285, 0, 0, 0, 0, 4009, 941, 0, + 0, 0, 0, 4010, 0, 0, 0, 0, 237, 0, + 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, + 339, 341, 346, 353, 359, 1309, 1358, 1398, 1310, 1360, + 264, 319, 271, 263, 572, 1409, 1390, 1273, 1339, 1397, + 1334, 0, 0, 228, 1400, 1333, 0, 1363, 0, 1415, + 1268, 1354, 0, 1271, 1275, 1411, 1395, 1304, 274, 0, + 0, 0, 0, 0, 0, 0, 1330, 1341, 1375, 1379, + 1324, 0, 0, 0, 0, 0, 0, 0, 0, 1302, + 0, 1350, 0, 0, 0, 1280, 1272, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1328, + 0, 0, 0, 0, 1283, 0, 1303, 1376, 0, 1266, + 296, 1277, 397, 256, 0, 448, 1383, 1394, 1325, 616, + 1396, 1323, 1322, 1370, 1281, 1389, 1316, 361, 1279, 328, + 197, 224, 0, 1314, 407, 456, 468, 1388, 1299, 1308, + 252, 1306, 466, 421, 594, 232, 283, 453, 427, 464, + 435, 286, 1349, 1368, 465, 368, 577, 445, 591, 617, + 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, + 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, + 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, + 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, + 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, + 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, + 639, 227, 610, 219, 1278, 609, 403, 576, 587, 390, + 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, + 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, + 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, + 236, 1294, 278, 282, 290, 293, 301, 302, 311, 363, + 414, 441, 437, 446, 1384, 571, 592, 604, 615, 621, + 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, + 489, 331, 369, 1373, 1414, 420, 467, 239, 596, 490, + 199, 1288, 1293, 1286, 0, 253, 254, 1355, 567, 1289, + 1287, 1344, 1345, 1290, 1405, 1406, 1407, 1392, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, + 502, 503, 504, 505, 0, 507, 1377, 1282, 0, 1291, + 1292, 1386, 583, 584, 659, 380, 480, 593, 333, 345, + 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, + 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, + 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, + 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, + 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, + 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, + 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, + 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, + 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, + 531, 1348, 196, 220, 364, 1410, 449, 287, 637, 606, + 601, 205, 222, 1285, 261, 1297, 1305, 0, 1311, 1319, + 1320, 1332, 1335, 1336, 1337, 1338, 1356, 1357, 1359, 1367, + 1369, 1372, 1374, 1381, 1393, 1413, 198, 200, 208, 221, + 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, + 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, + 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, + 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, + 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, + 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, + 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, + 632, 614, 433, 374, 1347, 1353, 377, 280, 303, 318, + 1362, 605, 496, 226, 461, 289, 250, 1380, 1382, 210, + 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, + 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, + 391, 265, 428, 1343, 1371, 372, 568, 569, 314, 392, + 0, 0, 0, 1399, 1385, 520, 0, 1327, 1402, 1296, + 1315, 1412, 1318, 1321, 1364, 1274, 1342, 411, 1312, 1267, + 1300, 1269, 1307, 1270, 1298, 1329, 269, 1295, 1387, 1346, + 1401, 362, 266, 1276, 1301, 425, 1317, 203, 1366, 481, + 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, + 423, 510, 417, 1408, 366, 1352, 0, 491, 396, 0, + 0, 0, 1331, 1391, 1340, 1378, 1326, 1365, 1284, 1351, + 1403, 1313, 1361, 1404, 321, 247, 323, 202, 408, 492, + 285, 0, 0, 0, 0, 0, 194, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, + 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, + 346, 353, 359, 1309, 1358, 1398, 1310, 1360, 264, 319, + 271, 263, 572, 1409, 1390, 1273, 1339, 1397, 1334, 0, + 0, 228, 1400, 1333, 0, 1363, 0, 1415, 1268, 1354, + 0, 1271, 1275, 1411, 1395, 1304, 274, 0, 0, 0, + 0, 0, 0, 0, 1330, 1341, 1375, 1379, 1324, 0, + 0, 0, 0, 0, 0, 3181, 0, 1302, 0, 1350, + 0, 0, 0, 1280, 1272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1327, 0, 0, 0, 0, 1282, 0, 1302, 1375, 0, - 1265, 296, 1276, 397, 256, 0, 448, 1382, 1393, 1324, - 616, 1395, 1322, 1321, 1369, 1280, 1388, 1315, 361, 1278, - 328, 197, 224, 0, 1313, 407, 456, 468, 1387, 1298, - 1307, 252, 1305, 466, 421, 594, 232, 283, 453, 427, - 464, 435, 286, 1348, 1367, 465, 368, 577, 445, 591, - 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, - 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, - 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, - 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, - 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, - 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, - 255, 639, 227, 610, 219, 1277, 609, 403, 576, 587, - 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, - 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, - 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, - 234, 236, 1293, 278, 282, 290, 293, 301, 302, 311, - 363, 414, 441, 437, 446, 1383, 571, 592, 604, 615, - 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, - 309, 489, 331, 369, 1372, 1413, 420, 467, 239, 596, - 490, 199, 1287, 1292, 1285, 0, 253, 254, 1354, 567, - 1288, 1286, 1343, 1344, 1289, 1404, 1405, 1406, 1391, 641, - 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, - 501, 502, 503, 504, 505, 0, 507, 1376, 1281, 0, - 1290, 1291, 1385, 583, 584, 659, 380, 480, 593, 333, - 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, - 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, - 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, - 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, - 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, - 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, - 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, - 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, - 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, - 523, 531, 1347, 196, 220, 364, 1409, 449, 287, 637, - 606, 601, 205, 222, 1284, 261, 1296, 1304, 0, 1310, - 1318, 1319, 1331, 1334, 1335, 1336, 1337, 1355, 1356, 1358, - 1366, 1368, 1371, 1373, 1380, 1392, 1412, 198, 200, 208, - 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, - 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, - 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, - 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, - 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, - 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, - 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, - 588, 632, 614, 433, 374, 1346, 1352, 377, 280, 303, - 318, 1361, 605, 496, 226, 461, 289, 250, 1379, 1381, - 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, - 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 1342, 1370, 372, 568, 569, 314, - 392, 0, 0, 0, 0, 0, 520, 0, 761, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 0, 749, 0, 0, 0, 269, 754, 0, - 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, - 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, - 381, 423, 510, 417, 760, 366, 0, 0, 491, 396, - 0, 0, 0, 0, 0, 756, 757, 0, 0, 0, - 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, - 492, 285, 0, 95, 0, 0, 957, 941, 733, 907, - 945, 958, 959, 960, 961, 946, 0, 237, 947, 948, - 244, 949, 0, 906, 791, 793, 792, 856, 857, 858, - 859, 860, 861, 862, 789, 954, 962, 963, 0, 264, - 319, 271, 263, 572, 0, 0, 2177, 2178, 2179, 0, - 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, - 729, 746, 0, 759, 0, 0, 0, 274, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 743, 744, 0, 0, 0, 0, - 901, 0, 745, 0, 0, 753, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, - 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, - 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, - 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 755, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, - 0, 397, 256, 0, 448, 900, 0, 0, 616, 0, - 0, 898, 0, 0, 0, 0, 361, 0, 328, 197, - 224, 0, 0, 407, 456, 468, 0, 0, 0, 951, - 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, - 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, - 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, - 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, - 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, - 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, - 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, - 267, 292, 0, 0, 257, 410, 952, 953, 255, 639, - 797, 610, 219, 0, 609, 403, 576, 587, 390, 379, - 218, 585, 388, 378, 332, 805, 806, 279, 305, 882, - 881, 880, 304, 306, 878, 879, 877, 206, 598, 0, - 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, - 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, - 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, - 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, - 331, 369, 0, 0, 420, 467, 239, 596, 490, 888, - 910, 899, 765, 766, 889, 890, 914, 891, 768, 769, - 911, 912, 762, 763, 767, 913, 915, 641, 642, 643, - 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, - 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, - 503, 504, 505, 0, 507, 902, 752, 751, 0, 758, - 0, 787, 788, 790, 794, 795, 796, 807, 854, 855, - 863, 865, 866, 864, 867, 868, 869, 872, 873, 874, - 875, 870, 871, 876, 770, 774, 771, 772, 773, 785, - 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, - 786, 925, 926, 927, 928, 929, 930, 800, 804, 803, - 801, 802, 798, 799, 826, 825, 827, 828, 829, 830, - 831, 832, 834, 833, 835, 836, 837, 838, 839, 840, - 808, 809, 812, 813, 811, 810, 814, 823, 824, 815, - 816, 817, 818, 819, 820, 822, 821, 841, 842, 843, - 844, 845, 847, 846, 850, 851, 849, 848, 853, 852, - 750, 196, 220, 364, 0, 449, 287, 637, 606, 601, - 205, 222, 916, 261, 917, 0, 0, 921, 0, 0, - 0, 923, 922, 0, 924, 886, 885, 0, 0, 918, - 919, 0, 920, 0, 0, 198, 200, 208, 221, 231, - 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, - 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, - 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, - 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, - 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, - 508, 578, 580, 595, 613, 619, 475, 931, 932, 933, - 934, 935, 936, 937, 938, 298, 590, 620, 588, 632, - 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, - 605, 496, 226, 461, 289, 250, 956, 0, 210, 245, - 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, - 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, - 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, - 761, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 0, 749, 0, 0, 0, 269, - 754, 0, 0, 0, 362, 266, 0, 0, 425, 0, - 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, - 249, 315, 381, 423, 510, 417, 760, 366, 0, 0, - 491, 396, 0, 0, 0, 0, 0, 756, 757, 0, - 0, 0, 0, 0, 0, 2383, 0, 321, 247, 323, - 202, 408, 492, 285, 0, 95, 0, 0, 957, 941, - 733, 907, 945, 958, 959, 960, 961, 946, 0, 237, - 947, 948, 244, 949, 0, 906, 791, 793, 792, 856, - 857, 858, 859, 860, 861, 862, 789, 954, 962, 963, - 2384, 264, 319, 271, 263, 572, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, - 0, 0, 729, 746, 0, 759, 0, 0, 0, 274, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 743, 744, 0, 0, - 0, 0, 901, 0, 745, 0, 0, 753, 964, 965, - 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, - 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, - 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, - 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, - 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 296, 0, 397, 256, 0, 448, 900, 0, 0, - 616, 0, 0, 898, 0, 0, 0, 0, 361, 0, - 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, - 0, 951, 0, 466, 421, 594, 232, 283, 453, 427, - 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, - 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, - 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, - 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, - 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, - 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, - 0, 452, 267, 292, 0, 0, 257, 410, 952, 953, - 255, 639, 797, 610, 219, 0, 609, 403, 576, 587, - 390, 379, 218, 585, 388, 378, 332, 805, 806, 279, - 305, 882, 881, 880, 304, 306, 878, 879, 877, 206, - 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, - 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, - 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, - 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, - 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, - 490, 888, 910, 899, 765, 766, 889, 890, 914, 891, - 768, 769, 911, 912, 762, 763, 767, 913, 915, 641, - 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, - 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, - 501, 502, 503, 504, 505, 0, 507, 902, 752, 751, - 0, 758, 0, 787, 788, 790, 794, 795, 796, 807, - 854, 855, 863, 865, 866, 864, 867, 868, 869, 872, - 873, 874, 875, 870, 871, 876, 770, 774, 771, 772, - 773, 785, 775, 776, 777, 778, 779, 780, 781, 782, - 783, 784, 786, 925, 926, 927, 928, 929, 930, 800, - 804, 803, 801, 802, 798, 799, 826, 825, 827, 828, - 829, 830, 831, 832, 834, 833, 835, 836, 837, 838, - 839, 840, 808, 809, 812, 813, 811, 810, 814, 823, - 824, 815, 816, 817, 818, 819, 820, 822, 821, 841, - 842, 843, 844, 845, 847, 846, 850, 851, 849, 848, - 853, 852, 750, 196, 220, 364, 0, 449, 287, 637, - 606, 601, 205, 222, 916, 261, 917, 0, 0, 921, - 0, 0, 0, 923, 922, 0, 924, 886, 885, 0, - 0, 918, 919, 0, 920, 0, 0, 198, 200, 208, - 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, - 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, - 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, - 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, - 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, - 494, 495, 508, 578, 580, 595, 613, 619, 475, 931, - 932, 933, 934, 935, 936, 937, 938, 298, 590, 620, - 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, - 318, 0, 605, 496, 226, 461, 289, 250, 956, 0, - 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, - 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, - 515, 391, 265, 428, 0, 392, 372, 568, 569, 314, - 86, 520, 0, 761, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 411, 0, 0, 0, 0, 749, 0, - 0, 0, 269, 754, 0, 0, 0, 362, 266, 0, - 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, - 281, 272, 268, 249, 315, 381, 423, 510, 417, 760, - 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, - 756, 757, 0, 0, 0, 0, 0, 0, 0, 0, - 321, 247, 323, 202, 408, 492, 285, 0, 95, 0, - 0, 957, 941, 733, 907, 945, 958, 959, 960, 961, - 946, 0, 237, 947, 948, 244, 949, 0, 906, 791, - 793, 792, 856, 857, 858, 859, 860, 861, 862, 789, - 954, 962, 963, 0, 264, 319, 271, 263, 572, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, - 0, 0, 0, 0, 0, 729, 746, 0, 759, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 743, - 744, 0, 0, 0, 0, 901, 0, 745, 0, 0, - 753, 964, 965, 966, 967, 968, 969, 970, 971, 972, - 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, - 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, - 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, - 1003, 1004, 1005, 755, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, - 900, 0, 0, 616, 0, 0, 898, 0, 0, 0, - 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, - 468, 0, 0, 0, 951, 0, 466, 421, 594, 232, - 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, + 0, 0, 0, 0, 0, 0, 0, 1328, 0, 0, + 0, 0, 1283, 0, 1303, 1376, 0, 1266, 296, 1277, + 397, 256, 0, 448, 1383, 1394, 1325, 616, 1396, 1323, + 1322, 1370, 1281, 1389, 1316, 361, 1279, 328, 197, 224, + 0, 1314, 407, 456, 468, 1388, 1299, 1308, 252, 1306, + 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, + 1349, 1368, 465, 368, 577, 445, 591, 617, 618, 262, + 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, + 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, + 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, + 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, + 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, + 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, + 610, 219, 1278, 609, 403, 576, 587, 390, 379, 218, + 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, + 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, + 0, 493, 599, 640, 447, 211, 233, 234, 236, 1294, + 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, + 437, 446, 1384, 571, 592, 604, 615, 621, 622, 624, + 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, + 369, 1373, 1414, 420, 467, 239, 596, 490, 199, 1288, + 1293, 1286, 0, 253, 254, 1355, 567, 1289, 1287, 1344, + 1345, 1290, 1405, 1406, 1407, 1392, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, + 504, 505, 0, 507, 1377, 1282, 0, 1291, 1292, 1386, + 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, + 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, + 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, + 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, + 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, + 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, + 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, + 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, + 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, + 556, 555, 536, 547, 558, 542, 530, 523, 531, 1348, + 196, 220, 364, 1410, 449, 287, 637, 606, 601, 205, + 222, 1285, 261, 1297, 1305, 0, 1311, 1319, 1320, 1332, + 1335, 1336, 1337, 1338, 1356, 1357, 1359, 1367, 1369, 1372, + 1374, 1381, 1393, 1413, 198, 200, 208, 221, 231, 235, + 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, + 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, + 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, + 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, + 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, + 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, + 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, + 433, 374, 1347, 1353, 377, 280, 303, 318, 1362, 605, + 496, 226, 461, 289, 250, 1380, 1382, 210, 245, 229, + 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, + 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, + 428, 1343, 1371, 372, 568, 569, 314, 392, 0, 0, + 0, 1399, 1385, 520, 0, 1327, 1402, 1296, 1315, 1412, + 1318, 1321, 1364, 1274, 1342, 411, 1312, 1267, 1300, 1269, + 1307, 1270, 1298, 1329, 269, 1295, 1387, 1346, 1401, 362, + 266, 1276, 1301, 425, 1317, 203, 1366, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 1408, 366, 1352, 0, 491, 396, 0, 0, 0, + 1331, 1391, 1340, 1378, 1326, 1365, 1284, 1351, 1403, 1313, + 1361, 1404, 321, 247, 323, 202, 408, 492, 285, 0, + 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, + 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, + 359, 1309, 1358, 1398, 1310, 1360, 264, 319, 271, 263, + 572, 1409, 1390, 1273, 1339, 1397, 1334, 0, 0, 228, + 1400, 1333, 0, 1363, 0, 1415, 1268, 1354, 0, 1271, + 1275, 1411, 1395, 1304, 274, 0, 0, 0, 0, 0, + 0, 0, 1330, 1341, 1375, 1379, 1324, 0, 0, 0, + 0, 0, 0, 3142, 0, 1302, 0, 1350, 0, 0, + 0, 1280, 1272, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1328, 0, 0, 0, 0, + 1283, 0, 1303, 1376, 0, 1266, 296, 1277, 397, 256, + 0, 448, 1383, 1394, 1325, 616, 1396, 1323, 1322, 1370, + 1281, 1389, 1316, 361, 1279, 328, 197, 224, 0, 1314, + 407, 456, 468, 1388, 1299, 1308, 252, 1306, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 1349, 1368, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 1278, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, + 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 1294, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 1384, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 1373, + 1414, 420, 467, 239, 596, 490, 199, 1288, 1293, 1286, + 0, 253, 254, 1355, 567, 1289, 1287, 1344, 1345, 1290, + 1405, 1406, 1407, 1392, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 1377, 1282, 0, 1291, 1292, 1386, 583, 584, + 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, + 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, + 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, + 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, + 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, + 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, + 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, + 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, + 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, + 536, 547, 558, 542, 530, 523, 531, 1348, 196, 220, + 364, 1410, 449, 287, 637, 606, 601, 205, 222, 1285, + 261, 1297, 1305, 0, 1311, 1319, 1320, 1332, 1335, 1336, + 1337, 1338, 1356, 1357, 1359, 1367, 1369, 1372, 1374, 1381, + 1393, 1413, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, + 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, + 1347, 1353, 377, 280, 303, 318, 1362, 605, 496, 226, + 461, 289, 250, 1380, 1382, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 1343, + 1371, 372, 568, 569, 314, 392, 0, 0, 0, 1399, + 1385, 520, 0, 1327, 1402, 1296, 1315, 1412, 1318, 1321, + 1364, 1274, 1342, 411, 1312, 1267, 1300, 1269, 1307, 1270, + 1298, 1329, 269, 1295, 1387, 1346, 1401, 362, 266, 1276, + 1301, 425, 1317, 203, 1366, 481, 251, 373, 370, 575, + 281, 272, 268, 249, 315, 381, 423, 510, 417, 1408, + 366, 1352, 0, 491, 396, 0, 0, 0, 1331, 1391, + 1340, 1378, 1326, 1365, 1284, 1351, 1403, 1313, 1361, 1404, + 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, + 0, 0, 941, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, + 356, 355, 336, 337, 339, 341, 346, 353, 359, 1309, + 1358, 1398, 1310, 1360, 264, 319, 271, 263, 572, 1409, + 1390, 1273, 1339, 1397, 1334, 0, 0, 228, 1400, 1333, + 0, 1363, 0, 1415, 1268, 1354, 0, 1271, 1275, 1411, + 1395, 1304, 274, 0, 0, 0, 0, 0, 0, 0, + 1330, 1341, 1375, 1379, 1324, 0, 0, 0, 0, 0, + 0, 2361, 0, 1302, 0, 1350, 0, 0, 0, 1280, + 1272, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1328, 0, 0, 0, 0, 1283, 0, + 1303, 1376, 0, 1266, 296, 1277, 397, 256, 0, 448, + 1383, 1394, 1325, 616, 1396, 1323, 1322, 1370, 1281, 1389, + 1316, 361, 1279, 328, 197, 224, 0, 1314, 407, 456, + 468, 1388, 1299, 1308, 252, 1306, 466, 421, 594, 232, + 283, 453, 427, 464, 435, 286, 1349, 1368, 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, - 410, 952, 953, 255, 639, 797, 610, 219, 0, 609, + 410, 581, 582, 255, 639, 227, 610, 219, 1278, 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, - 805, 806, 279, 305, 882, 881, 880, 304, 306, 878, - 879, 877, 206, 598, 0, 207, 0, 493, 599, 640, - 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, - 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, + 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, + 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, + 447, 211, 233, 234, 236, 1294, 278, 282, 290, 293, + 301, 302, 311, 363, 414, 441, 437, 446, 1384, 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, - 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, - 467, 239, 596, 490, 888, 910, 899, 765, 766, 889, - 890, 914, 891, 768, 769, 911, 912, 762, 763, 767, - 913, 915, 641, 642, 643, 644, 645, 646, 647, 648, + 631, 629, 402, 309, 489, 331, 369, 1373, 1414, 420, + 467, 239, 596, 490, 199, 1288, 1293, 1286, 0, 253, + 254, 1355, 567, 1289, 1287, 1344, 1345, 1290, 1405, 1406, + 1407, 1392, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, - 902, 752, 751, 0, 758, 0, 787, 788, 790, 794, - 795, 796, 807, 854, 855, 863, 865, 866, 864, 867, - 868, 869, 872, 873, 874, 875, 870, 871, 876, 770, - 774, 771, 772, 773, 785, 775, 776, 777, 778, 779, - 780, 781, 782, 783, 784, 786, 925, 926, 927, 928, - 929, 930, 800, 804, 803, 801, 802, 798, 799, 826, - 825, 827, 828, 829, 830, 831, 832, 834, 833, 835, - 836, 837, 838, 839, 840, 808, 809, 812, 813, 811, - 810, 814, 823, 824, 815, 816, 817, 818, 819, 820, - 822, 821, 841, 842, 843, 844, 845, 847, 846, 850, - 851, 849, 848, 853, 852, 750, 196, 220, 364, 94, - 449, 287, 637, 606, 601, 205, 222, 916, 261, 917, - 0, 0, 921, 0, 0, 0, 923, 922, 0, 924, - 886, 885, 0, 0, 918, 919, 0, 920, 0, 0, + 1377, 1282, 0, 1291, 1292, 1386, 583, 584, 659, 380, + 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, + 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, + 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, + 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, + 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, + 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, + 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, + 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, + 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, + 558, 542, 530, 523, 531, 1348, 196, 220, 364, 1410, + 449, 287, 637, 606, 601, 205, 222, 1285, 261, 1297, + 1305, 0, 1311, 1319, 1320, 1332, 1335, 1336, 1337, 1338, + 1356, 1357, 1359, 1367, 1369, 1372, 1374, 1381, 1393, 1413, 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, - 619, 475, 931, 932, 933, 934, 935, 936, 937, 938, - 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, - 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, - 250, 956, 0, 210, 245, 229, 258, 273, 276, 322, + 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, + 298, 590, 620, 588, 632, 614, 433, 374, 1347, 1353, + 377, 280, 303, 318, 1362, 605, 496, 226, 461, 289, + 250, 1380, 1382, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, - 568, 569, 314, 520, 0, 761, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, - 749, 0, 0, 0, 269, 754, 0, 0, 0, 362, - 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, - 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, - 417, 760, 366, 0, 0, 491, 396, 0, 0, 0, - 0, 0, 756, 757, 0, 0, 0, 0, 0, 0, - 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, - 95, 0, 0, 957, 941, 733, 907, 945, 958, 959, - 960, 961, 946, 0, 237, 947, 948, 244, 949, 0, - 906, 791, 793, 792, 856, 857, 858, 859, 860, 861, - 862, 789, 954, 962, 963, 0, 264, 319, 271, 263, - 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, - 0, 0, 0, 0, 0, 0, 0, 729, 746, 0, - 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, + 511, 512, 513, 515, 391, 265, 428, 1343, 1371, 372, + 568, 569, 314, 392, 0, 0, 0, 1399, 1385, 520, + 0, 1327, 1402, 1296, 1315, 1412, 1318, 1321, 1364, 1274, + 1342, 411, 1312, 1267, 1300, 1269, 1307, 1270, 1298, 1329, + 269, 1295, 1387, 1346, 1401, 362, 266, 1276, 1301, 425, + 1317, 203, 1366, 481, 251, 373, 370, 575, 281, 272, + 268, 249, 315, 381, 423, 510, 417, 1408, 366, 1352, + 0, 491, 396, 0, 0, 0, 1331, 1391, 1340, 1378, + 1326, 1365, 1284, 1351, 1403, 1313, 1361, 1404, 321, 247, + 323, 202, 408, 492, 285, 0, 95, 0, 0, 0, + 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, + 336, 337, 339, 341, 346, 353, 359, 1309, 1358, 1398, + 1310, 1360, 264, 319, 271, 263, 572, 1409, 1390, 1273, + 1339, 1397, 1334, 0, 0, 228, 1400, 1333, 0, 1363, + 0, 1415, 1268, 1354, 0, 1271, 1275, 1411, 1395, 1304, + 274, 0, 0, 0, 0, 0, 0, 0, 1330, 1341, + 1375, 1379, 1324, 0, 0, 0, 0, 0, 0, 0, + 0, 1302, 0, 1350, 0, 0, 0, 1280, 1272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 743, 744, 0, 0, 0, 0, 901, 0, 745, - 0, 0, 753, 964, 965, 966, 967, 968, 969, 970, - 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, - 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, - 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, - 1001, 1002, 1003, 1004, 1005, 755, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, - 0, 448, 900, 0, 0, 616, 0, 0, 898, 0, - 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, - 407, 456, 468, 0, 0, 0, 951, 0, 466, 421, - 594, 232, 283, 453, 427, 464, 435, 286, 3988, 0, - 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, - 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, - 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, - 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, - 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, - 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 952, 953, 255, 639, 797, 610, 219, - 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 805, 806, 279, 305, 882, 881, 880, 304, - 306, 878, 879, 877, 206, 598, 0, 207, 0, 493, - 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, - 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, - 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, - 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, - 0, 420, 467, 239, 596, 490, 888, 910, 899, 765, - 766, 889, 890, 914, 891, 768, 769, 911, 912, 762, - 763, 767, 913, 915, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 902, 752, 751, 0, 758, 0, 787, 788, - 790, 794, 795, 796, 807, 854, 855, 863, 865, 866, - 864, 867, 868, 869, 872, 873, 874, 875, 870, 871, - 876, 770, 774, 771, 772, 773, 785, 775, 776, 777, - 778, 779, 780, 781, 782, 783, 784, 786, 925, 926, - 927, 928, 929, 930, 800, 804, 803, 801, 802, 798, - 799, 826, 825, 827, 828, 829, 830, 831, 832, 834, - 833, 835, 836, 837, 838, 839, 840, 808, 809, 812, - 813, 811, 810, 814, 823, 824, 815, 816, 817, 818, - 819, 820, 822, 821, 841, 842, 843, 844, 845, 847, - 846, 850, 851, 849, 848, 853, 852, 750, 196, 220, - 364, 0, 449, 287, 637, 606, 601, 205, 222, 916, - 261, 917, 0, 0, 921, 0, 0, 0, 923, 922, - 0, 924, 886, 885, 0, 0, 918, 919, 0, 920, - 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 931, 932, 933, 934, 935, 936, - 937, 938, 298, 590, 620, 588, 632, 614, 433, 374, - 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, - 461, 289, 250, 956, 0, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, - 0, 372, 568, 569, 314, 520, 0, 761, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, - 0, 0, 749, 0, 0, 0, 269, 754, 0, 0, - 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1328, 0, 0, 0, 0, 1283, 0, 1303, 1376, + 0, 1266, 296, 1277, 397, 256, 0, 448, 1383, 1394, + 1325, 616, 1396, 1323, 1322, 1370, 1281, 1389, 1316, 361, + 1279, 328, 197, 224, 0, 1314, 407, 456, 468, 1388, + 1299, 1308, 252, 1306, 466, 421, 594, 232, 283, 453, + 427, 464, 435, 286, 1349, 1368, 465, 368, 577, 445, + 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, + 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, + 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, + 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, + 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, + 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, + 582, 255, 639, 227, 610, 219, 1278, 609, 403, 576, + 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, + 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, + 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, + 233, 234, 236, 1294, 278, 282, 290, 293, 301, 302, + 311, 363, 414, 441, 437, 446, 1384, 571, 592, 604, + 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, + 402, 309, 489, 331, 369, 1373, 1414, 420, 467, 239, + 596, 490, 199, 1288, 1293, 1286, 0, 253, 254, 1355, + 567, 1289, 1287, 1344, 1345, 1290, 1405, 1406, 1407, 1392, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, + 506, 501, 502, 503, 504, 505, 0, 507, 1377, 1282, + 0, 1291, 1292, 1386, 583, 584, 659, 380, 480, 593, + 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, + 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, + 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, + 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, + 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, + 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, + 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, + 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, + 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, + 530, 523, 531, 1348, 196, 220, 364, 1410, 449, 287, + 637, 606, 601, 205, 222, 1285, 261, 1297, 1305, 0, + 1311, 1319, 1320, 1332, 1335, 1336, 1337, 1338, 1356, 1357, + 1359, 1367, 1369, 1372, 1374, 1381, 1393, 1413, 198, 200, + 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, + 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, + 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, + 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, + 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, + 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, + 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, + 620, 588, 632, 614, 433, 374, 1347, 1353, 377, 280, + 303, 318, 1362, 605, 496, 226, 461, 289, 250, 1380, + 1382, 210, 245, 229, 258, 273, 276, 322, 387, 395, + 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, + 513, 515, 391, 265, 428, 1343, 1371, 372, 568, 569, + 314, 392, 0, 0, 0, 1399, 1385, 520, 0, 1327, + 1402, 1296, 1315, 1412, 1318, 1321, 1364, 1274, 1342, 411, + 1312, 1267, 1300, 1269, 1307, 1270, 1298, 1329, 269, 1295, + 1387, 1346, 1401, 362, 266, 1276, 1301, 425, 1317, 203, + 1366, 481, 251, 373, 370, 575, 281, 272, 268, 249, + 315, 381, 423, 510, 417, 1408, 366, 1352, 0, 491, + 396, 0, 0, 0, 1331, 1391, 1340, 1378, 1326, 1365, + 1284, 1351, 1403, 1313, 1361, 1404, 321, 247, 323, 202, + 408, 492, 285, 0, 0, 0, 0, 0, 194, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, + 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, + 339, 341, 346, 353, 359, 1309, 1358, 1398, 1310, 1360, + 264, 319, 271, 263, 572, 1409, 1390, 1273, 1339, 1397, + 1334, 0, 0, 228, 1400, 1333, 0, 1363, 0, 1415, + 1268, 1354, 0, 1271, 1275, 1411, 1395, 1304, 274, 0, + 0, 0, 0, 0, 0, 0, 1330, 1341, 1375, 1379, + 1324, 0, 0, 0, 0, 0, 0, 0, 0, 1302, + 0, 1350, 0, 0, 0, 1280, 1272, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1328, + 0, 0, 0, 0, 1283, 0, 1303, 1376, 0, 1266, + 296, 1277, 397, 256, 0, 448, 1383, 1394, 1325, 616, + 1396, 1323, 1322, 1370, 1281, 1389, 1316, 361, 1279, 328, + 197, 224, 0, 1314, 407, 456, 468, 1388, 1299, 1308, + 252, 1306, 466, 421, 594, 232, 283, 453, 427, 464, + 435, 286, 1349, 1368, 465, 368, 577, 445, 591, 617, + 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, + 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, + 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, + 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, + 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, + 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, + 639, 227, 610, 219, 1278, 609, 403, 576, 587, 390, + 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, + 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, + 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, + 236, 1294, 278, 282, 290, 293, 301, 302, 311, 363, + 414, 441, 437, 446, 1384, 571, 592, 604, 615, 621, + 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, + 489, 331, 369, 1373, 1414, 420, 467, 239, 596, 490, + 199, 1288, 1293, 1286, 0, 253, 254, 1355, 567, 1289, + 1287, 1344, 1345, 1290, 1405, 1406, 1407, 1392, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, + 502, 503, 504, 505, 0, 507, 1377, 1282, 0, 1291, + 1292, 1386, 583, 584, 659, 380, 480, 593, 333, 345, + 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, + 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, + 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, + 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, + 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, + 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, + 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, + 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, + 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, + 531, 1348, 196, 220, 364, 1410, 449, 287, 637, 606, + 601, 205, 222, 1285, 261, 1297, 1305, 0, 1311, 1319, + 1320, 1332, 1335, 1336, 1337, 1338, 1356, 1357, 1359, 1367, + 1369, 1372, 1374, 1381, 1393, 1413, 198, 200, 208, 221, + 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, + 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, + 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, + 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, + 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, + 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, + 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, + 632, 614, 433, 374, 1347, 1353, 377, 280, 303, 318, + 1362, 605, 496, 226, 461, 289, 250, 1380, 1382, 210, + 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, + 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, + 391, 265, 428, 1343, 1371, 372, 568, 569, 314, 392, + 0, 0, 0, 1399, 1385, 520, 0, 1327, 1402, 1296, + 1315, 1412, 1318, 1321, 1364, 1274, 1342, 411, 1312, 1267, + 1300, 1269, 1307, 1270, 1298, 1329, 269, 1295, 1387, 1346, + 1401, 362, 266, 1276, 1301, 425, 1317, 203, 1366, 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, - 423, 510, 417, 760, 366, 0, 0, 491, 396, 0, - 0, 0, 0, 0, 756, 757, 0, 0, 0, 0, - 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, - 285, 0, 95, 0, 1717, 957, 941, 733, 907, 945, - 958, 959, 960, 961, 946, 0, 237, 947, 948, 244, - 949, 0, 906, 791, 793, 792, 856, 857, 858, 859, - 860, 861, 862, 789, 954, 962, 963, 0, 264, 319, - 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 729, - 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 743, 744, 0, 0, 0, 0, 901, - 0, 745, 0, 0, 753, 964, 965, 966, 967, 968, - 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, - 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, - 999, 1000, 1001, 1002, 1003, 1004, 1005, 755, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, - 397, 256, 0, 448, 900, 0, 0, 616, 0, 0, - 898, 0, 0, 0, 0, 361, 0, 328, 197, 224, - 0, 0, 407, 456, 468, 0, 0, 0, 951, 0, + 423, 510, 417, 1408, 366, 1352, 0, 491, 396, 0, + 0, 0, 1331, 1391, 1340, 1378, 1326, 1365, 1284, 1351, + 1403, 1313, 1361, 1404, 321, 247, 323, 202, 408, 492, + 285, 0, 0, 0, 0, 0, 709, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, + 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, + 346, 353, 359, 1309, 1358, 1398, 1310, 1360, 264, 319, + 271, 263, 572, 1409, 1390, 1273, 1339, 1397, 1334, 0, + 0, 228, 1400, 1333, 0, 1363, 0, 1415, 1268, 1354, + 0, 1271, 1275, 1411, 1395, 1304, 274, 0, 0, 0, + 0, 0, 0, 0, 1330, 1341, 1375, 1379, 1324, 0, + 0, 0, 0, 0, 0, 0, 0, 1302, 0, 1350, + 0, 0, 0, 1280, 1272, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1328, 0, 0, + 0, 0, 1283, 0, 1303, 1376, 0, 1266, 296, 1277, + 397, 256, 0, 448, 1383, 1394, 1325, 616, 1396, 1323, + 1322, 1370, 1281, 1389, 1316, 361, 1279, 328, 197, 224, + 0, 1314, 407, 456, 468, 1388, 1299, 1308, 252, 1306, 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, - 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, + 1349, 1368, 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, - 292, 0, 0, 257, 410, 952, 953, 255, 639, 797, - 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, - 585, 388, 378, 332, 805, 806, 279, 305, 882, 881, - 880, 304, 306, 878, 879, 877, 206, 598, 0, 207, - 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, + 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, + 610, 219, 1278, 609, 403, 576, 587, 390, 379, 218, + 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, + 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, + 0, 493, 599, 640, 447, 211, 233, 234, 236, 1294, 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, - 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, + 437, 446, 1384, 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, - 369, 0, 0, 420, 467, 239, 596, 490, 888, 910, - 899, 765, 766, 889, 890, 914, 891, 768, 769, 911, - 912, 762, 763, 767, 913, 915, 641, 642, 643, 644, + 369, 1373, 1414, 420, 467, 239, 596, 490, 199, 1288, + 1293, 1286, 0, 253, 254, 1355, 567, 1289, 1287, 1344, + 1345, 1290, 1405, 1406, 1407, 1392, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, - 504, 505, 0, 507, 902, 752, 751, 0, 758, 0, - 787, 788, 790, 794, 795, 796, 807, 854, 855, 863, - 865, 866, 864, 867, 868, 869, 872, 873, 874, 875, - 870, 871, 876, 770, 774, 771, 772, 773, 785, 775, - 776, 777, 778, 779, 780, 781, 782, 783, 784, 786, - 925, 926, 927, 928, 929, 930, 800, 804, 803, 801, - 802, 798, 799, 826, 825, 827, 828, 829, 830, 831, - 832, 834, 833, 835, 836, 837, 838, 839, 840, 808, - 809, 812, 813, 811, 810, 814, 823, 824, 815, 816, - 817, 818, 819, 820, 822, 821, 841, 842, 843, 844, - 845, 847, 846, 850, 851, 849, 848, 853, 852, 750, - 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, - 222, 916, 261, 917, 0, 0, 921, 0, 0, 0, - 923, 922, 0, 924, 886, 885, 0, 0, 918, 919, - 0, 920, 0, 0, 198, 200, 208, 221, 231, 235, + 504, 505, 0, 507, 1377, 1282, 0, 1291, 1292, 1386, + 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, + 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, + 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, + 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, + 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, + 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, + 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, + 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, + 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, + 556, 555, 536, 547, 558, 542, 530, 523, 531, 1348, + 196, 220, 364, 1410, 449, 287, 637, 606, 601, 205, + 222, 1285, 261, 1297, 1305, 0, 1311, 1319, 1320, 1332, + 1335, 1336, 1337, 1338, 1356, 1357, 1359, 1367, 1369, 1372, + 1374, 1381, 1393, 1413, 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, - 578, 580, 595, 613, 619, 475, 931, 932, 933, 934, - 935, 936, 937, 938, 298, 590, 620, 588, 632, 614, - 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, - 496, 226, 461, 289, 250, 956, 0, 210, 245, 229, + 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, + 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, + 433, 374, 1347, 1353, 377, 280, 303, 318, 1362, 605, + 496, 226, 461, 289, 250, 1380, 1382, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, - 428, 392, 0, 372, 568, 569, 314, 520, 0, 761, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, - 0, 0, 0, 0, 749, 0, 0, 0, 269, 754, - 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, - 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 760, 366, 0, 0, 491, - 396, 0, 0, 0, 0, 0, 756, 757, 0, 0, - 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, - 408, 492, 285, 0, 95, 0, 0, 957, 941, 733, - 907, 945, 958, 959, 960, 961, 946, 0, 237, 947, - 948, 244, 949, 0, 906, 791, 793, 792, 856, 857, - 858, 859, 860, 861, 862, 789, 954, 962, 963, 0, - 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, - 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 729, 746, 0, 759, 0, 0, 0, 274, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 743, 744, 1049, 0, 0, - 0, 901, 0, 745, 0, 0, 753, 964, 965, 966, - 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, - 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 755, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 296, 0, 397, 256, 0, 448, 900, 0, 0, 616, - 0, 0, 898, 0, 0, 0, 0, 361, 0, 328, - 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, - 951, 0, 466, 421, 594, 232, 283, 453, 427, 464, - 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, - 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, - 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, - 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, - 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, - 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 952, 953, 255, - 639, 797, 610, 219, 0, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 805, 806, 279, 305, - 882, 881, 880, 304, 306, 878, 879, 877, 206, 598, - 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, - 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, - 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, - 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, - 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, - 888, 910, 899, 765, 766, 889, 890, 914, 891, 768, - 769, 911, 912, 762, 763, 767, 913, 915, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 902, 752, 751, 0, - 758, 0, 787, 788, 790, 794, 795, 796, 807, 854, - 855, 863, 865, 866, 864, 867, 868, 869, 872, 873, - 874, 875, 870, 871, 876, 770, 774, 771, 772, 773, - 785, 775, 776, 777, 778, 779, 780, 781, 782, 783, - 784, 786, 925, 926, 927, 928, 929, 930, 800, 804, - 803, 801, 802, 798, 799, 826, 825, 827, 828, 829, - 830, 831, 832, 834, 833, 835, 836, 837, 838, 839, - 840, 808, 809, 812, 813, 811, 810, 814, 823, 824, - 815, 816, 817, 818, 819, 820, 822, 821, 841, 842, - 843, 844, 845, 847, 846, 850, 851, 849, 848, 853, - 852, 750, 196, 220, 364, 0, 449, 287, 637, 606, - 601, 205, 222, 916, 261, 917, 0, 0, 921, 0, - 0, 0, 923, 922, 0, 924, 886, 885, 0, 0, - 918, 919, 0, 920, 0, 0, 198, 200, 208, 221, - 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, - 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, - 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, - 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, - 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 931, 932, - 933, 934, 935, 936, 937, 938, 298, 590, 620, 588, - 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, - 0, 605, 496, 226, 461, 289, 250, 956, 0, 210, - 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, - 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, - 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 411, 0, 0, 0, 0, 749, 0, 0, 0, - 269, 754, 0, 0, 0, 362, 266, 0, 0, 425, - 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 760, 366, 0, - 0, 491, 396, 0, 0, 0, 0, 0, 756, 757, - 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, - 323, 202, 408, 492, 285, 0, 95, 0, 0, 957, - 941, 733, 907, 945, 958, 959, 960, 961, 946, 0, - 237, 947, 948, 244, 949, 0, 906, 791, 793, 792, - 856, 857, 858, 859, 860, 861, 862, 789, 954, 962, - 963, 0, 264, 319, 271, 263, 572, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, - 0, 0, 0, 729, 746, 0, 759, 0, 0, 0, - 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 743, 744, 0, - 0, 0, 0, 901, 0, 745, 0, 0, 753, 964, - 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, - 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, - 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, - 1005, 755, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 397, 256, 0, 448, 900, 0, - 0, 616, 0, 0, 898, 0, 0, 0, 0, 361, - 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, - 0, 0, 951, 0, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 952, - 953, 255, 639, 797, 610, 219, 0, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 805, 806, - 279, 305, 882, 881, 880, 304, 306, 878, 879, 877, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, - 596, 490, 888, 910, 899, 765, 766, 889, 890, 914, - 891, 768, 769, 911, 912, 762, 763, 767, 913, 915, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 902, 752, - 751, 0, 758, 0, 787, 788, 790, 794, 795, 796, - 807, 854, 855, 863, 865, 866, 864, 867, 868, 869, - 872, 873, 874, 875, 870, 871, 876, 770, 774, 771, - 772, 773, 785, 775, 776, 777, 778, 779, 780, 781, - 782, 783, 784, 786, 925, 926, 927, 928, 929, 930, - 800, 804, 803, 801, 802, 798, 799, 826, 825, 827, - 828, 829, 830, 831, 832, 834, 833, 835, 836, 837, - 838, 839, 840, 808, 809, 812, 813, 811, 810, 814, - 823, 824, 815, 816, 817, 818, 819, 820, 822, 821, - 841, 842, 843, 844, 845, 847, 846, 850, 851, 849, - 848, 853, 852, 750, 196, 220, 364, 0, 449, 287, - 637, 606, 601, 205, 222, 916, 261, 917, 0, 0, - 921, 0, 0, 0, 923, 922, 0, 924, 886, 885, - 0, 0, 918, 919, 0, 920, 0, 0, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 931, 932, 933, 934, 935, 936, 937, 938, 298, 590, - 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, - 303, 318, 0, 605, 496, 226, 461, 289, 250, 956, - 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, - 314, 520, 0, 761, 0, 0, 0, 0, 0, 0, + 428, 1343, 1371, 372, 568, 569, 314, 392, 0, 0, + 0, 1399, 1385, 520, 0, 1327, 1402, 1296, 1315, 1412, + 1318, 1321, 1364, 1274, 1342, 411, 1312, 1267, 1300, 1269, + 1307, 1270, 1298, 1329, 269, 1295, 1387, 1346, 1401, 362, + 266, 1276, 1301, 425, 1317, 203, 1366, 481, 251, 373, + 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, + 417, 1408, 366, 1352, 0, 491, 396, 0, 0, 0, + 1331, 1391, 1340, 1378, 1326, 1365, 1284, 1351, 1403, 1313, + 1361, 1404, 321, 247, 323, 202, 408, 492, 285, 0, + 0, 0, 0, 0, 941, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, + 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, + 359, 1309, 1358, 1398, 1310, 1360, 264, 319, 271, 263, + 572, 1409, 1390, 1273, 1339, 1397, 1334, 0, 0, 228, + 1400, 1333, 0, 1363, 0, 1415, 1268, 1354, 0, 1271, + 1275, 1411, 1395, 1304, 274, 0, 0, 0, 0, 0, + 0, 0, 1330, 1341, 1375, 1379, 1324, 0, 0, 0, + 0, 0, 0, 0, 0, 1302, 0, 1350, 0, 0, + 0, 1280, 1272, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1328, 0, 0, 0, 0, + 1283, 0, 1303, 1376, 0, 1266, 296, 1277, 397, 256, + 0, 448, 1383, 1394, 1325, 616, 1396, 1323, 1322, 1370, + 1281, 1389, 1316, 361, 1279, 328, 197, 224, 0, 1314, + 407, 456, 468, 1388, 1299, 1308, 252, 1306, 466, 421, + 594, 232, 283, 453, 427, 464, 435, 286, 1349, 1368, + 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, + 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, + 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, + 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, + 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, + 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, + 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 1278, 609, 403, 576, 587, 390, 379, 218, 585, 388, + 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, + 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 599, 640, 447, 211, 233, 234, 236, 1294, 278, 282, + 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, + 1384, 571, 592, 604, 615, 621, 622, 624, 625, 626, + 627, 628, 631, 629, 402, 309, 489, 331, 369, 1373, + 1414, 420, 467, 239, 596, 490, 199, 1288, 1293, 1286, + 0, 253, 254, 1355, 567, 1289, 1287, 1344, 1345, 1290, + 1405, 1406, 1407, 1392, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, + 0, 507, 1377, 1282, 0, 1291, 1292, 1386, 583, 584, + 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, + 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, + 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, + 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, + 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, + 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, + 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, + 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, + 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, + 536, 547, 558, 542, 530, 523, 531, 1348, 196, 220, + 364, 1410, 449, 287, 637, 606, 601, 205, 222, 1285, + 261, 1297, 1305, 0, 1311, 1319, 1320, 1332, 1335, 1336, + 1337, 1338, 1356, 1357, 1359, 1367, 1369, 1372, 1374, 1381, + 1393, 1413, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, + 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, + 1347, 1353, 377, 280, 303, 318, 1362, 605, 496, 226, + 461, 289, 250, 1380, 1382, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 1343, + 1371, 372, 568, 569, 314, 392, 0, 0, 0, 0, + 0, 520, 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 749, 0, 0, 0, 269, 754, 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, @@ -3897,7 +3407,7 @@ var yyAct = [...]int{ 946, 0, 237, 947, 948, 244, 949, 0, 906, 791, 793, 792, 856, 857, 858, 859, 860, 861, 862, 789, 954, 962, 963, 0, 264, 319, 271, 263, 572, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, + 0, 2182, 2183, 2184, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 729, 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 743, @@ -3906,7 +3416,7 @@ var yyAct = [...]int{ 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, - 1003, 1004, 1005, 3093, 0, 0, 0, 0, 0, 0, + 1003, 1004, 1005, 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, 900, 0, 0, 616, 0, 0, 898, 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, @@ -3964,11 +3474,11 @@ var yyAct = [...]int{ 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, 760, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 756, 757, 0, 0, 0, 0, 0, 0, - 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, + 2390, 0, 321, 247, 323, 202, 408, 492, 285, 0, 95, 0, 0, 957, 941, 733, 907, 945, 958, 959, 960, 961, 946, 0, 237, 947, 948, 244, 949, 0, 906, 791, 793, 792, 856, 857, 858, 859, 860, 861, - 862, 789, 954, 962, 963, 0, 264, 319, 271, 263, + 862, 789, 954, 962, 963, 2391, 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 729, 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, @@ -3978,372 +3488,11 @@ var yyAct = [...]int{ 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, - 1001, 1002, 1003, 1004, 1005, 3089, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, - 0, 448, 900, 0, 0, 616, 0, 0, 898, 0, - 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, - 407, 456, 468, 0, 0, 0, 951, 0, 466, 421, - 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, - 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, - 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, - 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, - 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, - 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, - 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 952, 953, 255, 639, 797, 610, 219, - 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 805, 806, 279, 305, 882, 881, 880, 304, - 306, 878, 879, 877, 206, 598, 0, 207, 0, 493, - 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, - 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, - 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, - 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, - 0, 420, 467, 239, 596, 490, 888, 910, 899, 765, - 766, 889, 890, 914, 891, 768, 769, 911, 912, 762, - 763, 767, 913, 915, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 902, 752, 751, 0, 758, 0, 787, 788, - 790, 794, 795, 796, 807, 854, 855, 863, 865, 866, - 864, 867, 868, 869, 872, 873, 874, 875, 870, 871, - 876, 770, 774, 771, 772, 773, 785, 775, 776, 777, - 778, 779, 780, 781, 782, 783, 784, 786, 925, 926, - 927, 928, 929, 930, 800, 804, 803, 801, 802, 798, - 799, 826, 825, 827, 828, 829, 830, 831, 832, 834, - 833, 835, 836, 837, 838, 839, 840, 808, 809, 812, - 813, 811, 810, 814, 823, 824, 815, 816, 817, 818, - 819, 820, 822, 821, 841, 842, 843, 844, 845, 847, - 846, 850, 851, 849, 848, 853, 852, 750, 196, 220, - 364, 0, 449, 287, 637, 606, 601, 205, 222, 916, - 261, 917, 0, 0, 921, 0, 0, 0, 923, 922, - 0, 924, 886, 885, 0, 0, 918, 919, 0, 920, - 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 931, 932, 933, 934, 935, 936, - 937, 938, 298, 590, 620, 588, 632, 614, 433, 374, - 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, - 461, 289, 250, 956, 0, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, - 0, 372, 568, 569, 314, 520, 0, 761, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, - 0, 0, 749, 0, 0, 0, 269, 754, 0, 0, - 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, - 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, - 423, 510, 417, 760, 366, 0, 0, 491, 396, 0, - 0, 0, 0, 0, 756, 757, 0, 0, 0, 0, - 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, - 285, 0, 95, 0, 0, 957, 941, 1070, 907, 945, - 958, 959, 960, 961, 946, 0, 237, 947, 948, 244, - 949, 0, 906, 791, 793, 792, 856, 857, 858, 859, - 860, 861, 862, 789, 954, 962, 963, 0, 264, 319, - 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 743, 744, 0, 0, 0, 0, 901, - 0, 745, 0, 0, 753, 964, 965, 966, 967, 968, - 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, - 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, - 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, - 999, 1000, 1001, 1002, 1003, 1004, 1005, 755, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, - 397, 256, 0, 448, 900, 0, 0, 616, 0, 0, - 898, 0, 0, 0, 0, 361, 0, 328, 197, 224, - 0, 0, 407, 456, 468, 0, 0, 0, 951, 0, - 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, - 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, - 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, - 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, - 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, - 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, - 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, - 292, 0, 0, 257, 410, 952, 953, 255, 639, 797, - 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, - 585, 388, 378, 332, 805, 806, 279, 305, 882, 881, - 880, 304, 306, 878, 879, 877, 206, 598, 0, 207, - 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, - 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, - 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, - 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, - 369, 0, 0, 420, 467, 239, 596, 490, 888, 910, - 899, 765, 766, 889, 890, 914, 891, 768, 769, 911, - 912, 762, 763, 767, 913, 915, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, - 504, 505, 0, 507, 902, 752, 751, 0, 758, 0, - 787, 788, 790, 794, 795, 796, 807, 854, 855, 863, - 865, 866, 864, 867, 868, 869, 872, 873, 874, 875, - 870, 871, 876, 770, 774, 771, 772, 773, 785, 775, - 776, 777, 778, 779, 780, 781, 782, 783, 784, 786, - 925, 926, 927, 928, 929, 930, 800, 804, 803, 801, - 802, 798, 799, 826, 825, 827, 828, 829, 830, 831, - 832, 834, 833, 835, 836, 837, 838, 839, 840, 808, - 809, 812, 813, 811, 810, 814, 823, 824, 815, 816, - 817, 818, 819, 820, 822, 821, 841, 842, 843, 844, - 845, 847, 846, 850, 851, 849, 848, 853, 852, 750, - 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, - 222, 916, 261, 917, 0, 0, 921, 0, 0, 0, - 923, 922, 0, 924, 886, 885, 0, 0, 918, 919, - 0, 920, 0, 0, 198, 200, 208, 221, 231, 235, - 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, - 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, - 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, - 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, - 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, - 578, 580, 595, 613, 619, 475, 931, 932, 933, 934, - 935, 936, 937, 938, 298, 590, 620, 588, 632, 614, - 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, - 496, 226, 461, 289, 250, 956, 0, 210, 245, 229, - 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, - 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, - 428, 392, 0, 372, 568, 569, 314, 520, 0, 761, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, - 0, 0, 0, 0, 749, 0, 0, 0, 269, 754, - 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, - 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 760, 366, 0, 0, 491, - 396, 0, 0, 0, 0, 0, 756, 757, 0, 0, - 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, - 408, 492, 285, 0, 95, 0, 0, 957, 941, 1070, - 907, 945, 958, 959, 960, 961, 946, 0, 237, 947, - 948, 244, 949, 0, 906, 791, 793, 792, 856, 857, - 858, 859, 860, 861, 862, 789, 954, 962, 963, 0, - 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, - 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 0, 746, 0, 759, 0, 0, 0, 274, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 743, 744, 0, 0, 0, - 0, 901, 0, 745, 0, 0, 753, 964, 965, 966, - 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, - 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 2071, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 296, 0, 397, 256, 0, 448, 900, 0, 0, 616, - 0, 0, 898, 0, 0, 0, 0, 361, 0, 328, - 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, - 951, 0, 466, 421, 594, 232, 283, 453, 427, 464, - 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, - 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, - 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, - 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, - 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, - 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 952, 953, 255, - 639, 797, 610, 219, 0, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 805, 806, 279, 305, - 882, 881, 880, 304, 306, 878, 879, 877, 206, 598, - 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, - 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, - 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, - 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, - 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, - 888, 910, 899, 765, 766, 889, 890, 914, 891, 768, - 769, 911, 912, 762, 763, 767, 913, 915, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 902, 752, 751, 0, - 758, 0, 787, 788, 790, 794, 795, 796, 807, 854, - 855, 863, 865, 866, 864, 867, 868, 869, 872, 873, - 874, 875, 870, 871, 876, 770, 774, 771, 772, 773, - 785, 775, 776, 777, 778, 779, 780, 781, 782, 783, - 784, 786, 925, 926, 927, 928, 929, 930, 800, 804, - 803, 801, 802, 798, 799, 826, 825, 827, 828, 829, - 830, 831, 832, 834, 833, 835, 836, 837, 838, 839, - 840, 808, 809, 812, 813, 811, 810, 814, 823, 824, - 815, 816, 817, 818, 819, 820, 822, 821, 841, 842, - 843, 844, 845, 847, 846, 850, 851, 849, 848, 853, - 852, 750, 196, 220, 364, 0, 449, 287, 637, 606, - 601, 205, 222, 916, 261, 917, 0, 0, 921, 0, - 0, 0, 923, 922, 0, 924, 886, 885, 0, 0, - 918, 919, 0, 920, 0, 0, 198, 200, 208, 221, - 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, - 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, - 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, - 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, - 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 931, 932, - 933, 934, 935, 936, 937, 938, 298, 590, 620, 588, - 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, - 0, 605, 496, 226, 461, 289, 250, 956, 0, 210, - 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, - 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, - 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 411, 0, 0, 0, 0, 749, 0, 0, 0, - 269, 754, 0, 0, 0, 362, 266, 0, 0, 425, - 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 760, 366, 0, - 0, 491, 396, 0, 0, 0, 0, 0, 756, 757, - 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, - 323, 202, 408, 492, 285, 0, 95, 0, 0, 957, - 941, 1070, 907, 945, 958, 959, 960, 961, 946, 0, - 237, 947, 948, 244, 949, 0, 906, 791, 793, 792, - 856, 857, 858, 859, 860, 861, 862, 789, 954, 962, - 963, 0, 264, 319, 271, 263, 572, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, - 0, 0, 0, 0, 746, 0, 759, 0, 0, 0, - 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 743, 744, 0, - 0, 0, 0, 901, 0, 745, 0, 0, 753, 964, - 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, - 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, - 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, - 1005, 2069, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 397, 256, 0, 448, 900, 0, - 0, 616, 0, 0, 898, 0, 0, 0, 0, 361, - 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, - 0, 0, 951, 0, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 952, - 953, 255, 639, 797, 610, 219, 0, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 805, 806, - 279, 305, 882, 881, 880, 304, 306, 878, 879, 877, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, - 596, 490, 888, 910, 899, 765, 766, 889, 890, 914, - 891, 768, 769, 911, 912, 762, 763, 767, 913, 915, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 902, 752, - 751, 0, 758, 0, 787, 788, 790, 794, 795, 796, - 807, 854, 855, 863, 865, 866, 864, 867, 868, 869, - 872, 873, 874, 875, 870, 871, 876, 770, 774, 771, - 772, 773, 785, 775, 776, 777, 778, 779, 780, 781, - 782, 783, 784, 786, 925, 926, 927, 928, 929, 930, - 800, 804, 803, 801, 802, 798, 799, 826, 825, 827, - 828, 829, 830, 831, 832, 834, 833, 835, 836, 837, - 838, 839, 840, 808, 809, 812, 813, 811, 810, 814, - 823, 824, 815, 816, 817, 818, 819, 820, 822, 821, - 841, 842, 843, 844, 845, 847, 846, 850, 851, 849, - 848, 853, 852, 750, 196, 220, 364, 0, 449, 287, - 637, 606, 601, 205, 222, 916, 261, 917, 0, 0, - 921, 0, 0, 0, 923, 922, 0, 924, 886, 885, - 0, 0, 918, 919, 0, 920, 0, 0, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 931, 932, 933, 934, 935, 936, 937, 938, 298, 590, - 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, - 303, 318, 0, 605, 496, 226, 461, 289, 250, 956, - 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, - 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, - 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, - 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, - 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, - 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, - 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, - 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, - 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 1121, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, - 0, 0, 1120, 616, 0, 0, 0, 0, 0, 1117, - 1118, 361, 1078, 328, 197, 224, 1111, 1115, 407, 456, - 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, - 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, - 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, - 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, - 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, - 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, - 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, - 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, - 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, - 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, - 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, - 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, - 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, - 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, - 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, - 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, - 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, - 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, - 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, - 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, - 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, - 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, - 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, - 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, - 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, - 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, - 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, - 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, - 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, - 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, - 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, - 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, - 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, - 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, - 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, - 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, - 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, - 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, - 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, - 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, - 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, - 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, - 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, - 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, - 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, - 0, 0, 0, 1679, 941, 0, 0, 1676, 0, 0, - 0, 0, 1674, 0, 237, 1675, 1673, 244, 1678, 0, - 906, 347, 356, 355, 336, 337, 339, 341, 346, 353, - 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, - 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1001, 1002, 1003, 1004, 1005, 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, - 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, + 0, 448, 900, 0, 0, 616, 0, 0, 898, 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, - 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, + 407, 456, 468, 0, 0, 0, 951, 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, @@ -4351,46 +3500,768 @@ var yyAct = [...]int{ 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, + 0, 257, 410, 952, 953, 255, 639, 797, 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, - 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, + 378, 332, 805, 806, 279, 305, 882, 881, 880, 304, + 306, 878, 879, 877, 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, - 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, - 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, + 0, 420, 467, 239, 596, 490, 888, 910, 899, 765, + 766, 889, 890, 914, 891, 768, 769, 911, 912, 762, + 763, 767, 913, 915, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, - 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, - 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, - 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, - 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, - 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, - 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, - 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, - 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, - 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, - 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, - 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, - 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 507, 902, 752, 751, 0, 758, 0, 787, 788, + 790, 794, 795, 796, 807, 854, 855, 863, 865, 866, + 864, 867, 868, 869, 872, 873, 874, 875, 870, 871, + 876, 770, 774, 771, 772, 773, 785, 775, 776, 777, + 778, 779, 780, 781, 782, 783, 784, 786, 925, 926, + 927, 928, 929, 930, 800, 804, 803, 801, 802, 798, + 799, 826, 825, 827, 828, 829, 830, 831, 832, 834, + 833, 835, 836, 837, 838, 839, 840, 808, 809, 812, + 813, 811, 810, 814, 823, 824, 815, 816, 817, 818, + 819, 820, 822, 821, 841, 842, 843, 844, 845, 847, + 846, 850, 851, 849, 848, 853, 852, 750, 196, 220, + 364, 0, 449, 287, 637, 606, 601, 205, 222, 916, + 261, 917, 0, 0, 921, 0, 0, 0, 923, 922, + 0, 924, 886, 885, 0, 0, 918, 919, 0, 920, + 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, + 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, + 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, + 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, + 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, + 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, + 595, 613, 619, 475, 931, 932, 933, 934, 935, 936, + 937, 938, 298, 590, 620, 588, 632, 614, 433, 374, + 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, + 461, 289, 250, 956, 0, 210, 245, 229, 258, 273, + 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 0, + 392, 372, 568, 569, 314, 86, 520, 0, 761, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, + 0, 0, 0, 749, 0, 0, 0, 269, 754, 0, + 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, + 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, + 381, 423, 510, 417, 760, 366, 0, 0, 491, 396, + 0, 0, 0, 0, 0, 756, 757, 0, 0, 0, + 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, + 492, 285, 0, 95, 0, 0, 957, 941, 733, 907, + 945, 958, 959, 960, 961, 946, 0, 237, 947, 948, + 244, 949, 0, 906, 791, 793, 792, 856, 857, 858, + 859, 860, 861, 862, 789, 954, 962, 963, 0, 264, + 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, + 729, 746, 0, 759, 0, 0, 0, 274, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 743, 744, 0, 0, 0, 0, + 901, 0, 745, 0, 0, 753, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, + 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, + 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, + 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 755, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, + 0, 397, 256, 0, 448, 900, 0, 0, 616, 0, + 0, 898, 0, 0, 0, 0, 361, 0, 328, 197, + 224, 0, 0, 407, 456, 468, 0, 0, 0, 951, + 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, + 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, + 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, + 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, + 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, + 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, + 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, + 267, 292, 0, 0, 257, 410, 952, 953, 255, 639, + 797, 610, 219, 0, 609, 403, 576, 587, 390, 379, + 218, 585, 388, 378, 332, 805, 806, 279, 305, 882, + 881, 880, 304, 306, 878, 879, 877, 206, 598, 0, + 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, + 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, + 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, + 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, + 331, 369, 0, 0, 420, 467, 239, 596, 490, 888, + 910, 899, 765, 766, 889, 890, 914, 891, 768, 769, + 911, 912, 762, 763, 767, 913, 915, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, + 503, 504, 505, 0, 507, 902, 752, 751, 0, 758, + 0, 787, 788, 790, 794, 795, 796, 807, 854, 855, + 863, 865, 866, 864, 867, 868, 869, 872, 873, 874, + 875, 870, 871, 876, 770, 774, 771, 772, 773, 785, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 786, 925, 926, 927, 928, 929, 930, 800, 804, 803, + 801, 802, 798, 799, 826, 825, 827, 828, 829, 830, + 831, 832, 834, 833, 835, 836, 837, 838, 839, 840, + 808, 809, 812, 813, 811, 810, 814, 823, 824, 815, + 816, 817, 818, 819, 820, 822, 821, 841, 842, 843, + 844, 845, 847, 846, 850, 851, 849, 848, 853, 852, + 750, 196, 220, 364, 94, 449, 287, 637, 606, 601, + 205, 222, 916, 261, 917, 0, 0, 921, 0, 0, + 0, 923, 922, 0, 924, 886, 885, 0, 0, 918, + 919, 0, 920, 0, 0, 198, 200, 208, 221, 231, + 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, + 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, + 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, + 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, + 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, + 508, 578, 580, 595, 613, 619, 475, 931, 932, 933, + 934, 935, 936, 937, 938, 298, 590, 620, 588, 632, + 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, + 605, 496, 226, 461, 289, 250, 956, 0, 210, 245, + 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, + 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, + 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, + 761, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 411, 0, 0, 0, 0, 749, 0, 0, 0, 269, + 754, 0, 0, 0, 362, 266, 0, 0, 425, 0, + 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 760, 366, 0, 0, + 491, 396, 0, 0, 0, 0, 0, 756, 757, 0, + 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, + 202, 408, 492, 285, 0, 95, 0, 0, 957, 941, + 733, 907, 945, 958, 959, 960, 961, 946, 0, 237, + 947, 948, 244, 949, 0, 906, 791, 793, 792, 856, + 857, 858, 859, 860, 861, 862, 789, 954, 962, 963, + 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, + 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, + 0, 0, 729, 746, 0, 759, 0, 0, 0, 274, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 743, 744, 0, 0, + 0, 0, 901, 0, 745, 0, 0, 753, 964, 965, + 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, + 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, + 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, + 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, + 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 296, 0, 397, 256, 0, 448, 900, 0, 0, + 616, 0, 0, 898, 0, 0, 0, 0, 361, 0, + 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, + 0, 951, 0, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 3995, 0, 465, 368, 577, 445, 591, + 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, + 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, + 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, + 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, + 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, + 0, 452, 267, 292, 0, 0, 257, 410, 952, 953, + 255, 639, 797, 610, 219, 0, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 805, 806, 279, + 305, 882, 881, 880, 304, 306, 878, 879, 877, 206, + 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, + 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, + 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, + 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, + 490, 888, 910, 899, 765, 766, 889, 890, 914, 891, + 768, 769, 911, 912, 762, 763, 767, 913, 915, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, + 501, 502, 503, 504, 505, 0, 507, 902, 752, 751, + 0, 758, 0, 787, 788, 790, 794, 795, 796, 807, + 854, 855, 863, 865, 866, 864, 867, 868, 869, 872, + 873, 874, 875, 870, 871, 876, 770, 774, 771, 772, + 773, 785, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 786, 925, 926, 927, 928, 929, 930, 800, + 804, 803, 801, 802, 798, 799, 826, 825, 827, 828, + 829, 830, 831, 832, 834, 833, 835, 836, 837, 838, + 839, 840, 808, 809, 812, 813, 811, 810, 814, 823, + 824, 815, 816, 817, 818, 819, 820, 822, 821, 841, + 842, 843, 844, 845, 847, 846, 850, 851, 849, 848, + 853, 852, 750, 196, 220, 364, 0, 449, 287, 637, + 606, 601, 205, 222, 916, 261, 917, 0, 0, 921, + 0, 0, 0, 923, 922, 0, 924, 886, 885, 0, + 0, 918, 919, 0, 920, 0, 0, 198, 200, 208, + 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, + 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, + 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, + 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, + 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 931, + 932, 933, 934, 935, 936, 937, 938, 298, 590, 620, + 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, + 318, 0, 605, 496, 226, 461, 289, 250, 956, 0, + 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, + 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, + 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, + 520, 0, 761, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 411, 0, 0, 0, 0, 749, 0, 0, + 0, 269, 754, 0, 0, 0, 362, 266, 0, 0, + 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, + 272, 268, 249, 315, 381, 423, 510, 417, 760, 366, + 0, 0, 491, 396, 0, 0, 0, 0, 0, 756, + 757, 0, 0, 0, 0, 0, 0, 0, 0, 321, + 247, 323, 202, 408, 492, 285, 0, 95, 0, 1718, + 957, 941, 733, 907, 945, 958, 959, 960, 961, 946, + 0, 237, 947, 948, 244, 949, 0, 906, 791, 793, + 792, 856, 857, 858, 859, 860, 861, 862, 789, 954, + 962, 963, 0, 264, 319, 271, 263, 572, 0, 0, + 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, + 0, 0, 0, 0, 729, 746, 0, 759, 0, 0, + 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 743, 744, + 0, 0, 0, 0, 901, 0, 745, 0, 0, 753, + 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, + 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, + 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 755, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 296, 0, 397, 256, 0, 448, 900, + 0, 0, 616, 0, 0, 898, 0, 0, 0, 0, + 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, + 0, 0, 0, 951, 0, 466, 421, 594, 232, 283, + 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, + 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, + 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, + 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, + 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, + 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, + 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, + 952, 953, 255, 639, 797, 610, 219, 0, 609, 403, + 576, 587, 390, 379, 218, 585, 388, 378, 332, 805, + 806, 279, 305, 882, 881, 880, 304, 306, 878, 879, + 877, 206, 598, 0, 207, 0, 493, 599, 640, 447, + 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, + 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, + 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, + 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, + 239, 596, 490, 888, 910, 899, 765, 766, 889, 890, + 914, 891, 768, 769, 911, 912, 762, 763, 767, 913, + 915, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, + 500, 506, 501, 502, 503, 504, 505, 0, 507, 902, + 752, 751, 0, 758, 0, 787, 788, 790, 794, 795, + 796, 807, 854, 855, 863, 865, 866, 864, 867, 868, + 869, 872, 873, 874, 875, 870, 871, 876, 770, 774, + 771, 772, 773, 785, 775, 776, 777, 778, 779, 780, + 781, 782, 783, 784, 786, 925, 926, 927, 928, 929, + 930, 800, 804, 803, 801, 802, 798, 799, 826, 825, + 827, 828, 829, 830, 831, 832, 834, 833, 835, 836, + 837, 838, 839, 840, 808, 809, 812, 813, 811, 810, + 814, 823, 824, 815, 816, 817, 818, 819, 820, 822, + 821, 841, 842, 843, 844, 845, 847, 846, 850, 851, + 849, 848, 853, 852, 750, 196, 220, 364, 0, 449, + 287, 637, 606, 601, 205, 222, 916, 261, 917, 0, + 0, 921, 0, 0, 0, 923, 922, 0, 924, 886, + 885, 0, 0, 918, 919, 0, 920, 0, 0, 198, + 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, + 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, + 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, + 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, + 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, + 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, + 475, 931, 932, 933, 934, 935, 936, 937, 938, 298, + 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, + 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, + 956, 0, 210, 245, 229, 258, 273, 276, 322, 387, + 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, + 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, + 569, 314, 520, 0, 761, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 411, 0, 0, 0, 0, 749, + 0, 0, 0, 269, 754, 0, 0, 0, 362, 266, + 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, + 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, + 760, 366, 0, 0, 491, 396, 0, 0, 0, 0, + 0, 756, 757, 0, 0, 0, 0, 0, 0, 0, + 0, 321, 247, 323, 202, 408, 492, 285, 0, 95, + 0, 0, 957, 941, 733, 907, 945, 958, 959, 960, + 961, 946, 0, 237, 947, 948, 244, 949, 0, 906, + 791, 793, 792, 856, 857, 858, 859, 860, 861, 862, + 789, 954, 962, 963, 0, 264, 319, 271, 263, 572, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, + 0, 0, 0, 0, 0, 0, 729, 746, 0, 759, + 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 743, 744, 1050, 0, 0, 0, 901, 0, 745, 0, + 0, 753, 964, 965, 966, 967, 968, 969, 970, 971, + 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, + 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 755, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, + 448, 900, 0, 0, 616, 0, 0, 898, 0, 0, + 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, + 456, 468, 0, 0, 0, 951, 0, 466, 421, 594, + 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, + 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, + 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, + 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, + 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, + 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, + 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, + 257, 410, 952, 953, 255, 639, 797, 610, 219, 0, + 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, + 332, 805, 806, 279, 305, 882, 881, 880, 304, 306, + 878, 879, 877, 206, 598, 0, 207, 0, 493, 599, + 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, + 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, + 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, + 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, + 420, 467, 239, 596, 490, 888, 910, 899, 765, 766, + 889, 890, 914, 891, 768, 769, 911, 912, 762, 763, + 767, 913, 915, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, + 507, 902, 752, 751, 0, 758, 0, 787, 788, 790, + 794, 795, 796, 807, 854, 855, 863, 865, 866, 864, + 867, 868, 869, 872, 873, 874, 875, 870, 871, 876, + 770, 774, 771, 772, 773, 785, 775, 776, 777, 778, + 779, 780, 781, 782, 783, 784, 786, 925, 926, 927, + 928, 929, 930, 800, 804, 803, 801, 802, 798, 799, + 826, 825, 827, 828, 829, 830, 831, 832, 834, 833, + 835, 836, 837, 838, 839, 840, 808, 809, 812, 813, + 811, 810, 814, 823, 824, 815, 816, 817, 818, 819, + 820, 822, 821, 841, 842, 843, 844, 845, 847, 846, + 850, 851, 849, 848, 853, 852, 750, 196, 220, 364, + 0, 449, 287, 637, 606, 601, 205, 222, 916, 261, + 917, 0, 0, 921, 0, 0, 0, 923, 922, 0, + 924, 886, 885, 0, 0, 918, 919, 0, 920, 0, + 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, + 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, + 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, + 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, + 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, + 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, + 613, 619, 475, 931, 932, 933, 934, 935, 936, 937, + 938, 298, 590, 620, 588, 632, 614, 433, 374, 0, + 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, + 289, 250, 956, 0, 210, 245, 229, 258, 273, 276, + 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, + 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, + 372, 568, 569, 314, 520, 0, 761, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, + 0, 749, 0, 0, 0, 269, 754, 0, 0, 0, + 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, + 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, + 510, 417, 760, 366, 0, 0, 491, 396, 0, 0, + 0, 0, 0, 756, 757, 0, 0, 0, 0, 0, + 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, + 0, 95, 0, 0, 957, 941, 733, 907, 945, 958, + 959, 960, 961, 946, 0, 237, 947, 948, 244, 949, + 0, 906, 791, 793, 792, 856, 857, 858, 859, 860, + 861, 862, 789, 954, 962, 963, 0, 264, 319, 271, + 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 729, 746, + 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 743, 744, 0, 0, 0, 0, 901, 0, + 745, 0, 0, 753, 964, 965, 966, 967, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, + 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, + 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1003, 1004, 1005, 755, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, + 256, 0, 448, 900, 0, 0, 616, 0, 0, 898, + 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, + 0, 407, 456, 468, 0, 0, 0, 951, 0, 466, + 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, + 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, + 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, + 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, + 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, + 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, + 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, + 0, 0, 257, 410, 952, 953, 255, 639, 797, 610, + 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, + 388, 378, 332, 805, 806, 279, 305, 882, 881, 880, + 304, 306, 878, 879, 877, 206, 598, 0, 207, 0, + 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, + 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, + 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, + 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, + 0, 0, 420, 467, 239, 596, 490, 888, 910, 899, + 765, 766, 889, 890, 914, 891, 768, 769, 911, 912, + 762, 763, 767, 913, 915, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, + 505, 0, 507, 902, 752, 751, 0, 758, 0, 787, + 788, 790, 794, 795, 796, 807, 854, 855, 863, 865, + 866, 864, 867, 868, 869, 872, 873, 874, 875, 870, + 871, 876, 770, 774, 771, 772, 773, 785, 775, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 786, 925, + 926, 927, 928, 929, 930, 800, 804, 803, 801, 802, + 798, 799, 826, 825, 827, 828, 829, 830, 831, 832, + 834, 833, 835, 836, 837, 838, 839, 840, 808, 809, + 812, 813, 811, 810, 814, 823, 824, 815, 816, 817, + 818, 819, 820, 822, 821, 841, 842, 843, 844, 845, + 847, 846, 850, 851, 849, 848, 853, 852, 750, 196, + 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, + 916, 261, 917, 0, 0, 921, 0, 0, 0, 923, + 922, 0, 924, 886, 885, 0, 0, 918, 919, 0, + 920, 0, 0, 198, 200, 208, 221, 231, 235, 242, + 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, + 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, + 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, + 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, + 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, + 580, 595, 613, 619, 475, 931, 932, 933, 934, 935, + 936, 937, 938, 298, 590, 620, 588, 632, 614, 433, + 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, + 226, 461, 289, 250, 956, 0, 210, 245, 229, 258, + 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, + 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, + 392, 0, 372, 568, 569, 314, 520, 0, 761, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, + 0, 0, 0, 749, 0, 0, 0, 269, 754, 0, + 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, + 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, + 381, 423, 510, 417, 760, 366, 0, 0, 491, 396, + 0, 0, 0, 0, 0, 756, 757, 0, 0, 0, + 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, + 492, 285, 0, 95, 0, 0, 957, 941, 733, 907, + 945, 958, 959, 960, 961, 946, 0, 237, 947, 948, + 244, 949, 0, 906, 791, 793, 792, 856, 857, 858, + 859, 860, 861, 862, 789, 954, 962, 963, 0, 264, + 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, + 729, 746, 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, - 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, - 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, - 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 0, - 392, 372, 568, 569, 314, 86, 520, 0, 0, 0, + 0, 0, 0, 0, 743, 744, 0, 0, 0, 0, + 901, 0, 745, 0, 0, 753, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, + 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, + 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, + 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 3100, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, + 0, 397, 256, 0, 448, 900, 0, 0, 616, 0, + 0, 898, 0, 0, 0, 0, 361, 0, 328, 197, + 224, 0, 0, 407, 456, 468, 0, 0, 0, 951, + 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, + 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, + 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, + 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, + 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, + 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, + 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, + 267, 292, 0, 0, 257, 410, 952, 953, 255, 639, + 797, 610, 219, 0, 609, 403, 576, 587, 390, 379, + 218, 585, 388, 378, 332, 805, 806, 279, 305, 882, + 881, 880, 304, 306, 878, 879, 877, 206, 598, 0, + 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, + 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, + 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, + 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, + 331, 369, 0, 0, 420, 467, 239, 596, 490, 888, + 910, 899, 765, 766, 889, 890, 914, 891, 768, 769, + 911, 912, 762, 763, 767, 913, 915, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, + 503, 504, 505, 0, 507, 902, 752, 751, 0, 758, + 0, 787, 788, 790, 794, 795, 796, 807, 854, 855, + 863, 865, 866, 864, 867, 868, 869, 872, 873, 874, + 875, 870, 871, 876, 770, 774, 771, 772, 773, 785, + 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 786, 925, 926, 927, 928, 929, 930, 800, 804, 803, + 801, 802, 798, 799, 826, 825, 827, 828, 829, 830, + 831, 832, 834, 833, 835, 836, 837, 838, 839, 840, + 808, 809, 812, 813, 811, 810, 814, 823, 824, 815, + 816, 817, 818, 819, 820, 822, 821, 841, 842, 843, + 844, 845, 847, 846, 850, 851, 849, 848, 853, 852, + 750, 196, 220, 364, 0, 449, 287, 637, 606, 601, + 205, 222, 916, 261, 917, 0, 0, 921, 0, 0, + 0, 923, 922, 0, 924, 886, 885, 0, 0, 918, + 919, 0, 920, 0, 0, 198, 200, 208, 221, 231, + 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, + 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, + 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, + 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, + 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, + 508, 578, 580, 595, 613, 619, 475, 931, 932, 933, + 934, 935, 936, 937, 938, 298, 590, 620, 588, 632, + 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, + 605, 496, 226, 461, 289, 250, 956, 0, 210, 245, + 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, + 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, + 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, + 761, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 411, 0, 0, 0, 0, 749, 0, 0, 0, 269, + 754, 0, 0, 0, 362, 266, 0, 0, 425, 0, + 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 760, 366, 0, 0, + 491, 396, 0, 0, 0, 0, 0, 756, 757, 0, + 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, + 202, 408, 492, 285, 0, 95, 0, 0, 957, 941, + 733, 907, 945, 958, 959, 960, 961, 946, 0, 237, + 947, 948, 244, 949, 0, 906, 791, 793, 792, 856, + 857, 858, 859, 860, 861, 862, 789, 954, 962, 963, + 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, + 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, + 0, 0, 729, 746, 0, 759, 0, 0, 0, 274, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 743, 744, 0, 0, + 0, 0, 901, 0, 745, 0, 0, 753, 964, 965, + 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, + 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, + 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, + 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, + 3096, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 296, 0, 397, 256, 0, 448, 900, 0, 0, + 616, 0, 0, 898, 0, 0, 0, 0, 361, 0, + 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, + 0, 951, 0, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, + 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, + 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, + 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, + 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, + 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, + 0, 452, 267, 292, 0, 0, 257, 410, 952, 953, + 255, 639, 797, 610, 219, 0, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 805, 806, 279, + 305, 882, 881, 880, 304, 306, 878, 879, 877, 206, + 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, + 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, + 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, + 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, + 490, 888, 910, 899, 765, 766, 889, 890, 914, 891, + 768, 769, 911, 912, 762, 763, 767, 913, 915, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, + 501, 502, 503, 504, 505, 0, 507, 902, 752, 751, + 0, 758, 0, 787, 788, 790, 794, 795, 796, 807, + 854, 855, 863, 865, 866, 864, 867, 868, 869, 872, + 873, 874, 875, 870, 871, 876, 770, 774, 771, 772, + 773, 785, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 786, 925, 926, 927, 928, 929, 930, 800, + 804, 803, 801, 802, 798, 799, 826, 825, 827, 828, + 829, 830, 831, 832, 834, 833, 835, 836, 837, 838, + 839, 840, 808, 809, 812, 813, 811, 810, 814, 823, + 824, 815, 816, 817, 818, 819, 820, 822, 821, 841, + 842, 843, 844, 845, 847, 846, 850, 851, 849, 848, + 853, 852, 750, 196, 220, 364, 0, 449, 287, 637, + 606, 601, 205, 222, 916, 261, 917, 0, 0, 921, + 0, 0, 0, 923, 922, 0, 924, 886, 885, 0, + 0, 918, 919, 0, 920, 0, 0, 198, 200, 208, + 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, + 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, + 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, + 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, + 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 931, + 932, 933, 934, 935, 936, 937, 938, 298, 590, 620, + 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, + 318, 0, 605, 496, 226, 461, 289, 250, 956, 0, + 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, + 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, + 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, + 520, 0, 761, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 411, 0, 0, 0, 0, 749, 0, 0, + 0, 269, 754, 0, 0, 0, 362, 266, 0, 0, + 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, + 272, 268, 249, 315, 381, 423, 510, 417, 760, 366, + 0, 0, 491, 396, 0, 0, 0, 0, 0, 756, + 757, 0, 0, 0, 0, 0, 0, 0, 0, 321, + 247, 323, 202, 408, 492, 285, 0, 95, 0, 0, + 957, 941, 1071, 907, 945, 958, 959, 960, 961, 946, + 0, 237, 947, 948, 244, 949, 0, 906, 791, 793, + 792, 856, 857, 858, 859, 860, 861, 862, 789, 954, + 962, 963, 0, 264, 319, 271, 263, 572, 0, 0, + 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, + 0, 0, 0, 0, 0, 746, 0, 759, 0, 0, + 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 743, 744, + 0, 0, 0, 0, 901, 0, 745, 0, 0, 753, + 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, + 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, + 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1004, 1005, 755, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 296, 0, 397, 256, 0, 448, 900, + 0, 0, 616, 0, 0, 898, 0, 0, 0, 0, + 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, + 0, 0, 0, 951, 0, 466, 421, 594, 232, 283, + 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, + 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, + 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, + 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, + 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, + 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, + 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, + 952, 953, 255, 639, 797, 610, 219, 0, 609, 403, + 576, 587, 390, 379, 218, 585, 388, 378, 332, 805, + 806, 279, 305, 882, 881, 880, 304, 306, 878, 879, + 877, 206, 598, 0, 207, 0, 493, 599, 640, 447, + 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, + 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, + 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, + 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, + 239, 596, 490, 888, 910, 899, 765, 766, 889, 890, + 914, 891, 768, 769, 911, 912, 762, 763, 767, 913, + 915, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, + 500, 506, 501, 502, 503, 504, 505, 0, 507, 902, + 752, 751, 0, 758, 0, 787, 788, 790, 794, 795, + 796, 807, 854, 855, 863, 865, 866, 864, 867, 868, + 869, 872, 873, 874, 875, 870, 871, 876, 770, 774, + 771, 772, 773, 785, 775, 776, 777, 778, 779, 780, + 781, 782, 783, 784, 786, 925, 926, 927, 928, 929, + 930, 800, 804, 803, 801, 802, 798, 799, 826, 825, + 827, 828, 829, 830, 831, 832, 834, 833, 835, 836, + 837, 838, 839, 840, 808, 809, 812, 813, 811, 810, + 814, 823, 824, 815, 816, 817, 818, 819, 820, 822, + 821, 841, 842, 843, 844, 845, 847, 846, 850, 851, + 849, 848, 853, 852, 750, 196, 220, 364, 0, 449, + 287, 637, 606, 601, 205, 222, 916, 261, 917, 0, + 0, 921, 0, 0, 0, 923, 922, 0, 924, 886, + 885, 0, 0, 918, 919, 0, 920, 0, 0, 198, + 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, + 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, + 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, + 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, + 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, + 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, + 475, 931, 932, 933, 934, 935, 936, 937, 938, 298, + 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, + 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, + 956, 0, 210, 245, 229, 258, 273, 276, 322, 387, + 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, + 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, + 569, 314, 520, 0, 761, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 411, 0, 0, 0, 0, 749, + 0, 0, 0, 269, 754, 0, 0, 0, 362, 266, + 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, + 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, + 760, 366, 0, 0, 491, 396, 0, 0, 0, 0, + 0, 756, 757, 0, 0, 0, 0, 0, 0, 0, + 0, 321, 247, 323, 202, 408, 492, 285, 0, 95, + 0, 0, 957, 941, 1071, 907, 945, 958, 959, 960, + 961, 946, 0, 237, 947, 948, 244, 949, 0, 906, + 791, 793, 792, 856, 857, 858, 859, 860, 861, 862, + 789, 954, 962, 963, 0, 264, 319, 271, 263, 572, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, + 0, 0, 0, 0, 0, 0, 0, 746, 0, 759, + 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 743, 744, 0, 0, 0, 0, 901, 0, 745, 0, + 0, 753, 964, 965, 966, 967, 968, 969, 970, 971, + 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, + 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 2076, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, + 448, 900, 0, 0, 616, 0, 0, 898, 0, 0, + 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, + 456, 468, 0, 0, 0, 951, 0, 466, 421, 594, + 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, + 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, + 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, + 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, + 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, + 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, + 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, + 257, 410, 952, 953, 255, 639, 797, 610, 219, 0, + 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, + 332, 805, 806, 279, 305, 882, 881, 880, 304, 306, + 878, 879, 877, 206, 598, 0, 207, 0, 493, 599, + 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, + 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, + 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, + 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, + 420, 467, 239, 596, 490, 888, 910, 899, 765, 766, + 889, 890, 914, 891, 768, 769, 911, 912, 762, 763, + 767, 913, 915, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, + 507, 902, 752, 751, 0, 758, 0, 787, 788, 790, + 794, 795, 796, 807, 854, 855, 863, 865, 866, 864, + 867, 868, 869, 872, 873, 874, 875, 870, 871, 876, + 770, 774, 771, 772, 773, 785, 775, 776, 777, 778, + 779, 780, 781, 782, 783, 784, 786, 925, 926, 927, + 928, 929, 930, 800, 804, 803, 801, 802, 798, 799, + 826, 825, 827, 828, 829, 830, 831, 832, 834, 833, + 835, 836, 837, 838, 839, 840, 808, 809, 812, 813, + 811, 810, 814, 823, 824, 815, 816, 817, 818, 819, + 820, 822, 821, 841, 842, 843, 844, 845, 847, 846, + 850, 851, 849, 848, 853, 852, 750, 196, 220, 364, + 0, 449, 287, 637, 606, 601, 205, 222, 916, 261, + 917, 0, 0, 921, 0, 0, 0, 923, 922, 0, + 924, 886, 885, 0, 0, 918, 919, 0, 920, 0, + 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, + 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, + 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, + 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, + 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, + 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, + 613, 619, 475, 931, 932, 933, 934, 935, 936, 937, + 938, 298, 590, 620, 588, 632, 614, 433, 374, 0, + 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, + 289, 250, 956, 0, 210, 245, 229, 258, 273, 276, + 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, + 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, + 372, 568, 569, 314, 520, 0, 761, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, + 0, 749, 0, 0, 0, 269, 754, 0, 0, 0, + 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, + 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, + 510, 417, 760, 366, 0, 0, 491, 396, 0, 0, + 0, 0, 0, 756, 757, 0, 0, 0, 0, 0, + 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, + 0, 95, 0, 0, 957, 941, 1071, 907, 945, 958, + 959, 960, 961, 946, 0, 237, 947, 948, 244, 949, + 0, 906, 791, 793, 792, 856, 857, 858, 859, 860, + 861, 862, 789, 954, 962, 963, 0, 264, 319, 271, + 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 746, + 0, 759, 0, 0, 0, 274, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 743, 744, 0, 0, 0, 0, 901, 0, + 745, 0, 0, 753, 964, 965, 966, 967, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, + 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, + 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1003, 1004, 1005, 2074, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, + 256, 0, 448, 900, 0, 0, 616, 0, 0, 898, + 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, + 0, 407, 456, 468, 0, 0, 0, 951, 0, 466, + 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, + 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, + 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, + 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, + 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, + 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, + 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, + 0, 0, 257, 410, 952, 953, 255, 639, 797, 610, + 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, + 388, 378, 332, 805, 806, 279, 305, 882, 881, 880, + 304, 306, 878, 879, 877, 206, 598, 0, 207, 0, + 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, + 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, + 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, + 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, + 0, 0, 420, 467, 239, 596, 490, 888, 910, 899, + 765, 766, 889, 890, 914, 891, 768, 769, 911, 912, + 762, 763, 767, 913, 915, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, + 505, 0, 507, 902, 752, 751, 0, 758, 0, 787, + 788, 790, 794, 795, 796, 807, 854, 855, 863, 865, + 866, 864, 867, 868, 869, 872, 873, 874, 875, 870, + 871, 876, 770, 774, 771, 772, 773, 785, 775, 776, + 777, 778, 779, 780, 781, 782, 783, 784, 786, 925, + 926, 927, 928, 929, 930, 800, 804, 803, 801, 802, + 798, 799, 826, 825, 827, 828, 829, 830, 831, 832, + 834, 833, 835, 836, 837, 838, 839, 840, 808, 809, + 812, 813, 811, 810, 814, 823, 824, 815, 816, 817, + 818, 819, 820, 822, 821, 841, 842, 843, 844, 845, + 847, 846, 850, 851, 849, 848, 853, 852, 750, 196, + 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, + 916, 261, 917, 0, 0, 921, 0, 0, 0, 923, + 922, 0, 924, 886, 885, 0, 0, 918, 919, 0, + 920, 0, 0, 198, 200, 208, 221, 231, 235, 242, + 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, + 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, + 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, + 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, + 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, + 580, 595, 613, 619, 475, 931, 932, 933, 934, 935, + 936, 937, 938, 298, 590, 620, 588, 632, 614, 433, + 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, + 226, 461, 289, 250, 956, 0, 210, 245, 229, 258, + 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, + 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, + 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, @@ -4398,12 +4269,12 @@ var yyAct = [...]int{ 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, - 492, 285, 0, 95, 0, 0, 0, 194, 0, 0, + 492, 285, 0, 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, - 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 1122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4413,9 +4284,9 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, - 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, - 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, - 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, + 0, 397, 256, 0, 448, 0, 0, 1121, 616, 0, + 0, 0, 0, 0, 1118, 1119, 361, 1079, 328, 197, + 224, 1112, 1116, 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, @@ -4447,9 +4318,9 @@ var yyAct = [...]int{ 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, - 0, 196, 220, 364, 94, 449, 287, 637, 606, 601, + 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, - 2370, 0, 0, 2369, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, @@ -4462,21 +4333,21 @@ var yyAct = [...]int{ 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, - 265, 428, 1736, 0, 372, 568, 569, 314, 520, 0, + 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 411, 0, 0, 0, 1738, 0, 0, 0, 0, 269, + 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, - 202, 408, 492, 285, 0, 0, 0, 0, 1740, 709, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, - 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, + 202, 408, 492, 285, 0, 0, 0, 0, 1680, 941, + 0, 0, 1677, 0, 0, 0, 0, 1675, 0, 237, + 1676, 1674, 244, 1679, 0, 906, 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 0, 1452, 0, - 1453, 1454, 0, 0, 0, 0, 0, 0, 0, 274, + 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4543,7 +4414,7 @@ var yyAct = [...]int{ 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, 95, 0, - 1717, 0, 709, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, @@ -4593,7 +4464,7 @@ var yyAct = [...]int{ 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, 94, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2377, 0, 0, 2376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, @@ -4606,21 +4477,21 @@ var yyAct = [...]int{ 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, + 511, 512, 513, 515, 391, 265, 428, 1741, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 411, 0, 0, 0, 1743, 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, - 95, 0, 0, 0, 194, 0, 0, 0, 0, 0, + 0, 0, 0, 1745, 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1453, 0, 1454, 1455, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4665,8 +4536,8 @@ var yyAct = [...]int{ 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, - 261, 0, 0, 0, 0, 0, 0, 2370, 0, 0, - 2369, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, @@ -4678,672 +4549,744 @@ var yyAct = [...]int{ 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, - 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, - 0, 2320, 0, 0, 0, 0, 269, 0, 0, 0, - 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, - 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, - 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, + 240, 479, 511, 512, 513, 515, 391, 265, 428, 0, + 392, 372, 568, 569, 314, 86, 520, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, + 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, + 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, + 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, + 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, + 492, 285, 0, 95, 0, 1718, 0, 709, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, + 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, + 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, + 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, + 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, + 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, + 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, + 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, + 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, + 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, + 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, + 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, + 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, + 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, + 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, + 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, + 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, + 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, + 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, + 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, + 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, + 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, + 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, + 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, + 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, + 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, + 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, + 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, + 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, + 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, + 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, + 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, + 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, + 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, + 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, + 0, 196, 220, 364, 94, 449, 287, 637, 606, 601, + 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, - 285, 0, 0, 0, 0, 1919, 194, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, - 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, - 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, - 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, + 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, + 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, + 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, + 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, + 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, + 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, + 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, + 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, + 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, + 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, + 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, + 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, + 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, + 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, + 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, + 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, + 202, 408, 492, 285, 0, 95, 0, 0, 0, 194, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, + 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, + 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, + 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, + 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, - 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, - 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, - 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, - 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, - 0, 2318, 465, 368, 577, 445, 591, 617, 618, 262, - 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, - 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, - 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, - 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, - 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, - 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, - 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, - 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, - 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, - 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, - 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, - 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, - 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, - 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, - 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, - 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, - 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, - 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, - 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, - 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, - 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, - 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, - 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, - 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, - 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, - 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, - 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, - 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, - 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, - 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, - 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, - 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, - 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, - 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, - 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, - 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, - 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, - 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, - 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, - 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, - 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, - 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, - 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, - 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, - 408, 492, 285, 0, 0, 0, 0, 0, 709, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, - 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, - 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, - 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, - 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, - 0, 0, 0, 0, 0, 0, 0, 1072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, + 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, + 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, + 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, + 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, + 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, + 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, + 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, + 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, + 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, + 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, + 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, + 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, + 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, + 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, + 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, + 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, + 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, + 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, + 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, + 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, + 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, + 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, + 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, + 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, + 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, + 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, + 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, + 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, + 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, + 0, 0, 2377, 0, 0, 2376, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, + 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, + 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, + 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, + 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, + 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, + 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, + 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, + 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, + 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, + 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, + 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, + 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 411, 0, 0, 0, 2325, 0, 0, 0, + 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, + 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, + 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, + 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, + 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, + 1924, 194, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, + 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, + 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, + 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, - 0, 0, 0, 0, 0, 0, 0, 361, 1078, 328, - 197, 224, 1076, 0, 407, 456, 468, 0, 0, 0, - 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, - 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, - 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, - 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, - 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, - 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, - 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, - 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, - 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, - 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, - 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, - 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, - 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, - 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, - 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, - 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, - 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, - 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, - 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, - 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, - 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, - 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, - 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, - 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, - 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, - 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, - 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, - 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, - 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, - 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, - 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, - 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, - 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, - 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, - 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, - 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, - 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 411, 0, 0, 0, 2320, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, - 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, - 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, - 323, 202, 408, 492, 285, 0, 0, 0, 0, 1919, - 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, - 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, - 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, + 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, + 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, + 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, + 453, 427, 464, 435, 286, 0, 2323, 465, 368, 577, + 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, + 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, + 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, + 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, + 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, + 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, + 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, + 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, + 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, + 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, + 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, + 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, + 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, + 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, + 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, + 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, + 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, + 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, + 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, + 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, + 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, + 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, + 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, + 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, + 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, + 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, + 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, + 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, + 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, + 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, + 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, + 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, + 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, + 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, + 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, + 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, + 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, + 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, + 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, + 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, + 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, + 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, + 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, + 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, + 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, + 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, + 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, + 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, + 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, + 0, 0, 1073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, - 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, - 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, - 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, - 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, - 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, - 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, - 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, - 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, - 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, - 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, - 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, - 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, - 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, - 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, - 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, - 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, - 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, - 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, - 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, - 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, - 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, - 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, - 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, - 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, - 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, - 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, - 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, - 1717, 0, 709, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, - 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, - 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, + 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, + 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, + 0, 0, 361, 1079, 328, 197, 224, 1077, 0, 407, + 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, + 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, + 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, + 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, + 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, + 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, + 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, + 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, + 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, + 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, + 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, + 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, + 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, + 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, + 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, + 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, + 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, + 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, + 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, + 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, + 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, + 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, + 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, + 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, + 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, + 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, + 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, + 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, + 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, + 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, + 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, + 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, + 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, + 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, + 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, + 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, + 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, + 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, + 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, + 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, + 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, + 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, + 2325, 0, 0, 0, 0, 269, 0, 0, 0, 0, + 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, + 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, + 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, + 0, 0, 0, 0, 1924, 194, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, + 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, + 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, + 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, - 0, 0, 0, 616, 0, 0, 0, 3898, 0, 0, - 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, - 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, - 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, - 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, - 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, - 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, - 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, - 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, - 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, - 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, - 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, - 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, - 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, - 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, - 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, - 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, - 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, - 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, - 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, - 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, - 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, - 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, - 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, - 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, - 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, - 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, - 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, - 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, - 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, - 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, - 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, - 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, - 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, - 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, - 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, - 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, - 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, - 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, - 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, - 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, - 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, - 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, - 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, - 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, - 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, - 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, + 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, + 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, + 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, + 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, + 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, + 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, + 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, + 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, + 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, + 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, + 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, + 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, + 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, + 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, + 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, + 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, + 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, + 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, + 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, + 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, + 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, + 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, + 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, + 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, + 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, + 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, + 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, + 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, + 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, + 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, + 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, + 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, + 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, - 0, 0, 0, 2080, 709, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, - 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, - 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, - 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, + 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, + 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, + 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, + 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, + 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, + 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, + 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, + 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, + 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, + 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, + 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, + 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, + 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, + 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, + 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, + 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, + 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, + 492, 285, 0, 0, 0, 1718, 0, 709, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, + 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, + 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, + 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, - 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, - 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, - 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, - 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, - 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, - 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, - 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, - 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, - 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, - 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, - 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, - 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, - 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, - 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, - 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, - 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, - 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, - 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, - 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, - 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, - 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, - 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, - 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, - 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, - 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, - 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, - 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, - 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, - 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, - 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, - 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, - 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, - 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, - 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, - 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, - 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, - 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, - 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, + 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, + 0, 0, 3905, 0, 0, 0, 361, 0, 328, 197, + 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, + 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, + 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, + 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, + 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, + 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, + 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, + 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, + 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, + 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, + 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, + 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, + 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, + 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, + 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, + 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, + 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, + 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, + 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, + 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, + 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, + 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, + 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, + 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, + 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, + 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, + 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, + 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, + 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, + 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, + 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, - 285, 0, 0, 0, 0, 2814, 709, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, - 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, - 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, - 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, + 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, + 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, + 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, + 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, + 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, + 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, + 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, + 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, + 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, + 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, + 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, + 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, + 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, + 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, + 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, + 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, + 202, 408, 492, 285, 0, 0, 0, 0, 2085, 709, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, + 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, + 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, + 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, + 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2086, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, - 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, - 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, - 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, - 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, - 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, - 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, - 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, - 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, - 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, - 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, - 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, - 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, - 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, - 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, - 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, - 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, - 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, - 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, - 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, - 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, - 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, - 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, - 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, - 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, - 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, - 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, - 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, - 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, - 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, - 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, - 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, - 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, - 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, - 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, - 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, - 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, - 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, - 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, - 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, - 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, - 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, - 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, - 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, - 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, - 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, - 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, - 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, - 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, - 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, - 408, 492, 285, 0, 0, 0, 0, 0, 709, 0, - 0, 0, 0, 2799, 0, 0, 0, 0, 237, 0, - 0, 244, 2800, 0, 0, 347, 356, 355, 336, 337, - 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, - 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, - 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, + 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, + 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, + 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, + 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, + 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, + 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, + 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, + 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, + 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, + 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, + 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, + 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, + 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, + 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, + 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, + 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, + 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, + 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, + 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, + 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, + 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, + 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, + 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, + 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, + 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, + 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, + 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, + 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, + 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, + 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, + 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, + 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, + 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, + 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, + 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, + 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, + 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, + 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, + 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, + 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, + 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, + 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, + 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, + 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, + 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, + 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, + 2821, 709, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, + 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, + 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, + 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, - 0, 0, 0, 0, 0, 0, 0, 361, 0, 328, - 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, - 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, - 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, - 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, - 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, - 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, - 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, - 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, - 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, - 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, - 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, - 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, - 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, - 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, - 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, - 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, - 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, - 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, - 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, - 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, - 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, - 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, - 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, - 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, - 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, - 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, - 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, - 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, - 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, - 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, - 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, - 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, - 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, - 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, - 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, - 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, - 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, - 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 1759, 0, 0, 0, 362, 266, 0, 0, 425, - 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, - 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, - 323, 202, 408, 492, 285, 0, 0, 0, 0, 1758, - 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, - 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, - 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, + 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, + 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, + 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, + 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, + 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, + 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, + 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, + 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, + 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, + 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, + 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, + 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, + 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, + 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, + 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, + 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, + 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, + 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, + 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, + 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, + 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, + 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, + 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, + 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, + 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, + 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, + 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, + 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, + 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, + 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, + 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, + 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, + 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, + 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, + 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, + 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, + 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, + 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, + 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, + 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, + 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, + 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, + 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, + 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, + 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, + 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, + 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, + 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, + 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, + 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, + 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, + 0, 0, 0, 709, 0, 0, 0, 0, 2806, 0, + 0, 0, 0, 237, 0, 0, 244, 2807, 0, 0, + 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, + 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, - 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, - 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, - 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, - 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, - 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, - 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, - 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, - 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, - 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, - 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, - 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, - 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, - 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, - 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, - 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, - 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, - 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, - 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, - 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, - 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, - 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, - 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, - 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, - 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, - 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, - 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, - 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, - 0, 0, 711, 712, 713, 0, 0, 0, 0, 0, - 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, - 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, - 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, + 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, + 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, + 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, + 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, + 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, + 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, + 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, + 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, + 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, + 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, + 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, + 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, + 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, + 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, + 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, + 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, + 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, + 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, + 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, + 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, + 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, + 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, + 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, + 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, + 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, + 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, + 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, + 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, + 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, + 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, + 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, + 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, + 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, + 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, + 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, + 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, + 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, + 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, + 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, + 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, + 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, + 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, + 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, + 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, + 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, + 0, 0, 0, 0, 0, 269, 1764, 0, 0, 0, + 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, + 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, + 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, + 0, 0, 0, 0, 1763, 709, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, + 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, + 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, + 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, - 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, - 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, - 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, - 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, - 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, - 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, - 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, - 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, - 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, - 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, - 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, - 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, - 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, - 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, - 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, - 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, - 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, - 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, - 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, - 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, - 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, - 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, - 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, - 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, - 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, - 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, - 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, - 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, - 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, - 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, - 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, - 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, - 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, - 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, - 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, - 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, - 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, - 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, - 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, - 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, - 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, - 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, - 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, - 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, - 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, - 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, - 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, + 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, + 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, + 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, + 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, + 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, + 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, + 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, + 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, + 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, + 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, + 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, + 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, + 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, + 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, + 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, + 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, + 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, + 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, + 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, + 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, + 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, + 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, + 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, + 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, + 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, + 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, + 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, + 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, + 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, + 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, + 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, + 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, + 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, - 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, - 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, - 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, - 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, + 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, + 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, + 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, + 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, + 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, + 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, + 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, + 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, + 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, + 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, + 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, + 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, + 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, + 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, + 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, + 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, + 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, + 492, 285, 0, 0, 0, 0, 0, 711, 712, 713, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, + 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, + 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, + 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5351,71 +5294,71 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, - 0, 448, 0, 0, 0, 616, 0, 0, 0, 4021, - 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, - 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, - 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, - 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, - 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, - 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, - 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, - 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, - 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, - 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, - 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, - 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, - 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, - 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, - 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, - 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, - 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, - 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, - 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, - 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, - 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, - 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, - 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, - 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, - 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, - 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, - 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, - 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, - 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, + 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, + 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, + 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, + 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, + 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, + 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, + 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, + 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, + 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, + 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, + 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, + 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, + 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, + 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, + 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, + 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, + 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, + 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, + 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, + 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, + 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, + 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, + 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, + 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, + 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, + 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, + 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, + 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, + 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, + 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, + 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, + 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, + 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, - 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, - 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, - 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, - 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, - 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, - 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, - 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, - 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, + 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, + 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, + 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, + 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, + 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, + 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, + 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, + 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, + 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, + 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, + 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, + 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, + 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, - 285, 0, 0, 0, 0, 1919, 194, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, - 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, - 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, - 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, + 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, + 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, + 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, + 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, + 202, 408, 492, 285, 0, 0, 0, 0, 0, 709, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, + 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, + 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, + 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, + 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5423,288 +5366,288 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, - 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, - 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, - 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, - 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, - 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, - 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, - 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, - 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, - 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, - 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, - 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, - 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, - 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, - 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, - 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, - 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, - 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, - 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, - 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, - 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, - 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, - 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, - 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, - 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, - 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, - 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, - 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, - 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, - 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, - 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, - 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, - 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, - 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, - 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, - 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, - 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, - 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, - 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, - 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, - 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, - 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, - 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, - 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, - 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, - 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, - 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, - 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, - 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, - 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, - 408, 492, 285, 0, 0, 0, 0, 0, 709, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, - 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, - 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, - 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, - 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, + 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, + 616, 0, 0, 0, 4028, 0, 0, 0, 361, 0, + 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, + 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, + 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, + 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, + 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, + 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, + 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, + 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, + 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, + 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, + 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, + 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, + 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, + 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, + 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, + 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, + 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, + 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, + 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, + 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, + 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, + 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, + 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, + 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, + 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, + 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, + 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, + 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, + 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, + 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, + 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, + 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, + 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, + 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, + 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, + 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, + 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, + 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, + 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, + 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, + 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, + 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, + 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, + 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, + 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, + 1924, 194, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, + 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, + 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, + 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, - 0, 0, 0, 3898, 0, 0, 0, 361, 0, 328, - 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, - 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, - 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, - 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, - 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, - 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, - 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, - 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, - 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, - 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, - 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, - 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, - 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, - 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, - 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, - 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, - 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, - 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, - 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, - 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, - 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, - 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, - 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, - 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, - 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, - 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, - 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, - 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, - 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, - 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, - 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, - 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, - 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, - 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, - 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, - 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, - 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, - 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, - 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, - 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, - 323, 202, 408, 492, 285, 0, 95, 0, 0, 0, - 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, - 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, - 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, + 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, + 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, + 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, + 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, + 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, + 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, + 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, + 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, + 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, + 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, + 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, + 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, + 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, + 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, + 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, + 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, + 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, + 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, + 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, + 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, + 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, + 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, + 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, + 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, + 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, + 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, + 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, + 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, + 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, + 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, + 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, + 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, + 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, + 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, + 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, + 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, + 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, + 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, + 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, + 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, + 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, + 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, + 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, + 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, + 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, + 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, + 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, + 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, + 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, + 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, + 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, + 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, + 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, + 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, - 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, - 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, - 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, - 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, - 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, - 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, - 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, - 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, - 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, - 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, - 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, - 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, - 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, - 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, - 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, - 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, - 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, - 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, - 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, - 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, - 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, - 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, - 314, 520, 0, 0, 0, 0, 2371, 0, 0, 0, - 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, - 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, - 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, - 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, - 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, - 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, - 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, - 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, + 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, + 448, 0, 0, 0, 616, 0, 0, 0, 3905, 0, + 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, + 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, + 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, + 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, + 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, + 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, + 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, + 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, + 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, + 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, + 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, + 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, + 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, + 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, + 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, + 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, + 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, + 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, + 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, + 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, + 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, + 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, + 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, + 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, + 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, + 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, + 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, + 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, + 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, + 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, + 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, + 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, + 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, + 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, + 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, + 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, + 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, + 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, + 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, + 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, + 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, + 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, + 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, + 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, + 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, + 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, + 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, + 0, 95, 0, 0, 0, 709, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, + 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, + 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, + 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, - 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, - 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, - 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, - 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, - 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, - 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, - 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, - 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, - 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, - 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, - 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, - 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, - 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, - 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, - 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, - 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, - 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, - 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, - 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, - 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, - 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, - 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, - 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, - 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, - 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, - 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, - 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, - 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, - 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, - 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, - 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, - 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, - 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, - 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, - 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, - 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, - 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, - 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, - 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, - 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, - 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, - 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, - 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, - 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, - 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, - 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, - 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, + 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, + 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, + 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, + 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, + 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, + 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, + 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, + 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, + 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, + 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, + 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, + 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, + 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, + 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, + 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, + 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, + 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, + 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, + 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, + 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, + 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, + 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, + 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, + 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, + 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, + 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, + 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, + 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, + 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, + 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, + 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, + 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, + 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, - 0, 0, 0, 1740, 709, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, - 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, - 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, - 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, + 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, + 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, + 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, + 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, + 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, + 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, + 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, + 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, + 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, + 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, + 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, + 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, + 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, + 0, 2378, 0, 0, 0, 0, 0, 0, 411, 0, + 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, + 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, + 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, + 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, + 492, 285, 0, 0, 0, 0, 0, 194, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, + 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, + 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, + 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5712,71 +5655,71 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, - 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, - 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, - 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, - 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, - 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, - 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, - 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, - 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, - 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, - 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, - 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, - 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, - 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, - 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, - 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, - 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, - 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, - 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, - 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, - 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, - 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, - 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, - 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, - 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, - 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, - 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, - 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, - 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, - 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, - 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, + 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, + 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, + 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, + 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, + 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, + 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, + 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, + 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, + 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, + 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, + 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, + 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, + 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, + 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, + 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, + 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, + 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, + 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, + 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, + 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, + 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, + 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, + 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, + 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, + 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, + 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, + 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, + 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, + 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, + 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, + 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, + 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, + 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, - 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, - 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, - 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, - 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, - 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, - 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, - 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, - 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, + 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, + 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, + 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, + 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, + 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, + 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, + 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, + 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, + 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, + 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, + 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, + 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, + 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, - 285, 0, 0, 0, 0, 0, 194, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, - 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, - 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, - 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, + 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, + 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, + 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, + 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, + 202, 408, 492, 285, 0, 0, 0, 0, 1745, 709, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, + 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, + 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, + 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, + 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5784,72 +5727,72 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, - 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, - 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, - 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, - 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, - 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, - 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, - 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, - 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, - 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, - 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, - 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, - 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, - 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, - 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, - 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, - 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, - 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, - 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, - 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, - 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, - 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, - 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, - 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, - 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, - 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, - 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, - 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, - 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, - 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, - 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, - 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, - 196, 220, 364, 2032, 449, 287, 637, 606, 601, 205, - 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, - 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, - 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, - 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, - 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, - 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, - 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, - 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, - 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, - 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, - 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, - 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, - 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, - 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, - 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, - 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, - 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, - 408, 492, 285, 0, 0, 0, 0, 2023, 709, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, - 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, - 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, - 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, - 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, + 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, + 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, + 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, + 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, + 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, + 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, + 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, + 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, + 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, + 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, + 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, + 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, + 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, + 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, + 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, + 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, + 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, + 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, + 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, + 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, + 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, + 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, + 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, + 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, + 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, + 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, + 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, + 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, + 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, + 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, + 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, + 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, + 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, + 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, + 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, + 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, + 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, + 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, + 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, + 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, + 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, + 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, + 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, + 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, + 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, + 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, + 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, + 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, + 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, + 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, + 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5857,1379 +5800,1452 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, - 0, 0, 0, 0, 0, 0, 0, 361, 0, 328, - 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, - 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, - 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, - 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, - 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, - 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, - 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, - 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, - 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, - 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, - 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, - 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, - 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, - 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, - 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, - 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, - 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, - 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, - 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, - 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, - 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, - 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, - 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, - 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, - 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, - 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, - 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, - 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, + 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, + 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, + 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, + 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, + 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, + 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, + 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, + 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, + 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, + 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, + 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, + 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, + 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, + 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, + 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, + 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, + 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, + 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, + 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, + 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, + 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, + 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, + 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, + 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, + 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, + 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, + 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, + 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, + 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, + 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, + 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, + 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, + 542, 530, 523, 531, 0, 196, 220, 364, 2037, 449, + 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, - 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, - 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, - 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, - 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, - 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, - 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, - 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, - 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, - 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, - 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 411, 0, 1886, 0, 0, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, - 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, - 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, - 323, 202, 408, 492, 285, 0, 0, 0, 0, 0, - 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, - 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, - 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, + 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, + 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, + 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, + 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, + 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, + 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, + 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, + 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, + 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, + 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, + 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, + 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, + 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, + 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, + 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, + 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, + 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, + 0, 0, 2028, 709, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, + 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, + 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, - 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, - 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, - 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, - 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, - 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, - 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, - 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, - 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, - 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, - 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, - 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, - 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, - 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, - 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, - 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, - 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, - 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, - 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, - 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, - 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, - 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, - 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, - 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 411, 0, 1884, 0, 0, 0, 0, - 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, - 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, - 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, - 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, + 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, + 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, + 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, + 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, + 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, + 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, + 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, + 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, + 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, + 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, + 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, + 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, + 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, + 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, + 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, + 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, + 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, + 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, + 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, + 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, + 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, + 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, + 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, + 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, + 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, + 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, + 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, + 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, + 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, + 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, + 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, + 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, + 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, + 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, + 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, + 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, + 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, + 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, + 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, + 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, + 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, + 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, + 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, + 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 411, 0, 1891, 0, + 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, + 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, + 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, + 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, - 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, - 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, - 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, + 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, + 0, 0, 0, 0, 0, 709, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, + 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, + 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, + 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, + 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, + 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, + 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, + 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, + 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, + 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, + 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, + 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, + 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, + 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, + 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, + 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, + 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, + 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, + 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, + 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, + 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, + 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, + 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, + 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, + 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, + 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, + 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, + 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, + 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, + 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, + 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, + 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, + 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, + 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, + 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, + 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, + 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, - 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, - 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, - 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, - 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, - 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, - 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, - 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, - 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, - 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, - 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, - 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, - 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, - 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, - 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, - 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, - 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, - 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, - 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, - 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, - 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, - 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, - 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, - 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, - 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, - 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, - 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, - 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, - 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, - 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, - 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, - 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, - 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, - 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, + 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, + 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, + 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, + 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, + 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, + 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, + 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, + 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, + 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, + 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, + 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, + 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, + 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, + 1889, 0, 0, 0, 0, 0, 0, 269, 0, 0, + 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, + 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, + 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, + 492, 285, 0, 0, 0, 0, 0, 709, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, + 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, + 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, + 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, - 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, - 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, - 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, - 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, - 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, - 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, - 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, - 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, - 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, - 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, - 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 411, 0, 1882, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, - 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, - 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, - 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, - 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, - 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, - 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, - 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, + 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, + 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, + 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, + 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, + 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, + 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, + 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, + 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, + 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, + 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, + 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, + 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, + 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, + 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, + 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, + 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, + 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, + 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, + 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, + 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, + 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, + 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, + 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, + 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, + 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, + 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, + 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, + 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, + 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, + 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, + 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, + 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, + 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, + 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, + 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, + 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, + 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, + 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, + 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, + 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, + 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, + 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, + 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, + 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, + 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 411, 0, 1887, 0, 0, 0, 0, 0, 0, 269, + 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, + 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, + 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, + 202, 408, 492, 285, 0, 0, 0, 0, 0, 709, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, + 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, + 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, + 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, + 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, - 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, - 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, - 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, - 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, - 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, - 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, - 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, - 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, - 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, - 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, - 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, - 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, - 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, - 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, - 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, - 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, - 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, - 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, - 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, - 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, - 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, - 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, - 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, - 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, - 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, - 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, - 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, - 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, - 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, - 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, - 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, - 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, - 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, - 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 411, 0, 1880, - 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, - 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, - 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, - 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, - 285, 0, 0, 0, 0, 0, 709, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, - 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, - 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, - 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, + 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, + 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, + 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, + 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, + 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, + 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, + 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, + 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, + 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, + 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, + 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, + 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, + 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, + 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, + 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, + 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, + 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, + 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, + 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, + 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, + 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, + 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, + 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, + 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, + 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, + 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, + 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, + 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, + 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, + 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, + 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, + 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, + 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, + 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, + 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, + 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, + 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, + 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, + 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, + 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, + 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 411, 0, 1885, 0, 0, 0, 0, 0, + 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, + 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, + 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, + 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, + 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, + 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, + 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, + 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, + 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, - 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, - 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, - 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, - 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, - 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, - 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, - 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, - 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, - 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, - 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, - 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, - 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, - 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, - 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, - 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, - 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, - 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, - 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, - 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, - 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, - 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, - 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, - 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, - 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, - 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, - 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, - 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, - 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, - 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, - 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, - 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, - 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, - 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, - 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, - 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, - 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, - 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, - 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, - 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, - 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, - 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, - 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, - 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, - 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, - 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, - 0, 1878, 0, 0, 0, 0, 0, 0, 269, 0, - 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, - 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, - 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, - 408, 492, 285, 0, 0, 0, 0, 0, 709, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, - 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, - 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, - 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, - 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, + 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, + 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, + 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, + 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, + 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, + 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, + 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, + 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, + 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, + 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, + 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, + 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, + 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, + 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, + 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, + 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, + 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, + 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, + 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, + 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, + 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, + 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, + 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, + 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, + 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, + 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, + 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, + 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, + 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, + 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, + 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, + 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, + 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, + 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, + 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, + 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, + 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, + 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, + 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, + 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, + 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, + 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, + 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, + 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, + 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, + 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 411, 0, 1883, 0, 0, 0, + 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, + 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, + 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, + 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, + 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, + 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, + 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, - 0, 0, 0, 0, 0, 0, 0, 361, 0, 328, - 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, - 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, - 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, - 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, - 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, - 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, - 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, - 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, - 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, - 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, - 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, - 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, - 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, - 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, - 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, - 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, - 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, - 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, - 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, - 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, - 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, - 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, - 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, - 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, - 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, - 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, - 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, - 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, + 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, - 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, - 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, - 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, - 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, - 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, - 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, - 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, - 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, - 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, - 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 411, 0, 1874, 0, 0, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, - 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, - 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, - 323, 202, 408, 492, 285, 0, 0, 0, 0, 0, - 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, - 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, - 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, + 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, + 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, + 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, + 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, + 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, + 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, + 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, + 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, + 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, + 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, + 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, + 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, + 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, + 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, + 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, + 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, + 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, + 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, + 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, + 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, + 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, + 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, + 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, + 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, + 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, + 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, + 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, + 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, + 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, + 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, + 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, + 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, - 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, - 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, - 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, - 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, - 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, - 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, - 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, - 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, - 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, - 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, - 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, - 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, - 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, - 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, - 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, - 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, - 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, - 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, - 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, + 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, + 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, + 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, + 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, + 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, + 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, + 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, + 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, + 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, + 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, + 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, + 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, + 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 411, 0, 1879, 0, + 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, + 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, + 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, + 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, - 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, - 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, - 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, - 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 411, 0, 1872, 0, 0, 0, 0, - 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, - 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, - 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, - 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, + 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, + 0, 0, 0, 0, 0, 709, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, + 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, + 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, + 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, - 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, - 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, - 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, + 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, + 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, + 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, + 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, + 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, + 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, + 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, + 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, + 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, + 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, + 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, + 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, + 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, + 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, + 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, + 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, + 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, + 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, + 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, + 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, + 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, + 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, + 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, + 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, + 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, + 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, + 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, + 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, + 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, + 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, + 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, + 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, + 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, + 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, + 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, + 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, + 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, + 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, + 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, + 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, + 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, + 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, + 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, + 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, + 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, + 1877, 0, 0, 0, 0, 0, 0, 269, 0, 0, + 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, + 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, + 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, - 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, - 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, - 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, - 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, - 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, - 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, - 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, - 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, - 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, - 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, - 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, - 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, - 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, - 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, - 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, - 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, - 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, - 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, - 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, - 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, - 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, - 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, - 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, - 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, - 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, - 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, - 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, - 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, - 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, - 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, - 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, - 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, - 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, + 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, + 492, 285, 0, 0, 0, 0, 0, 709, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, + 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, + 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, + 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, - 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, - 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, - 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, - 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, - 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, - 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, - 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, - 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, - 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, - 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, - 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 411, 0, 1870, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, - 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, - 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, - 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, - 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, - 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, - 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, - 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, + 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, + 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, + 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, + 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, + 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, + 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, + 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, + 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, + 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, + 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, + 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, + 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, + 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, + 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, + 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, + 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, + 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, + 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, + 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, + 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, + 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, + 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, + 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, + 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, + 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, + 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, + 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, + 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, + 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, + 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, + 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, + 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, + 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, + 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, + 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, + 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, + 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, + 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, + 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, + 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, + 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, + 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, + 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, + 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, + 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 411, 0, 1875, 0, 0, 0, 0, 0, 0, 269, + 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, + 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, + 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, + 202, 408, 492, 285, 0, 0, 0, 0, 0, 709, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, + 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, + 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, + 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, + 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, - 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, - 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, - 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, - 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, - 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, - 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, - 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, - 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, - 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, - 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, - 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, - 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, - 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, - 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, - 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, - 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, - 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, - 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, - 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, - 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, - 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, - 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, - 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, - 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, - 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, - 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, - 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, - 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, - 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, - 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, - 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, - 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, - 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, - 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, - 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, - 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, - 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, - 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, - 285, 0, 1845, 0, 0, 0, 709, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, - 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, - 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, - 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, + 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, + 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, + 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, + 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, + 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, + 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, + 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, + 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, + 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, + 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, + 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, + 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, + 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, + 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, + 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, + 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, + 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, + 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, + 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, + 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, + 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, + 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, + 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, + 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, + 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, + 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, + 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, + 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, + 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, + 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, + 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, + 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, + 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, + 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, + 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, + 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, + 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, + 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, + 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, + 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, + 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, + 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, + 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, + 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, + 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, + 247, 323, 202, 408, 492, 285, 0, 1850, 0, 0, + 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, + 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, + 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, + 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, - 397, 256, 0, 448, 0, 0, 0, 616, 0, 0, - 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, - 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, - 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, - 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, - 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, - 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, - 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, - 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, - 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, - 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, - 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, - 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, - 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, - 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, - 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, - 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, - 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, - 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, - 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, - 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, - 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, - 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, - 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, - 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, - 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, - 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, - 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, - 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, - 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, - 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, - 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, - 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, - 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, - 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, - 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, - 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, - 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, - 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, - 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, - 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, - 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, - 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, - 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, - 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, - 0, 0, 0, 0, 0, 0, 0, 1744, 269, 0, - 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, - 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, - 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, - 408, 492, 285, 0, 0, 0, 0, 0, 194, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, - 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, - 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, - 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, - 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, + 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, + 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, + 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, + 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, + 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, + 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, + 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, + 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, + 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, + 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, + 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, + 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, + 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, + 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, + 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, + 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, + 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, + 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, + 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, + 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, + 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, + 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, + 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, + 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, + 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, + 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, + 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, + 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, + 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, + 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, + 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, + 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, + 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, + 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, + 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, + 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, + 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, + 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, + 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, + 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, + 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, + 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, + 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, + 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, + 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, + 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, + 0, 0, 1749, 269, 0, 0, 0, 0, 362, 266, + 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, + 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, + 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, + 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, + 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, + 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, - 0, 0, 0, 0, 0, 0, 0, 361, 0, 328, - 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, - 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, - 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, - 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, - 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, - 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, - 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, - 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, - 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, - 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, - 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, - 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, - 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, - 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, - 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, - 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, - 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, - 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, - 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, - 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, - 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, - 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, - 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, - 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, - 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, - 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, - 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, - 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, - 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, - 317, 320, 326, 376, 382, 383, 384, 385, 404, 405, - 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, - 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, - 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, - 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, - 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, - 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, - 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, - 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, - 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, - 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, - 323, 202, 408, 492, 285, 0, 95, 0, 0, 0, - 941, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, - 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, - 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, + 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, + 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, + 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, + 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, + 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, + 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, + 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, + 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, + 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, + 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, + 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, + 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, + 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, + 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, + 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, + 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, + 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, + 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, + 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, + 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, + 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, + 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, + 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, + 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, + 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, + 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, + 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, + 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, + 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, + 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, + 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, + 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, + 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, + 383, 384, 385, 404, 405, 406, 409, 412, 413, 416, + 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, + 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, + 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, + 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, + 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, + 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, + 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, + 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, + 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, + 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, + 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, + 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, + 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, + 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, + 0, 95, 0, 0, 0, 941, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, + 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, + 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, + 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, - 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, - 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, - 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, - 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, - 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, - 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, - 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, - 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, - 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, - 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, - 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, - 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, - 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, - 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, - 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, - 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, - 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, - 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, - 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, - 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, - 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, - 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, - 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, - 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, - 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, - 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, - 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, - 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, - 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, - 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, + 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, + 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, + 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, + 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, + 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, + 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, + 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, + 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, + 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, + 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, + 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, + 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, + 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, + 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, + 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, + 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, + 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, + 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, + 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, + 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, + 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, + 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, + 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, + 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, + 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, + 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, + 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, + 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, + 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, + 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, + 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, + 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, + 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, + 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, + 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, + 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, + 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, + 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, + 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, + 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, + 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, + 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, + 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, + 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, + 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, + 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, + 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, + 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, + 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, + 492, 285, 0, 0, 0, 0, 0, 194, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, + 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, + 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, + 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1431, 0, 296, 0, 397, 256, 0, 448, - 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, - 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, - 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, - 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, - 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, - 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, - 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, - 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, - 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, - 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, - 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, - 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, - 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, - 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, - 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, - 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, - 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, - 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, - 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, - 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, - 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, - 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, - 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, - 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, - 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, - 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, - 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, - 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, - 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, - 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, - 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, - 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, - 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, - 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, - 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, - 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, - 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, - 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, - 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, - 1430, 590, 620, 588, 632, 614, 433, 374, 0, 0, - 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, - 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, - 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, - 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, - 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, - 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, - 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, - 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, - 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, - 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, - 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, + 0, 0, 0, 0, 0, 0, 0, 1432, 0, 296, + 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, + 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, + 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, + 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, + 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, + 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, + 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, + 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, + 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, + 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, + 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, + 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, + 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, + 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, + 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, + 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, + 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, + 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, + 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, + 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, + 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, + 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, + 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, + 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, + 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, + 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, + 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, + 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, + 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, + 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, + 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, + 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, + 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, + 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, + 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, + 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, + 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, + 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, + 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, + 440, 312, 313, 633, 634, 1431, 590, 620, 588, 632, + 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, + 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, + 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, + 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, + 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, + 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, + 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, + 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, + 202, 408, 492, 285, 0, 0, 0, 0, 0, 194, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, + 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, + 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, + 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, + 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, - 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, - 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, - 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, - 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, - 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, - 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, - 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, - 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, - 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, - 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, - 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, - 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, - 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, - 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, - 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, - 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, - 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, - 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, - 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, - 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, - 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, - 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, - 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, - 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, - 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, - 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, - 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, - 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, - 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, - 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1030, 0, - 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, - 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, - 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, - 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 392, - 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, - 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, - 0, 362, 266, 0, 0, 425, 0, 203, 0, 481, - 251, 373, 370, 575, 281, 272, 268, 249, 315, 381, - 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 321, 247, 323, 202, 408, 492, - 285, 0, 0, 0, 0, 0, 194, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 237, 0, 0, 244, - 0, 0, 0, 347, 356, 355, 336, 337, 339, 341, - 346, 353, 359, 0, 0, 0, 0, 0, 264, 319, - 271, 263, 572, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, + 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, + 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, + 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, + 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, + 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, + 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, + 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, + 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, + 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, + 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, + 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, + 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, + 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, + 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, + 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, + 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, + 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, + 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, + 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, + 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, + 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, + 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, + 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, + 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, + 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, + 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, + 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, + 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, + 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1030, 0, 0, 0, 198, 200, 208, + 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, + 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, + 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, + 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, + 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, + 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, + 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, + 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, + 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, + 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, + 515, 391, 265, 428, 392, 0, 372, 568, 569, 314, + 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, + 0, 269, 0, 0, 0, 0, 362, 266, 0, 0, + 425, 0, 203, 0, 481, 251, 373, 370, 575, 281, + 272, 268, 249, 315, 381, 423, 510, 417, 0, 366, + 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, + 247, 323, 202, 408, 492, 285, 0, 0, 0, 0, + 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 237, 0, 0, 244, 0, 0, 0, 347, 356, + 355, 336, 337, 339, 341, 346, 353, 359, 0, 0, + 0, 0, 0, 264, 319, 271, 263, 572, 0, 0, + 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, - 397, 256, 0, 448, 0, 662, 0, 616, 0, 0, - 0, 0, 0, 0, 0, 361, 0, 328, 197, 224, - 0, 0, 407, 456, 468, 0, 0, 0, 252, 0, - 466, 421, 594, 232, 283, 453, 427, 464, 435, 286, - 0, 0, 465, 368, 577, 445, 591, 617, 618, 262, - 401, 603, 514, 611, 635, 225, 259, 415, 499, 597, - 488, 393, 573, 574, 327, 487, 294, 201, 365, 623, - 223, 474, 367, 241, 230, 579, 600, 288, 451, 630, - 212, 509, 589, 238, 478, 0, 0, 638, 246, 498, - 214, 586, 497, 389, 324, 325, 213, 0, 452, 267, - 292, 0, 0, 257, 410, 581, 582, 255, 639, 227, - 610, 219, 0, 609, 403, 576, 587, 390, 379, 218, - 585, 388, 378, 332, 351, 352, 279, 305, 442, 371, - 443, 304, 306, 399, 398, 400, 206, 598, 0, 207, - 0, 493, 599, 640, 447, 211, 233, 234, 236, 0, - 278, 282, 290, 293, 301, 302, 311, 363, 414, 441, - 437, 446, 0, 571, 592, 604, 615, 621, 622, 624, - 625, 626, 627, 628, 631, 629, 402, 309, 489, 331, - 369, 0, 0, 420, 467, 239, 596, 490, 199, 0, - 0, 0, 0, 253, 254, 0, 567, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 636, 500, 506, 501, 502, 503, - 504, 505, 0, 507, 0, 0, 0, 0, 0, 0, - 583, 584, 659, 380, 480, 593, 333, 345, 348, 338, - 357, 0, 358, 334, 335, 340, 342, 343, 344, 349, - 350, 354, 360, 248, 209, 386, 394, 570, 310, 215, - 216, 217, 516, 517, 518, 519, 607, 608, 612, 204, - 457, 458, 459, 460, 291, 602, 307, 463, 462, 329, - 330, 375, 444, 532, 534, 545, 549, 551, 553, 559, - 562, 533, 535, 546, 550, 552, 554, 560, 563, 522, - 524, 526, 528, 541, 540, 537, 565, 566, 543, 548, - 527, 539, 544, 557, 564, 561, 521, 525, 529, 538, - 556, 555, 536, 547, 558, 542, 530, 523, 531, 0, - 196, 220, 364, 0, 449, 287, 637, 606, 601, 205, - 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 198, 200, 208, 221, 231, 235, - 242, 260, 275, 277, 284, 297, 308, 316, 317, 320, - 326, 376, 382, 383, 384, 385, 404, 405, 406, 409, - 412, 413, 416, 418, 419, 422, 426, 430, 431, 432, - 434, 436, 438, 450, 455, 469, 470, 471, 472, 473, - 476, 477, 482, 483, 484, 485, 486, 494, 495, 508, - 578, 580, 595, 613, 619, 475, 299, 300, 439, 440, - 312, 313, 633, 634, 298, 590, 620, 588, 632, 614, - 433, 374, 0, 0, 377, 280, 303, 318, 0, 605, - 496, 226, 461, 289, 250, 0, 0, 210, 245, 229, - 258, 273, 276, 322, 387, 395, 424, 429, 295, 270, - 243, 454, 240, 479, 511, 512, 513, 515, 391, 265, - 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, - 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, - 0, 0, 0, 362, 266, 0, 0, 425, 0, 203, - 0, 481, 251, 373, 370, 575, 281, 272, 268, 249, - 315, 381, 423, 510, 417, 0, 366, 0, 0, 491, - 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 321, 247, 323, 202, - 408, 492, 285, 0, 0, 0, 0, 0, 709, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, - 0, 244, 0, 0, 0, 347, 356, 355, 336, 337, - 339, 341, 346, 353, 359, 0, 0, 0, 0, 0, - 264, 319, 271, 263, 572, 0, 0, 0, 0, 0, - 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 296, 0, 397, 256, 0, 448, 0, + 662, 0, 616, 0, 0, 0, 0, 0, 0, 0, + 361, 0, 328, 197, 224, 0, 0, 407, 456, 468, + 0, 0, 0, 252, 0, 466, 421, 594, 232, 283, + 453, 427, 464, 435, 286, 0, 0, 465, 368, 577, + 445, 591, 617, 618, 262, 401, 603, 514, 611, 635, + 225, 259, 415, 499, 597, 488, 393, 573, 574, 327, + 487, 294, 201, 365, 623, 223, 474, 367, 241, 230, + 579, 600, 288, 451, 630, 212, 509, 589, 238, 478, + 0, 0, 638, 246, 498, 214, 586, 497, 389, 324, + 325, 213, 0, 452, 267, 292, 0, 0, 257, 410, + 581, 582, 255, 639, 227, 610, 219, 0, 609, 403, + 576, 587, 390, 379, 218, 585, 388, 378, 332, 351, + 352, 279, 305, 442, 371, 443, 304, 306, 399, 398, + 400, 206, 598, 0, 207, 0, 493, 599, 640, 447, + 211, 233, 234, 236, 0, 278, 282, 290, 293, 301, + 302, 311, 363, 414, 441, 437, 446, 0, 571, 592, + 604, 615, 621, 622, 624, 625, 626, 627, 628, 631, + 629, 402, 309, 489, 331, 369, 0, 0, 420, 467, + 239, 596, 490, 199, 0, 0, 0, 0, 253, 254, + 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 636, + 500, 506, 501, 502, 503, 504, 505, 0, 507, 0, + 0, 0, 0, 0, 0, 583, 584, 659, 380, 480, + 593, 333, 345, 348, 338, 357, 0, 358, 334, 335, + 340, 342, 343, 344, 349, 350, 354, 360, 248, 209, + 386, 394, 570, 310, 215, 216, 217, 516, 517, 518, + 519, 607, 608, 612, 204, 457, 458, 459, 460, 291, + 602, 307, 463, 462, 329, 330, 375, 444, 532, 534, + 545, 549, 551, 553, 559, 562, 533, 535, 546, 550, + 552, 554, 560, 563, 522, 524, 526, 528, 541, 540, + 537, 565, 566, 543, 548, 527, 539, 544, 557, 564, + 561, 521, 525, 529, 538, 556, 555, 536, 547, 558, + 542, 530, 523, 531, 0, 196, 220, 364, 0, 449, + 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, + 200, 208, 221, 231, 235, 242, 260, 275, 277, 284, + 297, 308, 316, 317, 320, 326, 376, 382, 383, 384, + 385, 404, 405, 406, 409, 412, 413, 416, 418, 419, + 422, 426, 430, 431, 432, 434, 436, 438, 450, 455, + 469, 470, 471, 472, 473, 476, 477, 482, 483, 484, + 485, 486, 494, 495, 508, 578, 580, 595, 613, 619, + 475, 299, 300, 439, 440, 312, 313, 633, 634, 298, + 590, 620, 588, 632, 614, 433, 374, 0, 0, 377, + 280, 303, 318, 0, 605, 496, 226, 461, 289, 250, + 0, 0, 210, 245, 229, 258, 273, 276, 322, 387, + 395, 424, 429, 295, 270, 243, 454, 240, 479, 511, + 512, 513, 515, 391, 265, 428, 392, 0, 372, 568, + 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, + 0, 0, 0, 269, 0, 0, 0, 0, 362, 266, + 0, 0, 425, 0, 203, 0, 481, 251, 373, 370, + 575, 281, 272, 268, 249, 315, 381, 423, 510, 417, + 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 321, 247, 323, 202, 408, 492, 285, 0, 0, + 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 0, 0, 244, 0, 0, 0, + 347, 356, 355, 336, 337, 339, 341, 346, 353, 359, + 0, 0, 0, 0, 0, 264, 319, 271, 263, 572, + 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 296, 0, 397, 256, 0, 448, 0, 0, 0, 616, - 0, 0, 0, 0, 0, 0, 0, 361, 0, 328, - 197, 224, 0, 0, 407, 456, 468, 0, 0, 0, - 252, 0, 466, 421, 594, 232, 283, 453, 427, 464, - 435, 286, 0, 0, 465, 368, 577, 445, 591, 617, - 618, 262, 401, 603, 514, 611, 635, 225, 259, 415, - 499, 597, 488, 393, 573, 574, 327, 487, 294, 201, - 365, 623, 223, 474, 367, 241, 230, 579, 600, 288, - 451, 630, 212, 509, 589, 238, 478, 0, 0, 638, - 246, 498, 214, 586, 497, 389, 324, 325, 213, 0, - 452, 267, 292, 0, 0, 257, 410, 581, 582, 255, - 639, 227, 610, 219, 0, 609, 403, 576, 587, 390, - 379, 218, 585, 388, 378, 332, 351, 352, 279, 305, - 442, 371, 443, 304, 306, 399, 398, 400, 206, 598, - 0, 207, 0, 493, 599, 640, 447, 211, 233, 234, - 236, 0, 278, 282, 290, 293, 301, 302, 311, 363, - 414, 441, 437, 446, 0, 571, 592, 604, 615, 621, - 622, 624, 625, 626, 627, 628, 631, 629, 402, 309, - 489, 331, 369, 0, 0, 420, 467, 239, 596, 490, - 199, 0, 0, 0, 0, 253, 254, 0, 567, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 641, 642, - 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 655, 656, 657, 658, 636, 500, 506, 501, - 502, 503, 504, 505, 0, 507, 0, 0, 0, 0, - 0, 0, 583, 584, 659, 380, 480, 593, 333, 345, - 348, 338, 357, 0, 358, 334, 335, 340, 342, 343, - 344, 349, 350, 354, 360, 248, 209, 386, 394, 570, - 310, 215, 216, 217, 516, 517, 518, 519, 607, 608, - 612, 204, 457, 458, 459, 460, 291, 602, 307, 463, - 462, 329, 330, 375, 444, 532, 534, 545, 549, 551, - 553, 559, 562, 533, 535, 546, 550, 552, 554, 560, - 563, 522, 524, 526, 528, 541, 540, 537, 565, 566, - 543, 548, 527, 539, 544, 557, 564, 561, 521, 525, - 529, 538, 556, 555, 536, 547, 558, 542, 530, 523, - 531, 0, 196, 220, 364, 0, 449, 287, 637, 606, - 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 198, 200, 208, 221, - 231, 235, 242, 260, 275, 277, 284, 297, 308, 316, - 317, 320, 326, 376, 382, 383, 384, 385, 4029, 405, - 406, 409, 412, 413, 416, 418, 419, 422, 426, 430, - 431, 432, 434, 436, 438, 450, 455, 469, 470, 471, - 472, 473, 476, 477, 482, 483, 484, 485, 486, 494, - 495, 508, 578, 580, 595, 613, 619, 475, 299, 300, - 439, 440, 312, 313, 633, 634, 298, 590, 620, 588, - 632, 614, 433, 374, 0, 0, 377, 280, 303, 318, - 0, 605, 496, 226, 461, 289, 250, 0, 0, 210, - 245, 229, 258, 273, 276, 322, 387, 395, 424, 429, - 295, 270, 243, 454, 240, 479, 511, 512, 513, 515, - 391, 265, 428, 392, 0, 372, 568, 569, 314, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 362, 266, 0, 0, 425, - 0, 203, 0, 481, 251, 373, 370, 575, 281, 272, - 268, 249, 315, 381, 423, 510, 417, 0, 366, 0, - 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 321, 247, - 323, 202, 408, 492, 285, 0, 0, 0, 0, 0, - 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 237, 0, 0, 244, 0, 0, 0, 347, 356, 355, - 336, 337, 339, 341, 346, 353, 359, 0, 0, 0, - 0, 0, 264, 319, 271, 263, 572, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 296, 0, 397, 256, 0, + 448, 0, 0, 0, 616, 0, 0, 0, 0, 0, + 0, 0, 361, 0, 328, 197, 224, 0, 0, 407, + 456, 468, 0, 0, 0, 252, 0, 466, 421, 594, + 232, 283, 453, 427, 464, 435, 286, 0, 0, 465, + 368, 577, 445, 591, 617, 618, 262, 401, 603, 514, + 611, 635, 225, 259, 415, 499, 597, 488, 393, 573, + 574, 327, 487, 294, 201, 365, 623, 223, 474, 367, + 241, 230, 579, 600, 288, 451, 630, 212, 509, 589, + 238, 478, 0, 0, 638, 246, 498, 214, 586, 497, + 389, 324, 325, 213, 0, 452, 267, 292, 0, 0, + 257, 410, 581, 582, 255, 639, 227, 610, 219, 0, + 609, 403, 576, 587, 390, 379, 218, 585, 388, 378, + 332, 351, 352, 279, 305, 442, 371, 443, 304, 306, + 399, 398, 400, 206, 598, 0, 207, 0, 493, 599, + 640, 447, 211, 233, 234, 236, 0, 278, 282, 290, + 293, 301, 302, 311, 363, 414, 441, 437, 446, 0, + 571, 592, 604, 615, 621, 622, 624, 625, 626, 627, + 628, 631, 629, 402, 309, 489, 331, 369, 0, 0, + 420, 467, 239, 596, 490, 199, 0, 0, 0, 0, + 253, 254, 0, 567, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 636, 500, 506, 501, 502, 503, 504, 505, 0, + 507, 0, 0, 0, 0, 0, 0, 583, 584, 659, + 380, 480, 593, 333, 345, 348, 338, 357, 0, 358, + 334, 335, 340, 342, 343, 344, 349, 350, 354, 360, + 248, 209, 386, 394, 570, 310, 215, 216, 217, 516, + 517, 518, 519, 607, 608, 612, 204, 457, 458, 459, + 460, 291, 602, 307, 463, 462, 329, 330, 375, 444, + 532, 534, 545, 549, 551, 553, 559, 562, 533, 535, + 546, 550, 552, 554, 560, 563, 522, 524, 526, 528, + 541, 540, 537, 565, 566, 543, 548, 527, 539, 544, + 557, 564, 561, 521, 525, 529, 538, 556, 555, 536, + 547, 558, 542, 530, 523, 531, 0, 196, 220, 364, + 0, 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 198, 200, 208, 221, 231, 235, 242, 260, 275, + 277, 284, 297, 308, 316, 317, 320, 326, 376, 382, + 383, 384, 385, 4036, 405, 406, 409, 412, 413, 416, + 418, 419, 422, 426, 430, 431, 432, 434, 436, 438, + 450, 455, 469, 470, 471, 472, 473, 476, 477, 482, + 483, 484, 485, 486, 494, 495, 508, 578, 580, 595, + 613, 619, 475, 299, 300, 439, 440, 312, 313, 633, + 634, 298, 590, 620, 588, 632, 614, 433, 374, 0, + 0, 377, 280, 303, 318, 0, 605, 496, 226, 461, + 289, 250, 0, 0, 210, 245, 229, 258, 273, 276, + 322, 387, 395, 424, 429, 295, 270, 243, 454, 240, + 479, 511, 512, 513, 515, 391, 265, 428, 392, 0, + 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, + 0, 0, 0, 0, 0, 269, 0, 0, 0, 0, + 362, 266, 0, 0, 425, 0, 203, 0, 481, 251, + 373, 370, 575, 281, 272, 268, 249, 315, 381, 423, + 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 321, 247, 323, 202, 408, 492, 285, + 0, 0, 0, 0, 0, 709, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 237, 0, 0, 244, 0, + 0, 0, 347, 356, 355, 336, 337, 339, 341, 346, + 353, 359, 0, 0, 0, 0, 0, 264, 319, 271, + 263, 572, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 296, 0, 397, 256, 0, 448, 0, 0, - 0, 616, 0, 0, 0, 0, 0, 0, 0, 361, - 0, 328, 197, 224, 0, 0, 407, 456, 468, 0, - 0, 0, 252, 0, 466, 421, 594, 232, 283, 453, - 427, 464, 435, 286, 0, 0, 465, 368, 577, 445, - 591, 617, 618, 262, 401, 603, 514, 611, 635, 225, - 259, 415, 499, 597, 488, 393, 573, 574, 327, 487, - 294, 201, 365, 623, 223, 474, 367, 241, 230, 579, - 600, 288, 451, 630, 212, 509, 589, 238, 478, 0, - 0, 638, 246, 498, 214, 586, 497, 389, 324, 325, - 213, 0, 452, 267, 292, 0, 0, 257, 410, 581, - 582, 255, 639, 227, 610, 219, 0, 609, 403, 576, - 587, 390, 379, 218, 585, 388, 378, 332, 351, 352, - 279, 305, 442, 371, 443, 304, 306, 399, 398, 400, - 206, 598, 0, 207, 0, 493, 599, 640, 447, 211, - 233, 234, 236, 0, 278, 282, 290, 293, 301, 302, - 311, 363, 414, 441, 437, 446, 0, 571, 592, 604, - 615, 621, 622, 624, 625, 626, 627, 628, 631, 629, - 402, 309, 489, 331, 369, 0, 0, 420, 467, 239, - 596, 490, 199, 0, 0, 0, 0, 253, 254, 0, - 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, - 651, 652, 653, 654, 655, 656, 657, 658, 636, 500, - 506, 501, 502, 503, 504, 505, 0, 507, 0, 0, - 0, 0, 0, 0, 583, 584, 659, 380, 480, 593, - 333, 345, 348, 338, 357, 0, 358, 334, 335, 340, - 342, 343, 344, 349, 350, 354, 360, 248, 209, 386, - 394, 570, 310, 215, 216, 217, 516, 517, 518, 519, - 607, 608, 612, 204, 457, 458, 459, 460, 291, 602, - 307, 463, 462, 329, 330, 375, 444, 532, 534, 545, - 549, 551, 553, 559, 562, 533, 535, 546, 550, 552, - 554, 560, 563, 522, 524, 526, 528, 541, 540, 537, - 565, 566, 543, 548, 527, 539, 544, 557, 564, 561, - 521, 525, 529, 538, 556, 555, 536, 547, 558, 542, - 530, 523, 531, 0, 196, 220, 364, 0, 449, 287, - 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 198, 200, - 208, 221, 231, 235, 242, 260, 275, 277, 284, 297, - 308, 316, 317, 320, 326, 376, 382, 383, 384, 385, - 404, 405, 406, 409, 412, 413, 416, 418, 419, 422, - 426, 430, 431, 432, 434, 436, 438, 450, 455, 469, - 470, 471, 472, 473, 476, 477, 482, 483, 484, 485, - 486, 494, 495, 508, 578, 580, 595, 613, 619, 475, - 299, 300, 439, 440, 312, 313, 633, 634, 298, 590, - 620, 588, 632, 614, 433, 374, 0, 0, 377, 280, - 303, 318, 0, 605, 496, 226, 461, 289, 250, 0, - 0, 210, 245, 229, 258, 273, 276, 322, 387, 395, - 424, 429, 295, 270, 243, 454, 240, 479, 511, 512, - 513, 515, 391, 265, 428, 392, 0, 372, 568, 569, - 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, - 0, 0, 269, 0, 0, 0, 0, 362, 266, 0, - 0, 425, 0, 203, 0, 481, 251, 373, 370, 575, - 281, 272, 268, 249, 315, 381, 423, 510, 417, 0, - 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 321, 247, 323, 202, 408, 492, 285, 0, 0, 0, - 0, 0, 941, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 237, 0, 0, 244, 0, 0, 0, 347, - 356, 355, 336, 337, 339, 341, 346, 353, 359, 0, - 0, 0, 0, 0, 264, 319, 271, 263, 572, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 296, 0, 397, + 256, 0, 448, 0, 0, 0, 616, 0, 0, 0, + 0, 0, 0, 0, 361, 0, 328, 197, 224, 0, + 0, 407, 456, 468, 0, 0, 0, 252, 0, 466, + 421, 594, 232, 283, 453, 427, 464, 435, 286, 0, + 0, 465, 368, 577, 445, 591, 617, 618, 262, 401, + 603, 514, 611, 635, 225, 259, 415, 499, 597, 488, + 393, 573, 574, 327, 487, 294, 201, 365, 623, 223, + 474, 367, 241, 230, 579, 600, 288, 451, 630, 212, + 509, 589, 238, 478, 0, 0, 638, 246, 498, 214, + 586, 497, 389, 324, 325, 213, 0, 452, 267, 292, + 0, 0, 257, 410, 581, 582, 255, 639, 227, 610, + 219, 0, 609, 403, 576, 587, 390, 379, 218, 585, + 388, 378, 332, 351, 352, 279, 305, 442, 371, 443, + 304, 306, 399, 398, 400, 206, 598, 0, 207, 0, + 493, 599, 640, 447, 211, 233, 234, 236, 0, 278, + 282, 290, 293, 301, 302, 311, 363, 414, 441, 437, + 446, 0, 571, 592, 604, 615, 621, 622, 624, 625, + 626, 627, 628, 631, 629, 402, 309, 489, 331, 369, + 0, 0, 420, 467, 239, 596, 490, 199, 0, 0, + 0, 0, 253, 254, 0, 567, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 636, 500, 506, 501, 502, 503, 504, + 505, 0, 507, 0, 0, 0, 0, 0, 0, 583, + 584, 659, 380, 480, 593, 333, 345, 348, 338, 357, + 0, 358, 334, 335, 340, 342, 343, 344, 349, 350, + 354, 360, 248, 209, 386, 394, 570, 310, 215, 216, + 217, 516, 517, 518, 519, 607, 608, 612, 204, 457, + 458, 459, 460, 291, 602, 307, 463, 462, 329, 330, + 375, 444, 532, 534, 545, 549, 551, 553, 559, 562, + 533, 535, 546, 550, 552, 554, 560, 563, 522, 524, + 526, 528, 541, 540, 537, 565, 566, 543, 548, 527, + 539, 544, 557, 564, 561, 521, 525, 529, 538, 556, + 555, 536, 547, 558, 542, 530, 523, 531, 0, 196, + 220, 364, 0, 449, 287, 637, 606, 601, 205, 222, + 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 198, 200, 208, 221, 231, 235, 242, + 260, 275, 277, 284, 297, 308, 316, 317, 320, 326, + 376, 382, 383, 384, 385, 404, 405, 406, 409, 412, + 413, 416, 418, 419, 422, 426, 430, 431, 432, 434, + 436, 438, 450, 455, 469, 470, 471, 472, 473, 476, + 477, 482, 483, 484, 485, 486, 494, 495, 508, 578, + 580, 595, 613, 619, 475, 299, 300, 439, 440, 312, + 313, 633, 634, 298, 590, 620, 588, 632, 614, 433, + 374, 0, 0, 377, 280, 303, 318, 0, 605, 496, + 226, 461, 289, 250, 0, 0, 210, 245, 229, 258, + 273, 276, 322, 387, 395, 424, 429, 295, 270, 243, + 454, 240, 479, 511, 512, 513, 515, 391, 265, 428, + 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, + 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, + 0, 0, 362, 266, 0, 0, 425, 0, 203, 0, + 481, 251, 373, 370, 575, 281, 272, 268, 249, 315, + 381, 423, 510, 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 321, 247, 323, 202, 408, + 492, 285, 0, 0, 0, 0, 0, 941, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, + 244, 0, 0, 0, 347, 356, 355, 336, 337, 339, + 341, 346, 353, 359, 0, 0, 0, 0, 0, 264, + 319, 271, 263, 572, 0, 0, 0, 0, 0, 0, + 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 296, 0, 397, 256, 0, 448, - 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, - 0, 361, 0, 328, 197, 224, 0, 0, 407, 456, - 468, 0, 0, 0, 252, 0, 466, 421, 594, 232, - 283, 453, 427, 464, 435, 286, 0, 0, 465, 368, - 577, 445, 591, 617, 618, 262, 401, 603, 514, 611, - 635, 225, 259, 415, 499, 597, 488, 393, 573, 574, - 327, 487, 294, 201, 365, 623, 223, 474, 367, 241, - 230, 579, 600, 288, 451, 630, 212, 509, 589, 238, - 478, 0, 0, 638, 246, 498, 214, 586, 497, 389, - 324, 325, 213, 0, 452, 267, 292, 0, 0, 257, - 410, 581, 582, 255, 639, 227, 610, 219, 0, 609, - 403, 576, 587, 390, 379, 218, 585, 388, 378, 332, - 351, 352, 279, 305, 442, 371, 443, 304, 306, 399, - 398, 400, 206, 598, 0, 207, 0, 493, 599, 640, - 447, 211, 233, 234, 236, 0, 278, 282, 290, 293, - 301, 302, 311, 363, 414, 441, 437, 446, 0, 571, - 592, 604, 615, 621, 622, 624, 625, 626, 627, 628, - 631, 629, 402, 309, 489, 331, 369, 0, 0, 420, - 467, 239, 596, 490, 199, 0, 0, 0, 0, 253, - 254, 0, 567, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 641, 642, 643, 644, 645, 646, 647, 648, - 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 636, 500, 506, 501, 502, 503, 504, 505, 0, 507, - 0, 0, 0, 0, 0, 0, 583, 584, 659, 380, - 480, 593, 333, 345, 348, 338, 357, 0, 358, 334, - 335, 340, 342, 343, 344, 349, 350, 354, 360, 248, - 209, 386, 394, 570, 310, 215, 216, 217, 516, 517, - 518, 519, 607, 608, 612, 204, 457, 458, 459, 460, - 291, 602, 307, 463, 462, 329, 330, 375, 444, 532, - 534, 545, 549, 551, 553, 559, 562, 533, 535, 546, - 550, 552, 554, 560, 563, 522, 524, 526, 528, 541, - 540, 537, 565, 566, 543, 548, 527, 539, 544, 557, - 564, 561, 521, 525, 529, 538, 556, 555, 536, 547, - 558, 542, 530, 523, 531, 0, 196, 220, 364, 0, - 449, 287, 637, 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 198, 200, 208, 221, 231, 235, 242, 260, 275, 277, - 284, 297, 308, 316, 317, 320, 326, 376, 382, 383, - 384, 385, 404, 405, 406, 409, 412, 413, 416, 418, - 419, 422, 426, 430, 431, 432, 434, 436, 438, 450, - 455, 469, 470, 471, 472, 473, 476, 477, 482, 483, - 484, 485, 486, 494, 495, 508, 578, 580, 595, 613, - 619, 475, 299, 300, 439, 440, 312, 313, 633, 634, - 298, 590, 620, 588, 632, 614, 433, 374, 0, 0, - 377, 280, 303, 318, 0, 605, 496, 226, 461, 289, - 250, 0, 0, 210, 245, 229, 258, 273, 276, 322, - 387, 395, 424, 429, 295, 270, 243, 454, 240, 479, - 511, 512, 513, 515, 391, 265, 428, 392, 0, 372, - 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 362, - 266, 0, 0, 425, 0, 203, 0, 481, 251, 373, - 370, 575, 281, 272, 268, 249, 315, 381, 423, 510, - 417, 0, 366, 0, 0, 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 321, 247, 323, 202, 408, 492, 285, 0, - 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 237, 0, 0, 244, 0, 0, - 0, 347, 356, 355, 336, 337, 339, 341, 346, 353, - 359, 0, 0, 0, 0, 0, 264, 319, 271, 263, - 572, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, + 0, 397, 256, 0, 448, 0, 0, 0, 616, 0, + 0, 0, 0, 0, 0, 0, 361, 0, 328, 197, + 224, 0, 0, 407, 456, 468, 0, 0, 0, 252, + 0, 466, 421, 594, 232, 283, 453, 427, 464, 435, + 286, 0, 0, 465, 368, 577, 445, 591, 617, 618, + 262, 401, 603, 514, 611, 635, 225, 259, 415, 499, + 597, 488, 393, 573, 574, 327, 487, 294, 201, 365, + 623, 223, 474, 367, 241, 230, 579, 600, 288, 451, + 630, 212, 509, 589, 238, 478, 0, 0, 638, 246, + 498, 214, 586, 497, 389, 324, 325, 213, 0, 452, + 267, 292, 0, 0, 257, 410, 581, 582, 255, 639, + 227, 610, 219, 0, 609, 403, 576, 587, 390, 379, + 218, 585, 388, 378, 332, 351, 352, 279, 305, 442, + 371, 443, 304, 306, 399, 398, 400, 206, 598, 0, + 207, 0, 493, 599, 640, 447, 211, 233, 234, 236, + 0, 278, 282, 290, 293, 301, 302, 311, 363, 414, + 441, 437, 446, 0, 571, 592, 604, 615, 621, 622, + 624, 625, 626, 627, 628, 631, 629, 402, 309, 489, + 331, 369, 0, 0, 420, 467, 239, 596, 490, 199, + 0, 0, 0, 0, 253, 254, 0, 567, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 636, 500, 506, 501, 502, + 503, 504, 505, 0, 507, 0, 0, 0, 0, 0, + 0, 583, 584, 659, 380, 480, 593, 333, 345, 348, + 338, 357, 0, 358, 334, 335, 340, 342, 343, 344, + 349, 350, 354, 360, 248, 209, 386, 394, 570, 310, + 215, 216, 217, 516, 517, 518, 519, 607, 608, 612, + 204, 457, 458, 459, 460, 291, 602, 307, 463, 462, + 329, 330, 375, 444, 532, 534, 545, 549, 551, 553, + 559, 562, 533, 535, 546, 550, 552, 554, 560, 563, + 522, 524, 526, 528, 541, 540, 537, 565, 566, 543, + 548, 527, 539, 544, 557, 564, 561, 521, 525, 529, + 538, 556, 555, 536, 547, 558, 542, 530, 523, 531, + 0, 196, 220, 364, 0, 449, 287, 637, 606, 601, + 205, 222, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 198, 200, 208, 221, 231, + 235, 242, 260, 275, 277, 284, 297, 308, 316, 317, + 320, 326, 376, 382, 383, 384, 385, 404, 405, 406, + 409, 412, 413, 416, 418, 419, 422, 426, 430, 431, + 432, 434, 436, 438, 450, 455, 469, 470, 471, 472, + 473, 476, 477, 482, 483, 484, 485, 486, 494, 495, + 508, 578, 580, 595, 613, 619, 475, 299, 300, 439, + 440, 312, 313, 633, 634, 298, 590, 620, 588, 632, + 614, 433, 374, 0, 0, 377, 280, 303, 318, 0, + 605, 496, 226, 461, 289, 250, 0, 0, 210, 245, + 229, 258, 273, 276, 322, 387, 395, 424, 429, 295, + 270, 243, 454, 240, 479, 511, 512, 513, 515, 391, + 265, 428, 392, 0, 372, 568, 569, 314, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 411, 0, 0, 0, 0, 0, 0, 0, 0, 269, + 0, 0, 0, 0, 362, 266, 0, 0, 425, 0, + 203, 0, 481, 251, 373, 370, 575, 281, 272, 268, + 249, 315, 381, 423, 510, 417, 0, 366, 0, 0, + 491, 396, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 321, 247, 323, + 202, 408, 492, 285, 0, 0, 0, 0, 0, 194, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, + 0, 0, 244, 0, 0, 0, 347, 356, 355, 336, + 337, 339, 341, 346, 353, 359, 0, 0, 0, 0, + 0, 264, 319, 271, 263, 572, 0, 0, 0, 0, + 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 296, 0, 397, 256, - 0, 448, 0, 0, 0, 616, 0, 0, 0, 0, - 0, 0, 0, 361, 0, 328, 197, 224, 0, 0, - 407, 456, 468, 0, 0, 0, 252, 0, 466, 421, - 594, 232, 283, 453, 427, 464, 435, 286, 0, 0, - 465, 368, 577, 445, 591, 617, 618, 262, 401, 603, - 514, 611, 635, 225, 259, 415, 499, 597, 488, 393, - 573, 574, 327, 487, 294, 201, 365, 623, 223, 474, - 367, 241, 230, 579, 600, 288, 451, 630, 212, 509, - 589, 238, 478, 0, 0, 638, 246, 498, 214, 586, - 497, 389, 324, 325, 213, 0, 452, 267, 292, 0, - 0, 257, 410, 581, 582, 255, 639, 227, 610, 219, - 0, 609, 403, 576, 587, 390, 379, 218, 585, 388, - 378, 332, 351, 352, 279, 305, 442, 371, 443, 304, - 306, 399, 398, 400, 206, 598, 0, 207, 0, 493, - 599, 640, 447, 211, 233, 234, 236, 0, 278, 282, - 290, 293, 301, 302, 311, 363, 414, 441, 437, 446, - 0, 571, 592, 604, 615, 621, 622, 624, 625, 626, - 627, 628, 631, 629, 402, 309, 489, 331, 369, 0, - 0, 420, 467, 239, 596, 490, 199, 0, 0, 0, - 0, 253, 254, 0, 567, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 641, 642, 643, 644, 645, 646, - 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, - 657, 658, 636, 500, 506, 501, 502, 503, 504, 505, - 0, 507, 0, 0, 0, 0, 0, 0, 583, 584, - 659, 380, 480, 593, 333, 345, 348, 338, 357, 0, - 358, 334, 335, 340, 342, 343, 344, 349, 350, 354, - 360, 248, 209, 386, 394, 570, 310, 215, 216, 217, - 516, 517, 518, 519, 607, 608, 612, 204, 457, 458, - 459, 460, 291, 602, 307, 463, 462, 329, 330, 375, - 444, 532, 534, 545, 549, 551, 553, 559, 562, 533, - 535, 546, 550, 552, 554, 560, 563, 522, 524, 526, - 528, 541, 540, 537, 565, 566, 543, 548, 527, 539, - 544, 557, 564, 561, 521, 525, 529, 538, 556, 555, - 536, 547, 558, 542, 530, 523, 531, 0, 196, 220, - 364, 0, 449, 287, 637, 606, 601, 205, 222, 0, - 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 198, 200, 208, 221, 231, 235, 242, 260, - 275, 277, 284, 297, 308, 316, 317, 320, 326, 376, - 382, 383, 384, 385, 404, 405, 406, 409, 412, 413, - 416, 418, 419, 422, 426, 430, 431, 432, 434, 436, - 438, 450, 455, 469, 470, 471, 472, 473, 476, 477, - 482, 483, 484, 485, 486, 494, 495, 508, 578, 580, - 595, 613, 619, 475, 299, 300, 439, 440, 312, 313, - 633, 634, 298, 590, 620, 588, 632, 614, 433, 374, - 0, 0, 377, 280, 303, 318, 0, 605, 496, 226, - 461, 289, 250, 0, 0, 210, 245, 229, 258, 273, - 276, 322, 387, 395, 424, 429, 295, 270, 243, 454, - 240, 479, 511, 512, 513, 515, 391, 265, 428, 0, - 0, 372, 568, 569, 314, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 296, 0, 397, 256, 0, 448, 0, 0, 0, + 616, 0, 0, 0, 0, 0, 0, 0, 361, 0, + 328, 197, 224, 0, 0, 407, 456, 468, 0, 0, + 0, 252, 0, 466, 421, 594, 232, 283, 453, 427, + 464, 435, 286, 0, 0, 465, 368, 577, 445, 591, + 617, 618, 262, 401, 603, 514, 611, 635, 225, 259, + 415, 499, 597, 488, 393, 573, 574, 327, 487, 294, + 201, 365, 623, 223, 474, 367, 241, 230, 579, 600, + 288, 451, 630, 212, 509, 589, 238, 478, 0, 0, + 638, 246, 498, 214, 586, 497, 389, 324, 325, 213, + 0, 452, 267, 292, 0, 0, 257, 410, 581, 582, + 255, 639, 227, 610, 219, 0, 609, 403, 576, 587, + 390, 379, 218, 585, 388, 378, 332, 351, 352, 279, + 305, 442, 371, 443, 304, 306, 399, 398, 400, 206, + 598, 0, 207, 0, 493, 599, 640, 447, 211, 233, + 234, 236, 0, 278, 282, 290, 293, 301, 302, 311, + 363, 414, 441, 437, 446, 0, 571, 592, 604, 615, + 621, 622, 624, 625, 626, 627, 628, 631, 629, 402, + 309, 489, 331, 369, 0, 0, 420, 467, 239, 596, + 490, 199, 0, 0, 0, 0, 253, 254, 0, 567, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 636, 500, 506, + 501, 502, 503, 504, 505, 0, 507, 0, 0, 0, + 0, 0, 0, 583, 584, 659, 380, 480, 593, 333, + 345, 348, 338, 357, 0, 358, 334, 335, 340, 342, + 343, 344, 349, 350, 354, 360, 248, 209, 386, 394, + 570, 310, 215, 216, 217, 516, 517, 518, 519, 607, + 608, 612, 204, 457, 458, 459, 460, 291, 602, 307, + 463, 462, 329, 330, 375, 444, 532, 534, 545, 549, + 551, 553, 559, 562, 533, 535, 546, 550, 552, 554, + 560, 563, 522, 524, 526, 528, 541, 540, 537, 565, + 566, 543, 548, 527, 539, 544, 557, 564, 561, 521, + 525, 529, 538, 556, 555, 536, 547, 558, 542, 530, + 523, 531, 0, 196, 220, 364, 0, 449, 287, 637, + 606, 601, 205, 222, 0, 261, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 198, 200, 208, + 221, 231, 235, 242, 260, 275, 277, 284, 297, 308, + 316, 317, 320, 326, 376, 382, 383, 384, 385, 404, + 405, 406, 409, 412, 413, 416, 418, 419, 422, 426, + 430, 431, 432, 434, 436, 438, 450, 455, 469, 470, + 471, 472, 473, 476, 477, 482, 483, 484, 485, 486, + 494, 495, 508, 578, 580, 595, 613, 619, 475, 299, + 300, 439, 440, 312, 313, 633, 634, 298, 590, 620, + 588, 632, 614, 433, 374, 0, 0, 377, 280, 303, + 318, 0, 605, 496, 226, 461, 289, 250, 0, 0, + 210, 245, 229, 258, 273, 276, 322, 387, 395, 424, + 429, 295, 270, 243, 454, 240, 479, 511, 512, 513, + 515, 391, 265, 428, 0, 0, 372, 568, 569, 314, } var yyPact = [...]int{ - -1000, -1000, 1893, -1000, -532, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 6231, -1000, -531, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 2350, 2400, -1000, -1000, -1000, -1000, 2535, -1000, 1002, + 1986, -1000, 2335, 4910, -1000, 54918, 503, -1000, 52030, -434, + 871, 236, 36146, -1000, 195, -1000, 184, 53474, 188, -1000, + -1000, -1000, -1000, -434, 21704, 2285, 57, 52, 54918, -1000, + -1000, -1000, -1000, -355, 2510, 1962, -1000, 415, -1000, -1000, + -1000, -1000, -1000, -1000, 51308, -1000, 1084, -1000, -1000, 2358, + 2349, 2259, 898, 2272, -1000, 2451, 1962, -1000, 21704, 2492, + 2407, 20982, 20982, 462, -1000, -1000, 315, -1000, -1000, 31092, + 54918, 39034, 306, -1000, 2335, -1000, -1000, -1000, 192, -1000, + 384, 1895, -1000, 1894, -1000, 892, 1017, 407, 875, 862, + 406, 395, 394, 389, 385, 381, 379, 361, 413, -1000, + 928, 928, -204, -208, 1319, 457, 449, 449, 1041, 476, + 2301, 2300, -1000, -1000, 928, 928, 928, 346, 928, 928, + 928, 928, 328, 327, 928, 928, 928, 928, 928, 928, + 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, + 928, 860, 2335, 310, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 2352, 2406, -1000, -1000, -1000, -1000, 2560, -1000, 1002, - 2052, -1000, 2357, 4901, -1000, 54763, 481, -1000, 51875, -434, - 853, 234, 35991, -1000, 198, -1000, 182, 53319, 191, -1000, - -1000, -1000, -1000, -434, 21549, 2291, 57, 53, 54763, -1000, - -1000, -1000, -1000, -357, 2521, 2031, -1000, 409, -1000, -1000, - -1000, -1000, -1000, -1000, 51153, -1000, 1082, -1000, -1000, 2364, - 2338, 2563, 912, 2292, -1000, 2456, 2031, -1000, 21549, 2510, - 2450, 20827, 20827, 430, -1000, -1000, 238, -1000, -1000, 30937, - 54763, 38879, 293, -1000, 2357, -1000, -1000, -1000, 219, -1000, - 336, 1947, -1000, 1943, -1000, 845, 896, 380, 478, 456, - 379, 359, 358, 356, 354, 349, 346, 344, 374, -1000, - 936, 936, -217, -218, 361, 425, 413, 413, 968, 458, - 2321, 2320, -1000, -1000, 936, 936, 936, 369, 936, 936, - 936, 936, 296, 295, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 906, 2357, 274, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7275,67 +7291,67 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 54918, 181, 54918, -1000, 819, 495, -1000, -1000, -438, 1091, + 1091, 69, 1091, 1091, 1091, 1091, 186, 971, 50, -1000, + 185, 281, 173, 294, 1044, 321, -1000, -1000, 277, 1044, + 1769, -1000, 903, 286, 216, -1000, 1091, 1091, -1000, 14459, + 252, 14459, 14459, -1000, 2324, -1000, -1000, -1000, -1000, -1000, + 1341, -1000, -1000, -1000, -1000, -27, 475, -1000, -1000, -1000, + -1000, 53474, 50586, 275, -1000, -1000, 47, 1807, 1263, 21704, + 1256, 896, -1000, -1000, 1187, 873, -1000, -1000, -1000, -1000, + -1000, 522, -1000, 23870, 23870, 23870, 23870, -1000, -1000, 1897, + 49864, 1897, 1897, 23870, 1897, 23870, 1897, 1897, 1897, 21704, + 1897, 1897, 1897, 1897, -1000, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, -1000, -1000, -1000, -1000, 1897, 817, 1897, 1897, + 1897, 1897, 1897, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1897, 1897, 1897, 1897, 1897, 1897, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 54763, 181, 54763, -1000, 798, 480, -1000, -1000, -439, 1083, - 1083, 96, 1083, 1083, 1083, 1083, 186, 962, 50, -1000, - 176, 266, 171, 269, 1027, 319, -1000, -1000, 262, 1027, - 1736, -1000, 917, 264, 166, -1000, 1083, 1083, -1000, 14304, - 230, 14304, 14304, -1000, 2355, -1000, -1000, -1000, -1000, -1000, - 1361, -1000, -1000, -1000, -1000, -26, 454, -1000, -1000, -1000, - -1000, 53319, 50431, 233, -1000, -1000, 769, 1803, 1515, 21549, - 1254, 893, -1000, -1000, 1479, 858, -1000, -1000, -1000, -1000, - -1000, 508, -1000, 23715, 23715, 23715, 23715, -1000, -1000, 1788, - 49709, 1788, 1788, 23715, 1788, 23715, 1788, 1788, 1788, 21549, - 1788, 1788, 1788, 1788, -1000, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, -1000, -1000, -1000, -1000, 1788, 795, 1788, 1788, - 1788, 1788, 1788, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1788, 1788, 1788, 1788, 1788, 1788, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, -1000, + 26758, 1482, 1480, 1475, -1000, 18816, 1897, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 26603, 1518, 1512, 1506, -1000, 18661, 1788, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 54918, -1000, 1897, + 217, 53474, 53474, 349, 1336, -1000, -1000, 2451, 1962, -1000, + 2510, 2462, 415, -1000, 3317, 1694, 1510, 1506, 1962, 1870, + 54918, -1000, 1913, -1000, -1000, -1000, -313, -318, 2197, 1471, + 1755, -1000, -1000, -1000, -1000, 2251, 21704, -1000, -1000, 2532, + -1000, 28203, 816, 2531, 49142, -1000, 462, 462, 1888, 428, + 33, -1000, -1000, -1000, -1000, 942, 35424, -1000, -1000, -1000, + -1000, -1000, 1766, 54918, -1000, -1000, 4141, 1347, -1000, 1985, + -1000, 1748, -1000, 1931, 21704, 1998, 493, 1347, 484, 483, + 482, -1000, -53, -1000, -1000, -1000, -1000, -1000, -1000, 928, + 928, 928, -1000, 387, 2490, 4910, 6412, -1000, -1000, -1000, + 48420, 1984, 1347, -1000, 1980, -1000, 1007, 869, 865, 865, + 1347, -1000, -1000, 54196, 1347, 1006, 1004, 1347, 1347, 53474, + 53474, -1000, 47698, -1000, 46976, 46254, 1328, 53474, 45532, 44810, + 44088, 43366, 42644, -1000, 2238, -1000, 2058, -1000, -1000, -1000, + 54196, 1347, 1347, 54196, 53474, 54196, 54918, 1347, -1000, -1000, + 338, -1000, -1000, 1320, 1308, 1305, 928, 928, 1291, 1742, + 1741, 1733, 928, 928, 1284, 1732, 37590, 1729, 269, 1283, + 1282, 1281, 1246, 1721, 193, 1712, 1245, 1229, 1279, 53474, + 1976, 54918, -1000, 262, 970, 935, 940, 2335, 2281, 1884, + 471, 492, 1347, 452, 452, 53474, -1000, 15187, 54918, 227, + -1000, 1665, 21704, -1000, 1054, 1044, 1044, -1000, -1000, -1000, + -1000, -1000, -1000, 1091, 54918, 1054, -1000, -1000, -1000, 1044, + 1091, 54918, 1091, 1091, 1091, 1091, 1044, 1044, 1044, 1091, + 54918, 54918, 54918, 54918, 54918, 54918, 54918, 54918, 54918, 14459, + 903, 1091, -440, -1000, 1663, -1000, -1000, -1000, 2117, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 54763, -1000, 1788, - 216, 53319, 53319, 321, 1326, -1000, -1000, 2456, 2031, -1000, - 2521, 2488, 409, -1000, 3573, 1787, 1722, 1426, 2031, 1927, - 54763, -1000, 1966, -1000, -1000, -1000, -1000, 2204, 1507, 1734, - -1000, -1000, -1000, -1000, 1925, 21549, -1000, -1000, 2555, -1000, - 28048, 792, 2552, 48987, -1000, 430, 430, 1939, 421, 20, - -1000, -1000, -1000, -1000, 958, 35269, -1000, -1000, -1000, -1000, - -1000, 1870, 54763, -1000, -1000, 5319, 1353, -1000, 2044, -1000, - 1868, -1000, 1990, 21549, 2063, 477, 1353, 467, 465, 463, - -1000, -61, -1000, -1000, -1000, -1000, -1000, -1000, 936, 936, - 936, -1000, 343, 2505, 4901, 6077, -1000, -1000, -1000, 48265, - 2040, 1353, -1000, 2038, -1000, 1031, 859, 868, 868, 1353, - -1000, -1000, 54041, 1353, 1022, 1015, 1353, 1353, 53319, 53319, - -1000, 47543, -1000, 46821, 46099, 1319, 53319, 45377, 44655, 43933, - 43211, 42489, -1000, 2233, -1000, 2016, -1000, -1000, -1000, 54041, - 1353, 1353, 54041, 53319, 54041, 54763, 1353, -1000, -1000, 364, - -1000, -1000, 1308, 1307, 1306, 936, 936, 1292, 1731, 1728, - 1714, 936, 936, 1290, 1707, 37435, 1699, 270, 1289, 1270, - 1261, 1318, 1686, 229, 1674, 1281, 1264, 1252, 53319, 2032, - 54763, -1000, 254, 951, 435, 956, 2357, 2289, 1935, 453, - 474, 1353, 424, 424, 53319, -1000, 15032, 54763, 227, -1000, - 1670, 21549, -1000, 1043, 1027, 1027, -1000, -1000, -1000, -1000, - -1000, -1000, 1083, 54763, 1043, -1000, -1000, -1000, 1027, 1083, - 54763, 1083, 1083, 1083, 1083, 1027, 1027, 1027, 1083, 54763, - 54763, 54763, 54763, 54763, 54763, 54763, 54763, 54763, 14304, 917, - 1083, -440, -1000, 1659, -1000, -1000, -1000, 2157, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -7350,328 +7366,328 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 14459, 14459, -1000, -1000, + -1000, -1000, -1000, 1882, -1000, 174, 19, 187, -1000, 41922, + 518, 938, -1000, 518, -1000, -1000, -1000, 1875, 41200, -1000, + -441, -442, -448, -449, -1000, -1000, -1000, -451, -455, -1000, + -1000, -1000, 21704, 21704, 21704, 21704, -238, -1000, 1191, 23870, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21704, 251, 941, + 23870, 23870, 23870, 23870, 23870, 23870, 23870, 25314, 24592, 23870, + 23870, 23870, 23870, 23870, 23870, -1000, -1000, 33258, 3221, 3221, + 873, 873, 873, 873, -1000, -164, 1872, 54196, -1000, -1000, + -1000, 815, 21704, 21704, 873, -1000, 1347, 1289, 18816, 20982, + 20982, 21704, 945, 1263, 54196, 21704, -1000, 1506, -1000, -1000, + -1000, -1000, 1159, -1000, -1000, 1043, 2309, 2309, 2309, 2309, + 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, + 2309, 21704, 213, 213, 1731, 21704, 21704, 21704, 21704, 21704, + 21704, 17371, 21704, 21704, 23870, 21704, 21704, 21704, 1506, 21704, + 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, + 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, + 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, + 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, + 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, + 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, + 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, + 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 1506, 21704, + 1418, 21704, 21704, 21704, 21704, 21704, 21704, 20982, 16643, 20982, + 20982, 20982, 20982, 20982, -1000, -1000, -1000, -1000, -1000, -1000, + 21704, 21704, 21704, 21704, 21704, 21704, 21704, 21704, 1506, 21704, + 21704, 21704, 21704, 21704, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1545, 1520, 1459, 21704, -1000, 1871, + -1000, -184, 30370, 21704, 1633, 2528, 2014, 53474, -1000, -1000, + -1000, -1000, 2451, -1000, 2451, 1545, 3299, 2202, 20982, -1000, + -1000, 3299, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1740, -1000, 54918, 1870, 2402, 53474, -1000, -268, -1000, -274, + 2194, 1626, 341, -1000, 21704, 21704, 1867, -1000, 2124, 54918, + -1000, -238, -1000, 40478, -1000, -1000, 13731, 54918, 358, 54918, + -1000, 29648, 39756, 304, -1000, 33, 1854, -1000, 23, 12, + 18093, 866, -1000, -1000, -1000, 1319, 26036, 1785, 866, 116, + -1000, -1000, -1000, 1931, -1000, 1931, 1931, 1931, 1931, 341, + 341, 341, 341, -1000, -1000, -1000, -1000, -1000, 1974, 1972, + -1000, 1931, 1931, 1931, 1931, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 14304, 14304, -1000, -1000, -1000, - -1000, -1000, 1934, -1000, 184, 26, 189, -1000, 41767, 517, - 955, -1000, 517, -1000, -1000, -1000, 1933, 41045, -1000, -441, - -445, -446, -447, -1000, -1000, -1000, -450, -460, -1000, -1000, - -1000, 21549, 21549, 21549, 21549, -251, -1000, 1019, 23715, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 21549, 251, 1038, 23715, - 23715, 23715, 23715, 23715, 23715, 23715, 25159, 24437, 23715, 23715, - 23715, 23715, 23715, 23715, -1000, -1000, 33103, 6798, 6798, 858, - 858, 858, 858, -1000, -173, 1932, 54041, -1000, -1000, -1000, - 790, 21549, 21549, 858, -1000, 1353, 2945, 18661, 20827, 20827, - 21549, 963, 1515, 54041, 21549, -1000, 1426, -1000, -1000, -1000, - -1000, 1257, -1000, -1000, 1093, 2335, 2335, 2335, 2335, 21549, - 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 2335, - 21549, 908, 908, 1136, 21549, 21549, 21549, 21549, 21549, 21549, - 17216, 21549, 21549, 23715, 21549, 21549, 21549, 1426, 21549, 21549, - 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, - 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, - 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, - 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, - 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, - 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, - 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, - 21549, 21549, 21549, 21549, 21549, 21549, 21549, 1426, 21549, 1665, - 21549, 21549, 21549, 21549, 21549, 21549, 20827, 16488, 20827, 20827, - 20827, 20827, 20827, -1000, -1000, -1000, -1000, -1000, -1000, 21549, - 21549, 21549, 21549, 21549, 21549, 21549, 21549, 1426, 21549, 21549, - 21549, 21549, 21549, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 1769, 1532, 1481, 21549, -1000, 1928, -1000, - -184, 30215, 21549, 1656, 2547, 2092, 53319, -1000, -1000, -1000, - -1000, 2456, -1000, 2456, 1769, 2727, 2207, 20827, -1000, -1000, - 2727, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1777, - -1000, 54763, 1927, 2393, 53319, 2198, 1652, 351, -1000, 21549, - 21549, 1923, -1000, 1601, 54763, -1000, -251, -1000, 40323, -1000, - -1000, 13576, 54763, 334, 54763, -1000, 29493, 39601, 268, -1000, - 20, 1878, -1000, 31, 9, 17938, 857, -1000, -1000, -1000, - 361, 25881, 1705, 857, 109, -1000, -1000, -1000, 1990, -1000, - 1990, 1990, 1990, 1990, 351, 351, 351, 351, -1000, -1000, - -1000, -1000, -1000, 2025, 2021, -1000, 1990, 1990, 1990, 1990, + -1000, -1000, 1969, 1969, 1969, 1967, 1967, 1949, 1949, 444, + -1000, 21704, 397, 39034, 2347, 1275, 1243, 262, 454, 2013, + 1347, 1347, 1347, 454, -1000, 1421, 1390, 1376, -1000, -509, + 1865, -1000, -1000, 2487, -1000, -1000, 905, 1050, 1042, 959, + 53474, 228, 348, -1000, 435, -1000, 39034, 1347, 994, 865, + 1347, -1000, 1347, -1000, -1000, -1000, -1000, -1000, 1347, -1000, + -1000, 1864, -1000, 1787, 1156, 1036, 1062, 987, 1864, -1000, + -1000, -173, 1864, -1000, 1864, -1000, 1864, -1000, 1864, -1000, + 1864, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 991, 300, -325, 53474, 228, 467, -1000, 466, 33258, -1000, + -1000, -1000, 33258, 33258, -1000, -1000, -1000, -1000, 1624, 1620, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2020, 2020, 2020, - 2019, 2019, 1995, 1995, 417, -1000, 21549, 415, 38879, 2362, - 1247, 1474, 254, 428, 2079, 1353, 1353, 1353, 428, -1000, - 1383, 1377, 1366, -1000, -518, 1919, -1000, -1000, 2504, -1000, - -1000, 940, 1048, 1047, 903, 53319, 220, 327, -1000, 408, - -1000, 38879, 1353, 1003, 868, 1353, -1000, 1353, -1000, -1000, - -1000, -1000, -1000, 1353, -1000, -1000, 1918, -1000, 1801, 1091, - 1044, 1077, 1030, 1918, -1000, -1000, -178, 1918, -1000, 1918, - -1000, 1918, -1000, 1918, -1000, 1918, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 979, 281, -325, 53319, 220, - 441, -1000, 439, 33103, -1000, -1000, -1000, 33103, 33103, -1000, - -1000, -1000, -1000, 1633, 1619, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -500, + 54918, -1000, 235, 936, 333, 318, 322, 54918, 226, 2441, + 2439, 2434, 2433, 2409, 250, 325, 54918, 54918, 452, 2074, + 54918, 2365, 54918, -1000, -1000, -1000, -1000, -1000, 1613, 1602, + -1000, 1263, 54918, -1000, -1000, 1091, 1091, -1000, -1000, 54918, + 1091, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1091, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -503, 54763, -1000, 240, 952, 283, - 306, 303, 54763, 420, 2419, 2408, 2405, 2400, 2397, 299, - 290, 54763, 54763, 424, 2130, 54763, 2376, 54763, -1000, -1000, - -1000, -1000, -1000, 1617, 1612, -1000, 1515, 54763, -1000, -1000, - 1083, 1083, -1000, -1000, 54763, 1083, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1083, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 54918, -1000, -1000, -1000, -1000, + -27, 170, -1000, -1000, 53474, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -105, -1000, 255, 16, 416, -1000, + -1000, -1000, -1000, -1000, 2421, -1000, 1263, 986, 976, -1000, + 1897, -1000, -1000, 1176, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 251, 23870, 23870, 23870, 1304, 822, 1410, 1456, + 1317, 904, 904, 1132, 23870, 1132, 23870, 877, 877, 877, + 877, 877, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1598, -1000, 1897, 54196, 1727, 16643, 1496, 2842, 1506, 890, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 54763, -1000, -1000, -1000, -1000, -26, 178, -1000, -1000, 53319, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -105, - -1000, 847, 24, 384, -1000, -1000, -1000, -1000, -1000, 2445, - -1000, 1515, 988, 976, -1000, 1788, -1000, -1000, 1135, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 251, 23715, 23715, - 23715, 1565, 485, 1224, 1315, 1155, 1133, 1133, 1097, 23715, - 1097, 23715, 862, 862, 862, 862, 862, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 1605, -1000, 1788, 54041, 1826, - 16488, 1974, 2164, 1426, 870, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 4151, 1824, -1000, 1824, 1425, - 964, -1000, 21549, 1426, 4143, -1000, -1000, 1426, 1426, 21549, - -1000, -1000, 21549, 21549, 21549, 21549, 1474, 1474, 1474, 1474, - 1474, 1474, 1474, 1474, 1474, 1474, 21549, 1474, 1906, -1000, + 4252, 1711, -1000, 1711, 1805, 961, -1000, 21704, 1506, 4247, + -1000, -1000, 1506, 1506, 21704, -1000, -1000, 21704, 21704, 21704, + 21704, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, + 1243, 21704, 1243, 1863, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1900, 2544, 1352, - 1474, 1474, 1474, 1474, 1474, 21549, 1432, -1000, -1000, -1000, - 1434, 4139, 1116, 4135, 1474, 1474, -1000, 1474, 4126, 4116, - 1426, 1803, 2877, 2872, 1474, 1474, 1474, 1474, 1474, 2864, - 2803, 1474, 1474, 2722, 1474, 4112, 1474, 2681, 2658, 2645, - 2621, 2615, 2598, 2556, 2540, 2535, 2529, 2524, 2511, 2495, - 2491, 2468, 2453, 2449, 2429, 1474, 1474, 1474, 4093, 1474, - 3877, 1474, 3845, 1474, 1474, 3820, 2409, 2361, 1426, 1897, - -1000, 3813, 1474, 3808, 3804, 3526, 2351, 3515, 3477, 3449, - 1474, 1474, 1474, 2322, 3440, 3435, 3427, 3421, 3417, 3407, - 3403, 3378, 3370, 1474, 1481, 1481, 1481, 1481, 1481, 3361, - -267, 1474, 1426, -1000, -1000, -1000, -1000, -1000, 3347, 2316, - 3336, 3332, 3321, 3317, 1426, 1891, 1788, 761, -1000, -1000, - 1824, 1426, 1426, 1824, 1824, 3290, 3276, 3207, 3191, 3018, - 2997, 1474, 1474, -1000, 1474, 2960, 2940, 2312, 2304, 1426, - -1000, 1481, 54763, -1000, -431, -1000, 0, 933, 1788, -1000, - 37435, 1426, -1000, 4158, -1000, 1335, -1000, -1000, -1000, -1000, - -1000, 34547, 1752, 2727, -1000, -1000, 1788, 1791, -1000, -1000, - 351, 81, 33825, 852, 852, 127, 1515, 1515, 21549, -1000, - -1000, -1000, -1000, -1000, -1000, 542, 2527, 423, 1788, -1000, - 1883, 3286, -1000, -1000, -1000, 2386, 27326, -1000, -1000, 1788, - 1788, 54763, 1863, 1854, -1000, 537, -1000, 1359, 1878, 20, - 19, -1000, -1000, -1000, -1000, 1515, -1000, 1358, 337, 341, - -1000, 416, -1000, -1000, -1000, -1000, 2306, 102, -1000, -1000, - -1000, 365, 351, -1000, -1000, -1000, -1000, -1000, -1000, 1580, - 1580, -1000, -1000, -1000, -1000, -1000, 1241, -1000, -1000, -1000, - -1000, 1223, -1000, -1000, 1222, -1000, -1000, 2327, 2135, 415, - -1000, -1000, 936, 1566, -1000, -1000, 2293, 936, 936, 53319, - -1000, -1000, 1611, 2362, 240, 54763, 959, 2126, -1000, 2079, - 2079, 2079, 54763, -1000, -1000, -1000, -1000, -1000, -1000, -505, - 175, 583, -1000, -1000, -1000, 2009, 53319, 1785, -1000, 222, - -1000, 1549, -1000, 53319, -1000, 1768, 2015, 1353, 1353, -1000, - -1000, -1000, 53319, 1788, -1000, -1000, -1000, -1000, 473, 2347, - 353, -1000, -1000, -293, -1000, -1000, 220, 222, 54041, 1353, - 857, -1000, -1000, -1000, -1000, -1000, -506, 1759, 457, 217, - 563, 54763, 54763, 54763, 54763, 54763, 54763, 782, -1000, -1000, - 41, -1000, -1000, 207, -1000, -1000, -1000, -1000, 207, -1000, - -1000, -1000, -1000, 278, 432, -1000, 54763, 54763, 914, -1000, - -1000, -1000, -1000, -1000, 1027, -1000, -1000, 1027, -1000, -1000, + -1000, -1000, 1861, 2527, 1415, 1243, 1243, 1243, 1243, 1243, + 21704, 1783, -1000, -1000, -1000, 1527, 4196, 1225, 4190, 1243, + 1243, -1000, 1243, 4183, 4166, 1506, 1807, 2869, 2862, 1243, + 1243, 1243, 1243, 1243, 2812, 2741, 1243, 1243, 2685, 1243, + 4162, 1243, 2679, 2660, 2649, 2639, 2621, 2616, 2599, 2593, + 2589, 2581, 2577, 2572, 2516, 2499, 2495, 2491, 2486, 2469, + 1243, 1243, 1243, 4158, 1243, 4153, 1243, 4149, 1243, 1243, + 4143, 2456, 2452, 1506, 1858, -1000, 4133, 1243, 4124, 4119, + 4105, 2425, 4100, 3884, 3866, 1243, 1243, 1243, 2420, 3860, + 3852, 3831, 3827, 3823, 3818, 3810, 3498, 3484, 1243, 1459, + 1459, 1459, 1459, 1459, 3480, -240, 1243, 1506, -1000, -1000, + -1000, -1000, -1000, 3467, 2412, 3463, 3456, 3395, 3389, 1506, + 1855, 1897, 814, -1000, -1000, 1711, 1506, 1506, 1711, 1711, + 3385, 3376, 3356, 3303, 3255, 3185, 1243, 1243, -1000, 1243, + 3029, 3025, 2391, 2354, 1506, -1000, 1459, 54918, -1000, -431, + -1000, 4, 960, 1897, -1000, 37590, 1506, -1000, 4165, -1000, + 1157, -1000, -1000, -1000, -1000, -1000, 34702, 1782, 3299, -1000, + -1000, 1897, 1705, -1000, -1000, -1000, -1000, 341, 76, 33980, + 870, 870, 129, 1263, 1263, 21704, -1000, -1000, -1000, -1000, + -1000, -1000, 804, 2505, 400, 1897, -1000, 1788, 2093, -1000, + -1000, -1000, 2399, 27481, -1000, -1000, 1897, 1897, 54918, 1820, + 1790, -1000, 803, -1000, 1349, 1854, 33, 9, -1000, -1000, + -1000, -1000, 1263, -1000, 1358, 360, 1394, -1000, 439, -1000, + -1000, -1000, -1000, 2292, 88, -1000, -1000, -1000, 787, 341, + -1000, -1000, -1000, -1000, -1000, -1000, 1595, 1595, -1000, -1000, + -1000, -1000, -1000, 1274, -1000, -1000, -1000, -1000, 1273, -1000, + -1000, 1272, -1000, -1000, 2165, 2044, 397, -1000, -1000, 928, + 1581, -1000, -1000, 2295, 928, 928, 53474, -1000, -1000, 1662, + 2347, 235, 54918, 964, 2073, -1000, 2013, 2013, 2013, 54918, + -1000, -1000, -1000, -1000, -1000, -1000, -511, 165, 382, -1000, + -1000, -1000, 5045, 53474, 1703, -1000, 221, -1000, 1640, -1000, + 53474, -1000, 1701, 1965, 1347, 1347, -1000, -1000, -1000, 53474, + 1897, -1000, -1000, -1000, -1000, 490, 2330, 347, -1000, -1000, + -258, -1000, -1000, 228, 221, 54196, 1347, 866, -1000, -1000, + -1000, -1000, -1000, -503, 1697, 480, 222, 489, 54918, 54918, + 54918, 54918, 54918, 54918, 785, -1000, -1000, 35, -1000, -1000, + 198, -1000, -1000, -1000, -1000, 198, -1000, -1000, -1000, -1000, + 314, 458, -1000, 54918, 54918, 924, -1000, -1000, -1000, -1000, + -1000, 1044, -1000, -1000, 1044, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2315, 54918, 11, + -470, -1000, -467, 21704, -1000, -1000, -1000, -1000, 1149, 798, + 1410, 23870, 23870, 1289, 1289, 23870, -1000, -1000, -1000, 832, + 832, 33258, -1000, 23870, 21704, 20982, -1000, -1000, 21704, 21704, + 947, -1000, 21704, 1359, -1000, 21704, -1000, -1000, 1459, 1243, + 1243, 1243, 1243, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1789, -1000, 21704, 21704, 21704, 1506, 309, + -1000, -1000, -1000, -1000, -1000, 2521, -1000, 21704, -1000, 33258, + 21704, 21704, 21704, -1000, -1000, -1000, 21704, 21704, -1000, -1000, + 21704, -1000, 21704, -1000, -1000, -1000, -1000, -1000, -1000, 21704, + -1000, 21704, -1000, -1000, -1000, 21704, -1000, 21704, -1000, -1000, + 21704, -1000, 21704, -1000, 21704, -1000, 21704, -1000, 21704, -1000, + 21704, -1000, 21704, -1000, 21704, -1000, 21704, -1000, 21704, -1000, + 21704, -1000, 21704, -1000, 21704, -1000, 21704, -1000, 21704, -1000, + 21704, -1000, 21704, -1000, 21704, -1000, -1000, -1000, 21704, -1000, + 21704, -1000, 21704, -1000, -1000, 21704, -1000, 21704, -1000, 21704, + -1000, 21704, 21704, -1000, 21704, 21704, 21704, -1000, 21704, 21704, + 21704, 21704, -1000, -1000, -1000, -1000, 21704, 21704, 21704, 21704, + 21704, 21704, 21704, 21704, 21704, 21704, -1000, -1000, -1000, -1000, + -1000, -1000, 21704, -1000, 39034, 53, -240, 1418, 53, 1418, + 23148, 823, 786, 22426, -1000, 20982, 15915, -1000, -1000, -1000, + -1000, -1000, 21704, 21704, 21704, 21704, 21704, 21704, -1000, -1000, + -1000, 21704, 21704, -1000, 21704, -1000, 21704, -1000, -1000, -1000, + -1000, -1000, 960, -1000, 865, 865, 865, 53474, -1000, -1000, + -1000, -1000, 1848, -1000, 2438, -1000, 2232, 2224, 2520, 2505, + -1000, 29648, 3299, -1000, -1000, 53474, -419, -1000, 2273, 2240, + 870, 870, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 13003, + 2451, 21704, 2072, 54196, 253, -1000, 28926, 53474, 54196, 29648, + 29648, 29648, 29648, 29648, -1000, 2103, 2101, -1000, 2133, 2125, + 2134, 54918, -1000, 1545, 1689, -1000, 21704, 31814, 1829, 29648, + -1000, -1000, 29648, 54918, 12275, -1000, -1000, 10, -3, -1000, + -1000, -1000, -1000, 1319, -1000, -1000, 927, 2386, 2283, -1000, + -1000, -1000, -1000, -1000, 1677, -1000, 1675, 1844, 1673, 1661, + 300, -1000, 1997, 2313, 928, 928, -1000, 1271, -1000, 1347, + 1564, 1560, -1000, -1000, -1000, 478, -1000, 2363, 54918, 2071, + 2070, 2054, -1000, -521, 1269, 1963, 1910, 21704, 1959, 2485, + 1832, 53474, -1000, -1000, 54196, -1000, 274, -1000, 397, 53474, + -1000, -1000, -1000, 348, 54918, -1000, 7141, -1000, -1000, -1000, + 221, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 54918, 258, + -1000, 1955, 1195, -1000, -1000, 1990, -1000, -1000, -1000, -1000, + -1000, 223, 197, 1547, 201, 1524, 201, -1000, 54918, 921, + 2044, 54918, -1000, -1000, -1000, 1091, 1091, -1000, -1000, 2310, + -1000, 1347, 1243, 23870, 23870, -1000, 873, -1000, -1000, 419, + -216, 1931, 1931, -1000, 1931, 1949, -1000, 1931, 154, 1931, + 138, 1931, -1000, -1000, 1506, 1506, -1000, 1459, -1000, 2346, + 1114, -1000, 1263, 21704, 3020, -1000, -1000, -1000, -1000, -1000, + -60, 2979, 2963, 1243, -1000, 1929, 1927, 21704, 1243, 1506, + 2312, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, + 1243, 1243, 1243, 2308, 2298, 2280, 2275, 2271, 2267, 2239, + 2211, 2198, 2189, 2056, 1994, 1981, 1977, 1946, 1915, 1243, + 1243, 1905, 1243, 1901, 1822, -1000, 1263, 1459, 2952, 1459, + 1243, 1243, 2915, 343, 1243, 1637, 1637, 1637, 1637, 1637, + 1459, 1459, 1459, 1459, 1243, 53474, -1000, -240, -1000, -1000, + -312, -316, -1000, 1506, -240, 1840, 23870, 1243, 23870, 23870, + 23870, 1243, 1506, -1000, 1814, 1791, 2892, 1754, 1243, 2746, + 1243, 1243, 1243, 1718, -1000, 2403, 2403, 2403, 1617, 1157, + 54918, -1000, -1000, -1000, -1000, 2505, 2459, 1834, -1000, -1000, + 76, 614, -1000, 2266, 2240, -1000, 2484, 2260, 2482, -1000, + -1000, -1000, -1000, -1000, 1263, -1000, 2339, 1804, -1000, 932, + 1812, -1000, -1000, 20260, 1631, 2210, 797, 1617, 1853, 2093, + 2007, 2048, 3006, -1000, -1000, -1000, -1000, 2092, -1000, 2068, + -1000, -1000, 1913, -1000, 2696, 358, 29648, 1851, 1851, -1000, + 537, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1063, 7141, + 2540, -1000, 1502, -1000, 1346, 205, 1250, -1000, -1000, 928, + 928, -1000, 993, 992, -1000, 54918, 1926, -1000, 341, 1498, + 341, 1234, -1000, -1000, 1233, -1000, -1000, -1000, -1000, 2055, + 2075, -1000, -1000, -1000, -1000, 54918, -1000, -1000, 54918, 54918, + 54918, 1923, 2478, -1000, 21704, 1922, 931, 2153, 53474, 53474, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 2344, 54763, 15, -472, -1000, -469, 21549, -1000, -1000, -1000, - -1000, 1547, 484, 1224, 23715, 23715, 2945, 2945, 23715, -1000, - -1000, -1000, 1176, 1176, 33103, -1000, 23715, 21549, 20827, -1000, - -1000, 21549, 21549, 934, -1000, 21549, 1198, -1000, 21549, -1000, - -1000, 1481, 1474, 1474, 1474, 1474, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1858, -1000, 21549, 21549, - 21549, 1426, 304, -1000, -1000, -1000, -1000, -1000, 2543, -1000, - 21549, -1000, 33103, 21549, 21549, 21549, -1000, -1000, -1000, 21549, - 21549, -1000, -1000, 21549, -1000, 21549, -1000, -1000, -1000, -1000, - -1000, -1000, 21549, -1000, 21549, -1000, -1000, -1000, 21549, -1000, - 21549, -1000, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, - -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, - -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, - -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, -1000, - -1000, 21549, -1000, 21549, -1000, 21549, -1000, -1000, 21549, -1000, - 21549, -1000, 21549, -1000, 21549, 21549, -1000, 21549, 21549, 21549, - -1000, 21549, 21549, 21549, 21549, -1000, -1000, -1000, -1000, 21549, - 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, 21549, -1000, - -1000, -1000, -1000, -1000, -1000, 21549, -1000, 38879, 58, -267, - 1665, 58, 1665, 22993, 805, 803, 22271, -1000, 20827, 15760, - -1000, -1000, -1000, -1000, -1000, 21549, 21549, 21549, 21549, 21549, - 21549, -1000, -1000, -1000, 21549, 21549, -1000, 21549, -1000, 21549, - -1000, -1000, -1000, -1000, -1000, 933, -1000, 868, 868, 868, - 53319, -1000, -1000, -1000, -1000, 1877, -1000, 2458, -1000, 2223, - 2219, 2539, 2527, -1000, 29493, 2727, -1000, -1000, 53319, -412, - -1000, 2258, 2253, 852, 852, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 12848, 2456, 21549, 2115, 54041, 249, -1000, 28771, - 53319, 54041, 29493, 29493, 29493, 29493, 29493, -1000, 2173, 2163, - -1000, 2190, 2154, 2216, 54763, -1000, 1769, 1741, -1000, 21549, - 31659, 1724, 29493, -1000, -1000, 29493, 54763, 12120, -1000, -1000, - 8, -11, -1000, -1000, -1000, -1000, 361, -1000, -1000, 1173, - 2383, 2297, -1000, -1000, -1000, -1000, -1000, 1721, -1000, 1712, - 1865, 1704, 1697, 281, -1000, 2060, 2339, 936, 936, -1000, - 1218, -1000, 1353, 1545, 1538, -1000, -1000, -1000, 436, -1000, - 2375, 54763, 2110, 2109, 2107, -1000, -515, 1213, 2011, 2014, - 21549, 2005, 2503, 1846, 53319, -1000, -1000, 54041, -1000, 294, - -1000, 415, 53319, -1000, -1000, -1000, 327, 54763, -1000, 8692, - -1000, -1000, -1000, 222, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 54763, 237, -1000, 2003, 1340, -1000, -1000, 2069, -1000, - -1000, -1000, -1000, -1000, 215, 213, 1536, 205, 1534, 205, - -1000, 54763, 907, 2135, 54763, -1000, -1000, -1000, 1083, 1083, - -1000, -1000, 2318, -1000, 1353, 1474, 23715, 23715, -1000, 858, - -1000, -1000, 520, -228, 1990, 1990, -1000, 1990, 1995, -1000, - 1990, 161, 1990, 159, 1990, -1000, -1000, 1426, 1426, -1000, - 1481, -1000, 2288, 1329, -1000, 1515, 21549, 2909, -1000, -1000, - -1000, -1000, -1000, -69, 2903, 2890, 1474, -1000, 1988, 1987, - 21549, 1474, 1426, 2280, 1474, 1474, 1474, 1474, 1474, 1474, - 1474, 1474, 1474, 1474, 1474, 1474, 2275, 2211, 2206, 2202, - 2185, 2175, 2111, 2105, 2093, 2089, 2085, 2076, 2062, 2055, - 2006, 1998, 1474, 1474, 1941, 1474, 1936, 1920, -1000, 1515, - 1481, 2843, 1481, 1474, 1474, 2834, 310, 1474, 1692, 1692, - 1692, 1692, 1692, 1481, 1481, 1481, 1481, 1474, 53319, -1000, - -267, -1000, -1000, -315, -316, -1000, 1426, -267, 1860, 23715, - 1474, 23715, 23715, 23715, 1474, 1426, -1000, 1894, 1861, 2689, - 1847, 1474, 2517, 1474, 1474, 1474, 1812, -1000, 2425, 2425, - 2425, 1640, 1335, 54763, -1000, -1000, -1000, -1000, 2527, 2519, - 1855, -1000, -1000, 81, 625, -1000, 2255, 2253, -1000, 2499, - 2272, 2496, -1000, -1000, -1000, -1000, -1000, 1515, -1000, 2353, - 1904, -1000, 950, 1819, -1000, -1000, 20105, 1683, 2210, 524, - 1640, 1881, 3286, 2084, 2106, 3001, -1000, -1000, -1000, -1000, - 2155, -1000, 2153, -1000, -1000, 1966, -1000, 2346, 334, 29493, - 1879, 1879, -1000, 518, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1057, 8692, 2542, -1000, 1525, -1000, 1334, 209, 1199, - -1000, -1000, 936, 936, -1000, 997, 995, -1000, 54763, 1986, - -1000, 351, 1523, 351, 1181, -1000, -1000, 1180, -1000, -1000, - -1000, -1000, 1973, 2217, -1000, -1000, -1000, -1000, 54763, -1000, - -1000, 54763, 54763, 54763, 1984, 2494, -1000, 21549, 1982, 938, - 2181, 53319, 53319, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 429, 936, -486, 285, 284, 936, - 936, 936, -526, -1000, -1000, 1638, 1610, -1000, -182, -1000, - 21549, -1000, -1000, -1000, -1000, -1000, 1238, 1238, 1518, 1512, - 1506, -1000, 1966, -1000, -1000, -1000, 1544, -1000, -1000, -187, - 53319, 53319, 53319, 53319, -1000, -1000, -1000, 1148, -1000, -1000, + -1000, 456, 928, -484, 320, 311, 928, 928, 928, -525, + -1000, -1000, 1610, 1577, -1000, -190, -1000, 21704, -1000, -1000, + -1000, -1000, -1000, 1241, 1241, 1482, 1480, 1475, -1000, 1913, + -1000, -1000, -1000, 1632, -1000, -1000, -180, 53474, 53474, 53474, + 53474, -1000, -1000, -1000, 1100, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 873, 1506, 345, + -189, 1506, -1000, -1000, 341, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 21704, -1000, 21704, -1000, 1263, + 21704, 2451, 1469, 21704, 21704, -1000, 1230, 1213, 1243, -1000, + -1000, -1000, 21704, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 21704, -1000, 21704, -1000, + 21704, -1000, 21704, -1000, 21704, -1000, 21704, -1000, 21704, -1000, + 21704, -1000, 21704, -1000, 21704, -1000, 21704, -1000, 21704, -1000, + 21704, -1000, 21704, -1000, 21704, -1000, 21704, -1000, -1000, 21704, + -1000, -1000, -1000, 21704, -1000, 21704, -1000, 21704, -1000, -1000, + -1000, 21704, 234, 832, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1506, 351, -1000, -1000, -1000, + -1000, 2515, -1000, 1506, 21704, 1289, -1000, 1289, 1289, 1289, + -1000, -1000, -1000, 21704, -1000, 21704, 21704, -1000, 21704, -1000, + 21704, -1000, -1000, -1000, -1000, 21704, 1897, 2294, 1897, 1897, + 31814, -1000, -1000, 2459, 2501, 2473, 2237, 2245, 2245, 2266, + -1000, 2467, 2458, -1000, 1466, 2457, 1452, 975, -1000, 54196, + 21704, 253, -1000, 404, 53474, 253, 53474, -1000, 2498, -1000, + -1000, 21704, 1921, -1000, 21704, -1000, -1000, -1000, -1000, 3221, + 2505, 1851, -1000, -1000, 884, -1000, 21704, -1000, 9991, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1441, 1436, -1000, + -1000, 1920, 21704, -1000, -1000, -1000, 1611, 1578, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1913, -1000, -1000, -1000, + -1000, 348, -516, 2118, 53474, 1190, -1000, 1575, 1832, 337, + 253, 1434, 928, 928, 928, 1122, 1105, 37590, 1571, -1000, + 53474, 429, -1000, 348, -1000, -209, -213, 1243, -1000, -1000, + 2378, -1000, -1000, 15915, -1000, -1000, 1908, 2003, -1000, -1000, + -1000, -1000, 2167, -167, -198, -1000, -1000, 1243, 1243, 2161, + 1506, -1000, 1243, 1243, 1572, 1553, -1000, 1243, 1243, 1243, + 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, + 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1459, 1685, -1000, + 234, 1506, 2041, -1000, -1000, 3221, -1000, -1000, 2498, 2455, + 53, -1000, -1000, 240, 53, 1263, 968, 1506, 1506, 968, + 1639, 1243, 1629, 1569, 1243, 1243, 32536, -1000, 2454, 2442, + 38312, 38312, 960, 2501, -248, 21704, 21704, 2214, 1214, -1000, + -1000, -1000, -1000, 1426, 1407, -1000, 1404, -1000, 2538, -1000, + 1263, -1000, 253, -1000, 526, 1812, -1000, 2451, 1263, 53474, + 1263, 73, 2498, -1000, 1243, -1000, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, + 1897, 1897, 1897, 1897, 1897, -1000, -1000, 53474, 1987, -1000, + -1000, 2377, 1552, 163, -1000, 1511, 1832, -1000, -1000, 220, + -1000, 21704, -1000, 37590, 1378, 1363, -1000, -1000, -1000, -1000, + -525, -1000, -1000, -1000, -1000, -1000, -1000, 415, 1830, -1000, + 918, 53474, 54918, -1000, 2128, -1000, -1000, -1000, 21704, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 858, 1426, 345, -195, 1426, -1000, -1000, 351, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21549, -1000, - 21549, -1000, 1515, 21549, 2456, 1470, 21549, 21549, -1000, 1162, - 1144, 1474, -1000, -1000, -1000, 21549, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21549, - -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, - -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, - -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, -1000, 21549, - -1000, -1000, 21549, -1000, -1000, -1000, 21549, -1000, 21549, -1000, - 21549, -1000, -1000, -1000, 21549, 204, 1176, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1426, 333, - -1000, -1000, -1000, -1000, 2538, -1000, 1426, 21549, 2945, -1000, - 2945, 2945, 2945, -1000, -1000, -1000, 21549, -1000, 21549, 21549, - -1000, 21549, -1000, 21549, -1000, -1000, -1000, -1000, 21549, 1788, - 2313, 1788, 1788, 31659, -1000, -1000, 2519, 2516, 2493, 2234, - 2240, 2240, 2255, -1000, 2486, 2482, -1000, 1458, 2472, 1456, - 991, -1000, 54041, 21549, 249, -1000, 419, 53319, 249, 53319, - -1000, 2459, -1000, -1000, 21549, 1977, -1000, 21549, -1000, -1000, - -1000, -1000, 6798, 2527, 1879, -1000, -1000, 869, -1000, 21549, - -1000, 10160, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1453, 1445, -1000, -1000, 1968, 21549, -1000, -1000, -1000, 1533, - 1511, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1966, - -1000, -1000, -1000, -1000, 327, -510, 2048, 53319, 1129, -1000, - 1578, 1846, 307, 249, 1406, 936, 936, 936, 1128, 1120, - 37435, 1576, -1000, 53319, 399, -1000, 327, -1000, -219, -220, - 1474, -1000, -1000, 2382, -1000, -1000, 15760, -1000, -1000, 1964, - 2074, -1000, -1000, -1000, -1000, 2183, -176, -208, -1000, -1000, - 1474, 1474, 1623, 1426, -1000, 1474, 1474, 1482, 1475, -1000, - 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, - 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, - 1481, 1750, -1000, 204, 1426, 2103, -1000, -1000, 6798, -1000, - -1000, 2459, 2470, 58, -1000, -1000, 236, 58, 1515, 987, - 1426, 1426, 987, 1685, 1474, 1680, 1608, 1474, 1474, 32381, - -1000, 2465, 2463, 38157, 38157, 933, 2516, -281, 21549, 21549, - 2227, 1142, -1000, -1000, -1000, -1000, 1403, 1401, -1000, 1387, - -1000, 2537, -1000, 1515, -1000, 249, -1000, 516, 1819, -1000, - 2456, 1515, 53319, 1515, 77, 2459, -1000, 1474, -1000, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, - 1788, 1788, 1788, 1788, 1788, 1788, 1788, 1788, -1000, -1000, - 53319, 1907, -1000, -1000, 2381, 1574, 165, -1000, 1469, 1846, - -1000, -1000, 247, -1000, 21549, -1000, 37435, 1385, 1380, -1000, - -1000, -1000, -1000, -526, -1000, -1000, -1000, -1000, -1000, -1000, - 409, 1837, -1000, 931, 53319, 54763, -1000, 2161, -1000, -1000, - -1000, 21549, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 21549, - -1000, 1426, 2099, -1000, -358, -1000, -490, 21549, -267, -1000, - -1000, -267, -1000, -1000, -1000, -1000, -1000, 21549, -1000, -1000, - 21549, -1000, 21549, -1000, -1000, 1571, -1000, -1000, -1000, -1000, - -1000, 1571, 1571, -1000, -281, -1000, 1832, -1000, 53319, 1515, - 1803, -1000, 1140, -1000, -1000, -1000, -1000, -1000, 54041, 1819, - 53319, -1000, 1548, 1426, 1788, 2456, -1000, 1543, -1000, 409, - -1000, 1952, 2014, -1000, -1000, -1000, 19383, -1000, -1000, -1000, - -1000, -1000, 267, -186, 15760, 11392, 1510, -1000, -180, 1474, - 1481, -1000, -462, -1000, -1000, -1000, -1000, 291, -1000, -1000, - 1803, -1000, -1000, 1461, 1419, 1357, 36713, -1000, -1000, -1000, - -1000, -281, -1000, -1000, 2380, -1000, -1000, 1766, -1000, -1000, - 31659, 52597, -1000, -171, 338, -186, 21549, 1951, 1426, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -34, -1000, -1000, - 501, -1000, -1000, -1000, 2069, -199, -1000, -1000, -1000, 318, - -475, -287, -292, 23715, -1000, 21549, -1000, 21549, -1000, 21549, - -1000, -1000, -1000, 53319, 1788, -1000, 1468, -1000, 4863, -326, - 2098, -1000, -92, -1000, -1000, -1000, 1051, 1336, -1000, -1000, - -1000, -1000, -1000, -1000, 1902, 53319, -1000, 366, -1000, -1000, - 15032, -187, -209, 972, -1000, -1000, -1000, -1000, -1000, 2945, - 1312, 1295, 1474, -1000, 53319, -1000, 52597, -321, 857, 6798, - -1000, 2086, 2026, 2532, -1000, -1000, -1000, -1000, -1000, -1000, - -529, 1442, 239, -1000, -1000, -1000, 318, -298, -1000, 21549, - -1000, 21549, -1000, 1426, -1000, -1000, 2369, 77, -1000, 2534, - -1000, 2497, 1021, 1021, -1000, 1089, -529, -1000, -1000, -1000, - -1000, 1474, 1474, -1000, -327, -1000, -1000, -1000, -1000, -1000, - 405, 1175, -1000, -1000, -1000, -1000, -1000, 6798, -1000, -1000, - -1000, 263, 263, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 21704, -1000, 1506, 2034, + -1000, -344, -1000, -488, 21704, -240, -1000, -1000, -240, -1000, + -1000, -1000, -1000, -1000, 21704, -1000, -1000, 21704, -1000, 21704, + -1000, -1000, 1529, -1000, -1000, -1000, -1000, -1000, 1529, 1529, + -1000, -248, -1000, 1824, -1000, 53474, 1263, 1807, -1000, 1153, + -1000, -1000, -1000, -1000, -1000, 54196, 1812, 53474, -1000, 1519, + 1506, 1897, 2451, -1000, 1479, -1000, 415, -1000, 1900, 1910, + -1000, -1000, -1000, 19538, -1000, -1000, -1000, -1000, -1000, 276, + -176, 15915, 11547, 1474, -1000, -174, 1243, 1459, -1000, -460, + -1000, -1000, -1000, -1000, 289, -1000, -1000, 1807, -1000, -1000, + 1509, 1505, 1461, 36868, -1000, -1000, -1000, -1000, -248, -1000, + -1000, 2373, -1000, -1000, 1803, -1000, -1000, 31814, 52752, -1000, + -162, 352, -176, 21704, 1899, 1506, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -34, -1000, -1000, 506, -1000, -1000, + -1000, 1990, -195, -1000, -1000, -1000, 296, -473, -264, -294, + 23870, -1000, 21704, -1000, 21704, -1000, 21704, -1000, -1000, -1000, + 53474, 1897, -1000, 1450, -1000, 1883, -336, 2033, -1000, -103, + -1000, -1000, -1000, 1052, 1360, -1000, -1000, -1000, -1000, -1000, + -1000, 1513, 53474, -1000, 441, -1000, -1000, 15187, -180, -200, + 967, -1000, -1000, -1000, -1000, -1000, 1289, 1447, 1285, 1243, + -1000, 53474, -1000, 52752, -340, 866, 3221, -1000, 2018, 2017, + 2511, -1000, -1000, -1000, -1000, -1000, -1000, -527, 1431, 260, + -1000, -1000, -1000, 296, -296, -1000, 21704, -1000, 21704, -1000, + 1506, -1000, -1000, 2362, 73, -1000, 2537, -1000, 2512, 1022, + 1022, -1000, 1092, -527, -1000, -1000, -1000, -1000, 1243, 1243, + -1000, -337, -1000, -1000, -1000, -1000, -1000, 436, 1155, -1000, + -1000, -1000, -1000, -1000, 3221, -1000, -1000, -1000, 264, 264, + -1000, -1000, } var yyPgo = [...]int{ - 0, 3155, 3154, 28, 6, 41, 35, 3152, 3138, 3136, - 177, 3135, 3131, 3130, 3128, 3127, 3126, 2601, 2585, 2578, - 3123, 3121, 3109, 3108, 3105, 3104, 3101, 3098, 3097, 39, - 106, 68, 99, 204, 213, 3096, 176, 166, 198, 3093, - 3092, 3091, 116, 192, 83, 82, 195, 3089, 3088, 74, - 3087, 3084, 3081, 185, 184, 183, 1030, 3077, 182, 112, - 48, 3076, 3073, 3066, 3064, 3062, 3061, 3055, 3054, 3053, - 3047, 3044, 3042, 3041, 3040, 3037, 3036, 3034, 3031, 296, - 3029, 3027, 21, 3026, 76, 3025, 3024, 3023, 3018, 3013, - 11, 3010, 3009, 26, 44, 3008, 3005, 47, 2999, 2998, - 2995, 2984, 2980, 69, 2979, 22, 2975, 40, 2972, 2967, - 121, 2963, 2962, 2958, 43, 2957, 2956, 2955, 29, 167, - 2954, 2951, 139, 2950, 2949, 2948, 165, 206, 2947, 2255, - 215, 108, 111, 2928, 2925, 103, 188, 2916, 123, 2915, - 2914, 2910, 150, 2908, 3192, 2900, 2899, 64, 70, 199, - 2897, 2896, 163, 66, 8, 16, 17, 2895, 2893, 63, - 73, 2890, 101, 2886, 2885, 104, 84, 2884, 90, 98, - 2883, 2882, 5, 7, 2880, 1, 4, 2, 80, 2879, - 2878, 115, 2877, 2874, 2872, 95, 2869, 2866, 4205, 2863, - 85, 128, 102, 62, 2861, 171, 131, 2859, 2858, 2857, - 2855, 2851, 49, 2850, 2849, 2848, 138, 251, 162, 2846, - 144, 337, 52, 143, 2845, 189, 77, 197, 190, 2826, - 2825, 135, 133, 2822, 2819, 55, 164, 191, 2818, 94, - 127, 117, 168, 91, 130, 2816, 2813, 56, 60, 2809, - 2806, 2804, 2803, 174, 2802, 2796, 59, 2790, 54, 2789, - 186, 2784, 136, 79, 2783, 170, 169, 2782, 61, 2781, - 2780, 65, 96, 100, 38, 2779, 158, 161, 125, 172, - 2776, 2775, 53, 2774, 2773, 2772, 196, 292, 2771, 2768, - 294, 178, 141, 147, 89, 2767, 299, 2765, 2762, 13, - 4392, 7332, 2760, 37, 160, 2759, 2756, 7030, 20, 45, - 24, 2754, 205, 2749, 2745, 2744, 2742, 238, 202, 110, - 159, 57, 2737, 2736, 2735, 36, 2732, 2731, 2724, 2723, - 2722, 2708, 72, 34, 33, 32, 212, 58, 19, 97, - 153, 152, 67, 2707, 2706, 2705, 124, 87, 2702, 157, - 155, 120, 129, 2701, 180, 142, 119, 2697, 93, 31, - 2694, 2692, 2689, 2684, 92, 2681, 2679, 2676, 2674, 151, - 146, 118, 78, 2670, 81, 114, 149, 145, 51, 2665, - 46, 2663, 2661, 30, 193, 23, 2658, 15, 105, 109, - 2656, 6221, 181, 2655, 9, 298, 148, 2650, 2647, 10, - 12, 18, 2646, 2640, 2639, 2636, 132, 2632, 2630, 2626, - 2622, 27, 50, 25, 14, 113, 75, 2621, 2616, 140, - 2615, 2614, 2594, 0, 1005, 126, 2586, 207, + 0, 3091, 3090, 28, 6, 41, 35, 3089, 3088, 3087, + 177, 3086, 3085, 3082, 3081, 3078, 3071, 2619, 2615, 2586, + 3069, 3064, 3061, 3060, 3054, 3053, 3052, 3050, 3049, 40, + 108, 62, 97, 209, 197, 3048, 179, 165, 200, 3047, + 3045, 3043, 118, 192, 80, 85, 193, 3042, 3039, 73, + 3038, 3037, 3036, 191, 186, 184, 1048, 3031, 183, 112, + 48, 3030, 3027, 3026, 3025, 3022, 3021, 3020, 3019, 3017, + 3016, 3015, 3014, 3013, 3010, 3000, 2992, 2991, 2990, 284, + 2989, 2986, 21, 2981, 76, 2979, 2976, 2973, 2971, 2970, + 8, 2969, 2968, 26, 42, 2966, 2964, 47, 2963, 2962, + 2960, 2959, 2933, 69, 2932, 22, 2929, 39, 2928, 2926, + 120, 2924, 2923, 2921, 44, 2918, 2917, 2914, 29, 163, + 2913, 2912, 134, 2910, 2908, 2907, 167, 206, 2898, 2232, + 180, 105, 103, 2897, 2892, 98, 194, 2890, 117, 2885, + 2880, 2879, 147, 2876, 3197, 2875, 2872, 60, 66, 199, + 2869, 2868, 287, 64, 11, 16, 17, 2865, 2861, 61, + 72, 2859, 104, 2858, 2857, 100, 75, 2856, 96, 99, + 2855, 2854, 5, 7, 2853, 1, 4, 2, 83, 2852, + 2833, 113, 2831, 2826, 2823, 91, 2817, 2815, 4988, 2813, + 89, 127, 101, 82, 2811, 172, 155, 2810, 2809, 2808, + 2807, 2805, 49, 2801, 2798, 2797, 132, 250, 162, 2796, + 145, 335, 52, 143, 2795, 189, 77, 198, 170, 2794, + 2790, 130, 128, 2788, 2787, 56, 166, 190, 2786, 95, + 126, 115, 168, 90, 131, 2783, 2780, 54, 71, 2778, + 2777, 2776, 2775, 176, 2772, 2771, 59, 2770, 55, 2769, + 164, 2766, 136, 68, 2765, 171, 175, 2762, 135, 2754, + 2753, 67, 93, 110, 38, 2752, 158, 161, 124, 173, + 2751, 2747, 53, 2744, 2743, 2740, 195, 289, 2734, 2730, + 294, 178, 139, 146, 81, 2725, 337, 2722, 2718, 13, + 4343, 7480, 2716, 37, 160, 2713, 2711, 6837, 20, 45, + 24, 2708, 205, 2707, 2706, 2703, 2702, 212, 202, 106, + 159, 57, 2701, 2697, 2696, 36, 2694, 2693, 2690, 2686, + 2685, 2684, 70, 34, 33, 32, 211, 58, 19, 94, + 153, 152, 63, 2680, 2679, 2676, 121, 84, 2675, 157, + 154, 123, 151, 2673, 181, 142, 116, 2672, 92, 31, + 2671, 2668, 2667, 2663, 87, 2662, 2655, 2652, 2651, 149, + 140, 119, 78, 2650, 79, 114, 144, 141, 51, 2649, + 46, 2646, 2645, 30, 188, 23, 2640, 15, 102, 109, + 2636, 5948, 187, 2632, 9, 317, 156, 2630, 2627, 10, + 12, 18, 2624, 2623, 2621, 2617, 129, 2608, 2607, 2606, + 2600, 27, 50, 25, 14, 111, 74, 2590, 2578, 137, + 2577, 2570, 2561, 0, 1005, 125, 2559, 207, } -//line sql.y:8579 +//line sql.y:8599 type yySymType struct { union any empty struct{} @@ -8508,16 +8524,17 @@ var yyR1 = [...]int{ 233, 49, 49, 49, 49, 49, 44, 44, 44, 44, 45, 45, 45, 45, 136, 136, 136, 136, 138, 138, 137, 137, 82, 82, 83, 83, 83, 142, 142, 143, - 143, 143, 140, 140, 141, 141, 250, 250, 234, 234, - 234, 241, 241, 241, 237, 237, 239, 239, 239, 240, - 240, 240, 238, 247, 247, 249, 249, 248, 248, 244, - 244, 245, 245, 246, 246, 246, 242, 242, 199, 199, - 199, 199, 199, 251, 251, 251, 251, 263, 263, 210, - 210, 212, 212, 211, 211, 161, 264, 264, 272, 269, - 269, 270, 270, 296, 296, 296, 273, 273, 286, 286, - 282, 282, 283, 283, 276, 276, 288, 288, 288, 77, - 208, 208, 365, 365, 362, 291, 291, 293, 293, 297, - 297, 301, 301, 298, 298, 8, 410, 410, 410, 289, + 143, 143, 140, 140, 141, 141, 250, 250, 250, 250, + 250, 250, 250, 234, 234, 234, 241, 241, 241, 237, + 237, 239, 239, 239, 240, 240, 240, 238, 247, 247, + 249, 249, 248, 248, 244, 244, 245, 245, 246, 246, + 246, 242, 242, 199, 199, 199, 199, 199, 251, 251, + 251, 251, 263, 263, 210, 210, 212, 212, 211, 211, + 161, 264, 264, 272, 269, 269, 270, 270, 296, 296, + 296, 273, 273, 286, 286, 282, 282, 283, 283, 276, + 276, 288, 288, 288, 77, 208, 208, 365, 365, 362, + 291, 291, 293, 293, 297, 297, 301, 301, 298, 298, + 8, 410, 410, 410, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, @@ -8532,8 +8549,7 @@ var yyR1 = [...]int{ 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, - 289, 289, 289, 289, 289, 289, 289, 289, 289, 290, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, + 289, 289, 289, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, @@ -8579,7 +8595,8 @@ var yyR1 = [...]int{ 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 413, 414, 307, 308, 308, 308, + 290, 290, 290, 290, 290, 290, 290, 290, 413, 414, + 307, 308, 308, 308, } var yyR2 = [...]int{ @@ -8735,16 +8752,17 @@ var yyR2 = [...]int{ 4, 0, 2, 2, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, 3, 1, 1, 0, 4, 0, 1, 1, 0, 3, 1, - 3, 2, 1, 1, 0, 1, 2, 4, 9, 3, - 5, 0, 3, 3, 0, 1, 0, 2, 2, 0, - 2, 2, 2, 0, 2, 1, 2, 3, 3, 0, - 2, 1, 2, 3, 4, 3, 0, 1, 2, 1, - 5, 4, 4, 1, 3, 3, 5, 0, 5, 1, - 3, 1, 2, 3, 4, 1, 1, 3, 3, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 0, 1, - 0, 2, 0, 3, 0, 1, 0, 1, 1, 5, - 0, 1, 0, 1, 2, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 1, 3, 0, 1, 1, 1, + 3, 2, 1, 1, 0, 1, 2, 3, 4, 2, + 3, 4, 4, 9, 3, 5, 0, 3, 3, 0, + 1, 0, 2, 2, 0, 2, 2, 2, 0, 2, + 1, 2, 3, 3, 0, 2, 1, 2, 3, 4, + 3, 0, 1, 2, 1, 5, 4, 4, 1, 3, + 3, 5, 0, 5, 1, 3, 1, 2, 3, 4, + 1, 1, 3, 3, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 2, 0, 3, 0, + 1, 0, 1, 1, 5, 0, 1, 0, 1, 2, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -8806,7 +8824,7 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 1, 1, } var yyChk = [...]int{ @@ -8913,56 +8931,56 @@ var yyChk = [...]int{ 216, 217, 218, 219, 220, 221, 45, 398, 398, -188, -79, -79, -79, -79, -410, 703, 579, -227, -127, -229, -33, -31, -413, 9, -79, -31, -32, -30, -36, -38, - 605, -37, -297, 100, -234, -250, 13, 163, 43, 51, - -232, -233, -34, -31, -144, 20, 24, 25, -132, 170, - -144, -297, -132, -276, 244, -79, -79, -265, -310, 317, - -267, 413, 686, 412, -257, -270, 91, -256, -269, 411, - 92, -351, 160, -337, -341, -291, 255, -367, 251, -188, - -360, -359, -291, -413, -128, -286, 241, 249, 248, 137, - -385, 140, 297, 425, 239, -53, -54, -55, -269, 178, - 706, -110, 272, 276, 88, 88, -341, -340, -339, -386, - 276, 255, -366, -358, 247, 256, -347, 248, 249, -342, - 241, 138, -386, -342, 246, 256, 251, 255, 276, 276, - 127, 276, 127, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 271, -348, 152, -348, 582, 582, -354, -386, - 251, 241, -386, -386, 247, -288, -342, 243, 26, 243, - 36, 36, -348, -348, -348, -269, 178, -348, -348, -348, - -348, 284, 284, -348, -348, -348, -348, -348, -348, -348, + 605, -37, -297, 100, -234, -250, 13, 62, 163, 43, + 51, -232, -233, -34, -31, -144, 20, 24, 25, -132, + 170, -144, -297, -132, -276, 244, -79, -79, -265, -310, + 317, -267, 413, 686, 412, -257, -270, 91, -256, -269, + 411, 92, -351, 160, -337, -341, -291, 255, -367, 251, + -188, -360, -359, -291, -413, -128, -286, 241, 249, 248, + 137, -385, 140, 297, 425, 239, -53, -54, -55, -269, + 178, 706, -110, 272, 276, 88, 88, -341, -340, -339, + -386, 276, 255, -366, -358, 247, 256, -347, 248, 249, + -342, 241, 138, -386, -342, 246, 256, 251, 255, 276, + 276, 127, 276, 127, 276, 276, 276, 276, 276, 276, + 276, 276, 276, 271, -348, 152, -348, 582, 582, -354, + -386, 251, 241, -386, -386, 247, -288, -342, 243, 26, + 243, 36, 36, -348, -348, -348, -269, 178, -348, -348, + -348, -348, 284, 284, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, -348, - 240, -385, -136, 409, 304, 82, -56, 286, -39, -188, - -286, 241, 242, -385, 273, -188, 223, 240, 689, -280, - 160, 16, -280, -277, 398, 396, 383, 388, -280, -280, - -280, -280, 287, 381, -343, 241, 36, 252, 398, 287, - 381, 287, 288, 287, 288, 391, 401, 287, -302, 15, - 163, 425, 386, 390, 280, 240, 281, 242, 400, 288, - -302, 90, -281, 160, 287, 398, 392, 283, -280, -280, - -308, -413, -293, -291, -289, 232, 24, 143, 26, 28, - 146, 179, 130, 20, 147, 38, 234, 347, 251, 178, - 247, 470, 227, 73, 586, 426, 433, 424, 432, 436, - 472, 473, 425, 384, 32, 14, 588, 29, 261, 25, - 39, 172, 229, 150, 589, 264, 27, 262, 118, 121, - 591, 23, 76, 256, 15, 249, 41, 17, 592, 593, - 18, 245, 244, 163, 241, 71, 12, 222, 30, 159, - 67, 594, 138, 133, 595, 596, 597, 598, 131, 69, - 160, 21, 726, 434, 435, 34, 687, 574, 275, 174, - 74, 60, 688, 144, 430, 599, 600, 119, 601, 122, - 77, 693, 140, 19, 72, 43, 602, 276, 603, 246, - 727, 604, 416, 605, 161, 230, 469, 70, 162, 700, - 606, 701, 239, 397, 9, 474, 33, 260, 248, 129, - 68, 440, 607, 240, 149, 243, 132, 120, 8, 137, - 35, 13, 75, 78, 437, 438, 439, 58, 128, 578, - 148, 16, 608, 417, 142, -381, 689, -308, -308, 33, - 92, -407, -408, -409, 578, 416, 243, -291, -188, -85, - 679, 231, -86, 685, 24, 238, -134, 398, -122, 179, - 707, 690, 691, 692, 689, 395, 697, 695, 693, 287, - 694, 88, 140, 142, 143, 4, -144, 159, -198, 152, - 153, 154, 155, 156, 157, 158, 164, 163, 144, 146, - 160, -243, 141, 165, 166, 167, 168, 169, 170, 171, - 173, 172, 174, 175, 161, 162, 178, 225, 226, -152, - -152, -152, -152, -213, -219, -218, -413, -215, -381, -290, - -297, -413, -413, -152, -275, -413, -149, -413, -413, -413, - -413, -222, -144, -413, -413, -417, -413, -417, -417, -417, - -326, -413, -326, -326, -413, -413, -413, -413, -413, -413, + -348, 240, -385, -136, 409, 304, 82, -56, 286, -39, + -188, -286, 241, 242, -385, 273, -188, 223, 240, 689, + -280, 160, 16, -280, -277, 398, 396, 383, 388, -280, + -280, -280, -280, 287, 381, -343, 241, 36, 252, 398, + 287, 381, 287, 288, 287, 288, 391, 401, 287, -302, + 15, 163, 425, 386, 390, 280, 240, 281, 242, 400, + 288, -302, 90, -281, 160, 287, 398, 392, 283, -280, + -280, -308, -413, -293, -291, -289, 232, 24, 143, 26, + 28, 146, 179, 130, 20, 147, 38, 234, 347, 251, + 178, 247, 470, 227, 73, 586, 426, 433, 424, 432, + 436, 472, 473, 425, 384, 32, 14, 588, 29, 261, + 25, 39, 172, 229, 150, 589, 264, 27, 262, 118, + 121, 591, 23, 76, 256, 15, 249, 41, 17, 592, + 593, 18, 245, 244, 163, 241, 71, 12, 222, 30, + 159, 67, 594, 138, 133, 595, 596, 597, 598, 131, + 69, 160, 21, 726, 434, 435, 34, 687, 574, 275, + 174, 74, 60, 688, 144, 430, 599, 600, 119, 601, + 122, 77, 693, 140, 19, 72, 43, 602, 276, 603, + 246, 727, 604, 416, 605, 161, 230, 469, 70, 162, + 700, 606, 701, 239, 397, 9, 474, 33, 260, 248, + 129, 68, 440, 607, 240, 149, 243, 132, 120, 8, + 137, 35, 13, 75, 78, 437, 438, 439, 58, 128, + 578, 148, 16, 608, 417, 142, -381, 689, -308, -308, + 33, 92, -407, -408, -409, 578, 416, 243, -291, -188, + -85, 679, 231, -86, 685, 24, 238, -134, 398, -122, + 179, 707, 690, 691, 692, 689, 395, 697, 695, 693, + 287, 694, 88, 140, 142, 143, 4, -144, 159, -198, + 152, 153, 154, 155, 156, 157, 158, 164, 163, 144, + 146, 160, -243, 141, 165, 166, 167, 168, 169, 170, + 171, 173, 172, 174, 175, 161, 162, 178, 225, 226, + -152, -152, -152, -152, -213, -219, -218, -413, -215, -381, + -290, -297, -413, -413, -152, -275, -413, -149, -413, -413, + -413, -413, -222, -144, -413, -413, -417, -413, -417, -417, + -417, -326, -413, -326, -326, -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, @@ -8974,256 +8992,257 @@ var yyChk = [...]int{ -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, 223, -413, -413, - -413, -413, -413, -326, -326, -326, -326, -326, -326, -413, + -413, -413, -413, -413, -413, -413, -413, -413, 223, -413, + -413, -413, -413, -413, -326, -326, -326, -326, -326, -326, -413, -413, -413, -413, -413, -413, -413, -413, -413, -413, - -413, -413, -413, 103, 99, 102, 94, -217, 105, 90, - 90, 90, 90, -31, -32, -207, -413, -307, -395, -396, - -191, -188, -413, 304, -291, -291, 273, 96, -232, -34, - -31, -227, -233, -229, -31, -79, -120, -133, 64, 65, - -135, 25, 39, 68, 66, 24, -414, 89, -414, -250, - -414, 88, -38, -253, 87, 62, 44, 90, 90, 88, - 22, -228, -230, -144, 15, -295, 4, -294, 26, -291, - 90, 223, 15, -189, 30, -188, -276, -276, 88, 91, - 317, -266, -268, 414, 416, 152, -296, -291, 90, 32, - 89, 88, -188, -315, -318, -320, -319, -321, -316, -317, - 344, 345, 179, 348, 350, 351, 352, 353, 354, 355, - 356, 357, 358, 361, 33, 263, 340, 341, 342, 343, - 362, 363, 364, 365, 367, 368, 369, 370, 325, 346, - 576, 326, 327, 328, 329, 330, 331, 333, 334, 337, - 335, 336, 338, 339, -382, -381, 87, 89, 88, -322, - 87, -144, -136, 240, -381, 241, 241, 241, -79, 469, - -348, -348, -348, 271, 20, -46, -43, -374, 19, -42, - -43, 232, 123, 124, 229, 87, -337, 87, -346, -382, - -381, 87, 138, 246, 137, -345, -342, -345, -346, -381, - -215, -381, 138, 138, -381, -381, -262, -291, -262, -262, - 24, -262, 24, -262, 24, 96, -291, -262, 24, -262, - 24, -262, 24, -262, 24, -262, 24, 32, 79, 80, - 81, 32, 83, 84, 85, -215, -381, -381, -215, -337, - -215, -188, -381, -269, 96, 96, 96, -348, -348, 96, - 90, 90, 90, -348, -348, 96, 90, -299, -297, 90, - 90, -387, 257, 301, 303, 96, 96, 96, 96, 32, - 90, -388, 32, 714, 713, 715, 716, 717, 90, 96, - 32, 96, 32, 96, -291, 87, -188, -142, 291, 227, - 229, 232, 77, 90, 307, 308, 305, 310, 311, 152, - 45, 88, 243, 240, -381, -282, 245, -282, -291, -298, - -297, -289, -188, 243, 380, 90, -144, -344, 15, 163, - -302, -302, -280, -188, -344, -302, -280, -188, -280, -280, - -280, -280, -302, -302, -302, -280, -297, -297, -188, -188, - -188, -188, -188, -188, -188, -308, -281, -280, 689, 90, - -274, 15, 77, -308, -308, 88, 323, 417, 418, -306, - 320, -81, -291, 90, -10, -29, -18, -17, -19, 152, - -10, 88, 578, -181, -188, 689, 689, 689, 689, 689, - 689, -144, -144, -144, -144, 601, -205, 119, 144, 120, - 121, -160, -144, -206, -211, -213, 106, 163, 146, 160, - -243, -149, -152, -149, -149, -149, -149, -149, -149, 222, - -149, 222, -149, -149, -149, -149, -149, -149, -309, -291, - 90, 179, -156, -155, 105, -404, -156, 575, 88, -218, - 223, -144, -144, -381, -118, 442, 443, 444, 445, 447, - 448, 449, 452, 453, 457, 458, 441, 459, 446, 451, - 454, 455, 456, 450, 343, -144, -130, -132, -130, -144, - -220, -221, 148, -215, -144, -414, -414, 96, 170, -126, - 25, 39, -126, -126, -126, -126, -144, -144, -144, -144, - -144, -144, -144, -144, -144, -144, -126, -144, -119, 441, - 459, 446, 451, 454, 455, 456, 450, 343, 460, 461, - 462, 463, 464, 465, 466, 467, 468, -119, -118, -144, - -144, -144, -144, -144, -144, -87, -144, 130, 131, 132, - -207, -144, -149, -144, -144, -144, -414, -144, -144, -144, - -208, -207, -144, -144, -144, -144, -144, -144, -144, -144, + -413, -413, -413, -413, 103, 99, 102, 94, -217, 105, + 90, 90, 90, 90, -31, -32, -207, -413, -307, -395, + -396, -191, -188, -413, 304, -291, -291, 273, 96, -232, + -34, -31, -227, -233, -229, -31, -79, -120, -133, 64, + 65, -135, 25, 39, 68, 66, 24, -414, 89, -414, + -250, -414, 88, -38, -253, 87, 633, 663, 633, 663, + 62, 44, 90, 90, 88, 22, -228, -230, -144, 15, + -295, 4, -294, 26, -291, 90, 223, 15, -189, 30, + -188, -276, -276, 88, 91, 317, -266, -268, 414, 416, + 152, -296, -291, 90, 32, 89, 88, -188, -315, -318, + -320, -319, -321, -316, -317, 344, 345, 179, 348, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 361, 33, + 263, 340, 341, 342, 343, 362, 363, 364, 365, 367, + 368, 369, 370, 325, 346, 576, 326, 327, 328, 329, + 330, 331, 333, 334, 337, 335, 336, 338, 339, -382, + -381, 87, 89, 88, -322, 87, -144, -136, 240, -381, + 241, 241, 241, -79, 469, -348, -348, -348, 271, 20, + -46, -43, -374, 19, -42, -43, 232, 123, 124, 229, + 87, -337, 87, -346, -382, -381, 87, 138, 246, 137, + -345, -342, -345, -346, -381, -215, -381, 138, 138, -381, + -381, -262, -291, -262, -262, 24, -262, 24, -262, 24, + 96, -291, -262, 24, -262, 24, -262, 24, -262, 24, + -262, 24, 32, 79, 80, 81, 32, 83, 84, 85, + -215, -381, -381, -215, -337, -215, -188, -381, -269, 96, + 96, 96, -348, -348, 96, 90, 90, 90, -348, -348, + 96, 90, -299, -297, 90, 90, -387, 257, 301, 303, + 96, 96, 96, 96, 32, 90, -388, 32, 714, 713, + 715, 716, 717, 90, 96, 32, 96, 32, 96, -291, + 87, -188, -142, 291, 227, 229, 232, 77, 90, 307, + 308, 305, 310, 311, 152, 45, 88, 243, 240, -381, + -282, 245, -282, -291, -298, -297, -289, -188, 243, 380, + 90, -144, -344, 15, 163, -302, -302, -280, -188, -344, + -302, -280, -188, -280, -280, -280, -280, -302, -302, -302, + -280, -297, -297, -188, -188, -188, -188, -188, -188, -188, + -308, -281, -280, 689, 90, -274, 15, 77, -308, -308, + 88, 323, 417, 418, -306, 320, -81, -291, 90, -10, + -29, -18, -17, -19, 152, -10, 88, 578, -181, -188, + 689, 689, 689, 689, 689, 689, -144, -144, -144, -144, + 601, -205, 119, 144, 120, 121, -160, -144, -206, -211, + -213, 106, 163, 146, 160, -243, -149, -152, -149, -149, + -149, -149, -149, -149, 222, -149, 222, -149, -149, -149, + -149, -149, -149, -309, -291, 90, 179, -156, -155, 105, + -404, -156, 575, 88, -218, 223, -144, -144, -381, -118, + 442, 443, 444, 445, 447, 448, 449, 452, 453, 457, + 458, 441, 459, 446, 451, 454, 455, 456, 450, 343, + -144, -130, -132, -130, -144, -220, -221, 148, -215, -144, + -414, -414, 96, 170, -126, 25, 39, -126, -126, -126, + -126, -144, -144, -144, -144, -144, -144, -144, -144, -144, + -144, -126, -144, -119, 441, 459, 446, 451, 454, 455, + 456, 450, 343, 460, 461, 462, 463, 464, 465, 466, + 467, 468, -119, -118, -144, -144, -144, -144, -144, -144, + -87, -144, 130, 131, 132, -207, -144, -149, -144, -144, + -144, -414, -144, -144, -144, -208, -207, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, - -144, -144, -144, -144, -144, -144, -144, -144, -380, -379, - -378, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, - -144, -144, -144, -144, -207, -207, -207, -207, -207, -144, - -414, -144, -162, -147, 96, -258, 105, 92, -144, -144, - -144, -144, -144, -144, -131, -130, -293, -298, -289, -290, - -130, -131, -131, -130, -130, -144, -144, -144, -144, -144, - -144, -144, -144, -414, -144, -144, -144, -144, -144, -250, - -414, -207, 88, -397, 416, 417, 687, -300, 276, -299, - 26, -208, 90, 15, -260, 78, -291, -232, -232, 64, - 65, 60, -130, -135, -414, -37, 26, -252, -291, 63, - 90, -327, -269, 371, 372, 179, -144, -144, 88, -231, - 28, 29, -188, -294, 170, -298, -188, -261, 276, -188, - -166, -168, -169, -170, -191, -214, -413, -171, -31, 597, - 594, 15, -181, -182, -190, -297, -267, -310, -266, 88, - 415, 417, 418, 77, 122, -144, -328, 178, -356, -355, - -354, -337, -339, -340, -341, 89, -328, -333, 377, 376, - -322, -322, -322, -322, -322, -327, -327, -327, -327, 87, - 87, -322, -322, -322, -322, -330, 87, -330, -330, -331, - -330, 87, -331, -332, 87, -332, -367, -144, -364, -363, - -361, -362, 250, 101, 669, 625, 578, 618, 659, 78, - -359, -231, 96, -414, -142, -283, 245, -365, -362, -381, - -381, -381, -283, 91, 90, 91, 90, 91, 90, -111, - -60, -1, 726, 727, 728, 88, 20, -338, -337, -59, - 301, -370, -371, 276, -366, -360, -346, 138, -345, -346, - -346, -381, 88, 30, 127, 127, 127, 127, 578, 229, - 33, -284, 617, 144, 669, 625, -337, -59, 243, 243, - -309, -309, -309, 90, 90, -279, 722, -181, -138, 293, - 152, 282, 282, 240, 295, 240, 295, -188, 306, 309, - 307, 308, 305, 310, 311, 24, 24, 24, 24, 24, - 294, 296, 298, 284, -188, -188, -282, 77, -183, -188, - 27, -297, 90, 90, -188, -280, -280, -188, -280, -280, - -188, -409, 324, -291, 358, 680, 681, 683, 682, -122, - 416, 88, 578, 23, -123, 23, -413, 119, 120, 121, - -206, -149, -152, -149, 143, 264, -149, -149, -413, -215, - -414, -293, 26, 88, 78, -414, 168, 88, 88, -414, - -414, 88, 15, -223, -221, 150, -144, -414, 88, -414, - -414, -207, -144, -144, -144, -144, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -207, -414, 88, 88, - 15, -313, 26, -414, -414, -414, -414, -414, -222, -414, - 15, -414, 78, 88, 163, 88, -414, -414, -414, 88, - 88, -414, -414, 88, -414, 88, -414, -414, -414, -414, - -414, -414, 88, -414, 88, -414, -414, -414, 88, -414, - 88, -414, -414, 88, -414, 88, -414, 88, -414, 88, - -414, 88, -414, 88, -414, 88, -414, 88, -414, 88, - -414, 88, -414, 88, -414, 88, -414, 88, -414, 88, - -414, 88, -414, 88, -414, 88, -414, 88, -414, -414, - -414, 88, -414, 88, -414, 88, -414, -414, 88, -414, - 88, -414, 88, -414, 88, 88, -414, 88, 88, 88, - -414, 88, 88, 88, 88, -414, -414, -414, -414, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, -414, - -414, -414, -414, -414, -414, 88, -94, 602, -414, -414, - 88, -414, 88, 88, 88, 88, 88, -414, -413, 223, - -414, -414, -414, -414, -414, 88, 88, 88, 88, 88, - 88, -414, -414, -414, 88, 88, -414, 88, -414, 88, - -414, -396, 686, 417, -195, -194, -192, 75, 244, 76, - -413, -299, -414, -156, -258, -259, -258, -200, -291, 96, - 105, -234, -165, -167, 15, -135, -213, 89, 88, -327, - -238, -244, -277, -291, 90, 179, -329, 179, -329, 371, - 372, -230, 223, -196, 16, -199, 33, 58, -29, -413, - -413, 33, 88, -184, -186, -185, -187, 67, 71, 73, - 68, 69, 70, 74, -304, 26, -31, -166, -31, -413, - -188, -181, -415, 15, 78, -415, 88, 223, -268, -271, - 419, 416, 422, -381, 90, -110, 88, -354, -341, -235, - -139, 41, -334, 378, -327, 585, -327, -336, 90, -336, - 96, 96, 96, 89, -49, -44, -45, 34, 82, -361, - -348, 90, 40, -348, -348, -291, 89, -231, -138, -188, - 144, 77, -365, -365, -365, -297, -2, 725, 731, 138, - 87, 383, 19, -252, 88, 89, -216, 302, 89, -112, - -291, 89, 87, -346, -346, -291, -413, 240, 32, 32, - 669, 625, 617, -59, -216, -215, -381, -328, 724, 723, - 89, 242, 300, -143, 436, -140, 90, 91, -188, -188, - -188, -188, -188, -188, 232, 229, 406, -405, 312, -405, - 285, 243, -181, -188, 88, -84, 259, 254, -302, -302, - 34, -188, 416, 698, 696, -144, 143, 264, -160, -152, - -118, -118, -149, -311, 179, 344, 263, 342, 338, 358, - 349, 376, 340, 377, 335, 334, 333, -311, -309, -149, - -207, -132, -144, -144, 151, -144, 149, -144, -414, -414, - -414, -414, -414, -227, -144, -144, -144, -414, 179, 344, - 15, -144, -309, -144, -144, -144, -144, -144, -144, -144, + -144, -144, -144, -380, -379, -378, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, + -144, -144, -144, -144, -144, -144, -144, -144, -144, -207, + -207, -207, -207, -207, -144, -414, -144, -162, -147, 96, + -258, 105, 92, -144, -144, -144, -144, -144, -144, -131, + -130, -293, -298, -289, -290, -130, -131, -131, -130, -130, + -144, -144, -144, -144, -144, -144, -144, -144, -414, -144, + -144, -144, -144, -144, -250, -414, -207, 88, -397, 416, + 417, 687, -300, 276, -299, 26, -208, 90, 15, -260, + 78, -291, -232, -232, 64, 65, 60, -130, -135, -414, + -37, 26, -252, -291, 626, 626, 63, 90, -327, -269, + 371, 372, 179, -144, -144, 88, -231, 28, 29, -188, + -294, 170, -298, -188, -261, 276, -188, -166, -168, -169, + -170, -191, -214, -413, -171, -31, 597, 594, 15, -181, + -182, -190, -297, -267, -310, -266, 88, 415, 417, 418, + 77, 122, -144, -328, 178, -356, -355, -354, -337, -339, + -340, -341, 89, -328, -333, 377, 376, -322, -322, -322, + -322, -322, -327, -327, -327, -327, 87, 87, -322, -322, + -322, -322, -330, 87, -330, -330, -331, -330, 87, -331, + -332, 87, -332, -367, -144, -364, -363, -361, -362, 250, + 101, 669, 625, 578, 618, 659, 78, -359, -231, 96, + -414, -142, -283, 245, -365, -362, -381, -381, -381, -283, + 91, 90, 91, 90, 91, 90, -111, -60, -1, 726, + 727, 728, 88, 20, -338, -337, -59, 301, -370, -371, + 276, -366, -360, -346, 138, -345, -346, -346, -381, 88, + 30, 127, 127, 127, 127, 578, 229, 33, -284, 617, + 144, 669, 625, -337, -59, 243, 243, -309, -309, -309, + 90, 90, -279, 722, -181, -138, 293, 152, 282, 282, + 240, 295, 240, 295, -188, 306, 309, 307, 308, 305, + 310, 311, 24, 24, 24, 24, 24, 294, 296, 298, + 284, -188, -188, -282, 77, -183, -188, 27, -297, 90, + 90, -188, -280, -280, -188, -280, -280, -188, -409, 324, + -291, 358, 680, 681, 683, 682, -122, 416, 88, 578, + 23, -123, 23, -413, 119, 120, 121, -206, -149, -152, + -149, 143, 264, -149, -149, -413, -215, -414, -293, 26, + 88, 78, -414, 168, 88, 88, -414, -414, 88, 15, + -223, -221, 150, -144, -414, 88, -414, -414, -207, -144, + -144, -144, -144, -414, -414, -414, -414, -414, -414, -414, + -414, -414, -414, -207, -414, 88, 88, 15, -313, 26, + -414, -414, -414, -414, -414, -222, -414, 15, -414, 78, + 88, 163, 88, -414, -414, -414, 88, 88, -414, -414, + 88, -414, 88, -414, -414, -414, -414, -414, -414, 88, + -414, 88, -414, -414, -414, 88, -414, 88, -414, -414, + 88, -414, 88, -414, 88, -414, 88, -414, 88, -414, + 88, -414, 88, -414, 88, -414, 88, -414, 88, -414, + 88, -414, 88, -414, 88, -414, 88, -414, 88, -414, + 88, -414, 88, -414, 88, -414, -414, -414, 88, -414, + 88, -414, 88, -414, -414, 88, -414, 88, -414, 88, + -414, 88, 88, -414, 88, 88, 88, -414, 88, 88, + 88, 88, -414, -414, -414, -414, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, -414, -414, -414, -414, + -414, -414, 88, -94, 602, -414, -414, 88, -414, 88, + 88, 88, 88, 88, -414, -413, 223, -414, -414, -414, + -414, -414, 88, 88, 88, 88, 88, 88, -414, -414, + -414, 88, 88, -414, 88, -414, 88, -414, -396, 686, + 417, -195, -194, -192, 75, 244, 76, -413, -299, -414, + -156, -258, -259, -258, -200, -291, 96, 105, -234, -165, + -167, 15, -135, -213, 89, 88, -327, -238, -244, -277, + -291, 90, 179, -329, 179, -329, 371, 372, -230, 223, + -196, 16, -199, 33, 58, -29, -413, -413, 33, 88, + -184, -186, -185, -187, 67, 71, 73, 68, 69, 70, + 74, -304, 26, -31, -166, -31, -413, -188, -181, -415, + 15, 78, -415, 88, 223, -268, -271, 419, 416, 422, + -381, 90, -110, 88, -354, -341, -235, -139, 41, -334, + 378, -327, 585, -327, -336, 90, -336, 96, 96, 96, + 89, -49, -44, -45, 34, 82, -361, -348, 90, 40, + -348, -348, -291, 89, -231, -138, -188, 144, 77, -365, + -365, -365, -297, -2, 725, 731, 138, 87, 383, 19, + -252, 88, 89, -216, 302, 89, -112, -291, 89, 87, + -346, -346, -291, -413, 240, 32, 32, 669, 625, 617, + -59, -216, -215, -381, -328, 724, 723, 89, 242, 300, + -143, 436, -140, 90, 91, -188, -188, -188, -188, -188, + -188, 232, 229, 406, -405, 312, -405, 285, 243, -181, + -188, 88, -84, 259, 254, -302, -302, 34, -188, 416, + 698, 696, -144, 143, 264, -160, -152, -118, -118, -149, + -311, 179, 344, 263, 342, 338, 358, 349, 376, 340, + 377, 335, 334, 333, -311, -309, -149, -207, -132, -144, + -144, 151, -144, 149, -144, -414, -414, -414, -414, -414, + -227, -144, -144, -144, -414, 179, 344, 15, -144, -309, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, - -144, -144, -144, -144, -144, -144, -144, -144, -378, -144, - -207, -144, -207, -144, -144, -144, -144, -144, -379, -379, - -379, -379, -379, -207, -207, -207, -207, -144, -413, -291, - -97, -96, -95, 652, 244, -94, -162, -97, -162, 222, - -144, 222, 222, 222, -144, -131, -293, -144, -144, -144, - -144, -144, -144, -144, -144, -144, -144, -192, -342, -342, - -342, -262, 88, -273, 23, 15, 58, 58, -165, -196, - -166, -135, -291, -241, 679, -247, 47, -245, -246, 48, - -242, 49, 57, -329, -329, 170, -232, -144, -263, 77, - -264, -272, -215, -210, -212, -211, -413, -251, -414, -291, - -262, -264, -168, -169, -169, -168, -169, 67, 67, 67, - 72, 67, 72, 67, -185, -297, -414, -144, -300, 78, - -166, -166, -190, -297, 170, 416, 420, 421, -354, -403, - 119, 144, 32, 77, 374, 101, -401, 178, 614, 664, - 669, 625, 618, 659, -402, 246, 137, 138, 258, 26, - 42, 89, 88, 89, 88, 89, 89, 88, -285, -284, - -45, -44, -348, -348, 96, -381, 90, 90, 242, 27, - -188, 77, 77, 77, -113, 729, 96, 87, -3, 82, - -144, 87, 20, -337, -215, -372, -323, -373, -324, -325, - -5, -6, -349, -116, 58, 101, -63, 45, 241, 709, - 710, 127, -413, 722, -364, -252, -368, -370, -188, -148, - -413, -159, -146, -145, -147, -153, 168, 169, 263, 340, - 341, -216, -188, -137, 291, 299, 87, -141, 92, -384, - 78, 282, 374, 282, 374, 90, -406, 313, 90, -406, - -188, -84, -49, -188, -280, -280, 34, -381, -414, -160, - -152, -125, 163, 578, -314, 584, -322, -322, -322, -332, - -322, 330, -322, 330, -322, -414, -414, -414, 88, -414, - 23, -414, -144, 88, -121, 474, 88, 88, -414, 87, - 87, -144, -414, -414, -414, 88, -414, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, -414, 88, - -414, 88, -414, 88, -414, 88, -414, 88, -414, 88, - -414, 88, -414, 88, -414, 88, -414, 88, -414, 88, - -414, 88, -414, 88, -414, 88, -414, 88, -414, 88, - -414, -414, 88, -414, -414, -414, 88, -414, 88, -414, - 88, -414, -414, -414, 88, -312, 670, -414, -414, -414, - -414, -414, -414, -414, -414, -414, -414, -414, -93, -292, - -291, -94, 634, 634, -414, -94, -224, 88, -149, -414, - -149, -149, -149, -414, -414, -414, 88, -414, 88, 88, - -414, 88, -414, 88, -414, -414, -414, -414, 88, -193, - 23, -193, -193, -414, -258, -188, -196, -225, 17, -238, - 52, 350, -249, -248, 56, 48, -246, 20, 50, 20, - 31, -263, 88, 152, 88, -414, -414, 88, 58, 223, - -414, -196, -179, -178, 77, 78, -180, 77, -178, 67, - 67, -253, 88, -261, -166, -196, -196, 223, 119, -413, - -148, 13, 90, 90, -381, -400, 713, 714, 32, 96, - -348, -348, 138, 138, -188, 87, -327, 90, -327, 96, - 96, 32, 83, 84, 85, 32, 79, 80, 81, -188, - -188, -188, -188, -369, 87, 20, -144, 87, 152, 89, - -252, -252, 278, 163, -348, 707, 284, 284, -348, -348, - -348, -115, -114, 729, 89, -414, 88, -335, 578, 581, - -144, -154, -154, -253, 89, -377, 578, -383, -291, -291, - -291, -291, 96, 98, -414, 576, 74, 579, -414, -327, - -144, -144, -144, -232, 90, -144, -144, 96, 96, -414, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, - -207, -144, -414, -176, -175, -177, 690, 119, 32, -311, - -414, -209, 276, -100, -99, -98, 15, -414, -144, -118, - -118, -118, -118, -144, -144, -144, -144, -144, -144, -413, - 67, 19, 17, -413, -413, -300, -225, -226, 18, 20, - -239, 54, -237, 53, -237, -248, 20, 20, 90, 20, - 90, 138, -272, -144, -212, 58, -29, -291, -210, -291, - -227, -144, 87, -144, -156, -196, -196, -144, -202, 498, - 500, 501, 502, 499, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 503, 514, 475, 476, 477, 108, - 110, 109, 478, 479, 480, 344, 526, 527, 521, 524, - 525, 523, 522, 359, 360, 481, 544, 545, 549, 548, - 546, 547, 550, 553, 554, 555, 556, 557, 558, 560, - 559, 551, 552, 529, 528, 530, 531, 532, 533, 534, - 535, 537, 536, 538, 539, 540, 541, 542, 543, 561, - 562, 563, 564, 565, 567, 566, 571, 570, 568, 569, - 573, 572, 482, 483, 111, 112, 113, 114, 115, 116, - 117, 484, 487, 485, 488, 489, 490, 495, 496, 491, - 492, 493, 494, 497, 370, 368, 369, 365, 364, 363, - 423, 428, 429, 431, 515, 516, 517, 518, 519, 520, - 671, 672, 673, 674, 675, 676, 677, 678, 90, 90, - 87, -144, 89, 89, -253, -368, -60, 89, -254, -252, - 96, 89, 279, -211, -413, 90, -348, -348, -348, 96, - 96, -299, -414, 88, -291, -402, -370, 582, 582, -414, - 26, -376, -375, -293, 87, 78, 63, 577, 580, -414, - -414, 88, -414, -414, -414, 89, 89, -414, -414, -414, + -144, -144, -144, -144, -144, -378, -144, -207, -144, -207, + -144, -144, -144, -144, -144, -379, -379, -379, -379, -379, + -207, -207, -207, -207, -144, -413, -291, -97, -96, -95, + 652, 244, -94, -162, -97, -162, 222, -144, 222, 222, + 222, -144, -131, -293, -144, -144, -144, -144, -144, -144, + -144, -144, -144, -144, -192, -342, -342, -342, -262, 88, + -273, 23, 15, 58, 58, -165, -196, -166, -135, -291, + -241, 679, -247, 47, -245, -246, 48, -242, 49, 57, + -329, -329, 170, -232, -144, -263, 77, -264, -272, -215, + -210, -212, -211, -413, -251, -414, -291, -262, -264, -168, + -169, -169, -168, -169, 67, 67, 67, 72, 67, 72, + 67, -185, -297, -414, -144, -300, 78, -166, -166, -190, + -297, 170, 416, 420, 421, -354, -403, 119, 144, 32, + 77, 374, 101, -401, 178, 614, 664, 669, 625, 618, + 659, -402, 246, 137, 138, 258, 26, 42, 89, 88, + 89, 88, 89, 89, 88, -285, -284, -45, -44, -348, + -348, 96, -381, 90, 90, 242, 27, -188, 77, 77, + 77, -113, 729, 96, 87, -3, 82, -144, 87, 20, + -337, -215, -372, -323, -373, -324, -325, -5, -6, -349, + -116, 58, 101, -63, 45, 241, 709, 710, 127, -413, + 722, -364, -252, -368, -370, -188, -148, -413, -159, -146, + -145, -147, -153, 168, 169, 263, 340, 341, -216, -188, + -137, 291, 299, 87, -141, 92, -384, 78, 282, 374, + 282, 374, 90, -406, 313, 90, -406, -188, -84, -49, + -188, -280, -280, 34, -381, -414, -160, -152, -125, 163, + 578, -314, 584, -322, -322, -322, -332, -322, 330, -322, + 330, -322, -414, -414, -414, 88, -414, 23, -414, -144, + 88, -121, 474, 88, 88, -414, 87, 87, -144, -414, + -414, -414, 88, -414, -414, -414, -414, -414, -414, -414, + -414, -414, -414, -414, -414, -414, 88, -414, 88, -414, + 88, -414, 88, -414, 88, -414, 88, -414, 88, -414, + 88, -414, 88, -414, 88, -414, 88, -414, 88, -414, + 88, -414, 88, -414, 88, -414, 88, -414, -414, 88, + -414, -414, -414, 88, -414, 88, -414, 88, -414, -414, + -414, 88, -312, 670, -414, -414, -414, -414, -414, -414, + -414, -414, -414, -414, -414, -93, -292, -291, -94, 634, + 634, -414, -94, -224, 88, -149, -414, -149, -149, -149, + -414, -414, -414, 88, -414, 88, 88, -414, 88, -414, + 88, -414, -414, -414, -414, 88, -193, 23, -193, -193, + -414, -258, -188, -196, -225, 17, -238, 52, 350, -249, + -248, 56, 48, -246, 20, 50, 20, 31, -263, 88, + 152, 88, -414, -414, 88, 58, 223, -414, -196, -179, + -178, 77, 78, -180, 77, -178, 67, 67, -253, 88, + -261, -166, -196, -196, 223, 119, -413, -148, 13, 90, + 90, -381, -400, 713, 714, 32, 96, -348, -348, 138, + 138, -188, 87, -327, 90, -327, 96, 96, 32, 83, + 84, 85, 32, 79, 80, 81, -188, -188, -188, -188, + -369, 87, 20, -144, 87, 152, 89, -252, -252, 278, + 163, -348, 707, 284, 284, -348, -348, -348, -115, -114, + 729, 89, -414, 88, -335, 578, 581, -144, -154, -154, + -253, 89, -377, 578, -383, -291, -291, -291, -291, 96, + 98, -414, 576, 74, 579, -414, -327, -144, -144, -144, + -232, 90, -144, -144, 96, 96, -414, -144, -144, -144, + -144, -144, -144, -144, -144, -144, -144, -144, -144, -144, + -144, -144, -144, -144, -144, -144, -144, -207, -144, -414, + -176, -175, -177, 690, 119, 32, -311, -414, -209, 276, + -100, -99, -98, 15, -414, -144, -118, -118, -118, -118, + -144, -144, -144, -144, -144, -144, -413, 67, 19, 17, + -413, -413, -300, -225, -226, 18, 20, -239, 54, -237, + 53, -237, -248, 20, 20, 90, 20, 90, 138, -272, + -144, -212, 58, -29, -291, -210, -291, -227, -144, 87, + -144, -156, -196, -196, -144, -202, 498, 500, 501, 502, + 499, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 503, 514, 475, 476, 477, 108, 110, 109, 478, + 479, 480, 344, 526, 527, 521, 524, 525, 523, 522, + 359, 360, 481, 544, 545, 549, 548, 546, 547, 550, + 553, 554, 555, 556, 557, 558, 560, 559, 551, 552, + 529, 528, 530, 531, 532, 533, 534, 535, 537, 536, + 538, 539, 540, 541, 542, 543, 561, 562, 563, 564, + 565, 567, 566, 571, 570, 568, 569, 573, 572, 482, + 483, 111, 112, 113, 114, 115, 116, 117, 484, 487, + 485, 488, 489, 490, 495, 496, 491, 492, 493, 494, + 497, 370, 368, 369, 365, 364, 363, 423, 428, 429, + 431, 515, 516, 517, 518, 519, 520, 671, 672, 673, + 674, 675, 676, 677, 678, 90, 90, 87, -144, 89, + 89, -253, -368, -60, 89, -254, -252, 96, 89, 279, + -211, -413, 90, -348, -348, -348, 96, 96, -299, -414, + 88, -291, -402, -370, 582, 582, -414, 26, -376, -375, + -293, 87, 78, 63, 577, 580, -414, -414, 88, -414, + -414, -414, 89, 89, -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, 88, - -414, -175, -177, -414, 77, -156, -227, 20, -97, 301, - 303, -97, -414, -414, -414, -414, -414, 88, -414, -414, - 88, -414, 88, -414, -414, -255, -414, -291, 246, 20, - 20, -255, -255, -195, -226, -107, -106, -105, 608, -144, - -207, -240, 55, 77, 122, 90, 90, 90, 13, -210, - 223, -232, -252, -173, 383, -227, -414, -252, 89, 26, - 89, 731, 138, 89, -211, -124, -413, 275, -299, 90, - 90, -114, -117, -29, 88, 152, -252, -188, 63, -144, - -207, -414, 77, 589, 690, -92, -91, -88, 701, 727, - -207, -94, -94, -144, -144, -144, 88, -414, -414, -414, - -107, 88, -104, -103, -291, 77, 122, -264, -291, 89, - -414, -413, -232, 89, -236, -29, 87, -3, 275, -323, - -373, -324, -325, -5, -6, -349, -82, 578, -375, -353, - -297, -293, 90, 96, 89, 578, -414, -414, -90, 146, - 699, 667, -154, 222, -414, 88, -414, 88, -414, 88, - -291, 246, -105, 88, 26, -300, -174, -172, -291, 631, - -393, -392, 574, -403, -399, 119, 144, 101, -401, 669, - 625, 128, 129, -82, -144, 87, -414, -83, 290, 686, - 223, -384, 579, -90, 700, 645, 620, 645, 620, -149, - -144, -144, -144, -103, -413, -414, 88, 23, -315, -62, - 642, -390, -391, 77, -394, 389, 641, 662, 119, 90, - 89, -252, 251, -298, -377, 580, 143, -118, -414, 88, - -414, 88, -414, -93, -172, 638, -328, -156, -391, 77, - -390, 77, 14, 13, -4, 730, 89, 292, -90, 645, - 620, -144, -144, -414, -61, 27, -173, -389, 259, 254, - 257, 33, -389, 96, -4, -414, -414, 642, 253, 32, - 119, -156, -176, -175, -175, + -414, -414, -414, -414, -414, -414, 88, -414, -175, -177, + -414, 77, -156, -227, 20, -97, 301, 303, -97, -414, + -414, -414, -414, -414, 88, -414, -414, 88, -414, 88, + -414, -414, -255, -414, -291, 246, 20, 20, -255, -255, + -195, -226, -107, -106, -105, 608, -144, -207, -240, 55, + 77, 122, 90, 90, 90, 13, -210, 223, -232, -252, + -173, 383, -227, -414, -252, 89, 26, 89, 731, 138, + 89, -211, -124, -413, 275, -299, 90, 90, -114, -117, + -29, 88, 152, -252, -188, 63, -144, -207, -414, 77, + 589, 690, -92, -91, -88, 701, 727, -207, -94, -94, + -144, -144, -144, 88, -414, -414, -414, -107, 88, -104, + -103, -291, 77, 122, -264, -291, 89, -414, -413, -232, + 89, -236, -29, 87, -3, 275, -323, -373, -324, -325, + -5, -6, -349, -82, 578, -375, -353, -297, -293, 90, + 96, 89, 578, -414, -414, -90, 146, 699, 667, -154, + 222, -414, 88, -414, 88, -414, 88, -291, 246, -105, + 88, 26, -300, -174, -172, -291, 631, -393, -392, 574, + -403, -399, 119, 144, 101, -401, 669, 625, 128, 129, + -82, -144, 87, -414, -83, 290, 686, 223, -384, 579, + -90, 700, 645, 620, 645, 620, -149, -144, -144, -144, + -103, -413, -414, 88, 23, -315, -62, 642, -390, -391, + 77, -394, 389, 641, 662, 119, 90, 89, -252, 251, + -298, -377, 580, 143, -118, -414, 88, -414, 88, -414, + -93, -172, 638, -328, -156, -391, 77, -390, 77, 14, + 13, -4, 730, 89, 292, -90, 645, 620, -144, -144, + -414, -61, 27, -173, -389, 259, 254, 257, 33, -389, + 96, -4, -414, -414, 642, 253, 32, 119, -156, -176, + -175, -175, } var yyDef = [...]int{ @@ -9232,415 +9251,416 @@ var yyDef = [...]int{ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 72, 74, 75, 880, 880, 880, 0, 880, 0, - 0, 880, -2, -2, 880, 1611, 0, 880, 0, 875, + 0, 880, -2, -2, 880, 1616, 0, 880, 0, 875, 0, -2, 795, 801, 0, 810, -2, 0, 0, 880, - 880, 2235, 2235, 875, 0, 0, 0, 0, 0, 880, - 880, 880, 880, 1616, 1477, 52, 880, 0, 87, 88, - 830, 831, 832, 67, 0, 2233, 881, 1, 3, 73, + 880, 2240, 2240, 875, 0, 0, 0, 0, 0, 880, + 880, 880, 880, 1621, 1477, 52, 880, 0, 87, 88, + 830, 831, 832, 67, 0, 2238, 881, 1, 3, 73, 77, 0, 0, 0, 60, 1486, 0, 80, 0, 0, - 884, 0, 0, 1594, 880, 880, 0, 128, 129, 0, + 884, 0, 0, 1599, 880, 880, 0, 128, 129, 0, 0, 0, -2, 132, -2, 161, 162, 163, 0, 168, 605, 526, 578, 524, 563, -2, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 529, - 401, 401, 0, 0, -2, 512, 512, 512, 1596, 0, + 401, 401, 0, 0, -2, 512, 512, 512, 1601, 0, 0, 0, 560, 463, 401, 401, 401, 0, 401, 401, 401, 401, 0, 0, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, - 401, 1504, 167, 1612, 1609, 1610, 1769, 1770, 1771, 1772, - 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, - 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, - 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, - 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, 1812, - 1813, 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, 1822, - 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, - 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, - 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, - 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, - 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, - 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, - 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, - 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, - 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, - 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, - 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, - 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, - 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, - 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, - 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, - 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, - 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, - 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, - 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, - 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, - 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, - 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, - 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, - 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, - 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, - 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, - 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, - 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, - 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, - 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, - 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, - 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, - 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, - 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, - 2173, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182, - 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, - 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, - 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, 2211, 2212, - 2213, 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222, - 2223, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, - 0, 1588, 0, 718, 983, 0, 876, 877, 0, 784, + 401, 1504, 167, 1617, 1614, 1615, 1774, 1775, 1776, 1777, + 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787, + 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, + 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, + 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, 1817, + 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, + 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, + 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, + 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857, + 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, + 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, + 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, + 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, + 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, + 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, + 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, + 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, + 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, + 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, + 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, + 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, + 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, + 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, + 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, + 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, + 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, + 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, + 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, + 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, + 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, + 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, + 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, + 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, + 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, + 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, + 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, + 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, + 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, + 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, + 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, + 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, + 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, + 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, + 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, + 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, + 2228, 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, + 0, 1593, 0, 718, 983, 0, 876, 877, 0, 784, 784, 0, 784, 784, 784, 784, 0, 0, 0, 732, 0, 0, 0, 0, 781, 0, 748, 749, 0, 781, - 0, 755, 787, 0, 0, 762, 784, 784, 765, 2236, - 0, 2236, 2236, 1579, 0, 778, 776, 790, 791, 42, - 794, 797, 798, 799, 800, 803, 0, 814, 817, 1605, - 1606, 0, 819, 826, 843, 844, 0, 47, 1133, 0, + 0, 755, 787, 0, 0, 762, 784, 784, 765, 2241, + 0, 2241, 2241, 1584, 0, 778, 776, 790, 791, 42, + 794, 797, 798, 799, 800, 803, 0, 814, 817, 1610, + 1611, 0, 819, 826, 843, 844, 0, 47, 1133, 0, 1005, 0, 1011, -2, 1022, 1039, 1040, 1041, 1042, 1043, 1045, 1046, 1047, 0, 0, 0, 0, 1052, 1053, 0, 0, 0, 0, 0, 1114, 0, 0, 0, 0, 1450, 0, 0, 1412, 1412, 1148, 1412, 1412, 1414, 1414, 1414, - 1821, 1959, 1967, 2143, 1782, 1788, 1789, 1790, 2089, 2090, - 2091, 2092, 2180, 2181, 2185, 1883, 1777, 2156, 2157, 0, - 2232, 1920, 1928, 1929, 1953, 2053, 2166, 1800, 1948, 2017, - 1880, 1902, 1903, 2035, 2036, 1924, 1925, 1906, 2095, 2097, - 2113, 2114, 2099, 2101, 2110, 2116, 2121, 2100, 2112, 2117, - 2130, 2134, 2137, 2138, 2139, 2107, 2105, 2118, 2122, 2124, - 2126, 2132, 2135, 2108, 2106, 2119, 2123, 2125, 2127, 2133, - 2136, 2094, 2098, 2102, 2111, 2129, 2109, 2128, 2103, 2115, - 2120, 2131, 2104, 2096, 1918, 1921, 1909, 1910, 1912, 1914, - 1919, 1926, 1932, 1911, 1931, 1930, 0, 1907, 1908, 1913, - 1923, 1927, 1915, 1916, 1917, 1922, 1933, 1973, 1972, 1971, - 2016, 1944, 2015, 0, 0, 0, 0, 0, 1772, 1826, - 1827, 2140, 1334, 1335, 1336, 1337, 0, 0, 0, 0, - 0, 0, 0, 293, 294, 1463, 1464, 46, 1132, 1575, + 1826, 1964, 1972, 2148, 1787, 1793, 1794, 1795, 2094, 2095, + 2096, 2097, 2185, 2186, 2190, 1888, 1782, 2161, 2162, 0, + 2237, 1925, 1933, 1934, 1958, 2058, 2171, 1805, 1953, 2022, + 1885, 1907, 1908, 2040, 2041, 1929, 1930, 1911, 2100, 2102, + 2118, 2119, 2104, 2106, 2115, 2121, 2126, 2105, 2117, 2122, + 2135, 2139, 2142, 2143, 2144, 2112, 2110, 2123, 2127, 2129, + 2131, 2137, 2140, 2113, 2111, 2124, 2128, 2130, 2132, 2138, + 2141, 2099, 2103, 2107, 2116, 2134, 2114, 2133, 2108, 2120, + 2125, 2136, 2109, 2101, 1923, 1926, 1914, 1915, 1917, 1919, + 1924, 1931, 1937, 1916, 1936, 1935, 0, 1912, 1913, 1918, + 1928, 1932, 1920, 1921, 1922, 1927, 1938, 1978, 1977, 1976, + 2021, 1949, 2020, 0, 0, 0, 0, 0, 1777, 1831, + 1832, 2145, 1334, 1335, 1336, 1337, 0, 0, 0, 0, + 0, 0, 0, 293, 294, 1463, 1464, 46, 1132, 1580, 1414, 1414, 1414, 1414, 1414, 1414, 1074, 1075, 1076, 1077, - 1078, 1102, 1103, 1109, 1110, 2030, 2031, 2032, 2033, 1864, - 2175, 1872, 1873, 2012, 2013, 1885, 1886, 2206, 2207, -2, + 1078, 1102, 1103, 1109, 1110, 2035, 2036, 2037, 2038, 1869, + 2180, 1877, 1878, 2017, 2018, 1890, 1891, 2211, 2212, -2, -2, -2, 234, 235, 236, 237, 238, 239, 240, 241, - 0, 1825, 2154, 2155, 230, 0, 0, 298, 299, 295, + 0, 1830, 2159, 2160, 230, 0, 0, 298, 299, 295, 296, 297, 1116, 1117, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 2235, 0, 853, 0, - 0, 0, 0, 0, 0, 1617, 1618, 1486, 0, 1478, + 287, 288, 289, 290, 291, 292, 2240, 0, 853, 0, + 0, 0, 0, 0, 0, 1622, 1623, 1486, 0, 1478, 1477, 65, 0, 880, -2, 0, 0, 0, 0, 49, - 0, 54, 940, 883, 79, 78, 1526, 0, 0, 0, - 61, 1487, 69, 71, 1488, 0, 885, 886, 0, 916, - 920, 0, 0, 0, 1595, 1594, 1594, 104, 0, 0, - 105, 125, 126, 127, 0, 0, 111, 112, 1581, 1582, - 45, 0, 0, 179, 180, 0, 43, 428, 0, 175, - 0, 421, 360, 0, 1504, 0, 0, 0, 0, 0, - 880, 0, 1589, 156, 157, 164, 165, 166, 401, 401, - 401, 575, 0, 0, 167, 167, 533, 534, 535, 0, - 0, -2, 426, 0, 513, 0, 0, 415, 415, 419, - 417, 418, 0, 0, 0, 0, 0, 0, 0, 0, - 552, 0, 553, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 666, 0, 402, 0, 573, 574, 464, 0, - 0, 0, 0, 0, 0, 0, 0, 1597, 1598, 0, - 550, 551, 0, 0, 0, 401, 401, 0, 0, 0, - 0, 401, 401, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 155, 1517, 0, 0, 0, -2, 0, 710, 0, - 0, 0, 1590, 1590, 0, 717, 0, 0, 0, 722, - 0, 0, 723, 0, 781, 781, 779, 780, 725, 726, - 727, 728, 784, 0, 0, 410, 411, 412, 781, 784, - 0, 784, 784, 784, 784, 781, 781, 781, 784, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2236, 787, - 784, 0, 756, 0, 757, 758, 759, 760, 763, 764, - 766, 2237, 2238, 1607, 1608, 1619, 1620, 1621, 1622, 1623, - 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, - 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1643, - 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, - 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, - 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, - 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, - 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, - 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, - 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, - 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, - 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, - 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, - 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, - 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, - 1764, 1765, 1766, 1767, 1768, 2236, 2236, 770, 774, 1580, - 796, 802, 804, 805, 0, 0, 815, 818, 837, 51, - 1871, 825, 51, 827, 828, 829, 855, 856, 861, 0, - 0, 0, 0, 867, 868, 869, 0, 0, 872, 873, - 874, 0, 0, 0, 0, 0, 1003, 0, 0, 1122, - 1123, 1124, 1125, 1126, 1127, 1128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1023, 1024, 0, 0, 0, 1048, - 1049, 1050, 1051, 1054, 0, 1065, 0, 1067, 1459, -2, - 0, 0, 0, 1059, 1060, 0, 0, 0, 0, 0, - 0, 0, 1451, 0, 0, 1146, 0, 1147, 1149, 1150, - 1151, 0, 1152, 1153, 890, 890, 890, 890, 890, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 890, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1600, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 900, 0, 0, 900, - 900, 0, 0, 222, 223, 224, 225, 226, 227, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 242, 243, 244, 245, 246, 247, 300, - 248, 249, 250, 1132, 0, 0, 0, 48, 845, 846, - 0, 966, 1600, 0, 0, 896, 0, 1615, 59, 68, - 70, 1486, 63, 1486, 0, 902, 0, 0, -2, -2, - 903, 909, 910, 911, 912, 913, 56, 2234, 57, 0, - 76, 0, 50, 0, 0, 0, 0, 374, 1529, 0, - 0, 1479, 1480, 1483, 0, 917, 1965, 921, 0, 923, - 924, 0, 0, 102, 0, 982, 0, 0, 0, 113, - 0, 115, 116, 0, 0, 0, 385, 1583, 1584, 1585, - -2, 408, 0, 385, 369, 308, 309, 310, 360, 312, - 360, 360, 360, 360, 374, 374, 374, 374, 343, 344, - 345, 346, 347, 0, 0, 329, 360, 360, 360, 360, - 350, 351, 352, 353, 354, 355, 356, 357, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 362, 362, 362, - 362, 362, 366, 366, 0, 44, 0, 389, 0, 1483, - 0, 0, 1517, 1592, 1602, 0, 0, 0, 1592, 134, - 0, 0, 0, 576, 616, 527, 564, 577, 0, 530, - 531, -2, 0, 0, 512, 0, 514, 0, 409, 0, - -2, 0, 419, 0, 415, 419, 416, 419, 407, 420, - 554, 555, 556, 0, 558, 559, 646, 952, 0, 0, - 0, 0, 0, 652, 653, 654, 0, 656, 657, 658, - 659, 660, 661, 662, 663, 664, 665, 565, 566, 567, - 568, 569, 570, 571, 572, 0, 0, 0, 0, 514, - 0, 561, 0, 0, 465, 466, 467, 0, 0, 470, - 471, 472, 473, 0, 0, 476, 477, 478, 969, 970, - 479, 480, 505, 506, 507, 481, 482, 483, 484, 485, - 486, 487, 499, 500, 501, 502, 503, 504, 488, 489, - 490, 491, 492, 493, 496, 0, 149, 1508, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1590, 0, 0, 0, 0, 899, 984, - 1613, 1614, 719, 0, 0, 785, 786, 0, 413, 414, - 784, 784, 729, 771, 0, 784, 733, 772, 734, 736, - 735, 737, 750, 751, 784, 740, 782, 783, 741, 742, - 743, 744, 745, 746, 747, 767, 752, 753, 754, 788, - 0, 792, 793, 768, 769, 0, 0, 808, 809, 0, - 816, 840, 838, 839, 841, 833, 834, 835, 836, 0, - 842, 0, 0, 858, 98, 863, 864, 865, 866, 878, - 871, 1134, 1000, 1001, 1002, 0, 1004, 1008, 0, 1118, - 1120, 1010, 1006, 1012, 1129, 1130, 1131, 0, 0, 0, - 0, 0, 1016, 1020, 1025, 1026, 1027, 1028, 1029, 0, - 1030, 0, 1033, 1034, 1035, 1036, 1037, 1038, 1044, 1427, - 1428, 1429, 1063, 301, 302, 0, 1064, 0, 0, 0, - 0, 0, 0, 0, 0, 1374, 1375, 1376, 1377, 1378, - 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, - 1389, 1390, 1391, 1392, 1393, 1133, 0, 914, 0, 0, - 1457, 1454, 0, 0, 0, 1413, 1415, 0, 0, 0, - 891, 892, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1394, - 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, - 1405, 1406, 1407, 1408, 1409, 1410, 1411, 0, 0, 1430, - 0, 0, 0, 0, 0, 1450, 0, 1069, 1070, 1071, - 0, 0, 0, 0, 0, 0, 1192, 0, 0, 0, - 0, 1601, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, - 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1338, 1339, 1340, 1341, 41, 0, 0, - 0, 0, 0, 0, 0, 901, 1461, 0, -2, -2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1363, 0, 0, 0, 0, 0, 0, - 1573, 0, 0, 848, 849, 851, 0, 986, 0, 967, - 0, 0, 854, 0, 895, 0, 898, 62, 64, 907, - 908, 0, 925, 904, 58, 53, 0, 0, 944, 1527, - 374, 1549, 0, 383, 383, 380, 1489, 1490, 0, 1482, - 1484, 1485, 81, 922, 918, 0, 998, 0, 0, 981, - 0, 928, 930, 931, 932, 964, 0, 935, 936, 0, - 0, 0, 0, 0, 100, 983, 106, 0, 114, 0, - 0, 119, 120, 107, 108, 109, 110, 0, 605, -2, - 460, 181, 183, 184, 185, 176, -2, 372, 370, 371, - 311, 374, 374, 337, 338, 339, 340, 341, 342, 0, - 0, 330, 331, 332, 333, 322, 0, 323, 324, 325, - 364, 0, 326, 327, 0, 328, 427, 0, 1491, 390, - 391, 393, 401, 0, 396, 397, 0, 401, 401, 0, - 422, 423, 0, 1483, 1508, 0, 0, 0, 1603, 1602, - 1602, 1602, 0, 169, 170, 171, 172, 173, 174, 641, - 0, 0, 617, 639, 640, 167, 0, 0, 177, 516, - 515, 0, 673, 0, 425, 0, 0, 419, 419, 404, - 405, 557, 0, 0, 648, 649, 650, 651, 0, 0, - 0, 543, 454, 0, 544, 545, 514, 516, 0, 0, - 385, 468, 469, 474, 475, 494, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 592, 593, - 594, 597, 599, 518, 603, 596, 598, 600, 518, 604, - 1505, 1506, 1507, 0, 0, 711, 0, 0, 451, 96, - 1591, 716, 720, 721, 781, 739, 773, 781, 731, 738, - 761, 806, 807, 812, 820, 821, 822, 823, 824, 862, - 0, 0, 0, 0, 870, 0, 0, 1009, 1119, 1121, - 1013, 0, 1017, 1021, 0, 0, 0, 0, 0, 1068, - 1066, 1461, 0, 0, 0, 1115, 0, 0, 0, 1137, - 1138, 0, 0, 0, 1455, 0, 0, 1144, 0, 1416, - 1154, 0, 0, 0, 0, 0, 1160, 1161, 1162, 1163, - 1164, 1165, 1166, 1167, 1168, 1169, 1477, 1171, 0, 0, - 0, 0, 0, 1176, 1177, 1178, 1179, 1180, 0, 1182, - 0, 1183, 0, 0, 0, 0, 1190, 1191, 1193, 0, - 0, 1196, 1197, 0, 1199, 0, 1201, 1202, 1203, 1204, - 1205, 1206, 0, 1208, 0, 1210, 1211, 1212, 0, 1214, - 0, 1216, 1217, 0, 1219, 0, 1221, 0, 1224, 0, - 1227, 0, 1230, 0, 1233, 0, 1236, 0, 1239, 0, - 1242, 0, 1245, 0, 1248, 0, 1251, 0, 1254, 0, - 1257, 0, 1260, 0, 1263, 0, 1266, 0, 1269, 1270, - 1271, 0, 1273, 0, 1275, 0, 1278, 1279, 0, 1281, - 0, 1284, 0, 1287, 0, 0, 1288, 0, 0, 0, - 1292, 0, 0, 0, 0, 1301, 1302, 1303, 1304, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1315, - 1316, 1317, 1318, 1319, 1320, 0, 1322, 0, 1097, 0, - 0, 1097, 0, 0, 0, 0, 0, 1135, 900, 0, - 1417, 1418, 1419, 1420, 1421, 0, 0, 0, 0, 0, - 0, 1361, 1362, 1364, 0, 0, 1367, 0, 1369, 0, - 1574, 847, 850, 852, 938, 987, 988, 0, 0, 0, - 0, 968, 1599, 893, 894, 897, 946, 0, 1465, 0, - 0, 925, 998, 926, 0, 905, 55, 941, 0, 1531, - 1530, 1543, 1556, 383, 383, 377, 378, 384, 379, 381, - 382, 1481, 0, 1486, 0, 1567, 0, 0, 1559, 0, - 0, 0, 0, 0, 0, 0, 0, 971, 0, 0, - 974, 0, 0, 0, 0, 965, 936, 0, 937, 0, - -2, 0, 0, 94, 95, 0, 0, 0, 117, 118, - 0, 0, 124, 386, 387, 158, 167, 462, 182, 435, - 0, 0, 307, 373, 334, 335, 336, 0, 358, 0, - 0, 0, 0, 456, 130, 1495, 1494, 401, 401, 392, - 0, 395, 0, 0, 0, 1604, 361, 424, 0, 148, - 0, 0, 0, 0, 0, 154, 611, 0, 0, 618, - 0, 0, 0, 525, 0, 536, 537, 0, 645, -2, - 707, 389, 0, 403, 406, 953, 0, 0, 538, 0, - 541, 542, 455, 516, 547, 548, 562, 549, 497, 498, - 495, 0, 0, 1518, 1519, 1524, 1522, 1523, 135, 583, - 585, 589, 584, 588, 0, 0, 0, 520, 0, 520, - 581, 0, 451, 1491, 0, 715, 452, 453, 784, 784, - 857, 99, 0, 860, 0, 0, 0, 0, 1014, 1018, - 1031, 1032, 1422, 1448, 360, 360, 1435, 360, 366, 1438, - 360, 1440, 360, 1443, 360, 1446, 1447, 0, 0, 1061, - 0, 915, 0, 0, 1143, 1458, 0, 0, 1155, 1156, - 1157, 1158, 1159, 1452, 0, 0, 0, 1175, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 146, 147, - 0, 0, 0, 0, 0, 0, 1372, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1092, 1096, - 0, 1098, 1099, 0, 0, 1324, 0, 0, 1342, 0, - 0, 0, 0, 0, 0, 0, 1462, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 989, 994, 994, - 994, 0, 0, 0, 1586, 1587, 1466, 1467, 998, 1468, - 927, 906, 945, 1549, 0, 1542, 0, -2, 1551, 0, - 0, 0, 1557, 375, 376, 919, 82, 999, 85, 0, - 1567, 1576, 0, 1558, 1569, 1571, 0, 0, 0, 1563, - 0, 998, 929, 960, 962, 0, 957, 972, 973, 975, - 0, 977, 0, 979, 980, 940, 934, 0, 102, 0, - 998, 998, 101, 0, 985, 121, 122, 123, 461, 186, - 191, 0, 0, 0, 196, 0, 198, 0, 0, 0, - 203, 204, 401, 401, 436, 0, 304, 306, 0, 0, - 189, 374, 0, 374, 0, 365, 367, 0, 437, 457, - 1492, 1493, 0, 0, 394, 398, 399, 400, 0, 1593, - 150, 0, 0, 0, 614, 0, 642, 0, 0, 0, - 0, 0, 0, 178, 517, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 0, 401, 0, 0, 0, 401, - 401, 401, 0, 699, 388, 0, 0, 670, 667, 539, - 0, 220, 221, 228, 229, 231, 0, 0, 0, 0, - 0, 546, 940, 1509, 1510, 1511, 0, 1521, 1525, 138, - 0, 0, 0, 0, 591, 595, 601, 0, 519, 602, - 712, 713, 714, 97, 724, 730, 859, 879, 1007, 1015, - 1019, 0, 0, 0, 0, 1449, 1433, 374, 1436, 1437, - 1439, 1441, 1442, 1444, 1445, 1057, 1058, 1062, 0, 1140, - 0, 1142, 1456, 0, 1486, 0, 0, 0, 1174, 0, - 0, 0, 1185, 1184, 1186, 0, 1188, 1189, 1194, 1195, - 1198, 1200, 1207, 1209, 1213, 1215, 1218, 1220, 1222, 0, - 1225, 0, 1228, 0, 1231, 0, 1234, 0, 1237, 0, - 1240, 0, 1243, 0, 1246, 0, 1249, 0, 1252, 0, - 1255, 0, 1258, 0, 1261, 0, 1264, 0, 1267, 0, - 1272, 1274, 0, 1277, 1280, 1282, 0, 1285, 0, 1289, - 0, 1291, 1293, 1294, 0, 0, 0, 1305, 1306, 1307, - 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1321, 0, 1090, - 1093, 1323, 1100, 1101, 1106, 1326, 0, 0, 0, 1329, - 0, 0, 0, 1333, 1136, 1344, 0, 1349, 0, 0, - 1355, 0, 1359, 0, 1365, 1366, 1368, 1370, 0, 0, - 0, 0, 0, 966, 947, 66, 1468, 1470, 0, 1536, - 1534, 1534, 1544, 1545, 0, 0, 1552, 0, 0, 0, - 0, 86, 0, 0, 0, 1572, 0, 0, 0, 0, - 103, 1477, 954, 961, 0, 0, 955, 0, 956, 976, - 978, 933, 0, 998, 998, 92, 93, 0, 192, 0, - 194, 0, 197, 199, 200, 201, 207, 208, 209, 202, - 0, 0, 303, 305, 0, 0, 348, 359, 349, 0, - 0, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 940, - 151, 152, 153, 606, 0, 616, 0, 942, 0, 609, - 0, 528, 0, 0, 0, 401, 401, 401, 0, 0, - 0, 0, 684, 0, 0, 647, 0, 655, 0, 0, - 0, 232, 233, 0, 1520, 582, 0, 136, 137, 0, - 0, 587, 521, 522, 1055, 0, 0, 0, 1056, 1434, - 0, 0, 0, 0, 1453, 0, 0, 0, 0, 1181, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1297, 0, 0, 0, 636, 637, 0, 1373, - 1095, 1477, 0, 1097, 1107, 1108, 0, 1097, 1343, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 995, 0, 0, 0, 0, 986, 1470, 1475, 0, 0, - 1539, 0, 1532, 1535, 1533, 1546, 0, 0, 1553, 0, - 1555, 0, 1577, 1578, 1570, 0, 1562, 1565, 1561, 1564, - 1486, 958, 0, 963, 0, 1477, 91, 0, 195, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 205, 206, - 0, 0, 363, 368, 0, 0, 0, 607, 0, 943, - 619, 610, 0, 697, 0, 701, 0, 0, 0, 704, - 705, 706, 683, 0, 687, 429, 671, 668, 669, 540, - 0, 139, 140, 0, 0, 0, 1423, 0, 1426, 1139, - 1141, 0, 1170, 1172, 1173, 1431, 1432, 1187, 1223, 1226, - 1229, 1232, 1235, 1238, 1241, 1244, 1247, 1250, 1253, 1256, - 1259, 1262, 1265, 1268, 1276, 1283, 1286, 1290, 1295, 0, - 1298, 0, 0, 1299, 0, 638, 1086, 0, 0, 1104, - 1105, 0, 1328, 1330, 1331, 1332, 1345, 0, 1350, 1351, - 0, 1356, 0, 1360, 1371, 0, 991, 948, 949, 996, - 997, 0, 0, 939, 1475, 84, 1476, 1473, 0, 1471, - 1469, 1528, 0, 1537, 1538, 1547, 1548, 1554, 0, 1560, - 0, 89, 0, 0, 0, 1486, 193, 0, 212, 0, - 615, 0, 618, 608, 695, 696, 0, 708, 700, 702, - 703, 685, -2, 1512, 0, 0, 0, 590, 1424, 0, - 0, 1300, 0, 634, 635, 1094, 1087, 0, 1072, 1073, - 1091, 1325, 1327, 0, 0, 0, 0, 990, 992, 993, - 83, 0, 1472, 1112, 0, 1540, 1541, 1568, 1566, 959, - 966, 0, 90, 442, 435, 1512, 0, 0, 0, 688, - 689, 690, 691, 692, 693, 694, 579, 1514, 141, 142, - 0, 509, 510, 511, 135, 0, 1145, 1296, 1088, 0, - 0, 0, 0, 0, 1346, 0, 1352, 0, 1357, 0, - 950, 951, 1474, 0, 0, 620, 0, 622, 0, -2, - 430, 443, 0, 187, 213, 214, 0, 0, 217, 218, - 219, 210, 211, 131, 0, 0, 709, 0, 1515, 1516, - 0, 138, 0, 0, 1079, 1080, 1081, 1082, 1084, 0, - 0, 0, 0, 1113, 1092, 621, 0, 0, 385, 0, - 631, 431, 432, 0, 438, 439, 440, 441, 215, 216, - 643, 0, 0, 508, 586, 1425, 0, 0, 1347, 0, - 1353, 0, 1358, 0, 623, 624, 632, 0, 433, 0, - 434, 0, 0, 0, 612, 0, 643, 1513, 1089, 1083, - 1085, 0, 0, 1111, 0, 633, 629, 444, 446, 447, - 0, 0, 445, 644, 613, 1348, 1354, 0, 448, 449, - 450, 625, 626, 627, 628, + 0, 54, 940, 883, 79, 78, 1526, 1529, 0, 0, + 0, 61, 1487, 69, 71, 1488, 0, 885, 886, 0, + 916, 920, 0, 0, 0, 1600, 1599, 1599, 104, 0, + 0, 105, 125, 126, 127, 0, 0, 111, 112, 1586, + 1587, 45, 0, 0, 179, 180, 0, 43, 428, 0, + 175, 0, 421, 360, 0, 1504, 0, 0, 0, 0, + 0, 880, 0, 1594, 156, 157, 164, 165, 166, 401, + 401, 401, 575, 0, 0, 167, 167, 533, 534, 535, + 0, 0, -2, 426, 0, 513, 0, 0, 415, 415, + 419, 417, 418, 0, 0, 0, 0, 0, 0, 0, + 0, 552, 0, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 666, 0, 402, 0, 573, 574, 464, + 0, 0, 0, 0, 0, 0, 0, 0, 1602, 1603, + 0, 550, 551, 0, 0, 0, 401, 401, 0, 0, + 0, 0, 401, 401, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 155, 1517, 0, 0, 0, -2, 0, 710, + 0, 0, 0, 1595, 1595, 0, 717, 0, 0, 0, + 722, 0, 0, 723, 0, 781, 781, 779, 780, 725, + 726, 727, 728, 784, 0, 0, 410, 411, 412, 781, + 784, 0, 784, 784, 784, 784, 781, 781, 781, 784, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2241, + 787, 784, 0, 756, 0, 757, 758, 759, 760, 763, + 764, 766, 2242, 2243, 1612, 1613, 1624, 1625, 1626, 1627, + 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, + 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, + 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, + 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667, + 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, + 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, + 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, + 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, + 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, + 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, + 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, + 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, + 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, + 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, + 1768, 1769, 1770, 1771, 1772, 1773, 2241, 2241, 770, 774, + 1585, 796, 802, 804, 805, 0, 0, 815, 818, 837, + 51, 1876, 825, 51, 827, 828, 829, 855, 856, 861, + 0, 0, 0, 0, 867, 868, 869, 0, 0, 872, + 873, 874, 0, 0, 0, 0, 0, 1003, 0, 0, + 1122, 1123, 1124, 1125, 1126, 1127, 1128, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1023, 1024, 0, 0, 0, + 1048, 1049, 1050, 1051, 1054, 0, 1065, 0, 1067, 1459, + -2, 0, 0, 0, 1059, 1060, 0, 0, 0, 0, + 0, 0, 0, 1451, 0, 0, 1146, 0, 1147, 1149, + 1150, 1151, 0, 1152, 1153, 890, 890, 890, 890, 890, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 890, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1605, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 900, 0, 0, + 900, 900, 0, 0, 222, 223, 224, 225, 226, 227, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 242, 243, 244, 245, 246, 247, + 300, 248, 249, 250, 1132, 0, 0, 0, 48, 845, + 846, 0, 966, 1605, 0, 0, 896, 0, 1620, 59, + 68, 70, 1486, 63, 1486, 0, 902, 0, 0, -2, + -2, 903, 909, 910, 911, 912, 913, 56, 2239, 57, + 0, 76, 0, 50, 0, 0, 1527, 0, 1530, 0, + 0, 0, 374, 1534, 0, 0, 1479, 1480, 1483, 0, + 917, 1970, 921, 0, 923, 924, 0, 0, 102, 0, + 982, 0, 0, 0, 113, 0, 115, 116, 0, 0, + 0, 385, 1588, 1589, 1590, -2, 408, 0, 385, 369, + 308, 309, 310, 360, 312, 360, 360, 360, 360, 374, + 374, 374, 374, 343, 344, 345, 346, 347, 0, 0, + 329, 360, 360, 360, 360, 350, 351, 352, 353, 354, + 355, 356, 357, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 362, 362, 362, 362, 362, 366, 366, 0, + 44, 0, 389, 0, 1483, 0, 0, 1517, 1597, 1607, + 0, 0, 0, 1597, 134, 0, 0, 0, 576, 616, + 527, 564, 577, 0, 530, 531, -2, 0, 0, 512, + 0, 514, 0, 409, 0, -2, 0, 419, 0, 415, + 419, 416, 419, 407, 420, 554, 555, 556, 0, 558, + 559, 646, 952, 0, 0, 0, 0, 0, 652, 653, + 654, 0, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 565, 566, 567, 568, 569, 570, 571, 572, + 0, 0, 0, 0, 514, 0, 561, 0, 0, 465, + 466, 467, 0, 0, 470, 471, 472, 473, 0, 0, + 476, 477, 478, 969, 970, 479, 480, 505, 506, 507, + 481, 482, 483, 484, 485, 486, 487, 499, 500, 501, + 502, 503, 504, 488, 489, 490, 491, 492, 493, 496, + 0, 149, 1508, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1595, 0, + 0, 0, 0, 899, 984, 1618, 1619, 719, 0, 0, + 785, 786, 0, 413, 414, 784, 784, 729, 771, 0, + 784, 733, 772, 734, 736, 735, 737, 750, 751, 784, + 740, 782, 783, 741, 742, 743, 744, 745, 746, 747, + 767, 752, 753, 754, 788, 0, 792, 793, 768, 769, + 0, 0, 808, 809, 0, 816, 840, 838, 839, 841, + 833, 834, 835, 836, 0, 842, 0, 0, 858, 98, + 863, 864, 865, 866, 878, 871, 1134, 1000, 1001, 1002, + 0, 1004, 1008, 0, 1118, 1120, 1010, 1006, 1012, 1129, + 1130, 1131, 0, 0, 0, 0, 0, 1016, 1020, 1025, + 1026, 1027, 1028, 1029, 0, 1030, 0, 1033, 1034, 1035, + 1036, 1037, 1038, 1044, 1427, 1428, 1429, 1063, 301, 302, + 0, 1064, 0, 0, 0, 0, 0, 0, 0, 0, + 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, + 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, + 1133, 0, 914, 0, 0, 1457, 1454, 0, 0, 0, + 1413, 1415, 0, 0, 0, 891, 892, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1394, 1395, 1396, 1397, 1398, 1399, + 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, + 1410, 1411, 0, 0, 1430, 0, 0, 0, 0, 0, + 1450, 0, 1069, 1070, 1071, 0, 0, 0, 0, 0, + 0, 1192, 0, 0, 0, 0, 1606, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 144, 145, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1338, 1339, + 1340, 1341, 41, 0, 0, 0, 0, 0, 0, 0, + 901, 1461, 0, -2, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1363, 0, + 0, 0, 0, 0, 0, 1578, 0, 0, 848, 849, + 851, 0, 986, 0, 967, 0, 0, 854, 0, 895, + 0, 898, 62, 64, 907, 908, 0, 925, 904, 58, + 53, 0, 0, 944, 1528, 1531, 1532, 374, 1554, 0, + 383, 383, 380, 1489, 1490, 0, 1482, 1484, 1485, 81, + 922, 918, 0, 998, 0, 0, 981, 0, 928, 930, + 931, 932, 964, 0, 935, 936, 0, 0, 0, 0, + 0, 100, 983, 106, 0, 114, 0, 0, 119, 120, + 107, 108, 109, 110, 0, 605, -2, 460, 181, 183, + 184, 185, 176, -2, 372, 370, 371, 311, 374, 374, + 337, 338, 339, 340, 341, 342, 0, 0, 330, 331, + 332, 333, 322, 0, 323, 324, 325, 364, 0, 326, + 327, 0, 328, 427, 0, 1491, 390, 391, 393, 401, + 0, 396, 397, 0, 401, 401, 0, 422, 423, 0, + 1483, 1508, 0, 0, 0, 1608, 1607, 1607, 1607, 0, + 169, 170, 171, 172, 173, 174, 641, 0, 0, 617, + 639, 640, 167, 0, 0, 177, 516, 515, 0, 673, + 0, 425, 0, 0, 419, 419, 404, 405, 557, 0, + 0, 648, 649, 650, 651, 0, 0, 0, 543, 454, + 0, 544, 545, 514, 516, 0, 0, 385, 468, 469, + 474, 475, 494, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 592, 593, 594, 597, 599, + 518, 603, 596, 598, 600, 518, 604, 1505, 1506, 1507, + 0, 0, 711, 0, 0, 451, 96, 1596, 716, 720, + 721, 781, 739, 773, 781, 731, 738, 761, 806, 807, + 812, 820, 821, 822, 823, 824, 862, 0, 0, 0, + 0, 870, 0, 0, 1009, 1119, 1121, 1013, 0, 1017, + 1021, 0, 0, 0, 0, 0, 1068, 1066, 1461, 0, + 0, 0, 1115, 0, 0, 0, 1137, 1138, 0, 0, + 0, 1455, 0, 0, 1144, 0, 1416, 1154, 0, 0, + 0, 0, 0, 1160, 1161, 1162, 1163, 1164, 1165, 1166, + 1167, 1168, 1169, 1477, 1171, 0, 0, 0, 0, 0, + 1176, 1177, 1178, 1179, 1180, 0, 1182, 0, 1183, 0, + 0, 0, 0, 1190, 1191, 1193, 0, 0, 1196, 1197, + 0, 1199, 0, 1201, 1202, 1203, 1204, 1205, 1206, 0, + 1208, 0, 1210, 1211, 1212, 0, 1214, 0, 1216, 1217, + 0, 1219, 0, 1221, 0, 1224, 0, 1227, 0, 1230, + 0, 1233, 0, 1236, 0, 1239, 0, 1242, 0, 1245, + 0, 1248, 0, 1251, 0, 1254, 0, 1257, 0, 1260, + 0, 1263, 0, 1266, 0, 1269, 1270, 1271, 0, 1273, + 0, 1275, 0, 1278, 1279, 0, 1281, 0, 1284, 0, + 1287, 0, 0, 1288, 0, 0, 0, 1292, 0, 0, + 0, 0, 1301, 1302, 1303, 1304, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1315, 1316, 1317, 1318, + 1319, 1320, 0, 1322, 0, 1097, 0, 0, 1097, 0, + 0, 0, 0, 0, 1135, 900, 0, 1417, 1418, 1419, + 1420, 1421, 0, 0, 0, 0, 0, 0, 1361, 1362, + 1364, 0, 0, 1367, 0, 1369, 0, 1579, 847, 850, + 852, 938, 987, 988, 0, 0, 0, 0, 968, 1604, + 893, 894, 897, 946, 0, 1465, 0, 0, 925, 998, + 926, 0, 905, 55, 941, 0, 1536, 1535, 1548, 1561, + 383, 383, 377, 378, 384, 379, 381, 382, 1481, 0, + 1486, 0, 1572, 0, 0, 1564, 0, 0, 0, 0, + 0, 0, 0, 0, 971, 0, 0, 974, 0, 0, + 0, 0, 965, 936, 0, 937, 0, -2, 0, 0, + 94, 95, 0, 0, 0, 117, 118, 0, 0, 124, + 386, 387, 158, 167, 462, 182, 435, 0, 0, 307, + 373, 334, 335, 336, 0, 358, 0, 0, 0, 0, + 456, 130, 1495, 1494, 401, 401, 392, 0, 395, 0, + 0, 0, 1609, 361, 424, 0, 148, 0, 0, 0, + 0, 0, 154, 611, 0, 0, 618, 0, 0, 0, + 525, 0, 536, 537, 0, 645, -2, 707, 389, 0, + 403, 406, 953, 0, 0, 538, 0, 541, 542, 455, + 516, 547, 548, 562, 549, 497, 498, 495, 0, 0, + 1518, 1519, 1524, 1522, 1523, 135, 583, 585, 589, 584, + 588, 0, 0, 0, 520, 0, 520, 581, 0, 451, + 1491, 0, 715, 452, 453, 784, 784, 857, 99, 0, + 860, 0, 0, 0, 0, 1014, 1018, 1031, 1032, 1422, + 1448, 360, 360, 1435, 360, 366, 1438, 360, 1440, 360, + 1443, 360, 1446, 1447, 0, 0, 1061, 0, 915, 0, + 0, 1143, 1458, 0, 0, 1155, 1156, 1157, 1158, 1159, + 1452, 0, 0, 0, 1175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 146, 147, 0, 0, 0, + 0, 0, 0, 1372, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1092, 1096, 0, 1098, 1099, + 0, 0, 1324, 0, 0, 1342, 0, 0, 0, 0, + 0, 0, 0, 1462, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 989, 994, 994, 994, 0, 0, + 0, 1591, 1592, 1466, 1467, 998, 1468, 927, 906, 945, + 1554, 0, 1547, 0, -2, 1556, 0, 0, 0, 1562, + 375, 376, 919, 82, 999, 85, 0, 1572, 1581, 0, + 1563, 1574, 1576, 0, 0, 0, 1568, 0, 998, 929, + 960, 962, 0, 957, 972, 973, 975, 0, 977, 0, + 979, 980, 940, 934, 0, 102, 0, 998, 998, 101, + 0, 985, 121, 122, 123, 461, 186, 191, 0, 0, + 0, 196, 0, 198, 0, 0, 0, 203, 204, 401, + 401, 436, 0, 304, 306, 0, 0, 189, 374, 0, + 374, 0, 365, 367, 0, 437, 457, 1492, 1493, 0, + 0, 394, 398, 399, 400, 0, 1598, 150, 0, 0, + 0, 614, 0, 642, 0, 0, 0, 0, 0, 0, + 178, 517, 674, 675, 676, 677, 678, 679, 680, 681, + 682, 0, 401, 0, 0, 0, 401, 401, 401, 0, + 699, 388, 0, 0, 670, 667, 539, 0, 220, 221, + 228, 229, 231, 0, 0, 0, 0, 0, 546, 940, + 1509, 1510, 1511, 0, 1521, 1525, 138, 0, 0, 0, + 0, 591, 595, 601, 0, 519, 602, 712, 713, 714, + 97, 724, 730, 859, 879, 1007, 1015, 1019, 0, 0, + 0, 0, 1449, 1433, 374, 1436, 1437, 1439, 1441, 1442, + 1444, 1445, 1057, 1058, 1062, 0, 1140, 0, 1142, 1456, + 0, 1486, 0, 0, 0, 1174, 0, 0, 0, 1185, + 1184, 1186, 0, 1188, 1189, 1194, 1195, 1198, 1200, 1207, + 1209, 1213, 1215, 1218, 1220, 1222, 0, 1225, 0, 1228, + 0, 1231, 0, 1234, 0, 1237, 0, 1240, 0, 1243, + 0, 1246, 0, 1249, 0, 1252, 0, 1255, 0, 1258, + 0, 1261, 0, 1264, 0, 1267, 0, 1272, 1274, 0, + 1277, 1280, 1282, 0, 1285, 0, 1289, 0, 1291, 1293, + 1294, 0, 0, 0, 1305, 1306, 1307, 1308, 1309, 1310, + 1311, 1312, 1313, 1314, 1321, 0, 1090, 1093, 1323, 1100, + 1101, 1106, 1326, 0, 0, 0, 1329, 0, 0, 0, + 1333, 1136, 1344, 0, 1349, 0, 0, 1355, 0, 1359, + 0, 1365, 1366, 1368, 1370, 0, 0, 0, 0, 0, + 966, 947, 66, 1468, 1470, 0, 1541, 1539, 1539, 1549, + 1550, 0, 0, 1557, 0, 0, 0, 0, 86, 0, + 0, 0, 1577, 0, 0, 0, 0, 103, 1477, 954, + 961, 0, 0, 955, 0, 956, 976, 978, 933, 0, + 998, 998, 92, 93, 0, 192, 0, 194, 0, 197, + 199, 200, 201, 207, 208, 209, 202, 0, 0, 303, + 305, 0, 0, 348, 359, 349, 0, 0, 1496, 1497, + 1498, 1499, 1500, 1501, 1502, 1503, 940, 151, 152, 153, + 606, 0, 616, 0, 942, 0, 609, 0, 528, 0, + 0, 0, 401, 401, 401, 0, 0, 0, 0, 684, + 0, 0, 647, 0, 655, 0, 0, 0, 232, 233, + 0, 1520, 582, 0, 136, 137, 0, 0, 587, 521, + 522, 1055, 0, 0, 0, 1056, 1434, 0, 0, 0, + 0, 1453, 0, 0, 0, 0, 1181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1297, + 0, 0, 0, 636, 637, 0, 1373, 1095, 1477, 0, + 1097, 1107, 1108, 0, 1097, 1343, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 995, 0, 0, + 0, 0, 986, 1470, 1475, 0, 0, 1544, 0, 1537, + 1540, 1538, 1551, 0, 0, 1558, 0, 1560, 0, 1582, + 1583, 1575, 0, 1567, 1570, 1566, 1569, 1486, 958, 0, + 963, 0, 1477, 91, 0, 195, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 205, 206, 0, 0, 363, + 368, 0, 0, 0, 607, 0, 943, 619, 610, 0, + 697, 0, 701, 0, 0, 0, 704, 705, 706, 683, + 0, 687, 429, 671, 668, 669, 540, 0, 139, 140, + 0, 0, 0, 1423, 0, 1426, 1139, 1141, 0, 1170, + 1172, 1173, 1431, 1432, 1187, 1223, 1226, 1229, 1232, 1235, + 1238, 1241, 1244, 1247, 1250, 1253, 1256, 1259, 1262, 1265, + 1268, 1276, 1283, 1286, 1290, 1295, 0, 1298, 0, 0, + 1299, 0, 638, 1086, 0, 0, 1104, 1105, 0, 1328, + 1330, 1331, 1332, 1345, 0, 1350, 1351, 0, 1356, 0, + 1360, 1371, 0, 991, 948, 949, 996, 997, 0, 0, + 939, 1475, 84, 1476, 1473, 0, 1471, 1469, 1533, 0, + 1542, 1543, 1552, 1553, 1559, 0, 1565, 0, 89, 0, + 0, 0, 1486, 193, 0, 212, 0, 615, 0, 618, + 608, 695, 696, 0, 708, 700, 702, 703, 685, -2, + 1512, 0, 0, 0, 590, 1424, 0, 0, 1300, 0, + 634, 635, 1094, 1087, 0, 1072, 1073, 1091, 1325, 1327, + 0, 0, 0, 0, 990, 992, 993, 83, 0, 1472, + 1112, 0, 1545, 1546, 1573, 1571, 959, 966, 0, 90, + 442, 435, 1512, 0, 0, 0, 688, 689, 690, 691, + 692, 693, 694, 579, 1514, 141, 142, 0, 509, 510, + 511, 135, 0, 1145, 1296, 1088, 0, 0, 0, 0, + 0, 1346, 0, 1352, 0, 1357, 0, 950, 951, 1474, + 0, 0, 620, 0, 622, 0, -2, 430, 443, 0, + 187, 213, 214, 0, 0, 217, 218, 219, 210, 211, + 131, 0, 0, 709, 0, 1515, 1516, 0, 138, 0, + 0, 1079, 1080, 1081, 1082, 1084, 0, 0, 0, 0, + 1113, 1092, 621, 0, 0, 385, 0, 631, 431, 432, + 0, 438, 439, 440, 441, 215, 216, 643, 0, 0, + 508, 586, 1425, 0, 0, 1347, 0, 1353, 0, 1358, + 0, 623, 624, 632, 0, 433, 0, 434, 0, 0, + 0, 612, 0, 643, 1513, 1089, 1083, 1085, 0, 0, + 1111, 0, 633, 629, 444, 446, 447, 0, 0, 445, + 644, 613, 1348, 1354, 0, 448, 449, 450, 625, 626, + 627, 628, } var yyTok1 = [...]int{ @@ -21510,336 +21530,376 @@ yydefault: } yyVAL.union = yyLOCAL case 1527: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Lock //line sql.y:7515 { - yyLOCAL = ShareModeLock + yyLOCAL = ForUpdateLockNoWait } yyVAL.union = yyLOCAL case 1528: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL Lock +//line sql.y:7519 + { + yyLOCAL = ForUpdateLockSkipLocked + } + yyVAL.union = yyLOCAL + case 1529: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL Lock +//line sql.y:7523 + { + yyLOCAL = ForShareLock + } + yyVAL.union = yyLOCAL + case 1530: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL Lock +//line sql.y:7527 + { + yyLOCAL = ForShareLockNoWait + } + yyVAL.union = yyLOCAL + case 1531: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL Lock +//line sql.y:7531 + { + yyLOCAL = ForShareLockSkipLocked + } + yyVAL.union = yyLOCAL + case 1532: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL Lock +//line sql.y:7535 + { + yyLOCAL = ShareModeLock + } + yyVAL.union = yyLOCAL + case 1533: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7521 +//line sql.y:7541 { yyLOCAL = &SelectInto{Type: IntoOutfileS3, FileName: encodeSQLString(yyDollar[4].str), Charset: yyDollar[5].columnCharset, FormatOption: yyDollar[6].str, ExportOption: yyDollar[7].str, Manifest: yyDollar[8].str, Overwrite: yyDollar[9].str} } yyVAL.union = yyLOCAL - case 1529: + case 1534: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7525 +//line sql.y:7545 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: ColumnCharset{}, FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1530: + case 1535: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:7529 +//line sql.y:7549 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].columnCharset, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1531: + case 1536: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7534 +//line sql.y:7554 { yyVAL.str = "" } - case 1532: + case 1537: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7538 +//line sql.y:7558 { yyVAL.str = " format csv" + yyDollar[3].str } - case 1533: + case 1538: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7542 +//line sql.y:7562 { yyVAL.str = " format text" + yyDollar[3].str } - case 1534: + case 1539: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7547 +//line sql.y:7567 { yyVAL.str = "" } - case 1535: + case 1540: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7551 +//line sql.y:7571 { yyVAL.str = " header" } - case 1536: + case 1541: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7556 +//line sql.y:7576 { yyVAL.str = "" } - case 1537: + case 1542: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7560 +//line sql.y:7580 { yyVAL.str = " manifest on" } - case 1538: + case 1543: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7564 +//line sql.y:7584 { yyVAL.str = " manifest off" } - case 1539: + case 1544: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7569 +//line sql.y:7589 { yyVAL.str = "" } - case 1540: + case 1545: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7573 +//line sql.y:7593 { yyVAL.str = " overwrite on" } - case 1541: + case 1546: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7577 +//line sql.y:7597 { yyVAL.str = " overwrite off" } - case 1542: + case 1547: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7583 +//line sql.y:7603 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1543: + case 1548: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7588 +//line sql.y:7608 { yyVAL.str = "" } - case 1544: + case 1549: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7592 +//line sql.y:7612 { yyVAL.str = " lines" + yyDollar[2].str } - case 1545: + case 1550: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7598 +//line sql.y:7618 { yyVAL.str = yyDollar[1].str } - case 1546: + case 1551: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7602 +//line sql.y:7622 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1547: + case 1552: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7608 +//line sql.y:7628 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } - case 1548: + case 1553: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7612 +//line sql.y:7632 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1549: + case 1554: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7617 +//line sql.y:7637 { yyVAL.str = "" } - case 1550: + case 1555: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7621 +//line sql.y:7641 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } - case 1551: + case 1556: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7627 +//line sql.y:7647 { yyVAL.str = yyDollar[1].str } - case 1552: + case 1557: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7631 +//line sql.y:7651 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1553: + case 1558: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7637 +//line sql.y:7657 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1554: + case 1559: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:7641 +//line sql.y:7661 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } - case 1555: + case 1560: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7645 +//line sql.y:7665 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } - case 1556: + case 1561: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7650 +//line sql.y:7670 { yyVAL.str = "" } - case 1557: + case 1562: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7654 +//line sql.y:7674 { yyVAL.str = " optionally" } - case 1558: + case 1563: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Insert -//line sql.y:7667 +//line sql.y:7687 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion()} } yyVAL.union = yyLOCAL - case 1559: + case 1564: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:7671 +//line sql.y:7691 { yyLOCAL = &Insert{Rows: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1560: + case 1565: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:7675 +//line sql.y:7695 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion()} } yyVAL.union = yyLOCAL - case 1561: + case 1566: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7679 +//line sql.y:7699 { yyLOCAL = &Insert{Columns: []IdentifierCI{}, Rows: yyDollar[4].valuesUnion()} } yyVAL.union = yyLOCAL - case 1562: + case 1567: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:7683 +//line sql.y:7703 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1563: + case 1568: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:7689 +//line sql.y:7709 { yyLOCAL = Columns{yyDollar[1].identifierCI} } yyVAL.union = yyLOCAL - case 1564: + case 1569: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:7693 +//line sql.y:7713 { yyLOCAL = Columns{yyDollar[3].identifierCI} } yyVAL.union = yyLOCAL - case 1565: + case 1570: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7697 +//line sql.y:7717 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].identifierCI) } - case 1566: + case 1571: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:7701 +//line sql.y:7721 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].identifierCI) } - case 1567: + case 1572: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7706 +//line sql.y:7726 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1568: + case 1573: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7710 +//line sql.y:7730 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 1569: + case 1574: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:7716 +//line sql.y:7736 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL - case 1570: + case 1575: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7720 +//line sql.y:7740 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) } - case 1571: + case 1576: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7726 +//line sql.y:7746 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1572: + case 1577: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7730 +//line sql.y:7750 { yyLOCAL = ValTuple{} } yyVAL.union = yyLOCAL - case 1573: + case 1578: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7736 +//line sql.y:7756 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 1574: + case 1579: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL ValTuple -//line sql.y:7740 +//line sql.y:7760 { yyLOCAL = ValTuple(yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 1575: + case 1580: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7745 +//line sql.y:7765 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -21848,300 +21908,300 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1576: + case 1581: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:7755 +//line sql.y:7775 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 1577: + case 1582: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:7759 +//line sql.y:7779 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) } - case 1578: + case 1583: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:7765 +//line sql.y:7785 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1580: + case 1585: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:7772 +//line sql.y:7792 { yyVAL.str = "charset" } - case 1583: + case 1588: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7782 +//line sql.y:7802 { yyLOCAL = NewStrLiteral(yyDollar[1].identifierCI.String()) } yyVAL.union = yyLOCAL - case 1584: + case 1589: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7786 +//line sql.y:7806 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1585: + case 1590: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:7790 +//line sql.y:7810 { yyLOCAL = &Default{} } yyVAL.union = yyLOCAL - case 1588: + case 1593: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7799 +//line sql.y:7819 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1589: + case 1594: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:7801 +//line sql.y:7821 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1590: + case 1595: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7804 +//line sql.y:7824 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1591: + case 1596: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:7806 +//line sql.y:7826 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1592: + case 1597: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:7809 +//line sql.y:7829 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1593: + case 1598: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:7811 +//line sql.y:7831 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1594: + case 1599: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:7814 +//line sql.y:7834 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1595: + case 1600: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:7816 +//line sql.y:7836 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1596: + case 1601: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7819 +//line sql.y:7839 { yyVAL.empty = struct{}{} } - case 1597: + case 1602: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7821 +//line sql.y:7841 { yyVAL.empty = struct{}{} } - case 1598: + case 1603: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7823 +//line sql.y:7843 { yyVAL.empty = struct{}{} } - case 1599: + case 1604: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:7827 +//line sql.y:7847 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL - case 1600: + case 1605: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:7832 +//line sql.y:7852 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1601: + case 1606: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:7836 +//line sql.y:7856 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1602: + case 1607: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7841 +//line sql.y:7861 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1603: + case 1608: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:7843 +//line sql.y:7863 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 1604: + case 1609: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:7847 +//line sql.y:7867 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].identifierCI.String())} } yyVAL.union = yyLOCAL - case 1605: + case 1610: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7853 +//line sql.y:7873 { yyVAL.identifierCI = yyDollar[1].identifierCI } - case 1606: + case 1611: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7857 +//line sql.y:7877 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 1608: + case 1613: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7864 +//line sql.y:7884 { yyVAL.identifierCI = NewIdentifierCI(string(yyDollar[1].str)) } - case 1609: + case 1614: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7870 +//line sql.y:7890 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1610: + case 1615: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7874 +//line sql.y:7894 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1611: + case 1616: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:7880 +//line sql.y:7900 { yyVAL.identifierCS = NewIdentifierCS("") } - case 1612: + case 1617: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7884 +//line sql.y:7904 { yyVAL.identifierCS = yyDollar[1].identifierCS } - case 1614: + case 1619: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:7891 +//line sql.y:7911 { yyVAL.identifierCS = NewIdentifierCS(string(yyDollar[1].str)) } - case 1615: + case 1620: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:7897 +//line sql.y:7917 { yyLOCAL = &Kill{Type: yyDollar[2].killTypeUnion(), ProcesslistID: convertStringToUInt64(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 1616: + case 1621: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL KillType -//line sql.y:7903 +//line sql.y:7923 { yyLOCAL = ConnectionType } yyVAL.union = yyLOCAL - case 1617: + case 1622: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:7907 +//line sql.y:7927 { yyLOCAL = ConnectionType } yyVAL.union = yyLOCAL - case 1618: + case 1623: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL KillType -//line sql.y:7911 +//line sql.y:7931 { yyLOCAL = QueryType } yyVAL.union = yyLOCAL - case 2233: + case 2238: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8554 +//line sql.y:8574 { } - case 2234: + case 2239: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8559 +//line sql.y:8579 { } - case 2235: + case 2240: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8563 +//line sql.y:8583 { skipToEnd(yylex) } - case 2236: + case 2241: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:8568 +//line sql.y:8588 { skipToEnd(yylex) } - case 2237: + case 2242: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8572 +//line sql.y:8592 { skipToEnd(yylex) } - case 2238: + case 2243: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:8576 +//line sql.y:8596 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 4ed613718fd..a71e8e6ac4c 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -7511,6 +7511,26 @@ FOR UPDATE { $$ = ForUpdateLock } +| FOR UPDATE NOWAIT + { + $$ = ForUpdateLockNoWait + } +| FOR UPDATE SKIP LOCKED + { + $$ = ForUpdateLockSkipLocked + } +| FOR SHARE + { + $$ = ForShareLock + } +| FOR SHARE NOWAIT + { + $$ = ForShareLockNoWait + } +| FOR SHARE SKIP LOCKED + { + $$ = ForShareLockSkipLocked + } | LOCK IN SHARE MODE { $$ = ShareModeLock diff --git a/go/vt/sqlparser/testdata/union_cases.txt b/go/vt/sqlparser/testdata/union_cases.txt index 8e2def0e04e..d5b620cb246 100644 --- a/go/vt/sqlparser/testdata/union_cases.txt +++ b/go/vt/sqlparser/testdata/union_cases.txt @@ -1004,7 +1004,7 @@ INPUT SELECT 1 FOR SHARE UNION SELECT 2; END ERROR -syntax error at position 19 near 'SHARE' +syntax error at position 25 near 'UNION' END INPUT SELECT ST_AsText(ST_Union(shore, boundary)) FROM lakes, named_places WHERE lakes.name = 'Blue Lake' AND named_places.name = 'Goose Island'; diff --git a/go/vt/vtgate/planbuilder/testdata/lock_cases.json b/go/vt/vtgate/planbuilder/testdata/lock_cases.json index c14ba026869..568b066fa22 100644 --- a/go/vt/vtgate/planbuilder/testdata/lock_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/lock_cases.json @@ -124,5 +124,95 @@ "main.dual" ] } + }, + { + "comment": "select nowait", + "query": "select u.col, u.bar from user u join music m on u.foo = m.foo for update nowait", + "plan": { + "QueryType": "SELECT", + "Original": "select u.col, u.bar from user u join music m on u.foo = m.foo for update nowait", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0,L:1", + "JoinVars": { + "u_foo": 2 + }, + "TableName": "`user`_music", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select u.col, u.bar, u.foo from `user` as u where 1 != 1", + "Query": "select u.col, u.bar, u.foo from `user` as u for update nowait", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from music as m where 1 != 1", + "Query": "select 1 from music as m where m.foo = :u_foo for update nowait", + "Table": "music" + } + ] + }, + "TablesUsed": [ + "user.music", + "user.user" + ] + } + }, + { + "comment": "select skip locked", + "query": "select u.col, u.bar from user u join music m on u.foo = m.foo for share skip locked", + "plan": { + "QueryType": "SELECT", + "Original": "select u.col, u.bar from user u join music m on u.foo = m.foo for share skip locked", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "L:0,L:1", + "JoinVars": { + "u_foo": 2 + }, + "TableName": "`user`_music", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select u.col, u.bar, u.foo from `user` as u where 1 != 1", + "Query": "select u.col, u.bar, u.foo from `user` as u for share skip locked", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "Scatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from music as m where 1 != 1", + "Query": "select 1 from music as m where m.foo = :u_foo for share skip locked", + "Table": "music" + } + ] + }, + "TablesUsed": [ + "user.music", + "user.user" + ] + } } ]
HealthCheck Tablet Cache%s
Cell