From 7419ee0e4eeb5aed22d51851e6825665bc6153b9 Mon Sep 17 00:00:00 2001 From: Rohit Nayak <57520317+rohit-nayak-ps@users.noreply.github.com> Date: Wed, 27 Apr 2022 10:04:39 +0200 Subject: [PATCH 01/22] MoveTables: adjust datetimes when importing from non-UTC sources into UTC targets (#10102) * Add e2e test case for source and target in different time zones Signed-off-by: Rohit Nayak * Added source_time_zone option to MoveTables v2, pass it through to table plan builder and convert datetime columns if option is provided. e2e test demonstrates this works. VDiff needs to be modified Signed-off-by: Rohit Nayak * Add time zone support in VDiff. Improve tests. Signed-off-by: Rohit Nayak * Add vdiff unit test Signed-off-by: Rohit Nayak * Add SourceTimeZone to Workflow Show Signed-off-by: Rohit Nayak * Update workflow test for added attribute SourceTimeZone Signed-off-by: Rohit Nayak * Support SourceTimeZone in reverse workflows, update e2e test Signed-off-by: Rohit Nayak * Update unit tests Signed-off-by: Rohit Nayak * Refactor vdiff timezone-related changes Signed-off-by: Rohit Nayak * Address review comment nits Signed-off-by: Rohit Nayak * Fix: lower col name also for time zone cols Signed-off-by: Rohit Nayak * Use field type for type comparison instead of the string representation Signed-off-by: Rohit Nayak * Check if current primaries have time zone loaded Signed-off-by: Rohit Nayak * Address review comments Signed-off-by: Rohit Nayak * Use same date for conversion and as date format Signed-off-by: Rohit Nayak --- go/test/endtoend/vreplication/config.go | 12 +- .../endtoend/vreplication/time_zone_test.go | 200 ++ go/test/endtoend/vreplication/tz.sql | 217 ++ .../vreplication/unsharded_init_data.sql | 7 + go/vt/proto/binlogdata/binlogdata.pb.go | 465 ++-- .../proto/binlogdata/binlogdata_vtproto.pb.go | 86 + go/vt/proto/vtctldata/vtctldata.pb.go | 2329 +++++++++-------- go/vt/proto/vtctldata/vtctldata_vtproto.pb.go | 86 + go/vt/vtctl/vtctl.go | 7 +- go/vt/vtctl/workflow/traffic_switcher.go | 1 + .../vreplication/replicator_plan.go | 2 + .../vreplication/replicator_plan_test.go | 12 +- .../vreplication/table_plan_builder.go | 25 +- .../tabletmanager/vreplication/vcopier.go | 4 +- .../tabletmanager/vreplication/vplayer.go | 2 +- go/vt/wrangler/materializer.go | 44 +- go/vt/wrangler/materializer_test.go | 14 +- go/vt/wrangler/traffic_switcher.go | 19 +- go/vt/wrangler/vdiff.go | 71 +- go/vt/wrangler/vdiff_test.go | 31 +- go/vt/wrangler/vexec.go | 13 +- go/vt/wrangler/vexec_test.go | 4 +- go/vt/wrangler/workflow.go | 6 +- proto/binlogdata.proto | 6 + proto/vtctldata.proto | 6 + 25 files changed, 2261 insertions(+), 1408 deletions(-) create mode 100644 go/test/endtoend/vreplication/time_zone_test.go create mode 100644 go/test/endtoend/vreplication/tz.sql diff --git a/go/test/endtoend/vreplication/config.go b/go/test/endtoend/vreplication/config.go index 2fd1946224b..1020f10758b 100644 --- a/go/test/endtoend/vreplication/config.go +++ b/go/test/endtoend/vreplication/config.go @@ -29,6 +29,7 @@ create table ` + "`Lead`(`Lead-id`" + ` binary(16), name varbinary(16), date1 da create table ` + "`Lead-1`(`Lead`" + ` binary(16), name varbinary(16), date1 datetime not null default '0000-00-00 00:00:00', date2 datetime not null default '2021-00-01 00:00:00', primary key (` + "`Lead`" + `)); create table _vt_PURGE_4f9194b43b2011eb8a0104ed332e05c2_20221210194431(id int, val varbinary(128), primary key(id)); create table db_order_test (c_uuid varchar(64) not null default '', created_at datetime not null, dstuff varchar(128), dtstuff text, dbstuff blob, cstuff char(32), primary key (c_uuid,created_at)) CHARSET=utf8mb4; +create table datze (id int, dt1 datetime not null default current_timestamp, dt2 datetime not null, ts1 timestamp default current_timestamp, primary key (id)); ` // These should always be ignored in vreplication @@ -60,7 +61,8 @@ create table db_order_test (c_uuid varchar(64) not null default '', created_at d }, "Lead": {}, "Lead-1": {}, - "db_order_test": {} + "db_order_test": {}, + "datze": {} } } ` @@ -127,6 +129,14 @@ create table db_order_test (c_uuid varchar(64) not null default '', created_at d "name": "xxhash" } ] + }, + "datze": { + "column_vindexes": [ + { + "column": "id", + "name": "reverse_bits" + } + ] } } } diff --git a/go/test/endtoend/vreplication/time_zone_test.go b/go/test/endtoend/vreplication/time_zone_test.go new file mode 100644 index 00000000000..69822e2f3d3 --- /dev/null +++ b/go/test/endtoend/vreplication/time_zone_test.go @@ -0,0 +1,200 @@ +/* +Copyright 2022 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 ( + "fmt" + "os" + "testing" + "time" + + "vitess.io/vitess/go/test/endtoend/cluster" + + "github.com/stretchr/testify/require" + + "vitess.io/vitess/go/vt/log" +) + +// TestMoveTablesTZ tests the conversion of datetime based on the source timezone passed to the MoveTables workflow +func TestMoveTablesTZ(t *testing.T) { + allCellNames = "zone1" + defaultCellName := "zone1" + workflow := "tz" + sourceKs := "product" + targetKs := "customer" + ksWorkflow := fmt.Sprintf("%s.%s", targetKs, workflow) + ksReverseWorkflow := fmt.Sprintf("%s.%s_reverse", sourceKs, workflow) + + vc = NewVitessCluster(t, "TestCellAliasVreplicationWorkflow", []string{"zone1"}, mainClusterConfig) + require.NotNil(t, vc) + defaultCell = vc.Cells[defaultCellName] + cells := []*Cell{defaultCell} + + defer vc.TearDown(t) + + cell1 := vc.Cells["zone1"] + vc.AddKeyspace(t, []*Cell{cell1}, sourceKs, "0", initialProductVSchema, initialProductSchema, 0, 0, 100, sourceKsOpts) + + vtgate = cell1.Vtgates[0] + require.NotNil(t, vtgate) + vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "product", "0"), 1) + + vtgateConn = getConnection(t, vc.ClusterConfig.hostname, vc.ClusterConfig.vtgateMySQLPort) + defer vtgateConn.Close() + verifyClusterHealth(t, vc) + + productTab := vc.Cells[defaultCell.Name].Keyspaces[sourceKs].Shards["0"].Tablets["zone1-100"].Vttablet + timeZoneSQLBytes, _ := os.ReadFile("tz.sql") + timeZoneSQL := string(timeZoneSQLBytes) + + // it seems to take some time for the mysql server to load time zone info after the tables in mysql db have been populated + loadTimeZoneInfo := func(tab *cluster.VttabletProcess, sql, timezone string) { + _, err := tab.QueryTabletWithDB(timeZoneSQL, "mysql") + require.NoError(t, err) + timer := time.NewTimer(1 * time.Minute) + for { + select { + case <-timer.C: + require.Fail(t, "could not load time zone info") + default: + } + _, err = tab.QueryTablet(fmt.Sprintf("SET GLOBAL time_zone = '%s';", timezone), "", false) + if err == nil { + timer.Stop() + return + } + time.Sleep(100 * time.Millisecond) + } + } + loadTimeZoneInfo(productTab, timeZoneSQL, "US/Pacific") + + insertInitialData(t) + + if _, err := vc.AddKeyspace(t, cells, targetKs, "0", customerVSchema, customerSchema, defaultReplicas, defaultRdonly, 200, targetKsOpts); err != nil { + t.Fatal(err) + } + if err := vtgate.WaitForStatusOfTabletInShard(fmt.Sprintf("%s.%s.primary", "customer", "0"), 1); err != nil { + t.Fatal(err) + } + + defaultCell := vc.Cells["zone1"] + custKs := vc.Cells[defaultCell.Name].Keyspaces[targetKs] + customerTab := custKs.Shards["0"].Tablets["zone1-200"].Vttablet + + loadTimeZoneInfo(customerTab, timeZoneSQL, "UTC") + + tables := "datze" + + ksErrorWorkflow := fmt.Sprintf("%s.%s", targetKs, "tzerr") + output, err := vc.VtctlClient.ExecuteCommandWithOutput("MoveTables", "--", "--source", sourceKs, "--tables", + tables, "--source_time_zone", "US/Pacifik", "Create", ksErrorWorkflow) + require.Error(t, err, output) + require.Contains(t, output, "time zone is invalid") + + output, err = vc.VtctlClient.ExecuteCommandWithOutput("MoveTables", "--", "--source", sourceKs, "--tables", + tables, "--source_time_zone", "US/Pacific", "Create", ksWorkflow) + require.NoError(t, err, output) + + catchup(t, customerTab, workflow, "MoveTables") + + // inserts to test date conversions in replication (vplayer) mode + _, err = vtgateConn.ExecuteFetch("insert into datze(id, dt2) values (11, '2022-01-01 10:20:30')", 1, false) // standard time + require.NoError(t, err) + _, err = vtgateConn.ExecuteFetch("insert into datze(id, dt2) values (12, '2022-04-01 5:06:07')", 1, false) // dst + require.NoError(t, err) + + vdiff(t, ksWorkflow, "") + + query := "select * from datze" + qrSourceUSPacific, err := productTab.QueryTablet(query, sourceKs, true) + require.NoError(t, err) + require.NotNil(t, qrSourceUSPacific) + + qrTargetUTC, err := customerTab.QueryTablet(query, targetKs, true) + require.NoError(t, err) + require.NotNil(t, qrTargetUTC) + + require.Equal(t, len(qrSourceUSPacific.Rows), len(qrTargetUTC.Rows)) + + pacificLocation, err := time.LoadLocation("US/Pacific") + require.NoError(t, err) + + // for reference the columns in the test are as follows: + // * dt1 datetime default current_timestamp, constant for all rows + // * dt2 datetime, different values. First row is in standard time, rest with daylight savings including times around the time zone switch + // * ts1 timestamp default current_timestamp, constant for all rows + for i, row := range qrSourceUSPacific.Named().Rows { + // source and UTC results must differ since source is in US/Pacific + require.NotEqual(t, row.AsString("dt1", ""), qrTargetUTC.Named().Rows[i].AsString("dt1", "")) + require.NotEqual(t, row.AsString("dt2", ""), qrTargetUTC.Named().Rows[i].AsString("dt2", "")) + require.NotEqual(t, row.AsString("ts1", ""), qrTargetUTC.Named().Rows[i].AsString("ts1", "")) + + dtLayout := "2006-01-02 15:04:05" + // now compare times b/w source and target (actual). VDiff has already compared, but we want to validate that vdiff is right too! + dt2a, err := time.Parse(dtLayout, qrTargetUTC.Named().Rows[i].AsString("dt2", "")) + require.NoError(t, err) + targetUTCTUnix := dt2a.Unix() + + dt2b, err := time.Parse(dtLayout, qrSourceUSPacific.Named().Rows[i].AsString("dt2", "")) + require.NoError(t, err) + sourceUSPacific := dt2b.Unix() + + dtt := dt2b.In(pacificLocation) + zone, _ := dtt.Zone() + var hoursBehind int64 + if zone == "PDT" { // daylight savings is on + hoursBehind = 7 + } else { + hoursBehind = 8 + } + // extra logging, so that we can spot any issues in CI test runs + log.Infof("times are %s, %s, hours behind %d", dt2a, dt2b, hoursBehind) + require.Equal(t, hoursBehind*3600, targetUTCTUnix-sourceUSPacific) + } + + // user should be either running this query or have set their location in their driver to map from the time in Vitess/UTC to local + query = "select id, convert_tz(dt1, 'UTC', 'US/Pacific') dt1, convert_tz(dt2, 'UTC', 'US/Pacific') dt2, convert_tz(ts1, 'UTC', 'US/Pacific') ts1 from datze" + qrTargetUSPacific, err := customerTab.QueryTablet(query, "customer", true) + require.NoError(t, err) + require.NotNil(t, qrTargetUSPacific) + require.Equal(t, len(qrSourceUSPacific.Rows), len(qrTargetUSPacific.Rows)) + + for i, row := range qrSourceUSPacific.Named().Rows { + // source and target results must match since source is in US/Pacific and we are converting target columns explicitly to US/Pacific + require.Equal(t, row.AsString("dt1", ""), qrTargetUSPacific.Named().Rows[i].AsString("dt1", "")) + require.Equal(t, row.AsString("dt2", ""), qrTargetUSPacific.Named().Rows[i].AsString("dt2", "")) + require.Equal(t, row.AsString("ts1", ""), qrTargetUSPacific.Named().Rows[i].AsString("ts1", "")) + } + + output, err = vc.VtctlClient.ExecuteCommandWithOutput("MoveTables", "--", "SwitchTraffic", ksWorkflow) + require.NoError(t, err, output) + + qr, err := productTab.QueryTablet(fmt.Sprintf("select * from _vt.vreplication where workflow='%s_reverse'", workflow), "", false) + if err != nil { + return + } + for _, row := range qr.Named().Rows { + bls := row["source"].ToString() + require.Contains(t, bls, "source_time_zone:\"UTC\"") + require.Contains(t, bls, "target_time_zone:\"US/Pacific\"") + } + + // inserts to test date conversions in reverse replication + execVtgateQuery(t, vtgateConn, "customer", "insert into datze(id, dt2) values (13, '2022-01-01 18:20:30')") + execVtgateQuery(t, vtgateConn, "customer", "insert into datze(id, dt2) values (14, '2022-04-01 12:06:07')") + vdiff(t, ksReverseWorkflow, "") +} diff --git a/go/test/endtoend/vreplication/tz.sql b/go/test/endtoend/vreplication/tz.sql new file mode 100644 index 00000000000..aa971e54016 --- /dev/null +++ b/go/test/endtoend/vreplication/tz.sql @@ -0,0 +1,217 @@ +# install only US/Pacific and UTC timezones, for e2e tests +# this file is a subset of the output of "mysql_tzinfo_to_sql /usr/share/zoneinfo" +# each time zone set starts with an "insert into time_zone". So we cut/paste all inserts from the start of our +# candidate time zone upto the next one. +TRUNCATE TABLE time_zone; +TRUNCATE TABLE time_zone_name; +TRUNCATE TABLE time_zone_transition; +TRUNCATE TABLE time_zone_transition_type; +START TRANSACTION; +INSERT INTO time_zone (Use_leap_seconds) +VALUES ('N'); +SET +@time_zone_id= LAST_INSERT_ID(); +INSERT INTO time_zone_name (Name, Time_zone_id) +VALUES ('US/Pacific', @time_zone_id); +INSERT INTO time_zone_transition (Time_zone_id, Transition_time, Transition_type_id) +VALUES (@time_zone_id, -2147483648, 2) + , (@time_zone_id, -1633269600, 1) + , (@time_zone_id, -1615129200, 2) + , (@time_zone_id, -1601820000, 1) + , (@time_zone_id, -1583679600, 2) + , (@time_zone_id, -880207200, 3) + , (@time_zone_id, -769395600, 4) + , (@time_zone_id, -765385200, 2) + , (@time_zone_id, -687967140, 1) + , (@time_zone_id, -662655600, 2) + , (@time_zone_id, -620838000, 1) + , (@time_zone_id, -608137200, 2) + , (@time_zone_id, -589388400, 1) + , (@time_zone_id, -576082800, 2) + , (@time_zone_id, -557938800, 1) + , (@time_zone_id, -544633200, 2) + , (@time_zone_id, -526489200, 1) + , (@time_zone_id, -513183600, 2) + , (@time_zone_id, -495039600, 1) + , (@time_zone_id, -481734000, 2) + , (@time_zone_id, -463590000, 1) + , (@time_zone_id, -450284400, 2) + , (@time_zone_id, -431535600, 1) + , (@time_zone_id, -418230000, 2) + , (@time_zone_id, -400086000, 1) + , (@time_zone_id, -386780400, 2) + , (@time_zone_id, -368636400, 1) + , (@time_zone_id, -355330800, 2) + , (@time_zone_id, -337186800, 1) + , (@time_zone_id, -323881200, 2) + , (@time_zone_id, -305737200, 1) + , (@time_zone_id, -292431600, 2) + , (@time_zone_id, -273682800, 1) + , (@time_zone_id, -260982000, 2) + , (@time_zone_id, -242233200, 1) + , (@time_zone_id, -226508400, 2) + , (@time_zone_id, -210783600, 1) + , (@time_zone_id, -195058800, 2) + , (@time_zone_id, -179334000, 1) + , (@time_zone_id, -163609200, 2) + , (@time_zone_id, -147884400, 1) + , (@time_zone_id, -131554800, 2) + , (@time_zone_id, -116434800, 1) + , (@time_zone_id, -100105200, 2) + , (@time_zone_id, -84376800, 1) + , (@time_zone_id, -68655600, 2) + , (@time_zone_id, -52927200, 1) + , (@time_zone_id, -37206000, 2) + , (@time_zone_id, -21477600, 1) + , (@time_zone_id, -5756400, 2) + , (@time_zone_id, 9972000, 1) + , (@time_zone_id, 25693200, 2) + , (@time_zone_id, 41421600, 1) + , (@time_zone_id, 57747600, 2) + , (@time_zone_id, 73476000, 1) + , (@time_zone_id, 89197200, 2) + , (@time_zone_id, 104925600, 1) + , (@time_zone_id, 120646800, 2) + , (@time_zone_id, 126698400, 1) + , (@time_zone_id, 152096400, 2) + , (@time_zone_id, 162381600, 1) + , (@time_zone_id, 183546000, 2) + , (@time_zone_id, 199274400, 1) + , (@time_zone_id, 215600400, 2) + , (@time_zone_id, 230724000, 1) + , (@time_zone_id, 247050000, 2) + , (@time_zone_id, 262778400, 1) + , (@time_zone_id, 278499600, 2) + , (@time_zone_id, 294228000, 1) + , (@time_zone_id, 309949200, 2) + , (@time_zone_id, 325677600, 1) + , (@time_zone_id, 341398800, 2) + , (@time_zone_id, 357127200, 1) + , (@time_zone_id, 372848400, 2) + , (@time_zone_id, 388576800, 1) + , (@time_zone_id, 404902800, 2) + , (@time_zone_id, 420026400, 1) + , (@time_zone_id, 436352400, 2) + , (@time_zone_id, 452080800, 1) + , (@time_zone_id, 467802000, 2) + , (@time_zone_id, 483530400, 1) + , (@time_zone_id, 499251600, 2) + , (@time_zone_id, 514980000, 1) + , (@time_zone_id, 530701200, 2) + , (@time_zone_id, 544615200, 1) + , (@time_zone_id, 562150800, 2) + , (@time_zone_id, 576064800, 1) + , (@time_zone_id, 594205200, 2) + , (@time_zone_id, 607514400, 1) + , (@time_zone_id, 625654800, 2) + , (@time_zone_id, 638964000, 1) + , (@time_zone_id, 657104400, 2) + , (@time_zone_id, 671018400, 1) + , (@time_zone_id, 688554000, 2) + , (@time_zone_id, 702468000, 1) + , (@time_zone_id, 720003600, 2) + , (@time_zone_id, 733917600, 1) + , (@time_zone_id, 752058000, 2) + , (@time_zone_id, 765367200, 1) + , (@time_zone_id, 783507600, 2) + , (@time_zone_id, 796816800, 1) + , (@time_zone_id, 814957200, 2) + , (@time_zone_id, 828871200, 1) + , (@time_zone_id, 846406800, 2) + , (@time_zone_id, 860320800, 1) + , (@time_zone_id, 877856400, 2) + , (@time_zone_id, 891770400, 1) + , (@time_zone_id, 909306000, 2) + , (@time_zone_id, 923220000, 1) + , (@time_zone_id, 941360400, 2) + , (@time_zone_id, 954669600, 1) + , (@time_zone_id, 972810000, 2) + , (@time_zone_id, 986119200, 1) + , (@time_zone_id, 1004259600, 2) + , (@time_zone_id, 1018173600, 1) + , (@time_zone_id, 1035709200, 2) + , (@time_zone_id, 1049623200, 1) + , (@time_zone_id, 1067158800, 2) + , (@time_zone_id, 1081072800, 1) + , (@time_zone_id, 1099213200, 2) + , (@time_zone_id, 1112522400, 1) + , (@time_zone_id, 1130662800, 2) + , (@time_zone_id, 1143972000, 1) + , (@time_zone_id, 1162112400, 2) + , (@time_zone_id, 1173607200, 1) + , (@time_zone_id, 1194166800, 2) + , (@time_zone_id, 1205056800, 1) + , (@time_zone_id, 1225616400, 2) + , (@time_zone_id, 1236506400, 1) + , (@time_zone_id, 1257066000, 2) + , (@time_zone_id, 1268560800, 1) + , (@time_zone_id, 1289120400, 2) + , (@time_zone_id, 1300010400, 1) + , (@time_zone_id, 1320570000, 2) + , (@time_zone_id, 1331460000, 1) + , (@time_zone_id, 1352019600, 2) + , (@time_zone_id, 1362909600, 1) + , (@time_zone_id, 1383469200, 2) + , (@time_zone_id, 1394359200, 1) + , (@time_zone_id, 1414918800, 2) + , (@time_zone_id, 1425808800, 1) + , (@time_zone_id, 1446368400, 2) + , (@time_zone_id, 1457863200, 1) + , (@time_zone_id, 1478422800, 2) + , (@time_zone_id, 1489312800, 1) + , (@time_zone_id, 1509872400, 2) + , (@time_zone_id, 1520762400, 1) + , (@time_zone_id, 1541322000, 2) + , (@time_zone_id, 1552212000, 1) + , (@time_zone_id, 1572771600, 2) + , (@time_zone_id, 1583661600, 1) + , (@time_zone_id, 1604221200, 2) + , (@time_zone_id, 1615716000, 1) + , (@time_zone_id, 1636275600, 2) + , (@time_zone_id, 1647165600, 1) + , (@time_zone_id, 1667725200, 2) + , (@time_zone_id, 1678615200, 1) + , (@time_zone_id, 1699174800, 2) + , (@time_zone_id, 1710064800, 1) + , (@time_zone_id, 1730624400, 2) + , (@time_zone_id, 1741514400, 1) + , (@time_zone_id, 1762074000, 2) + , (@time_zone_id, 1772964000, 1) + , (@time_zone_id, 1793523600, 2) + , (@time_zone_id, 1805018400, 1) + , (@time_zone_id, 1825578000, 2) + , (@time_zone_id, 1836468000, 1) + , (@time_zone_id, 1857027600, 2) + , (@time_zone_id, 1867917600, 1) + , (@time_zone_id, 1888477200, 2) + , (@time_zone_id, 1899367200, 1) + , (@time_zone_id, 1919926800, 2) + , (@time_zone_id, 1930816800, 1) + , (@time_zone_id, 1951376400, 2) + , (@time_zone_id, 1962871200, 1) + , (@time_zone_id, 1983430800, 2) + , (@time_zone_id, 1994320800, 1) + , (@time_zone_id, 2014880400, 2) + , (@time_zone_id, 2025770400, 1) + , (@time_zone_id, 2046330000, 2) + , (@time_zone_id, 2057220000, 1) + , (@time_zone_id, 2077779600, 2) + , (@time_zone_id, 2088669600, 1) + , (@time_zone_id, 2109229200, 2) + , (@time_zone_id, 2120119200, 1) + , (@time_zone_id, 2140678800, 2) +; +INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) +VALUES (@time_zone_id, 0, -28378, 0, 'LMT') + , (@time_zone_id, 1, -25200, 1, 'PDT') + , (@time_zone_id, 2, -28800, 0, 'PST') + , (@time_zone_id, 3, -25200, 1, 'PWT') + , (@time_zone_id, 4, -25200, 1, 'PPT') +; +INSERT INTO time_zone (Use_leap_seconds) VALUES ('N'); +SET @time_zone_id= LAST_INSERT_ID(); +INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('UTC', @time_zone_id); +INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES + (@time_zone_id, 0, 0, 0, 'UTC') +; +COMMIT; diff --git a/go/test/endtoend/vreplication/unsharded_init_data.sql b/go/test/endtoend/vreplication/unsharded_init_data.sql index fcaa3ed4fcd..b12aaa9bf79 100644 --- a/go/test/endtoend/vreplication/unsharded_init_data.sql +++ b/go/test/endtoend/vreplication/unsharded_init_data.sql @@ -26,3 +26,10 @@ insert into db_order_test (c_uuid, created_at, dstuff, dtstuff, dbstuff, cstuff) insert into db_order_test (c_uuid, created_at, dstuff, dtstuff, dbstuff, cstuff) values ('b169-7359cfb5-9ff5-064d3874effb-14e4', '2018-12-11 01:46:46', 'Fohk0aif4oov!e>ith)eeghoo`Goh)p0', 'shi3ahde9doo5Uph6CeiSheCh/uw0nae', 'audaek{eceenooPh8wichahcheiv9thu', 'chickens'); insert into db_order_test (c_uuid, created_at, dstuff, dtstuff, dbstuff, cstuff) values ('b169-a8411858-a983-123139285dbf-14e2', '2020-03-23 04:42:39', 'ooM4pej>eashaeko', 'too$Shei&s2eing3ashoh0Sh9fiey7th', 'Ohx9saf#eiz*echoo0eechSues_u2que', 'dogs'); +insert into datze(id, dt2, ts1) values (1, '2022-01-01 00:00:00', current_timestamp); +insert into datze(id, dt2, ts1) values (2, '2022-03-27 02:00:00', current_timestamp); +insert into datze(id, dt2, ts1) values (3, '2022-03-27 02:15:00', current_timestamp); +insert into datze(id, dt2, ts1) values (4, '2022-03-27 03:00:00', current_timestamp); +insert into datze(id, dt2, ts1) values (5, '2022-03-27 03:15:00', current_timestamp); +insert into datze(id, dt2, ts1) values (6, current_timestamp, current_timestamp); + diff --git a/go/vt/proto/binlogdata/binlogdata.pb.go b/go/vt/proto/binlogdata/binlogdata.pb.go index 044691c6baf..8f5b12ffcd1 100644 --- a/go/vt/proto/binlogdata/binlogdata.pb.go +++ b/go/vt/proto/binlogdata/binlogdata.pb.go @@ -1081,6 +1081,11 @@ type BinlogSource struct { // ExternalCluster is the name of the mounted cluster which has the source keyspace/db for this workflow // it is of the type ExternalCluster string `protobuf:"bytes,10,opt,name=external_cluster,json=externalCluster,proto3" json:"external_cluster,omitempty"` + // SourceTimeZone is the time zone in which datetimes on the source were stored, provided as an option in MoveTables + SourceTimeZone string `protobuf:"bytes,11,opt,name=source_time_zone,json=sourceTimeZone,proto3" json:"source_time_zone,omitempty"` + // TargetTimeZone is not currently specifiable by the user, defaults to UTC for the forward workflows + // and to the SourceTimeZone in reverse workflows + TargetTimeZone string `protobuf:"bytes,12,opt,name=target_time_zone,json=targetTimeZone,proto3" json:"target_time_zone,omitempty"` } func (x *BinlogSource) Reset() { @@ -1185,6 +1190,20 @@ func (x *BinlogSource) GetExternalCluster() string { return "" } +func (x *BinlogSource) GetSourceTimeZone() string { + if x != nil { + return x.SourceTimeZone + } + return "" +} + +func (x *BinlogSource) GetTargetTimeZone() string { + if x != nil { + return x.TargetTimeZone + } + return "" +} + // RowChange represents one row change. // If Before is set and not After, it's a delete. // If After is set and not Before, it's an insert. @@ -2698,7 +2717,7 @@ var file_binlogdata_proto_rawDesc = []byte{ 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x36, 0x0a, 0x0e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x52, 0x52, 0x5f, 0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x42, - 0x45, 0x53, 0x54, 0x5f, 0x45, 0x46, 0x46, 0x4f, 0x52, 0x54, 0x10, 0x01, 0x22, 0x96, 0x03, 0x0a, + 0x45, 0x53, 0x54, 0x5f, 0x45, 0x46, 0x46, 0x4f, 0x52, 0x54, 0x10, 0x01, 0x22, 0xea, 0x03, 0x0a, 0x0c, 0x42, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 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, @@ -2724,228 +2743,234 @@ var file_binlogdata_proto_rawDesc = []byte{ 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x51, 0x0a, 0x09, 0x52, 0x6f, 0x77, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x06, - 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, - 0x77, 0x52, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x08, 0x52, 0x6f, 0x77, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x69, 0x6e, 0x6c, - 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x83, - 0x01, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x06, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x22, 0x88, 0x01, 0x0a, 0x09, 0x53, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, - 0x69, 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, 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, 0x67, 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, - 0x61, 0x73, 0x74, 0x50, 0x4b, 0x52, 0x08, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x4b, 0x73, 0x22, - 0x3f, 0x0a, 0x05, 0x56, 0x47, 0x74, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x72, - 0x64, 0x5f, 0x67, 0x74, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, - 0x47, 0x74, 0x69, 0x64, 0x52, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, 0x73, - 0x22, 0x41, 0x0a, 0x0d, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x14, 0x0a, - 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x22, 0xbc, 0x02, 0x0a, 0x07, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x40, 0x0a, 0x0e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0d, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x36, 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x67, 0x74, 0x69, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, 0x52, 0x0a, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x22, 0xed, 0x03, 0x0a, 0x06, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x62, 0x69, - 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x09, 0x72, 0x6f, 0x77, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x52, 0x08, 0x72, 0x6f, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x0b, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x67, 0x74, 0x69, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x56, 0x47, 0x74, 0x69, 0x64, 0x52, 0x05, 0x76, 0x67, 0x74, 0x69, 0x64, 0x12, 0x2d, - 0x0a, 0x07, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4a, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x07, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x10, 0x0a, - 0x03, 0x64, 0x6d, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x6d, 0x6c, 0x12, - 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x5f, 0x6b, 0x5f, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, - 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, + 0x75, 0x73, 0x74, 0x65, 0x72, 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, + 0x28, 0x0a, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, + 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x22, 0x51, 0x0a, 0x09, 0x52, 0x6f, 0x77, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, + 0x6f, 0x77, 0x52, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, + 0x08, 0x52, 0x6f, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x0b, 0x72, 0x6f, 0x77, 0x5f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x6f, 0x77, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x22, 0x68, 0x0a, 0x0c, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0b, - 0x70, 0x5f, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x03, 0x52, 0x09, 0x70, 0x4b, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x22, 0x41, 0x0a, 0x0d, - 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x30, 0x0a, - 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, - 0x61, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, - 0xc7, 0x02, 0x0a, 0x0e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, - 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, - 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, - 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 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, 0x2a, 0x0a, - 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x52, 0x0c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x73, 0x22, 0x3d, 0x0a, 0x0f, 0x56, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, - 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x85, 0x02, 0x0a, 0x12, 0x56, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, - 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, - 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, - 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x18, 0x05, - 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, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, - 0x22, 0xbd, 0x01, 0x0a, 0x13, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x77, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x28, - 0x0a, 0x08, 0x70, 0x6b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x08, - 0x70, 0x6b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x88, 0x01, 0x0a, 0x09, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x47, 0x74, 0x69, 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, 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, 0x67, 0x74, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x0a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x5f, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x52, 0x08, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x4b, 0x73, 0x22, 0x3f, 0x0a, 0x05, 0x56, 0x47, 0x74, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0b, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x67, 0x74, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, 0x52, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x47, + 0x74, 0x69, 0x64, 0x73, 0x22, 0x41, 0x0a, 0x0d, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 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, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0xbc, 0x02, 0x0a, 0x07, 0x4a, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x62, 0x69, + 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, + 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x67, 0x74, + 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x62, 0x69, 0x6e, 0x6c, + 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, + 0x52, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x64, 0x47, 0x74, 0x69, 0x64, 0x73, 0x12, 0x3d, 0x0a, 0x0c, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x64, 0x52, 0x0c, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xed, 0x03, 0x0a, 0x06, 0x56, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x16, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x67, + 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, + 0x09, 0x72, 0x6f, 0x77, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x6f, + 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x72, 0x6f, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x37, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x67, 0x74, + 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, + 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x47, 0x74, 0x69, 0x64, 0x52, 0x05, 0x76, 0x67, 0x74, + 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x07, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x07, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x61, + 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x6d, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x64, 0x6d, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, + 0x5f, 0x6b, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x73, 0x74, + 0x50, 0x4b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x68, 0x0a, 0x0c, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, + 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x12, 0x1e, 0x0a, 0x0b, 0x70, 0x5f, 0x6b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x70, 0x4b, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, + 0x22, 0x41, 0x0a, 0x0d, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x30, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, + 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x22, 0xc7, 0x02, 0x0a, 0x0e, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, + 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, + 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x2a, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3e, 0x0a, + 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x5f, 0x6b, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x52, + 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x73, 0x22, 0x3d, 0x0a, + 0x0f, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2a, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x56, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x85, 0x02, 0x0a, + 0x12, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, + 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, + 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, + 0x70, 0x6b, 0x18, 0x05, 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, 0x6c, 0x61, + 0x73, 0x74, 0x70, 0x6b, 0x22, 0xbd, 0x01, 0x0a, 0x13, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x06, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x12, 0x28, 0x0a, 0x08, 0x70, 0x6b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x52, 0x08, 0x70, 0x6b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x67, 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, + 0x12, 0x1e, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, + 0x12, 0x22, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x06, 0x6c, 0x61, + 0x73, 0x74, 0x70, 0x6b, 0x22, 0x69, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x70, 0x5f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x69, + 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, + 0x73, 0x74, 0x50, 0x4b, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, + 0x4b, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, + 0x58, 0x0a, 0x0b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x12, 0x1d, + 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, + 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x18, 0x03, 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, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x22, 0xdc, 0x01, 0x0a, 0x15, 0x56, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x76, 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, + 0x44, 0x52, 0x11, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, + 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, + 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x72, 0x0a, 0x16, 0x56, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x22, 0x0a, 0x06, - 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x70, 0x6b, - 0x22, 0x69, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x5f, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x62, 0x69, 0x6e, 0x6c, 0x6f, 0x67, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, - 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x12, 0x1c, 0x0a, - 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x58, 0x0a, 0x0b, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x4b, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x6c, 0x61, 0x73, - 0x74, 0x70, 0x6b, 0x18, 0x03, 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, 0x6c, - 0x61, 0x73, 0x74, 0x70, 0x6b, 0x22, 0xdc, 0x01, 0x0a, 0x15, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x3f, 0x0a, 0x13, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, - 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, - 0x74, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x65, - 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, - 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x56, 0x54, 0x47, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, - 0x65, 0x72, 0x49, 0x44, 0x52, 0x11, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x43, - 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x22, 0x72, 0x0a, 0x16, 0x56, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, - 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x67, 0x74, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x52, - 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x2a, 0x3e, 0x0a, 0x0b, 0x4f, 0x6e, 0x44, 0x44, - 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x47, 0x4e, 0x4f, 0x52, - 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x01, 0x12, 0x08, 0x0a, - 0x04, 0x45, 0x58, 0x45, 0x43, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x58, 0x45, 0x43, 0x5f, - 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x03, 0x2a, 0x7b, 0x0a, 0x18, 0x56, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x41, 0x54, 0x45, 0x52, 0x49, 0x41, 0x4c, - 0x49, 0x5a, 0x45, 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, 0x12, 0x0b, 0x0a, 0x07, - 0x4d, 0x49, 0x47, 0x52, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x53, - 0x48, 0x41, 0x52, 0x44, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4f, 0x4e, 0x4c, 0x49, 0x4e, 0x45, - 0x44, 0x44, 0x4c, 0x10, 0x05, 0x2a, 0xf9, 0x01, 0x0a, 0x0a, 0x56, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x54, 0x49, 0x44, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x42, - 0x45, 0x47, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x4d, 0x4d, 0x49, 0x54, - 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x4f, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x04, - 0x12, 0x07, 0x0a, 0x03, 0x44, 0x44, 0x4c, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, - 0x45, 0x52, 0x54, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, - 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x08, 0x12, 0x0a, - 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, - 0x54, 0x10, 0x0a, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x10, 0x0b, 0x12, 0x07, - 0x0a, 0x03, 0x52, 0x4f, 0x57, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x49, 0x45, 0x4c, 0x44, - 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, - 0x0e, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x47, 0x54, 0x49, 0x44, 0x10, 0x0f, 0x12, 0x0b, 0x0a, 0x07, - 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x10, 0x12, 0x0b, 0x0a, 0x07, 0x56, 0x45, 0x52, - 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x11, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x41, 0x53, 0x54, 0x50, 0x4b, - 0x10, 0x12, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x41, 0x56, 0x45, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, - 0x13, 0x2a, 0x27, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x53, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x53, 0x48, 0x41, 0x52, 0x44, 0x53, 0x10, 0x01, 0x42, 0x29, 0x5a, 0x27, 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, 0x62, 0x69, 0x6e, 0x6c, 0x6f, - 0x67, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x79, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x2a, 0x3e, 0x0a, 0x0b, + 0x4f, 0x6e, 0x44, 0x44, 0x4c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x49, + 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, + 0x01, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x58, 0x45, 0x43, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x45, + 0x58, 0x45, 0x43, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x03, 0x2a, 0x7b, 0x0a, 0x18, + 0x56, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x41, 0x54, 0x45, + 0x52, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x45, 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, + 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x49, 0x47, 0x52, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, + 0x07, 0x52, 0x45, 0x53, 0x48, 0x41, 0x52, 0x44, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4f, 0x4e, + 0x4c, 0x49, 0x4e, 0x45, 0x44, 0x44, 0x4c, 0x10, 0x05, 0x2a, 0xf9, 0x01, 0x0a, 0x0a, 0x56, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x54, 0x49, 0x44, 0x10, 0x01, 0x12, + 0x09, 0x0a, 0x05, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, + 0x4d, 0x4d, 0x49, 0x54, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x4f, 0x4c, 0x4c, 0x42, 0x41, + 0x43, 0x4b, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x44, 0x4c, 0x10, 0x05, 0x12, 0x0a, 0x0a, + 0x06, 0x49, 0x4e, 0x53, 0x45, 0x52, 0x54, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x50, + 0x4c, 0x41, 0x43, 0x45, 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x09, 0x12, 0x07, + 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x0a, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x54, 0x48, 0x45, 0x52, + 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x4f, 0x57, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x46, + 0x49, 0x45, 0x4c, 0x44, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, + 0x45, 0x41, 0x54, 0x10, 0x0e, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x47, 0x54, 0x49, 0x44, 0x10, 0x0f, + 0x12, 0x0b, 0x0a, 0x07, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x10, 0x12, 0x0b, 0x0a, + 0x07, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x11, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x41, + 0x53, 0x54, 0x50, 0x4b, 0x10, 0x12, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x41, 0x56, 0x45, 0x50, 0x4f, + 0x49, 0x4e, 0x54, 0x10, 0x13, 0x2a, 0x27, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x53, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x48, 0x41, 0x52, 0x44, 0x53, 0x10, 0x01, 0x42, 0x29, + 0x5a, 0x27, 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, 0x62, + 0x69, 0x6e, 0x6c, 0x6f, 0x67, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/go/vt/proto/binlogdata/binlogdata_vtproto.pb.go b/go/vt/proto/binlogdata/binlogdata_vtproto.pb.go index f7dd1f66070..60ba2fd9d62 100644 --- a/go/vt/proto/binlogdata/binlogdata_vtproto.pb.go +++ b/go/vt/proto/binlogdata/binlogdata_vtproto.pb.go @@ -633,6 +633,20 @@ func (m *BinlogSource) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.TargetTimeZone) > 0 { + i -= len(m.TargetTimeZone) + copy(dAtA[i:], m.TargetTimeZone) + i = encodeVarint(dAtA, i, uint64(len(m.TargetTimeZone))) + i-- + dAtA[i] = 0x62 + } + if len(m.SourceTimeZone) > 0 { + i -= len(m.SourceTimeZone) + copy(dAtA[i:], m.SourceTimeZone) + i = encodeVarint(dAtA, i, uint64(len(m.SourceTimeZone))) + i-- + dAtA[i] = 0x5a + } if len(m.ExternalCluster) > 0 { i -= len(m.ExternalCluster) copy(dAtA[i:], m.ExternalCluster) @@ -2275,6 +2289,14 @@ func (m *BinlogSource) SizeVT() (n int) { if l > 0 { n += 1 + l + sov(uint64(l)) } + l = len(m.SourceTimeZone) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } + l = len(m.TargetTimeZone) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } if m.unknownFields != nil { n += len(m.unknownFields) } @@ -4715,6 +4737,70 @@ func (m *BinlogSource) UnmarshalVT(dAtA []byte) error { } m.ExternalCluster = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SourceTimeZone", 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.SourceTimeZone = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetTimeZone", 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.TargetTimeZone = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) diff --git a/go/vt/proto/vtctldata/vtctldata.pb.go b/go/vt/proto/vtctldata/vtctldata.pb.go index 4b896954e5a..12b7b69af33 100644 --- a/go/vt/proto/vtctldata/vtctldata.pb.go +++ b/go/vt/proto/vtctldata/vtctldata.pb.go @@ -295,6 +295,11 @@ type MaterializeSettings struct { ExternalCluster string `protobuf:"bytes,8,opt,name=external_cluster,json=externalCluster,proto3" json:"external_cluster,omitempty"` // MaterializationIntent is used to identify the reason behind the materialization workflow: eg. MoveTables, CreateLookupVindex MaterializationIntent MaterializationIntent `protobuf:"varint,9,opt,name=materialization_intent,json=materializationIntent,proto3,enum=vtctldata.MaterializationIntent" json:"materialization_intent,omitempty"` + // SourceTimeZone is the time zone in which datetimes on the source were stored, provided as an option in MoveTable + SourceTimeZone string `protobuf:"bytes,10,opt,name=source_time_zone,json=sourceTimeZone,proto3" json:"source_time_zone,omitempty"` + // TargetTimeZone is not currently specifiable by the user, defaults to UTC for the forward workflows + // and to the SourceTimeZone in reverse workflows + TargetTimeZone string `protobuf:"bytes,11,opt,name=target_time_zone,json=targetTimeZone,proto3" json:"target_time_zone,omitempty"` } func (x *MaterializeSettings) Reset() { @@ -392,6 +397,20 @@ func (x *MaterializeSettings) GetMaterializationIntent() MaterializationIntent { return MaterializationIntent_CUSTOM } +func (x *MaterializeSettings) GetSourceTimeZone() string { + if x != nil { + return x.SourceTimeZone + } + return "" +} + +func (x *MaterializeSettings) GetTargetTimeZone() string { + if x != nil { + return x.TargetTimeZone + } + return "" +} + type Keyspace struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9872,8 +9891,8 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x64, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x64, 0x6c, 0x22, 0xb2, - 0x03, 0x0a, 0x13, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x65, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x64, 0x6c, 0x22, 0x86, + 0x04, 0x0a, 0x13, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 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, @@ -9900,1207 +9919,1213 @@ var file_vtctldata_proto_rawDesc = []byte{ 0x74, 0x6c, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x15, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 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, 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, 0x81, 0x0c, 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, 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, + 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x28, 0x0a, + 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x22, 0x4e, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 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, 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, 0x81, 0x0c, 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, 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, 0xf6, 0x06, 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, 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, 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, 0x86, 0x03, 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, 0x3a, 0x0a, 0x19, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x4c, 0x6f, 0x6e, 0x67, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 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, 0x25, 0x0a, 0x0e, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x73, 0x6b, 0x69, 0x70, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, + 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, 0x22, + 0x32, 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, 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, + 0x90, 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, 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, 0x8d, 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, 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, 0xf6, - 0x06, 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, 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, 0x22, 0x59, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x43, 0x65, + 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, 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, 0xb6, + 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, 0x30, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x73, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, + 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x12, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x79, 0x70, + 0x65, 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, 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, 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, 0x86, 0x03, 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, 0x3a, 0x0a, 0x19, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, - 0x6f, 0x6e, 0x67, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, - 0x6f, 0x6e, 0x67, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 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, + 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, 0xd0, 0x02, 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, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 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, 0x25, 0x0a, 0x0e, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x70, - 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x73, 0x6b, 0x69, 0x70, 0x50, 0x72, 0x65, 0x66, 0x6c, 0x69, 0x67, 0x68, 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, 0x22, 0x32, 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, 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, 0x90, 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, 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, 0x8d, 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, + 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, 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, 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, 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, 0xb6, 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, - 0x30, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, - 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x4a, 0x0a, 0x14, 0x73, 0x68, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x18, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x49, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x12, 0x73, 0x68, 0x61, 0x72, 0x64, - 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x79, 0x70, 0x65, 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, 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, 0xd0, 0x02, 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, + 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, 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, 0x84, 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, 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, 0x84, 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, - 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, 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, 0x32, 0x0a, 0x1a, + 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, 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, 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, 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, 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, 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, + 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, 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, - 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, + 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, 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, 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, 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, 0x52, 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, 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, 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, + 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, 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, 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, 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, + 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, 0x52, 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, 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, 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, + 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, 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, 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, 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, 0x83, 0x01, 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, 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, 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, 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, 0xae, 0x01, 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, + 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, 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, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 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, + 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, 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, + 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, + 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, 0x83, 0x01, 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, 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, + 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, 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, 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, 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, 0xae, 0x01, 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, 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, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, 0x6f, 0x70, + 0x6f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 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, 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, 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, 0x0d, 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, + 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, 0x10, - 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 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, + 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, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x6f, 0x70, 0x6f, 0x64, 0x61, 0x74, 0x61, + 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, 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, + 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, 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, 0x0d, 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, 0x0d, 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, 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, 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, + 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, + 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, 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, 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, - 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, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, + 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, 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, 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, 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, - 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, 0x98, 0x01, 0x0a, 0x16, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, + 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, - 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, 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, 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, + 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, 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, 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, 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, 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 14d7ef09836..c63a61b2c90 100644 --- a/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go +++ b/go/vt/proto/vtctldata/vtctldata_vtproto.pb.go @@ -202,6 +202,20 @@ func (m *MaterializeSettings) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if len(m.TargetTimeZone) > 0 { + i -= len(m.TargetTimeZone) + copy(dAtA[i:], m.TargetTimeZone) + i = encodeVarint(dAtA, i, uint64(len(m.TargetTimeZone))) + i-- + dAtA[i] = 0x5a + } + if len(m.SourceTimeZone) > 0 { + i -= len(m.SourceTimeZone) + copy(dAtA[i:], m.SourceTimeZone) + i = encodeVarint(dAtA, i, uint64(len(m.SourceTimeZone))) + i-- + dAtA[i] = 0x52 + } if m.MaterializationIntent != 0 { i = encodeVarint(dAtA, i, uint64(m.MaterializationIntent)) i-- @@ -9009,6 +9023,14 @@ func (m *MaterializeSettings) SizeVT() (n int) { if m.MaterializationIntent != 0 { n += 1 + sov(uint64(m.MaterializationIntent)) } + l = len(m.SourceTimeZone) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } + l = len(m.TargetTimeZone) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } if m.unknownFields != nil { n += len(m.unknownFields) } @@ -13164,6 +13186,70 @@ func (m *MaterializeSettings) UnmarshalVT(dAtA []byte) error { break } } + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SourceTimeZone", 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.SourceTimeZone = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetTimeZone", 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.TargetTimeZone = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index b2ecbcd46f5..27a4ecaff8f 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -2289,7 +2289,7 @@ func commandMoveTables(ctx context.Context, wr *wrangler.Wrangler, subFlags *fla target := subFlags.Arg(1) tableSpecs := subFlags.Arg(2) return wr.MoveTables(ctx, *workflow, source, target, tableSpecs, *cells, *tabletTypes, *allTables, - *excludes, *autoStart, *stopAfterCopy, "", *dropForeignKeys) + *excludes, *autoStart, *stopAfterCopy, "", *dropForeignKeys, "") } // VReplicationWorkflowAction defines subcommands passed to vtctl for movetables or reshard @@ -2346,6 +2346,10 @@ func commandVRWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *fla excludes := subFlags.String("exclude", "", "MoveTables only. Tables to exclude (comma-separated) if -all is specified") sourceKeyspace := subFlags.String("source", "", "MoveTables only. Source keyspace") + // if sourceTimeZone is specified, the target needs to have time zones loaded + // note we make an opinionated decision to not allow specifying a different target time zone than UTC. + sourceTimeZone := subFlags.String("source_time_zone", "", "MoveTables only. Specifying this causes any DATETIME fields to be converted from given time zone into UTC") + // MoveTables-only params renameTables := subFlags.Bool("rename_tables", false, "MoveTables only. Rename tables instead of dropping them. -rename_tables is only supported for Complete.") @@ -2469,6 +2473,7 @@ func commandVRWorkflow(ctx context.Context, wr *wrangler.Wrangler, subFlags *fla vrwp.ExcludeTables = *excludes vrwp.Timeout = *timeout vrwp.ExternalCluster = externalClusterName + vrwp.SourceTimeZone = *sourceTimeZone case wrangler.ReshardWorkflow: if *sourceShards == "" || *targetShards == "" { return fmt.Errorf("source and target shards are not specified") diff --git a/go/vt/vtctl/workflow/traffic_switcher.go b/go/vt/vtctl/workflow/traffic_switcher.go index 6f038e610df..7b8ad0a9605 100644 --- a/go/vt/vtctl/workflow/traffic_switcher.go +++ b/go/vt/vtctl/workflow/traffic_switcher.go @@ -116,6 +116,7 @@ type ITrafficSwitcher interface { TargetKeyspaceName() string Targets() map[string]*MigrationTarget WorkflowName() string + SourceTimeZone() string /* Functions that *wrangler.trafficSwitcher implements */ diff --git a/go/vt/vttablet/tabletmanager/vreplication/replicator_plan.go b/go/vt/vttablet/tabletmanager/vreplication/replicator_plan.go index 79ad1975c82..313fd8de5ce 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/replicator_plan.go +++ b/go/vt/vttablet/tabletmanager/vreplication/replicator_plan.go @@ -56,6 +56,7 @@ type ReplicatorPlan struct { TablePlans map[string]*TablePlan ColInfoMap map[string][]*ColumnInfo stats *binlogplayer.Stats + Source *binlogdatapb.BinlogSource } // buildExecution plan uses the field info as input and the partially built @@ -99,6 +100,7 @@ func (rp *ReplicatorPlan) buildFromFields(tableName string, lastpk *sqltypes.Res lastpk: lastpk, colInfos: rp.ColInfoMap[tableName], stats: rp.stats, + source: rp.Source, } for _, field := range fields { colName := sqlparser.NewColIdent(field.Name) diff --git a/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go b/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go index f935dea3202..927c740d595 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go +++ b/go/vt/vttablet/tabletmanager/vreplication/replicator_plan_test.go @@ -684,7 +684,7 @@ func TestBuildPlayerPlan(t *testing.T) { } for _, tcase := range testcases { - plan, err := buildReplicatorPlan(tcase.input, PrimaryKeyInfos, nil, binlogplayer.NewStats()) + plan, err := buildReplicatorPlan(getSource(tcase.input), PrimaryKeyInfos, nil, binlogplayer.NewStats()) gotPlan, _ := json.Marshal(plan) wantPlan, _ := json.Marshal(tcase.plan) if string(gotPlan) != string(wantPlan) { @@ -698,7 +698,7 @@ func TestBuildPlayerPlan(t *testing.T) { t.Errorf("Filter err(%v): %s, want %v", tcase.input, gotErr, tcase.err) } - plan, err = buildReplicatorPlan(tcase.input, PrimaryKeyInfos, copyState, binlogplayer.NewStats()) + plan, err = buildReplicatorPlan(getSource(tcase.input), PrimaryKeyInfos, copyState, binlogplayer.NewStats()) if err != nil { continue } @@ -710,6 +710,10 @@ func TestBuildPlayerPlan(t *testing.T) { } } +func getSource(filter *binlogdatapb.Filter) *binlogdatapb.BinlogSource { + return &binlogdatapb.BinlogSource{Filter: filter} +} + func TestBuildPlayerPlanNoDup(t *testing.T) { PrimaryKeyInfos := map[string][]*ColumnInfo{ "t1": {&ColumnInfo{Name: "c1"}}, @@ -724,7 +728,7 @@ func TestBuildPlayerPlanNoDup(t *testing.T) { Filter: "select * from t", }}, } - _, err := buildReplicatorPlan(input, PrimaryKeyInfos, nil, binlogplayer.NewStats()) + _, err := buildReplicatorPlan(getSource(input), PrimaryKeyInfos, nil, binlogplayer.NewStats()) want := "more than one target for source table t" if err == nil || !strings.Contains(err.Error(), want) { t.Errorf("buildReplicatorPlan err: %v, must contain: %v", err, want) @@ -745,7 +749,7 @@ func TestBuildPlayerPlanExclude(t *testing.T) { Filter: "", }}, } - plan, err := buildReplicatorPlan(input, PrimaryKeyInfos, nil, binlogplayer.NewStats()) + plan, err := buildReplicatorPlan(getSource(input), PrimaryKeyInfos, nil, binlogplayer.NewStats()) assert.NoError(t, err) want := &TestReplicatorPlan{ diff --git a/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go b/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go index 5e3886f374b..9e573f5d7d1 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go +++ b/go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go @@ -54,6 +54,7 @@ type tablePlanBuilder struct { lastpk *sqltypes.Result colInfos []*ColumnInfo stats *binlogplayer.Stats + source *binlogdatapb.BinlogSource } // colExpr describes the processing to be performed to @@ -123,13 +124,15 @@ const ( // The TablePlan built is a partial plan. The full plan for a table is built // when we receive field information from events or rows sent by the source. // buildExecutionPlan is the function that builds the full plan. -func buildReplicatorPlan(filter *binlogdatapb.Filter, colInfoMap map[string][]*ColumnInfo, copyState map[string]*sqltypes.Result, stats *binlogplayer.Stats) (*ReplicatorPlan, error) { +func buildReplicatorPlan(source *binlogdatapb.BinlogSource, colInfoMap map[string][]*ColumnInfo, copyState map[string]*sqltypes.Result, stats *binlogplayer.Stats) (*ReplicatorPlan, error) { + filter := source.Filter plan := &ReplicatorPlan{ VStreamFilter: &binlogdatapb.Filter{FieldEventMode: filter.FieldEventMode}, TargetTables: make(map[string]*TablePlan), TablePlans: make(map[string]*TablePlan), ColInfoMap: colInfoMap, stats: stats, + Source: source, } for tableName := range colInfoMap { lastpk, ok := copyState[tableName] @@ -148,7 +151,7 @@ func buildReplicatorPlan(filter *binlogdatapb.Filter, colInfoMap map[string][]*C if !ok { return nil, fmt.Errorf("table %s not found in schema", tableName) } - tablePlan, err := buildTablePlan(tableName, rule, colInfos, lastpk, stats) + tablePlan, err := buildTablePlan(tableName, rule, colInfos, lastpk, stats, source) if err != nil { return nil, err } @@ -187,7 +190,9 @@ func MatchTable(tableName string, filter *binlogdatapb.Filter) (*binlogdatapb.Ru return nil, nil } -func buildTablePlan(tableName string, rule *binlogdatapb.Rule, colInfos []*ColumnInfo, lastpk *sqltypes.Result, stats *binlogplayer.Stats) (*TablePlan, error) { +func buildTablePlan(tableName string, rule *binlogdatapb.Rule, colInfos []*ColumnInfo, lastpk *sqltypes.Result, + stats *binlogplayer.Stats, source *binlogdatapb.BinlogSource) (*TablePlan, error) { + filter := rule.Filter query := filter // generate equivalent select statement if filter is empty or a keyrange. @@ -248,6 +253,7 @@ func buildTablePlan(tableName string, rule *binlogdatapb.Rule, colInfos []*Colum lastpk: lastpk, colInfos: colInfos, stats: stats, + source: source, } if err := tpb.analyzeExprs(sel.SelectExprs); err != nil { @@ -669,9 +675,18 @@ func (tpb *tablePlanBuilder) generateValuesPart(buf *sqlparser.TrackedBuffer, bv separator = "," switch cexpr.operation { case opExpr: - if cexpr.colType == querypb.Type_JSON { + switch cexpr.colType { + case querypb.Type_JSON: buf.Myprintf("convert(%v using utf8mb4)", cexpr.expr) - } else { + case querypb.Type_DATETIME: + sourceTZ := tpb.source.SourceTimeZone + targetTZ := tpb.source.TargetTimeZone + if sourceTZ != "" && targetTZ != "" { + buf.Myprintf("convert_tz(%v, '%s', '%s')", cexpr.expr, sourceTZ, targetTZ) + } else { + buf.Myprintf("%v", cexpr.expr) + } + default: buf.Myprintf("%v", cexpr.expr) } case opCount: diff --git a/go/vt/vttablet/tabletmanager/vreplication/vcopier.go b/go/vt/vttablet/tabletmanager/vreplication/vcopier.go index 661fe1cf294..f17c556b306 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vcopier.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vcopier.go @@ -57,7 +57,7 @@ func newVCopier(vr *vreplicator) *vcopier { func (vc *vcopier) initTablesForCopy(ctx context.Context) error { defer vc.vr.dbClient.Rollback() - plan, err := buildReplicatorPlan(vc.vr.source.Filter, vc.vr.colInfoMap, nil, vc.vr.stats) + plan, err := buildReplicatorPlan(vc.vr.source, vc.vr.colInfoMap, nil, vc.vr.stats) if err != nil { return err } @@ -200,7 +200,7 @@ func (vc *vcopier) copyTable(ctx context.Context, tableName string, copyState ma log.Infof("Copying table %s, lastpk: %v", tableName, copyState[tableName]) - plan, err := buildReplicatorPlan(vc.vr.source.Filter, vc.vr.colInfoMap, nil, vc.vr.stats) + plan, err := buildReplicatorPlan(vc.vr.source, vc.vr.colInfoMap, nil, vc.vr.stats) if err != nil { return err } diff --git a/go/vt/vttablet/tabletmanager/vreplication/vplayer.go b/go/vt/vttablet/tabletmanager/vreplication/vplayer.go index 7e29e617016..1cf6f62f727 100644 --- a/go/vt/vttablet/tabletmanager/vreplication/vplayer.go +++ b/go/vt/vttablet/tabletmanager/vreplication/vplayer.go @@ -106,7 +106,7 @@ func (vp *vplayer) play(ctx context.Context) error { return nil } - plan, err := buildReplicatorPlan(vp.vr.source.Filter, vp.vr.colInfoMap, vp.copyState, vp.vr.stats) + plan, err := buildReplicatorPlan(vp.vr.source, vp.vr.colInfoMap, vp.copyState, vp.vr.stats) if err != nil { vp.vr.stats.ErrorCounts.Add([]string{"Plan"}, 1) return err diff --git a/go/vt/wrangler/materializer.go b/go/vt/wrangler/materializer.go index 5533f9bff64..6830e17fe3a 100644 --- a/go/vt/wrangler/materializer.go +++ b/go/vt/wrangler/materializer.go @@ -25,6 +25,7 @@ import ( "strings" "sync" "text/template" + "time" "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/proto" @@ -119,7 +120,7 @@ func shouldInclude(table string, excludes []string) bool { // MoveTables initiates moving table(s) over to another keyspace func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, targetKeyspace, tableSpecs, cell, tabletTypes string, allTables bool, excludeTables string, autoStart, stopAfterCopy bool, - externalCluster string, dropForeignKeys bool) error { + externalCluster string, dropForeignKeys bool, sourceTimeZone string) error { //FIXME validate tableSpecs, allTables, excludeTables var tables []string var externalTopo *topo.Server @@ -245,6 +246,11 @@ func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, ta ExternalCluster: externalCluster, } + if sourceTimeZone != "" { + ms.SourceTimeZone = sourceTimeZone + ms.TargetTimeZone = "UTC" + } + createDDLMode := createDDLAsCopy if dropForeignKeys { createDDLMode = createDDLAsCopyDropForeignKeys @@ -263,6 +269,13 @@ func (wr *Wrangler) MoveTables(ctx context.Context, workflow, sourceKeyspace, ta if err != nil { return err } + + if sourceTimeZone != "" { + if err := mz.checkTZConversion(ctx, sourceTimeZone); err != nil { + return err + } + } + tabletShards, err := wr.collectTargetStreams(ctx, mz) if err != nil { return err @@ -935,6 +948,7 @@ func (wr *Wrangler) buildMaterializer(ctx context.Context, ms *vtctldatapb.Mater if err != nil { return nil, err } + return &materializer{ wr: wr, ms: ms, @@ -1143,6 +1157,8 @@ func (mz *materializer) generateInserts(ctx context.Context, targetShard *topo.S Filter: &binlogdatapb.Filter{}, StopAfterCopy: mz.ms.StopAfterCopy, ExternalCluster: mz.ms.ExternalCluster, + SourceTimeZone: mz.ms.SourceTimeZone, + TargetTimeZone: mz.ms.TargetTimeZone, } for _, ts := range mz.ms.TableSettings { rule := &binlogdatapb.Rule{ @@ -1297,3 +1313,29 @@ func (mz *materializer) forAllTargets(f func(*topo.ShardInfo) error) error { wg.Wait() return allErrors.AggrError(vterrors.Aggregate) } + +// checkTZConversion is a light-weight consistency check to validate that, if a source time zone is specified to MoveTables, +// that the current primary has the time zone loaded in order to run the convert_tz() function used by VReplication to do the +// datetime conversions. We only check the current primaries on each shard and note here that it is possible a new primary +// gets elected: in this case user will either see errors during vreplication or vdiff will report mismatches. +func (mz *materializer) checkTZConversion(ctx context.Context, tz string) error { + err := mz.forAllTargets(func(target *topo.ShardInfo) error { + targetPrimary, err := mz.wr.ts.GetTablet(ctx, target.PrimaryAlias) + if err != nil { + return vterrors.Wrapf(err, "GetTablet(%v) failed", target.PrimaryAlias) + } + testDateTime := "2006-01-02 15:04:05" + query := fmt.Sprintf("select convert_tz(%s, %s, 'UTC')", encodeString(testDateTime), encodeString(tz)) + qrproto, err := mz.wr.tmc.ExecuteFetchAsApp(ctx, targetPrimary.Tablet, false, []byte(query), 1) + if err != nil { + return vterrors.Wrapf(err, "ExecuteFetchAsApp(%v, %s)", targetPrimary.Tablet, query) + } + qr := sqltypes.Proto3ToResult(qrproto) + if gotDate, err := time.Parse(testDateTime, qr.Rows[0][0].ToString()); err != nil { + return fmt.Errorf("unable to perform time_zone conversions from %s to UTC — result of the attempt was: %s. Either the specified source time zone is invalid or the time zone tables have not been loaded on the %s tablet", + tz, gotDate, targetPrimary.Alias) + } + return nil + }) + return err +} diff --git a/go/vt/wrangler/materializer_test.go b/go/vt/wrangler/materializer_test.go index 4972c6c9871..79b1e9fd728 100644 --- a/go/vt/wrangler/materializer_test.go +++ b/go/vt/wrangler/materializer_test.go @@ -62,7 +62,7 @@ func TestMigrateTables(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() - err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false) + err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, "") require.NoError(t, err) vschema, err := env.wr.ts.GetSrvVSchema(ctx, env.cell) require.NoError(t, err) @@ -103,11 +103,11 @@ func TestMissingTables(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() - err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt", "", "", false, "", true, false, "", false) + err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt", "", "", false, "", true, false, "", false, "") require.EqualError(t, err, "table(s) not found in source keyspace sourceks: tyt") - err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt,t2,txt", "", "", false, "", true, false, "", false) + err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1,tyt,t2,txt", "", "", false, "", true, false, "", false, "") require.EqualError(t, err, "table(s) not found in source keyspace sourceks: tyt,txt") - err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false) + err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", "", false, "", true, false, "", false, "") require.NoError(t, err) } @@ -163,7 +163,7 @@ func TestMoveTablesAllAndExclude(t *testing.T) { env.tmc.expectVRQuery(200, insertPrefix, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzSelectIDQuery, &sqltypes.Result{}) env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) - err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "", "", "", tcase.allTables, tcase.excludeTables, true, false, "", false) + err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "", "", "", tcase.allTables, tcase.excludeTables, true, false, "", false, "") require.NoError(t, err) require.EqualValues(t, tcase.want, targetTables(env)) }) @@ -197,7 +197,7 @@ func TestMoveTablesStopFlags(t *testing.T) { env.tmc.expectVRQuery(200, mzSelectIDQuery, &sqltypes.Result{}) // -auto_start=false is tested by NOT expecting the update query which sets state to RUNNING err = env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", "t1", "", - "", false, "", false, true, "", false) + "", false, "", false, true, "", false, "") require.NoError(t, err) env.tmc.verifyQueries(t) }) @@ -223,7 +223,7 @@ func TestMigrateVSchema(t *testing.T) { env.tmc.expectVRQuery(200, mzUpdateQuery, &sqltypes.Result{}) ctx := context.Background() - err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", `{"t1":{}}`, "", "", false, "", true, false, "", false) + err := env.wr.MoveTables(ctx, "workflow", "sourceks", "targetks", `{"t1":{}}`, "", "", false, "", true, false, "", false, "") require.NoError(t, err) vschema, err := env.wr.ts.GetSrvVSchema(ctx, env.cell) require.NoError(t, err) diff --git a/go/vt/wrangler/traffic_switcher.go b/go/vt/wrangler/traffic_switcher.go index 27c6a5f3325..e06722ac326 100644 --- a/go/vt/wrangler/traffic_switcher.go +++ b/go/vt/wrangler/traffic_switcher.go @@ -102,6 +102,8 @@ type trafficSwitcher struct { optTabletTypes string //tabletTypes option passed to MoveTables/Reshard externalCluster string externalTopo *topo.Server + sourceTimeZone string + targetTimeZone string } /* @@ -132,6 +134,8 @@ func (ts *trafficSwitcher) Tables() []string { ret func (ts *trafficSwitcher) TargetKeyspaceName() string { return ts.targetKeyspace } func (ts *trafficSwitcher) Targets() map[string]*workflow.MigrationTarget { return ts.targets } func (ts *trafficSwitcher) WorkflowName() string { return ts.workflow } +func (ts *trafficSwitcher) SourceTimeZone() string { return ts.sourceTimeZone } +func (ts *trafficSwitcher) TargetTimeZone() string { return ts.targetTimeZone } func (ts *trafficSwitcher) ForAllSources(f func(source *workflow.MigrationSource) error) error { var wg sync.WaitGroup @@ -808,6 +812,8 @@ func (wr *Wrangler) buildTrafficSwitcher(ctx context.Context, targetKeyspace, wo for _, bls := range target.Sources { if ts.sourceKeyspace == "" { ts.sourceKeyspace = bls.Keyspace + ts.sourceTimeZone = bls.SourceTimeZone + ts.targetTimeZone = bls.TargetTimeZone ts.externalCluster = bls.ExternalCluster if ts.externalCluster != "" { externalTopo, err := wr.ts.OpenExternalVitessClusterServer(ctx, ts.externalCluster) @@ -1157,12 +1163,15 @@ func (ts *trafficSwitcher) createReverseVReplication(ctx context.Context) error bls := target.Sources[uid] source := ts.Sources()[bls.Shard] reverseBls := &binlogdatapb.BinlogSource{ - Keyspace: ts.TargetKeyspaceName(), - Shard: target.GetShard().ShardName(), - TabletType: bls.TabletType, - Filter: &binlogdatapb.Filter{}, - OnDdl: bls.OnDdl, + Keyspace: ts.TargetKeyspaceName(), + Shard: target.GetShard().ShardName(), + TabletType: bls.TabletType, + Filter: &binlogdatapb.Filter{}, + OnDdl: bls.OnDdl, + SourceTimeZone: bls.TargetTimeZone, + TargetTimeZone: bls.SourceTimeZone, } + for _, rule := range bls.Filter.Rules { if rule.Filter == "exclude" { reverseBls.Filter.Rules = append(reverseBls.Filter.Rules, rule) diff --git a/go/vt/wrangler/vdiff.go b/go/vt/wrangler/vdiff.go index 4c61322047a..32b18037fc8 100644 --- a/go/vt/wrangler/vdiff.go +++ b/go/vt/wrangler/vdiff.go @@ -102,6 +102,8 @@ type vdiff struct { workflow string targetKeyspace string tables []string + sourceTimeZone string + targetTimeZone string } // compareColInfo contains the metadata for a column of the table being diffed @@ -204,6 +206,8 @@ func (wr *Wrangler) VDiff(ctx context.Context, targetKeyspace, workflowName, sou workflow: workflowName, targetKeyspace: targetKeyspace, tables: includeTables, + sourceTimeZone: ts.sourceTimeZone, + targetTimeZone: ts.targetTimeZone, } for shard, source := range ts.Sources() { df.sources[shard] = &shardStreamer{ @@ -456,6 +460,66 @@ func findPKs(table *tabletmanagerdatapb.TableDefinition, targetSelect *sqlparser return orderby, nil } +// If SourceTimeZone is defined in the BinlogSource, the VReplication workflow would have converted the datetime +// columns expecting the source to have been in the SourceTimeZone and target in TargetTimeZone. We need to do the reverse +// conversion in VDiff before comparing to the source +func (df *vdiff) adjustForSourceTimeZone(targetSelectExprs sqlparser.SelectExprs, fields map[string]querypb.Type) sqlparser.SelectExprs { + if df.sourceTimeZone == "" { + return targetSelectExprs + } + log.Infof("source time zone specified: %s", df.sourceTimeZone) + var newSelectExprs sqlparser.SelectExprs + var modified bool + for _, expr := range targetSelectExprs { + converted := false + switch selExpr := expr.(type) { + case *sqlparser.AliasedExpr: + if colAs, ok := selExpr.Expr.(*sqlparser.ColName); ok { + var convertTZFuncExpr *sqlparser.FuncExpr + colName := colAs.Name.Lowered() + fieldType := fields[colName] + if fieldType == querypb.Type_DATETIME { + convertTZFuncExpr = &sqlparser.FuncExpr{ + Name: sqlparser.NewColIdent("convert_tz"), + Exprs: sqlparser.SelectExprs{ + expr, + &sqlparser.AliasedExpr{Expr: sqlparser.NewStrLiteral(df.targetTimeZone)}, + &sqlparser.AliasedExpr{Expr: sqlparser.NewStrLiteral(df.sourceTimeZone)}, + }, + } + log.Infof("converting datetime column %s using convert_tz()", colName) + newSelectExprs = append(newSelectExprs, &sqlparser.AliasedExpr{Expr: convertTZFuncExpr, As: colAs.Name}) + converted = true + modified = true + } + } + } + if !converted { // not datetime + newSelectExprs = append(newSelectExprs, expr) + } + } + if modified { // at least one datetime was found + log.Infof("Found datetime columns when SourceTimeZone was set, resetting target SelectExprs after convert_tz()") + return newSelectExprs + } + return targetSelectExprs +} + +func getColumnNameForSelectExpr(selectExpression sqlparser.SelectExpr) (string, error) { + aliasedExpr := selectExpression.(*sqlparser.AliasedExpr) + expr := aliasedExpr.Expr + var colname string + switch t := expr.(type) { + case *sqlparser.ColName: + colname = t.Name.Lowered() + case *sqlparser.FuncExpr: // only in case datetime was converted using convert_tz() + colname = aliasedExpr.As.Lowered() + default: + return "", fmt.Errorf("found target SelectExpr which was neither ColName or FuncExpr: %+v", aliasedExpr) + } + return colname, nil +} + // buildTablePlan builds one tableDiffer. func (df *vdiff) buildTablePlan(table *tabletmanagerdatapb.TableDefinition, query string) (*tableDiffer, error) { statement, err := sqlparser.Parse(query) @@ -511,16 +575,21 @@ func (df *vdiff) buildTablePlan(table *tabletmanagerdatapb.TableDefinition, quer return nil, fmt.Errorf("unexpected: %v", sqlparser.String(statement)) } } + fields := make(map[string]querypb.Type) for _, field := range table.Fields { fields[strings.ToLower(field.Name)] = field.Type } + targetSelect.SelectExprs = df.adjustForSourceTimeZone(targetSelect.SelectExprs, fields) // Start with adding all columns for comparison. td.compareCols = make([]compareColInfo, len(sourceSelect.SelectExprs)) for i := range td.compareCols { td.compareCols[i].colIndex = i - colname := targetSelect.SelectExprs[i].(*sqlparser.AliasedExpr).Expr.(*sqlparser.ColName).Name.Lowered() + colname, err := getColumnNameForSelectExpr(targetSelect.SelectExprs[i]) + if err != nil { + return nil, err + } _, ok := fields[colname] if !ok { return nil, fmt.Errorf("column %v not found in table %v", colname, table.Name) diff --git a/go/vt/wrangler/vdiff_test.go b/go/vt/wrangler/vdiff_test.go index 373eb3ec29a..4f1574cc851 100644 --- a/go/vt/wrangler/vdiff_test.go +++ b/go/vt/wrangler/vdiff_test.go @@ -63,13 +63,19 @@ func TestVDiffPlanSuccess(t *testing.T) { Columns: []string{"c1", "c2", "c3", "c4"}, PrimaryKeyColumns: []string{"c1"}, Fields: sqltypes.MakeTestFields("c1|c2|c3|c4", "int64|int64|int64|int64"), + }, { + Name: "datze", + Columns: []string{"id", "dt"}, + PrimaryKeyColumns: []string{"id"}, + Fields: sqltypes.MakeTestFields("id|dt", "int64|datetime"), }}, } testcases := []struct { - input *binlogdatapb.Rule - table string - td *tableDiffer + input *binlogdatapb.Rule + table string + td *tableDiffer + sourceTimeZone string }{{ input: &binlogdatapb.Rule{ Match: "t1", @@ -400,12 +406,29 @@ func TestVDiffPlanSuccess(t *testing.T) { }, targetPrimitive: newMergeSorter(nil, []compareColInfo{{0, collations.Collation(nil), true}}), }, + }, { + input: &binlogdatapb.Rule{ + Match: "datze", + }, + sourceTimeZone: "US/Pacific", + table: "datze", + td: &tableDiffer{ + targetTable: "datze", + sourceExpression: "select id, dt from datze order by id asc", + targetExpression: "select id, convert_tz(dt, 'UTC', 'US/Pacific') as dt from datze order by id asc", + compareCols: []compareColInfo{{0, collations.Collation(nil), true}, {1, collations.Collation(nil), false}}, + comparePKs: []compareColInfo{{0, collations.Collation(nil), true}}, + pkCols: []int{0}, + selectPks: []int{0}, + sourcePrimitive: newMergeSorter(nil, []compareColInfo{{0, collations.Collation(nil), true}}), + targetPrimitive: newMergeSorter(nil, []compareColInfo{{0, collations.Collation(nil), true}}), + }, }} for _, tcase := range testcases { t.Run(tcase.input.Filter, func(t *testing.T) { filter := &binlogdatapb.Filter{Rules: []*binlogdatapb.Rule{tcase.input}} - df := &vdiff{} + df := &vdiff{sourceTimeZone: tcase.sourceTimeZone, targetTimeZone: "UTC"} err := df.buildVDiffPlan(context.Background(), filter, schm, nil) require.NoError(t, err, tcase.input) require.Equal(t, 1, len(df.differs), tcase.input) diff --git a/go/vt/wrangler/vexec.go b/go/vt/wrangler/vexec.go index 2d2ff682c43..29acab0542c 100644 --- a/go/vt/wrangler/vexec.go +++ b/go/vt/wrangler/vexec.go @@ -358,6 +358,10 @@ type ReplicationStatusResult struct { Frozen bool // Statuses is a map of / : ShardReplicationStatus (for the given shard). ShardStatuses map[string]*ShardReplicationStatus + // SourceTimeZone represents the time zone provided to the workflow, only set if not UTC + SourceTimeZone string + // TargetTimeZone is set to the original SourceTimeZone, in reverse streams, if it was provided to the workflow + TargetTimeZone string } // ReplicationLocation represents a location that data is either replicating from, or replicating into. @@ -409,9 +413,12 @@ type ReplicationStatus struct { Message string // Tags contain the tags specified for this stream Tags string - // CopyState represents the rows from the _vt.copy_state table. CopyState []copyState + // sourceTimeZone represents the time zone of each stream, only set if not UTC + sourceTimeZone string + // targetTimeZone is set to the sourceTimeZone of the forward stream, if it was provided in the workflow + targetTimeZone string } func (wr *Wrangler) getReplicationStatusFromRow(ctx context.Context, row sqltypes.RowNamedValues, primary *topo.TabletInfo) (*ReplicationStatus, string, error) { @@ -491,6 +498,8 @@ func (wr *Wrangler) getReplicationStatusFromRow(ctx context.Context, row sqltype TimeHeartbeat: timeHeartbeat, Message: message, Tags: tags, + sourceTimeZone: bls.SourceTimeZone, + targetTimeZone: bls.TargetTimeZone, } status.CopyState, err = wr.getCopyState(ctx, primary, id) if err != nil { @@ -529,6 +538,8 @@ func (wr *Wrangler) getStreams(ctx context.Context, workflow, keyspace string) ( if err != nil { return nil, err } + rsr.SourceTimeZone = status.sourceTimeZone + rsr.TargetTimeZone = status.targetTimeZone sourceKeyspace = sk sourceShards.Insert(status.Bls.Shard) rsrStatus = append(rsrStatus, status) diff --git a/go/vt/wrangler/vexec_test.go b/go/vt/wrangler/vexec_test.go index d8db3d9081d..3ffed07c752 100644 --- a/go/vt/wrangler/vexec_test.go +++ b/go/vt/wrangler/vexec_test.go @@ -288,7 +288,9 @@ func TestWorkflowListStreams(t *testing.T) { "TabletControls": null, "PrimaryIsServing": true } - } + }, + "SourceTimeZone": "", + "TargetTimeZone": "" } ` diff --git a/go/vt/wrangler/workflow.go b/go/vt/wrangler/workflow.go index a417f6a27dc..6c3c8d81527 100644 --- a/go/vt/wrangler/workflow.go +++ b/go/vt/wrangler/workflow.go @@ -52,9 +52,10 @@ type VReplicationWorkflowParams struct { Direction workflow.TrafficSwitchDirection MaxAllowedTransactionLagSeconds int64 - // MoveTables specific + // MoveTables/Migrate specific SourceKeyspace, Tables string AllTables, RenameTables bool + SourceTimeZone string // Reshard specific SourceShards, TargetShards []string @@ -406,7 +407,8 @@ func (vrw *VReplicationWorkflow) initMoveTables() error { log.Infof("In VReplicationWorkflow.initMoveTables() for %+v", vrw) return vrw.wr.MoveTables(vrw.ctx, vrw.params.Workflow, vrw.params.SourceKeyspace, vrw.params.TargetKeyspace, vrw.params.Tables, vrw.params.Cells, vrw.params.TabletTypes, vrw.params.AllTables, vrw.params.ExcludeTables, - vrw.params.AutoStart, vrw.params.StopAfterCopy, vrw.params.ExternalCluster, vrw.params.DropConstraints) + vrw.params.AutoStart, vrw.params.StopAfterCopy, vrw.params.ExternalCluster, vrw.params.DropConstraints, + vrw.params.SourceTimeZone) } func (vrw *VReplicationWorkflow) initReshard() error { diff --git a/proto/binlogdata.proto b/proto/binlogdata.proto index 2c97c582f81..f8af9069117 100644 --- a/proto/binlogdata.proto +++ b/proto/binlogdata.proto @@ -250,6 +250,12 @@ message BinlogSource { // ExternalCluster is the name of the mounted cluster which has the source keyspace/db for this workflow // it is of the type string external_cluster = 10; + + // SourceTimeZone is the time zone in which datetimes on the source were stored, provided as an option in MoveTables + string source_time_zone = 11; + // TargetTimeZone is not currently specifiable by the user, defaults to UTC for the forward workflows + // and to the SourceTimeZone in reverse workflows + string target_time_zone = 12; } // VEventType enumerates the event types. Many of these types diff --git a/proto/vtctldata.proto b/proto/vtctldata.proto index 8b034668965..bf08d190194 100644 --- a/proto/vtctldata.proto +++ b/proto/vtctldata.proto @@ -85,6 +85,12 @@ message MaterializeSettings { string external_cluster = 8; // MaterializationIntent is used to identify the reason behind the materialization workflow: eg. MoveTables, CreateLookupVindex MaterializationIntent materialization_intent = 9; + // SourceTimeZone is the time zone in which datetimes on the source were stored, provided as an option in MoveTable + string source_time_zone =10; + // TargetTimeZone is not currently specifiable by the user, defaults to UTC for the forward workflows + // and to the SourceTimeZone in reverse workflows + string target_time_zone = 11; + } /* Data types for VtctldServer */ From edd64e59dae2868f3156e4f3d115ef55398eba9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicent=20Mart=C3=AD?= <42793+vmg@users.noreply.github.com> Date: Wed, 27 Apr 2022 13:40:56 +0200 Subject: [PATCH 02/22] sqlparser: fix canonical formatting for enums (#10149) * sqlparser: fix canonical formatting for enums Signed-off-by: Vicent Marti * added test for SET datatype Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/sqlparser/ast_format.go | 9 ++++++++- go/vt/sqlparser/ast_format_fast.go | 11 ++++++++--- go/vt/sqlparser/tracked_buffer_test.go | 8 ++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/go/vt/sqlparser/ast_format.go b/go/vt/sqlparser/ast_format.go index 5c226157c3c..e736d6161dd 100644 --- a/go/vt/sqlparser/ast_format.go +++ b/go/vt/sqlparser/ast_format.go @@ -563,7 +563,14 @@ func (ct *ColumnType) Format(buf *TrackedBuffer) { } if ct.EnumValues != nil { - buf.astPrintf(ct, "(%s)", strings.Join(ct.EnumValues, ", ")) + buf.WriteString("(") + for i, enum := range ct.EnumValues { + if i > 0 { + buf.WriteString(", ") + } + buf.astPrintf(ct, "%#s", enum) + } + buf.WriteString(")") } if ct.Unsigned { diff --git a/go/vt/sqlparser/ast_format_fast.go b/go/vt/sqlparser/ast_format_fast.go index d2e1e122907..6dead1008c3 100644 --- a/go/vt/sqlparser/ast_format_fast.go +++ b/go/vt/sqlparser/ast_format_fast.go @@ -764,9 +764,14 @@ func (ct *ColumnType) formatFast(buf *TrackedBuffer) { } if ct.EnumValues != nil { - buf.WriteByte('(') - buf.WriteString(strings.Join(ct.EnumValues, ", ")) - buf.WriteByte(')') + buf.WriteString("(") + for i, enum := range ct.EnumValues { + if i > 0 { + buf.WriteString(", ") + } + buf.WriteString(enum) + } + buf.WriteString(")") } if ct.Unsigned { diff --git a/go/vt/sqlparser/tracked_buffer_test.go b/go/vt/sqlparser/tracked_buffer_test.go index 53cbe49088c..191fd75237a 100644 --- a/go/vt/sqlparser/tracked_buffer_test.go +++ b/go/vt/sqlparser/tracked_buffer_test.go @@ -136,6 +136,14 @@ func TestCanonicalOutput(t *testing.T) { "alter table t1 row_format=compressed, character set=utf8", "ALTER TABLE `t1` ROW_FORMAT COMPRESSED, CHARSET utf8", }, + { + "create table a (e enum('red','green','blue','orange','yellow'))", + "CREATE TABLE `a` (\n\t`e` enum('red', 'green', 'blue', 'orange', 'yellow')\n)", + }, + { + "create table a (e set('red','green','blue','orange','yellow'))", + "CREATE TABLE `a` (\n\t`e` set('red', 'green', 'blue', 'orange', 'yellow')\n)", + }, } for _, tc := range testcases { From 30fbd471f56d50901ebcc97d8aaab8108aff00f3 Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Wed, 27 Apr 2022 17:34:34 +0300 Subject: [PATCH 03/22] schemadiff: CanonicalStatementString(), utilize sqlparser.CanonicalString() (#10142) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- .../vrepl/schemadiff_vrepl_suite_test.go | 2 +- go/vt/schemadiff/diff_test.go | 129 ++++- go/vt/schemadiff/table.go | 24 + go/vt/schemadiff/table_test.go | 504 ++++++++++-------- go/vt/schemadiff/types.go | 2 + go/vt/schemadiff/view.go | 24 + go/vt/schemadiff/view_test.go | 100 ++-- go/vt/vttablet/onlineddl/executor.go | 4 +- 8 files changed, 518 insertions(+), 271 deletions(-) diff --git a/go/test/endtoend/schemadiff/vrepl/schemadiff_vrepl_suite_test.go b/go/test/endtoend/schemadiff/vrepl/schemadiff_vrepl_suite_test.go index 8677706a4bd..faa250ec716 100644 --- a/go/test/endtoend/schemadiff/vrepl/schemadiff_vrepl_suite_test.go +++ b/go/test/endtoend/schemadiff/vrepl/schemadiff_vrepl_suite_test.go @@ -344,7 +344,7 @@ func validateDiff(t *testing.T, fromCreateTable string, toCreateTable string, hi // The diff can be empty or there can be an actual ALTER TABLE statement diffedAlterQuery := "" if diff != nil && !diff.IsEmpty() { - diffedAlterQuery = sqlparser.String(diff.Statement()) + diffedAlterQuery = diff.CanonicalStatementString() } // Validate the diff! The way we do it is: diff --git a/go/vt/schemadiff/diff_test.go b/go/vt/schemadiff/diff_test.go index 5126d5f9884..3fa2b081b18 100644 --- a/go/vt/schemadiff/diff_test.go +++ b/go/vt/schemadiff/diff_test.go @@ -31,6 +31,7 @@ func TestDiffTables(t *testing.T) { from string to string diff string + cdiff string action string isError bool }{ @@ -44,18 +45,21 @@ func TestDiffTables(t *testing.T) { from: "create table t(id int primary key)", to: "create table t(id int primary key, i int)", diff: "alter table t add column i int", + cdiff: "ALTER TABLE `t` ADD COLUMN `i` int", action: "alter", }, { name: "create", to: "create table t(id int primary key)", diff: "create table t (\n\tid int primary key\n)", + cdiff: "CREATE TABLE `t` (\n\t`id` int PRIMARY KEY\n)", action: "create", }, { name: "drop", from: "create table t(id int primary key)", diff: "drop table t", + cdiff: "DROP TABLE `t`", action: "drop", }, { @@ -102,17 +106,33 @@ func TestDiffTables(t *testing.T) { assert.NoError(t, err) require.NotNil(t, d) require.False(t, d.IsEmpty()) - diff := d.StatementString() - assert.Equal(t, ts.diff, diff) - action, err := DDLActionStr(d) - assert.NoError(t, err) - assert.Equal(t, ts.action, action) + { + diff := d.StatementString() + assert.Equal(t, ts.diff, diff) + action, err := DDLActionStr(d) + assert.NoError(t, err) + assert.Equal(t, ts.action, action) + + // validate we can parse back the statement + _, err = sqlparser.Parse(diff) + assert.NoError(t, err) + } + { + canonicalDiff := d.CanonicalStatementString() + assert.Equal(t, ts.cdiff, canonicalDiff) + action, err := DDLActionStr(d) + assert.NoError(t, err) + assert.Equal(t, ts.action, action) + // validate we can parse back the statement + _, err = sqlparser.Parse(canonicalDiff) + assert.NoError(t, err) + } // let's also check dq, and also validate that dq's statement is identical to d's assert.NoError(t, dqerr) require.NotNil(t, dq) require.False(t, dq.IsEmpty()) - diff = dq.StatementString() + diff := dq.StatementString() assert.Equal(t, ts.diff, diff) } }) @@ -125,6 +145,7 @@ func TestDiffViews(t *testing.T) { from string to string diff string + cdiff string action string isError bool }{ @@ -138,18 +159,21 @@ func TestDiffViews(t *testing.T) { from: "create view v1 (col1, `col2`, `col3`) as select `a`, `b`, c from t", to: "create view v1 (`col1`, col2, colother) as select a, b, `c` from t", diff: "alter view v1(col1, col2, colother) as select a, b, c from t", + cdiff: "ALTER VIEW `v1`(`col1`, `col2`, `colother`) AS SELECT `a`, `b`, `c` FROM `t`", action: "alter", }, { name: "create", to: "create view v1 as select a, b, c from t", diff: "create view v1 as select a, b, c from t", + cdiff: "CREATE VIEW `v1` AS SELECT `a`, `b`, `c` FROM `t`", action: "create", }, { name: "drop", from: "create view v1 as select a, b, c from t", diff: "drop view v1", + cdiff: "DROP VIEW `v1`", action: "drop", }, { @@ -196,17 +220,35 @@ func TestDiffViews(t *testing.T) { assert.NoError(t, err) require.NotNil(t, d) require.False(t, d.IsEmpty()) - diff := d.StatementString() - assert.Equal(t, ts.diff, diff) - action, err := DDLActionStr(d) - assert.NoError(t, err) - assert.Equal(t, ts.action, action) + { + diff := d.StatementString() + assert.Equal(t, ts.diff, diff) + action, err := DDLActionStr(d) + assert.NoError(t, err) + assert.Equal(t, ts.action, action) + + // validate we can parse back the statement + _, err = sqlparser.Parse(diff) + assert.NoError(t, err) + + } + { + canonicalDiff := d.CanonicalStatementString() + assert.Equal(t, ts.cdiff, canonicalDiff) + action, err := DDLActionStr(d) + assert.NoError(t, err) + assert.Equal(t, ts.action, action) + + // validate we can parse back the statement + _, err = sqlparser.Parse(canonicalDiff) + assert.NoError(t, err) + } // let's also check dq, and also validate that dq's statement is identical to d's assert.NoError(t, dqerr) require.NotNil(t, dq) require.False(t, dq.IsEmpty()) - diff = dq.StatementString() + diff := dq.StatementString() assert.Equal(t, ts.diff, diff) } }) @@ -219,6 +261,7 @@ func TestDiffSchemas(t *testing.T) { from string to string diffs []string + cdiffs []string expectError string }{ { @@ -233,6 +276,9 @@ func TestDiffSchemas(t *testing.T) { diffs: []string{ "alter table t add column i int", }, + cdiffs: []string{ + "ALTER TABLE `t` ADD COLUMN `i` int", + }, }, { name: "create table", @@ -240,6 +286,9 @@ func TestDiffSchemas(t *testing.T) { diffs: []string{ "create table t (\n\tid int primary key\n)", }, + cdiffs: []string{ + "CREATE TABLE `t` (\n\t`id` int PRIMARY KEY\n)", + }, }, { name: "create table (2)", @@ -248,6 +297,9 @@ func TestDiffSchemas(t *testing.T) { diffs: []string{ "create table t (\n\tid int primary key\n)", }, + cdiffs: []string{ + "CREATE TABLE `t` (\n\t`id` int PRIMARY KEY\n)", + }, }, { name: "drop table", @@ -255,6 +307,9 @@ func TestDiffSchemas(t *testing.T) { diffs: []string{ "drop table t", }, + cdiffs: []string{ + "DROP TABLE `t`", + }, }, { name: "create, alter, drop tables", @@ -265,6 +320,11 @@ func TestDiffSchemas(t *testing.T) { "alter table t2 modify column id bigint primary key", "create table t4 (\n\tid int primary key\n)", }, + cdiffs: []string{ + "DROP TABLE `t1`", + "ALTER TABLE `t2` MODIFY COLUMN `id` bigint PRIMARY KEY", + "CREATE TABLE `t4` (\n\t`id` int PRIMARY KEY\n)", + }, }, { name: "identical views", @@ -278,6 +338,9 @@ func TestDiffSchemas(t *testing.T) { diffs: []string{ "alter view v1 as select id from t", }, + cdiffs: []string{ + "ALTER VIEW `v1` AS SELECT `id` FROM `t`", + }, }, { name: "drop view", @@ -286,6 +349,9 @@ func TestDiffSchemas(t *testing.T) { diffs: []string{ "drop view v1", }, + cdiffs: []string{ + "DROP VIEW `v1`", + }, }, { name: "create view", @@ -294,6 +360,9 @@ func TestDiffSchemas(t *testing.T) { diffs: []string{ "create view v1 as select id from t", }, + cdiffs: []string{ + "CREATE VIEW `v1` AS SELECT `id` FROM `t`", + }, }, { name: "create view: unresolved dependencies", @@ -309,6 +378,10 @@ func TestDiffSchemas(t *testing.T) { "drop table v1", "create view v1 as select * from t", }, + cdiffs: []string{ + "DROP TABLE `v1`", + "CREATE VIEW `v1` AS SELECT * FROM `t`", + }, }, { name: "convert view to table", @@ -318,6 +391,10 @@ func TestDiffSchemas(t *testing.T) { "drop view v1", "create table v1 (\n\tid int\n)", }, + cdiffs: []string{ + "DROP VIEW `v1`", + "CREATE TABLE `v1` (\n\t`id` int\n)", + }, }, { name: "unsupported statement", @@ -337,6 +414,14 @@ func TestDiffSchemas(t *testing.T) { "alter view v2 as select id from t2", "create view v0 as select * from v2, t2", }, + cdiffs: []string{ + "DROP TABLE `t1`", + "DROP VIEW `v1`", + "ALTER TABLE `t2` MODIFY COLUMN `id` bigint PRIMARY KEY", + "CREATE TABLE `t4` (\n\t`id` int PRIMARY KEY\n)", + "ALTER VIEW `v2` AS SELECT `id` FROM `t2`", + "CREATE VIEW `v0` AS SELECT * FROM `v2`, `t2`", + }, }, } hints := &DiffHints{} @@ -348,15 +433,31 @@ func TestDiffSchemas(t *testing.T) { assert.Contains(t, err.Error(), ts.expectError) } else { assert.NoError(t, err) + statements := []string{} + cstatements := []string{} for _, d := range diffs { - statement := sqlparser.String(d.Statement()) - statements = append(statements, statement) + statements = append(statements, d.StatementString()) + cstatements = append(cstatements, d.CanonicalStatementString()) } if ts.diffs == nil { ts.diffs = []string{} } assert.Equal(t, ts.diffs, statements) + if ts.cdiffs == nil { + ts.cdiffs = []string{} + } + assert.Equal(t, ts.cdiffs, cstatements) + + // validate we can parse back the diff statements + for _, s := range statements { + _, err := sqlparser.Parse(s) + assert.NoError(t, err) + } + for _, s := range cstatements { + _, err := sqlparser.Parse(s) + assert.NoError(t, err) + } } }) } diff --git a/go/vt/schemadiff/table.go b/go/vt/schemadiff/table.go index 942a761dd5e..f5aa24e1294 100644 --- a/go/vt/schemadiff/table.go +++ b/go/vt/schemadiff/table.go @@ -49,6 +49,14 @@ func (d *AlterTableEntityDiff) StatementString() (s string) { return s } +// CanonicalStatementString implements EntityDiff +func (d *AlterTableEntityDiff) CanonicalStatementString() (s string) { + if stmt := d.Statement(); stmt != nil { + s = sqlparser.CanonicalString(stmt) + } + return s +} + // type CreateTableEntityDiff struct { createTable *sqlparser.CreateTable @@ -75,6 +83,14 @@ func (d *CreateTableEntityDiff) StatementString() (s string) { return s } +// CanonicalStatementString implements EntityDiff +func (d *CreateTableEntityDiff) CanonicalStatementString() (s string) { + if stmt := d.Statement(); stmt != nil { + s = sqlparser.CanonicalString(stmt) + } + return s +} + // type DropTableEntityDiff struct { dropTable *sqlparser.DropTable @@ -101,6 +117,14 @@ func (d *DropTableEntityDiff) StatementString() (s string) { return s } +// CanonicalStatementString implements EntityDiff +func (d *DropTableEntityDiff) CanonicalStatementString() (s string) { + if stmt := d.Statement(); stmt != nil { + s = sqlparser.CanonicalString(stmt) + } + return s +} + // CreateTableEntity stands for a TABLE construct. It contains the table's CREATE statement. type CreateTableEntity struct { sqlparser.CreateTable diff --git a/go/vt/schemadiff/table_test.go b/go/vt/schemadiff/table_test.go index d8f000325a2..ddcace63433 100644 --- a/go/vt/schemadiff/table_test.go +++ b/go/vt/schemadiff/table_test.go @@ -31,6 +31,7 @@ func TestCreateTableDiff(t *testing.T) { from string to string diff string + cdiff string isError bool errorMsg string autoinc int @@ -79,167 +80,193 @@ func TestCreateTableDiff(t *testing.T) { to: "create TABLE t (id int primary key, `i` int not null default 0)", }, { - name: "added column", - from: "create table t1 (`id` int primary key)", - to: "create table t2 (id int primary key, `i` int not null default 0)", - diff: "alter table t1 add column i int not null default 0", + name: "added column", + from: "create table t1 (`id` int primary key)", + to: "create table t2 (id int primary key, `i` int not null default 0)", + diff: "alter table t1 add column i int not null default 0", + cdiff: "ALTER TABLE `t1` ADD COLUMN `i` int NOT NULL DEFAULT 0", }, { - name: "dropped column", - from: "create table t1 (id int primary key, `i` int not null default 0)", - to: "create table t2 (`id` int primary key)", - diff: "alter table t1 drop column i", + name: "dropped column", + from: "create table t1 (id int primary key, `i` int not null default 0)", + to: "create table t2 (`id` int primary key)", + diff: "alter table t1 drop column i", + cdiff: "ALTER TABLE `t1` DROP COLUMN `i`", }, { - name: "modified column", - from: "create table t1 (id int primary key, `i` int not null default 0)", - to: "create table t2 (id int primary key, `i` bigint unsigned default null)", - diff: "alter table t1 modify column i bigint unsigned default null", + name: "modified column", + from: "create table t1 (id int primary key, `i` int not null default 0)", + to: "create table t2 (id int primary key, `i` bigint unsigned default null)", + diff: "alter table t1 modify column i bigint unsigned default null", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `i` bigint UNSIGNED DEFAULT NULL", }, { - name: "added column, dropped column, modified column", - from: "create table t1 (id int primary key, `i` int not null default 0, c char(3) default '')", - to: "create table t2 (id int primary key, ts timestamp null, `i` bigint unsigned default null)", - diff: "alter table t1 drop column c, modify column i bigint unsigned default null, add column ts timestamp null after id", + name: "added column, dropped column, modified column", + from: "create table t1 (id int primary key, `i` int not null default 0, c char(3) default '')", + to: "create table t2 (id int primary key, ts timestamp null, `i` bigint unsigned default null)", + diff: "alter table t1 drop column c, modify column i bigint unsigned default null, add column ts timestamp null after id", + cdiff: "ALTER TABLE `t1` DROP COLUMN `c`, MODIFY COLUMN `i` bigint UNSIGNED DEFAULT NULL, ADD COLUMN `ts` timestamp NULL AFTER `id`", }, { - name: "reorder column", - from: "create table t1 (id int primary key, a int, b int, c int, d int)", - to: "create table t2 (id int primary key, a int, c int, b int, d int)", - diff: "alter table t1 modify column c int after a", + name: "reorder column", + from: "create table t1 (id int primary key, a int, b int, c int, d int)", + to: "create table t2 (id int primary key, a int, c int, b int, d int)", + diff: "alter table t1 modify column c int after a", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `c` int AFTER `a`", }, { - name: "reorder column, far jump", - from: "create table t1 (id int primary key, a int, b int, c int, d int)", - to: "create table t2 (a int, b int, c int, d int, id int primary key)", - diff: "alter table t1 modify column a int first, modify column b int after a, modify column c int after b, modify column d int after c", + name: "reorder column, far jump", + from: "create table t1 (id int primary key, a int, b int, c int, d int)", + to: "create table t2 (a int, b int, c int, d int, id int primary key)", + diff: "alter table t1 modify column a int first, modify column b int after a, modify column c int after b, modify column d int after c", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `a` int FIRST, MODIFY COLUMN `b` int AFTER `a`, MODIFY COLUMN `c` int AFTER `b`, MODIFY COLUMN `d` int AFTER `c`", }, { - name: "reorder column, far jump, another reorder", - from: "create table t1 (id int primary key, a int, b int, c int, d int)", - to: "create table t2 (a int, c int, b int, d int, id int primary key)", - diff: "alter table t1 modify column a int first, modify column c int after a, modify column b int after c, modify column d int after b", + name: "reorder column, far jump, another reorder", + from: "create table t1 (id int primary key, a int, b int, c int, d int)", + to: "create table t2 (a int, c int, b int, d int, id int primary key)", + diff: "alter table t1 modify column a int first, modify column c int after a, modify column b int after c, modify column d int after b", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `a` int FIRST, MODIFY COLUMN `c` int AFTER `a`, MODIFY COLUMN `b` int AFTER `c`, MODIFY COLUMN `d` int AFTER `b`", }, { - name: "reorder column, far jump, another reorder 2", - from: "create table t1 (id int primary key, a int, b int, c int, d int)", - to: "create table t2 (c int, a int, b int, d int, id int primary key)", - diff: "alter table t1 modify column c int first, modify column a int after c, modify column b int after a, modify column d int after b", + name: "reorder column, far jump, another reorder 2", + from: "create table t1 (id int primary key, a int, b int, c int, d int)", + to: "create table t2 (c int, a int, b int, d int, id int primary key)", + diff: "alter table t1 modify column c int first, modify column a int after c, modify column b int after a, modify column d int after b", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `c` int FIRST, MODIFY COLUMN `a` int AFTER `c`, MODIFY COLUMN `b` int AFTER `a`, MODIFY COLUMN `d` int AFTER `b`", }, { - name: "reorder column, far jump, another reorder, extra columns", - from: "create table t1 (id int primary key, a int, b int, c int, d int, e int, f int)", - to: "create table t2 (a int, c int, b int, d int, id int primary key, e int, f int)", - diff: "alter table t1 modify column a int first, modify column c int after a, modify column b int after c, modify column d int after b", + name: "reorder column, far jump, another reorder, extra columns", + from: "create table t1 (id int primary key, a int, b int, c int, d int, e int, f int)", + to: "create table t2 (a int, c int, b int, d int, id int primary key, e int, f int)", + diff: "alter table t1 modify column a int first, modify column c int after a, modify column b int after c, modify column d int after b", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `a` int FIRST, MODIFY COLUMN `c` int AFTER `a`, MODIFY COLUMN `b` int AFTER `c`, MODIFY COLUMN `d` int AFTER `b`", }, { - name: "reorder column, far jump, another reorder, removed columns", - from: "create table t1 (id int primary key, a int, b int, c int, d int, e int, f int, g int)", - to: "create table t2 (a int, c int, f int, e int, id int primary key, g int)", - diff: "alter table t1 drop column b, drop column d, modify column a int first, modify column c int after a, modify column f int after c, modify column e int after f", - }, + name: "reorder column, far jump, another reorder, removed columns", + from: "create table t1 (id int primary key, a int, b int, c int, d int, e int, f int, g int)", + to: "create table t2 (a int, c int, f int, e int, id int primary key, g int)", + diff: "alter table t1 drop column b, drop column d, modify column a int first, modify column c int after a, modify column f int after c, modify column e int after f", + cdiff: "ALTER TABLE `t1` DROP COLUMN `b`, DROP COLUMN `d`, MODIFY COLUMN `a` int FIRST, MODIFY COLUMN `c` int AFTER `a`, MODIFY COLUMN `f` int AFTER `c`, MODIFY COLUMN `e` int AFTER `f`"}, { - name: "two reorders", - from: "create table t1 (id int primary key, a int, b int, c int, d int, e int, f int)", - to: "create table t2 (id int primary key, b int, a int, c int, e int, d int, f int)", - diff: "alter table t1 modify column b int after id, modify column e int after c", + name: "two reorders", + from: "create table t1 (id int primary key, a int, b int, c int, d int, e int, f int)", + to: "create table t2 (id int primary key, b int, a int, c int, e int, d int, f int)", + diff: "alter table t1 modify column b int after id, modify column e int after c", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `b` int AFTER `id`, MODIFY COLUMN `e` int AFTER `c`", }, { - name: "reorder column and change data type", - from: "create table t1 (id int primary key, a int, b int, c int, d int)", - to: "create table t2 (id int primary key, a int, c bigint, b int, d int)", - diff: "alter table t1 modify column c bigint after a", + name: "reorder column and change data type", + from: "create table t1 (id int primary key, a int, b int, c int, d int)", + to: "create table t2 (id int primary key, a int, c bigint, b int, d int)", + diff: "alter table t1 modify column c bigint after a", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `c` bigint AFTER `a`", }, { - name: "reorder column, first", - from: "create table t1 (id int primary key, a int, b int, c int, d int)", - to: "create table t2 (c int, id int primary key, a int, b int, d int)", - diff: "alter table t1 modify column c int first", + name: "reorder column, first", + from: "create table t1 (id int primary key, a int, b int, c int, d int)", + to: "create table t2 (c int, id int primary key, a int, b int, d int)", + diff: "alter table t1 modify column c int first", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `c` int FIRST", }, { - name: "add multiple columns", - from: "create table t1 (id int primary key, a int)", - to: "create table t2 (id int primary key, a int, b int, c int, d int)", - diff: "alter table t1 add column b int, add column c int, add column d int", + name: "add multiple columns", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (id int primary key, a int, b int, c int, d int)", + diff: "alter table t1 add column b int, add column c int, add column d int", + cdiff: "ALTER TABLE `t1` ADD COLUMN `b` int, ADD COLUMN `c` int, ADD COLUMN `d` int", }, { - name: "added column in middle", - from: "create table t1 (id int primary key, a int, b int, c int, d int)", - to: "create table t2 (id int primary key, a int, b int, x int, c int, d int)", - diff: "alter table t1 add column x int after b", + name: "added column in middle", + from: "create table t1 (id int primary key, a int, b int, c int, d int)", + to: "create table t2 (id int primary key, a int, b int, x int, c int, d int)", + diff: "alter table t1 add column x int after b", + cdiff: "ALTER TABLE `t1` ADD COLUMN `x` int AFTER `b`", }, { - name: "added multiple column in middle", - from: "create table t1 (id int primary key, a int)", - to: "create table t2 (w int, x int, id int primary key, y int, a int, z int)", - diff: "alter table t1 add column w int first, add column x int after w, add column y int after id, add column z int", + name: "added multiple column in middle", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (w int, x int, id int primary key, y int, a int, z int)", + diff: "alter table t1 add column w int first, add column x int after w, add column y int after id, add column z int", + cdiff: "ALTER TABLE `t1` ADD COLUMN `w` int FIRST, ADD COLUMN `x` int AFTER `w`, ADD COLUMN `y` int AFTER `id`, ADD COLUMN `z` int", }, { - name: "added column first, reorder column", - from: "create table t1 (id int primary key, a int)", - to: "create table t2 (x int, a int, id int primary key)", - diff: "alter table t1 modify column a int first, add column x int first", + name: "added column first, reorder column", + from: "create table t1 (id int primary key, a int)", + to: "create table t2 (x int, a int, id int primary key)", + diff: "alter table t1 modify column a int first, add column x int first", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `a` int FIRST, ADD COLUMN `x` int FIRST", }, { - name: "added column in middle, add column on end, reorder column", - from: "create table t1 (id int primary key, a int, b int, c int, d int)", - to: "create table t2 (id int primary key, a int, b int, x int, d int, c int, y int)", - diff: "alter table t1 modify column d int after b, add column x int after b, add column y int", + name: "added column in middle, add column on end, reorder column", + from: "create table t1 (id int primary key, a int, b int, c int, d int)", + to: "create table t2 (id int primary key, a int, b int, x int, d int, c int, y int)", + diff: "alter table t1 modify column d int after b, add column x int after b, add column y int", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `d` int AFTER `b`, ADD COLUMN `x` int AFTER `b`, ADD COLUMN `y` int", }, { - name: "added column in middle, add column on end, reorder column 2", - from: "create table t1 (id int primary key, a int, b int, c int, d int)", - to: "create table t2 (id int primary key, a int, c int, x int, b int, d int, y int)", - diff: "alter table t1 modify column c int after a, add column x int after c, add column y int", + name: "added column in middle, add column on end, reorder column 2", + from: "create table t1 (id int primary key, a int, b int, c int, d int)", + to: "create table t2 (id int primary key, a int, c int, x int, b int, d int, y int)", + diff: "alter table t1 modify column c int after a, add column x int after c, add column y int", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `c` int AFTER `a`, ADD COLUMN `x` int AFTER `c`, ADD COLUMN `y` int", }, // keys { - name: "added key", - from: "create table t1 (`id` int primary key, i int)", - to: "create table t2 (id int primary key, `i` int, key `i_idx` (i))", - diff: "alter table t1 add key i_idx (i)", + name: "added key", + from: "create table t1 (`id` int primary key, i int)", + to: "create table t2 (id int primary key, `i` int, key `i_idx` (i))", + diff: "alter table t1 add key i_idx (i)", + cdiff: "ALTER TABLE `t1` ADD KEY `i_idx` (`i`)", }, { - name: "added column and key", - from: "create table t1 (`id` int primary key)", - to: "create table t2 (id int primary key, `i` int, key `i_idx` (i))", - diff: "alter table t1 add column i int, add key i_idx (i)", + name: "added column and key", + from: "create table t1 (`id` int primary key)", + to: "create table t2 (id int primary key, `i` int, key `i_idx` (i))", + diff: "alter table t1 add column i int, add key i_idx (i)", + cdiff: "ALTER TABLE `t1` ADD COLUMN `i` int, ADD KEY `i_idx` (`i`)", }, { - name: "modify column primary key", - from: "create table t1 (`id` int)", - to: "create table t2 (id int primary key)", - diff: "alter table t1 modify column id int primary key", + name: "modify column primary key", + from: "create table t1 (`id` int)", + to: "create table t2 (id int primary key)", + diff: "alter table t1 modify column id int primary key", + cdiff: "ALTER TABLE `t1` MODIFY COLUMN `id` int PRIMARY KEY", }, { - name: "added primary key", - from: "create table t1 (`id` int)", - to: "create table t2 (id int, primary key(id))", - diff: "alter table t1 add primary key (id)", + name: "added primary key", + from: "create table t1 (`id` int)", + to: "create table t2 (id int, primary key(id))", + diff: "alter table t1 add primary key (id)", + cdiff: "ALTER TABLE `t1` ADD PRIMARY KEY (`id`)", }, { - name: "dropped key", - from: "create table t1 (`id` int primary key, i int, key i_idx(i))", - to: "create table t2 (`id` int primary key, i int)", - diff: "alter table t1 drop key i_idx", + name: "dropped key", + from: "create table t1 (`id` int primary key, i int, key i_idx(i))", + to: "create table t2 (`id` int primary key, i int)", + diff: "alter table t1 drop key i_idx", + cdiff: "ALTER TABLE `t1` DROP KEY `i_idx`", }, { - name: "dropped key 2", - from: "create table t1 (`id` int, i int, primary key (id), key i_idx(i))", - to: "create table t1 (`id` int, i int, primary key (id))", - diff: "alter table t1 drop key i_idx", + name: "dropped key 2", + from: "create table t1 (`id` int, i int, primary key (id), key i_idx(i))", + to: "create table t1 (`id` int, i int, primary key (id))", + diff: "alter table t1 drop key i_idx", + cdiff: "ALTER TABLE `t1` DROP KEY `i_idx`", }, { - name: "modified key", - from: "create table t1 (`id` int primary key, i int, key i_idx(i))", - to: "create table t2 (`id` int primary key, i int, key i_idx(i, id))", - diff: "alter table t1 drop key i_idx, add key i_idx (i, id)", + name: "modified key", + from: "create table t1 (`id` int primary key, i int, key i_idx(i))", + to: "create table t2 (`id` int primary key, i int, key i_idx(i, id))", + diff: "alter table t1 drop key i_idx, add key i_idx (i, id)", + cdiff: "ALTER TABLE `t1` DROP KEY `i_idx`, ADD KEY `i_idx` (`i`, `id`)", }, { - name: "modified primary key", - from: "create table t1 (`id` int, i int, primary key(id), key i_idx(i))", - to: "create table t2 (`id` int, i int, primary key(id, i),key i_idx(`i`))", - diff: "alter table t1 drop key `PRIMARY`, add primary key (id, i)", + name: "modified primary key", + from: "create table t1 (`id` int, i int, primary key(id), key i_idx(i))", + to: "create table t2 (`id` int, i int, primary key(id, i),key i_idx(`i`))", + diff: "alter table t1 drop key `PRIMARY`, add primary key (id, i)", + cdiff: "ALTER TABLE `t1` DROP KEY `PRIMARY`, ADD PRIMARY KEY (`id`, `i`)", }, { name: "reordered key, no diff", @@ -252,23 +279,26 @@ func TestCreateTableDiff(t *testing.T) { to: "create table t2 (`id` int, i int, key i2_idx (`i`, id), key i_idx ( i ), primary key(id) )", }, { - name: "reordered key, add key", - from: "create table t1 (`id` int primary key, i int, key i_idx(i), key i2_idx(i, `id`))", - to: "create table t2 (`id` int primary key, i int, key i2_idx (`i`, id), key i_idx3(id), key i_idx ( i ) )", - diff: "alter table t1 add key i_idx3 (id)", + name: "reordered key, add key", + from: "create table t1 (`id` int primary key, i int, key i_idx(i), key i2_idx(i, `id`))", + to: "create table t2 (`id` int primary key, i int, key i2_idx (`i`, id), key i_idx3(id), key i_idx ( i ) )", + diff: "alter table t1 add key i_idx3 (id)", + cdiff: "ALTER TABLE `t1` ADD KEY `i_idx3` (`id`)", }, // foreign keys { - name: "drop foreign key", - from: "create table t1 (id int primary key, i int, constraint f foreign key (i) references parent(id))", - to: "create table t2 (id int primary key, i int)", - diff: "alter table t1 drop foreign key f", + name: "drop foreign key", + from: "create table t1 (id int primary key, i int, constraint f foreign key (i) references parent(id))", + to: "create table t2 (id int primary key, i int)", + diff: "alter table t1 drop foreign key f", + cdiff: "ALTER TABLE `t1` DROP FOREIGN KEY `f`", }, { - name: "add foreign key", - from: "create table t1 (id int primary key, i int)", - to: "create table t2 (id int primary key, i int, constraint f foreign key (i) references parent(id))", - diff: "alter table t1 add constraint f foreign key (i) references parent (id)", + name: "add foreign key", + from: "create table t1 (id int primary key, i int)", + to: "create table t2 (id int primary key, i int, constraint f foreign key (i) references parent(id))", + diff: "alter table t1 add constraint f foreign key (i) references parent (id)", + cdiff: "ALTER TABLE `t1` ADD CONSTRAINT `f` FOREIGN KEY (`i`) REFERENCES `parent` (`id`)", }, { name: "identical foreign key", @@ -277,16 +307,18 @@ func TestCreateTableDiff(t *testing.T) { diff: "", }, { - name: "modify foreign key", - 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 set null)", - diff: "alter table t1 drop foreign key f, add constraint f foreign key (i) references parent (id) on delete set null", + name: "modify foreign key", + 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 set null)", + diff: "alter table t1 drop foreign key f, add constraint f foreign key (i) references parent (id) on delete set null", + cdiff: "ALTER TABLE `t1` DROP FOREIGN KEY `f`, ADD CONSTRAINT `f` FOREIGN KEY (`i`) REFERENCES `parent` (`id`) ON DELETE SET NULL", }, { - name: "drop and add foreign key", - 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 f2 foreign key (i) references parent(id) on delete set null)", - diff: "alter table t1 drop foreign key f, add constraint f2 foreign key (i) references parent (id) on delete set null", + name: "drop and add foreign key", + 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 f2 foreign key (i) references parent(id) on delete set null)", + diff: "alter table t1 drop foreign key f, add constraint f2 foreign key (i) references parent (id) on delete set null", + cdiff: "ALTER TABLE `t1` DROP FOREIGN KEY `f`, ADD CONSTRAINT `f2` FOREIGN KEY (`i`) REFERENCES `parent` (`id`) ON DELETE SET NULL", }, { name: "ignore different foreign key order", @@ -296,46 +328,53 @@ func TestCreateTableDiff(t *testing.T) { }, // partitions { - name: "identical partitioning", - from: "create table t1 (id int primary key) partition by hash (id) partitions 4", - to: "create table t1 (id int primary key, a int) partition by hash (id) partitions 4", - diff: "alter table t1 add column a int", + name: "identical partitioning", + from: "create table t1 (id int primary key) partition by hash (id) partitions 4", + to: "create table t1 (id int primary key, a int) partition by hash (id) partitions 4", + diff: "alter table t1 add column a int", + cdiff: "ALTER TABLE `t1` ADD COLUMN `a` int", }, { - name: "remove partitioning", - from: "create table t1 (id int primary key) partition by hash (id) partitions 4", - to: "create table t1 (id int primary key, a int)", - diff: "alter table t1 add column a int remove partitioning", + name: "remove partitioning", + from: "create table t1 (id int primary key) partition by hash (id) partitions 4", + to: "create table t1 (id int primary key, a int)", + diff: "alter table t1 add column a int remove partitioning", + cdiff: "ALTER TABLE `t1` ADD COLUMN `a` int REMOVE PARTITIONING", }, { - name: "remove partitioning 2", - from: "create table t1 (id int primary key) partition by hash (id) partitions 4", - to: "create table t1 (id int primary key)", - diff: "alter table t1 remove partitioning", + name: "remove partitioning 2", + from: "create table t1 (id int primary key) partition by hash (id) partitions 4", + to: "create table t1 (id int primary key)", + diff: "alter table t1 remove partitioning", + cdiff: "ALTER TABLE `t1` REMOVE PARTITIONING", }, { - name: "change partitioning hash", - from: "create table t1 (id int primary key) partition by hash (id) partitions 4", - to: "create table t1 (id int primary key) partition by hash (id) partitions 5", - diff: "alter table t1 partition by hash (id) partitions 5", + name: "change partitioning hash", + from: "create table t1 (id int primary key) partition by hash (id) partitions 4", + to: "create table t1 (id int primary key) partition by hash (id) partitions 5", + diff: "alter table t1 partition by hash (id) partitions 5", + cdiff: "ALTER TABLE `t1` PARTITION BY HASH (`id`) PARTITIONS 5", }, { - name: "change partitioning key", - from: "create table t1 (id int primary key) partition by key (id) partitions 2", - to: "create table t1 (id int primary key) partition by hash (id) partitions 5", - diff: "alter table t1 partition by hash (id) partitions 5", + name: "change partitioning key", + from: "create table t1 (id int primary key) partition by key (id) partitions 2", + to: "create table t1 (id int primary key) partition by hash (id) partitions 5", + diff: "alter table t1 partition by hash (id) partitions 5", + cdiff: "ALTER TABLE `t1` PARTITION BY HASH (`id`) PARTITIONS 5", }, { - name: "change partitioning list", - from: "create table t1 (id int primary key) partition by key (id) partitions 2", - to: "create table t1 (id int primary key) partition by list (id) (partition p1 values in(11,21), partition p2 values in (12,22))", - diff: "alter table t1 partition by list (id) (partition p1 values in (11, 21), partition p2 values in (12, 22))", + name: "change partitioning list", + from: "create table t1 (id int primary key) partition by key (id) partitions 2", + to: "create table t1 (id int primary key) partition by list (id) (partition p1 values in(11,21), partition p2 values in (12,22))", + diff: "alter table t1 partition by list (id) (partition p1 values in (11, 21), partition p2 values in (12, 22))", + cdiff: "ALTER TABLE `t1` PARTITION BY LIST (`id`) (PARTITION `p1` VALUES IN (11, 21), PARTITION `p2` VALUES IN (12, 22))", }, { - name: "change partitioning range: rotate", - from: "create table t1 (id int primary key) partition by range (id) (partition p1 values less than (10), partition p2 values less than (20), partition p3 values less than (30))", - to: "create table t1 (id int primary key) partition by range (id) (partition p2 values less than (20), partition p3 values less than (30), partition p4 values less than (40))", - diff: "alter table t1 partition by range (id) (partition p2 values less than (20), partition p3 values less than (30), partition p4 values less than (40))", + name: "change partitioning range: rotate", + from: "create table t1 (id int primary key) partition by range (id) (partition p1 values less than (10), partition p2 values less than (20), partition p3 values less than (30))", + to: "create table t1 (id int primary key) partition by range (id) (partition p2 values less than (20), partition p3 values less than (30), partition p4 values less than (40))", + diff: "alter table t1 partition by range (id) (partition p2 values less than (20), partition p3 values less than (30), partition p4 values less than (40))", + cdiff: "ALTER TABLE `t1` PARTITION BY RANGE (`id`) (PARTITION `p2` VALUES LESS THAN (20), PARTITION `p3` VALUES LESS THAN (30), PARTITION `p4` VALUES LESS THAN (40))", }, { name: "change partitioning range: ignore rotate", @@ -349,6 +388,7 @@ func TestCreateTableDiff(t *testing.T) { to: "create table t1 (id int primary key) partition by range (id) (partition p2 values less than (25), partition p3 values less than (30), partition p4 values less than (40))", rotation: RangeRotationIgnore, diff: "alter table t1 partition by range (id) (partition p2 values less than (25), partition p3 values less than (30), partition p4 values less than (40))", + cdiff: "ALTER TABLE `t1` PARTITION BY RANGE (`id`) (PARTITION `p2` VALUES LESS THAN (25), PARTITION `p3` VALUES LESS THAN (30), PARTITION `p4` VALUES LESS THAN (40))", }, { name: "change partitioning range: ignore rotate, not a rotation 2", @@ -356,6 +396,7 @@ func TestCreateTableDiff(t *testing.T) { to: "create table t1 (id int primary key) partition by range (id) (partition p2 values less than (20), partition p3 values less than (35), partition p4 values less than (40))", rotation: RangeRotationIgnore, diff: "alter table t1 partition by range (id) (partition p2 values less than (20), partition p3 values less than (35), partition p4 values less than (40))", + cdiff: "ALTER TABLE `t1` PARTITION BY RANGE (`id`) (PARTITION `p2` VALUES LESS THAN (20), PARTITION `p3` VALUES LESS THAN (35), PARTITION `p4` VALUES LESS THAN (40))", }, { name: "change partitioning range: ignore rotate, not a rotation 3", @@ -363,6 +404,7 @@ func TestCreateTableDiff(t *testing.T) { to: "create table t1 (id int primary key) partition by range (id) (partition p2 values less than (20), partition pX values less than (30), partition p4 values less than (40))", rotation: RangeRotationIgnore, diff: "alter table t1 partition by range (id) (partition p2 values less than (20), partition pX values less than (30), partition p4 values less than (40))", + cdiff: "ALTER TABLE `t1` PARTITION BY RANGE (`id`) (PARTITION `p2` VALUES LESS THAN (20), PARTITION `pX` VALUES LESS THAN (30), PARTITION `p4` VALUES LESS THAN (40))", }, { name: "change partitioning range: ignore rotate, not a rotation 4", @@ -370,6 +412,7 @@ func TestCreateTableDiff(t *testing.T) { to: "create table t1 (id int primary key) partition by range (id) (partition pX values less than (20), partition p3 values less than (30), partition p4 values less than (40))", rotation: RangeRotationIgnore, diff: "alter table t1 partition by range (id) (partition pX values less than (20), partition p3 values less than (30), partition p4 values less than (40))", + cdiff: "ALTER TABLE `t1` PARTITION BY RANGE (`id`) (PARTITION `pX` VALUES LESS THAN (20), PARTITION `p3` VALUES LESS THAN (30), PARTITION `p4` VALUES LESS THAN (40))", }, { name: "change partitioning range: ignore rotate, nothing shared", @@ -377,6 +420,7 @@ func TestCreateTableDiff(t *testing.T) { to: "create table t1 (id int primary key) partition by range (id) (partition p4 values less than (40), partition p5 values less than (50), partition p6 values less than (60))", rotation: RangeRotationIgnore, diff: "alter table t1 partition by range (id) (partition p4 values less than (40), partition p5 values less than (50), partition p6 values less than (60))", + cdiff: "ALTER TABLE `t1` PARTITION BY RANGE (`id`) (PARTITION `p4` VALUES LESS THAN (40), PARTITION `p5` VALUES LESS THAN (50), PARTITION `p6` VALUES LESS THAN (60))", }, { name: "change partitioning range: ignore rotate, no names shared, definitions shared", @@ -384,6 +428,7 @@ func TestCreateTableDiff(t *testing.T) { to: "create table t1 (id int primary key) partition by range (id) (partition pA values less than (20), partition pB values less than (30), partition pC values less than (40))", rotation: RangeRotationIgnore, diff: "alter table t1 partition by range (id) (partition pA values less than (20), partition pB values less than (30), partition pC values less than (40))", + cdiff: "ALTER TABLE `t1` PARTITION BY RANGE (`id`) (PARTITION `pA` VALUES LESS THAN (20), PARTITION `pB` VALUES LESS THAN (30), PARTITION `pC` VALUES LESS THAN (40))", }, // @@ -409,82 +454,95 @@ func TestCreateTableDiff(t *testing.T) { to: "create table t1 (id int primary key) character set=utf8, row_format=compressed", }, { - name: "add table option 1", - from: "create table t1 (id int primary key)", - to: "create table t1 (id int primary key) row_format=compressed", - diff: "alter table t1 row_format compressed", + name: "add table option 1", + from: "create table t1 (id int primary key)", + to: "create table t1 (id int primary key) row_format=compressed", + diff: "alter table t1 row_format compressed", + cdiff: "ALTER TABLE `t1` ROW_FORMAT COMPRESSED", }, { - name: "add table option 2", - from: "create table t1 (id int primary key) character set=utf8", - to: "create table t1 (id int primary key) character set=utf8, row_format=compressed", - diff: "alter table t1 row_format compressed", + name: "add table option 2", + from: "create table t1 (id int primary key) character set=utf8", + to: "create table t1 (id int primary key) character set=utf8, row_format=compressed", + diff: "alter table t1 row_format compressed", + cdiff: "ALTER TABLE `t1` ROW_FORMAT COMPRESSED", }, { - name: "add table option 3", - from: "create table t1 (id int primary key) character set=utf8", - to: "create table t1 (id int primary key) row_format=compressed, character set=utf8", - diff: "alter table t1 row_format compressed", + name: "add table option 3", + from: "create table t1 (id int primary key) character set=utf8", + to: "create table t1 (id int primary key) row_format=compressed, character set=utf8", + diff: "alter table t1 row_format compressed", + cdiff: "ALTER TABLE `t1` ROW_FORMAT COMPRESSED", }, { - name: "add table option 3", - from: "create table t1 (id int primary key) character set=utf8", - to: "create table t1 (id int primary key) row_format=compressed, character set=utf8, checksum=1", - diff: "alter table t1 row_format compressed checksum 1", + name: "add table option 3", + from: "create table t1 (id int primary key) character set=utf8", + to: "create table t1 (id int primary key) row_format=compressed, character set=utf8, checksum=1", + diff: "alter table t1 row_format compressed checksum 1", + cdiff: "ALTER TABLE `t1` ROW_FORMAT COMPRESSED CHECKSUM 1", }, { - name: "modify table option 1", - from: "create table t1 (id int primary key) character set=utf8", - to: "create table t1 (id int primary key) character set=utf8mb4", - diff: "alter table t1 charset utf8mb4", + name: "modify table option 1", + from: "create table t1 (id int primary key) character set=utf8", + to: "create table t1 (id int primary key) character set=utf8mb4", + diff: "alter table t1 charset utf8mb4", + cdiff: "ALTER TABLE `t1` CHARSET utf8mb4", }, { - name: "modify table option 2", - from: "create table t1 (id int primary key) charset=utf8", - to: "create table t1 (id int primary key) character set=utf8mb4", - diff: "alter table t1 charset utf8mb4", + name: "modify table option 2", + from: "create table t1 (id int primary key) charset=utf8", + to: "create table t1 (id int primary key) character set=utf8mb4", + diff: "alter table t1 charset utf8mb4", + cdiff: "ALTER TABLE `t1` CHARSET utf8mb4", }, { - name: "modify table option 3", - from: "create table t1 (id int primary key) character set=utf8", - to: "create table t1 (id int primary key) charset=utf8mb4", - diff: "alter table t1 charset utf8mb4", + name: "modify table option 3", + from: "create table t1 (id int primary key) character set=utf8", + to: "create table t1 (id int primary key) charset=utf8mb4", + diff: "alter table t1 charset utf8mb4", + cdiff: "ALTER TABLE `t1` CHARSET utf8mb4", }, { - name: "modify table option 4", - from: "create table t1 (id int primary key) character set=utf8", - to: "create table t1 (id int primary key) row_format=compressed, character set=utf8mb4, checksum=1", - diff: "alter table t1 charset utf8mb4 row_format compressed checksum 1", + name: "modify table option 4", + from: "create table t1 (id int primary key) character set=utf8", + to: "create table t1 (id int primary key) row_format=compressed, character set=utf8mb4, checksum=1", + diff: "alter table t1 charset utf8mb4 row_format compressed checksum 1", + cdiff: "ALTER TABLE `t1` CHARSET utf8mb4 ROW_FORMAT COMPRESSED CHECKSUM 1", }, { - name: "remove table option 1", - from: "create table t1 (id int primary key) row_format=compressed", - to: "create table t1 (id int primary key) ", - diff: "alter table t1 row_format DEFAULT", + name: "remove table option 1", + from: "create table t1 (id int primary key) row_format=compressed", + to: "create table t1 (id int primary key) ", + diff: "alter table t1 row_format DEFAULT", + cdiff: "ALTER TABLE `t1` ROW_FORMAT DEFAULT", }, { - name: "remove table option 2", - from: "create table t1 (id int primary key) CHECKSUM=1", - to: "create table t1 (id int primary key) ", - diff: "alter table t1 CHECKSUM 0", + name: "remove table option 2", + from: "create table t1 (id int primary key) CHECKSUM=1", + to: "create table t1 (id int primary key) ", + diff: "alter table t1 CHECKSUM 0", + cdiff: "ALTER TABLE `t1` CHECKSUM 0", }, { - name: "remove table option 3", - from: "create table t1 (id int primary key) checksum=1", - to: "create table t1 (id int primary key) ", - diff: "alter table t1 checksum 0", + name: "remove table option 3", + from: "create table t1 (id int primary key) checksum=1", + to: "create table t1 (id int primary key) ", + diff: "alter table t1 checksum 0", + cdiff: "ALTER TABLE `t1` CHECKSUM 0", }, { - name: "remove table option 4", - from: "create table t1 (id int auto_increment primary key) KEY_BLOCK_SIZE=16 COMPRESSION='zlib'", - to: "create table t2 (id int auto_increment primary key)", - diff: "alter table t1 KEY_BLOCK_SIZE 0 COMPRESSION ''", + name: "remove table option 4", + from: "create table t1 (id int auto_increment primary key) KEY_BLOCK_SIZE=16 COMPRESSION='zlib'", + to: "create table t2 (id int auto_increment primary key)", + diff: "alter table t1 KEY_BLOCK_SIZE 0 COMPRESSION ''", + cdiff: "ALTER TABLE `t1` KEY_BLOCK_SIZE 0 COMPRESSION ''", }, { - name: "add, modify and remove table option", - from: "create table t1 (id int primary key) engine=innodb, charset=utf8, checksum=1", - to: "create table t1 (id int primary key) row_format=compressed, engine=innodb, charset=utf8mb4", - diff: "alter table t1 checksum 0 charset utf8mb4 row_format compressed", + name: "add, modify and remove table option", + from: "create table t1 (id int primary key) engine=innodb, charset=utf8, checksum=1", + to: "create table t1 (id int primary key) row_format=compressed, engine=innodb, charset=utf8mb4", + diff: "alter table t1 checksum 0 charset utf8mb4 row_format compressed", + cdiff: "ALTER TABLE `t1` CHECKSUM 0 CHARSET utf8mb4 ROW_FORMAT COMPRESSED", }, { name: "ignore AUTO_INCREMENT addition", @@ -497,6 +555,7 @@ func TestCreateTableDiff(t *testing.T) { to: "create table t2 (id int auto_increment primary key) AUTO_INCREMENT=300", autoinc: AutoIncrementApplyHigher, diff: "alter table t1 AUTO_INCREMENT 300", + cdiff: "ALTER TABLE `t1` AUTO_INCREMENT 300", }, { name: "ignore AUTO_INCREMENT removal", @@ -520,6 +579,7 @@ func TestCreateTableDiff(t *testing.T) { to: "create table t2 (id int auto_increment primary key) AUTO_INCREMENT=300", autoinc: AutoIncrementApplyHigher, diff: "alter table t1 AUTO_INCREMENT 300", + cdiff: "ALTER TABLE `t1` AUTO_INCREMENT 300", }, { name: "ignore AUTO_INCREMENT decrease", @@ -533,12 +593,14 @@ func TestCreateTableDiff(t *testing.T) { to: "create table t2 (id int auto_increment primary key) AUTO_INCREMENT=100", autoinc: AutoIncrementApplyAlways, diff: "alter table t1 AUTO_INCREMENT 100", + cdiff: "ALTER TABLE `t1` AUTO_INCREMENT 100", }, { - name: `change table charset`, - from: "create table t (id int primary key, t1 varchar(128) default null, t2 varchar(128) not null, t3 tinytext charset latin1, t4 tinytext charset latin1) default charset=utf8", - to: "create table t (id int primary key, t1 varchar(128) not null, t2 varchar(128) not null, t3 tinytext, t4 tinytext charset latin1) default charset=utf8mb4", - diff: "alter table t modify column t1 varchar(128) not null, modify column t2 varchar(128) not null, modify column t3 tinytext, charset utf8mb4", + name: `change table charset`, + from: "create table t (id int primary key, t1 varchar(128) default null, t2 varchar(128) not null, t3 tinytext charset latin1, t4 tinytext charset latin1) default charset=utf8", + to: "create table t (id int primary key, t1 varchar(128) not null, t2 varchar(128) not null, t3 tinytext, t4 tinytext charset latin1) default charset=utf8mb4", + diff: "alter table t modify column t1 varchar(128) not null, modify column t2 varchar(128) not null, modify column t3 tinytext, charset utf8mb4", + cdiff: "ALTER TABLE `t` MODIFY COLUMN `t1` varchar(128) NOT NULL, MODIFY COLUMN `t2` varchar(128) NOT NULL, MODIFY COLUMN `t3` tinytext, CHARSET utf8mb4", }, } standardHints := DiffHints{} @@ -576,8 +638,20 @@ func TestCreateTableDiff(t *testing.T) { assert.NoError(t, err) require.NotNil(t, alter) assert.False(t, alter.IsEmpty(), "expected changes, found empty diff") - diff := alter.StatementString() - assert.Equal(t, ts.diff, diff) + + { + diff := alter.StatementString() + assert.Equal(t, ts.diff, diff) + // validate we can parse back the statement + _, err := sqlparser.Parse(diff) + assert.NoError(t, err) + } + { + cdiff := alter.CanonicalStatementString() + assert.Equal(t, ts.cdiff, cdiff) + _, err := sqlparser.Parse(cdiff) + assert.NoError(t, err) + } } }) } diff --git a/go/vt/schemadiff/types.go b/go/vt/schemadiff/types.go index c5b7b71242b..efb77c89965 100644 --- a/go/vt/schemadiff/types.go +++ b/go/vt/schemadiff/types.go @@ -61,6 +61,8 @@ type EntityDiff interface { Statement() sqlparser.Statement // StatementString "stringifies" the this diff's Statement(). It returns an empty string if the diff is empty StatementString() string + // CanonicalStatementString "stringifies" the this diff's Statement() to a canonical string. It returns an empty string if the diff is empty + CanonicalStatementString() string } const ( diff --git a/go/vt/schemadiff/view.go b/go/vt/schemadiff/view.go index fd59133d2ce..7d258bbb177 100644 --- a/go/vt/schemadiff/view.go +++ b/go/vt/schemadiff/view.go @@ -44,6 +44,14 @@ func (d *AlterViewEntityDiff) StatementString() (s string) { return s } +// CanonicalStatementString implements EntityDiff +func (d *AlterViewEntityDiff) CanonicalStatementString() (s string) { + if stmt := d.Statement(); stmt != nil { + s = sqlparser.CanonicalString(stmt) + } + return s +} + // type CreateViewEntityDiff struct { createView *sqlparser.CreateView @@ -70,6 +78,14 @@ func (d *CreateViewEntityDiff) StatementString() (s string) { return s } +// CanonicalStatementString implements EntityDiff +func (d *CreateViewEntityDiff) CanonicalStatementString() (s string) { + if stmt := d.Statement(); stmt != nil { + s = sqlparser.CanonicalString(stmt) + } + return s +} + // type DropViewEntityDiff struct { dropView *sqlparser.DropView @@ -88,6 +104,14 @@ func (d *DropViewEntityDiff) Statement() sqlparser.Statement { return d.dropView } +// CanonicalStatementString implements EntityDiff +func (d *DropViewEntityDiff) CanonicalStatementString() (s string) { + if stmt := d.Statement(); stmt != nil { + s = sqlparser.CanonicalString(stmt) + } + return s +} + // StatementString implements EntityDiff func (d *DropViewEntityDiff) StatementString() (s string) { if stmt := d.Statement(); stmt != nil { diff --git a/go/vt/schemadiff/view_test.go b/go/vt/schemadiff/view_test.go index 1d8a36820e8..173b4c71453 100644 --- a/go/vt/schemadiff/view_test.go +++ b/go/vt/schemadiff/view_test.go @@ -31,6 +31,7 @@ func TestCreateViewDiff(t *testing.T) { from string to string diff string + cdiff string isError bool }{ { @@ -59,16 +60,18 @@ func TestCreateViewDiff(t *testing.T) { to: "create view v1 (`col1`, col2, col3) as select a, b, `c` from t", }, { - name: "change of column list, qualifiers", - from: "create view v1 (col1, `col2`, `col3`) as select `a`, `b`, c from t", - to: "create view v1 (`col1`, col2, colother) as select a, b, `c` from t", - diff: "alter view v1(col1, col2, colother) as select a, b, c from t", + name: "change of column list, qualifiers", + from: "create view v1 (col1, `col2`, `col3`) as select `a`, `b`, c from t", + to: "create view v1 (`col1`, col2, colother) as select a, b, `c` from t", + diff: "alter view v1(col1, col2, colother) as select a, b, c from t", + cdiff: "ALTER VIEW `v1`(`col1`, `col2`, `colother`) AS SELECT `a`, `b`, `c` FROM `t`", }, { - name: "change of column list, must have qualifiers", - from: "create view v1 (col1, `col2`, `col3`) as select `a`, `b`, c from t", - to: "create view v1 (`col1.with.dot`, `col2`, colother) as select a, b, `c` from t", - diff: "alter view v1(`col1.with.dot`, col2, colother) as select a, b, c from t", + name: "change of column list, must have qualifiers", + from: "create view v1 (col1, `col2`, `col3`) as select `a`, `b`, c from t", + to: "create view v1 (`col1.with.dot`, `col2`, colother) as select a, b, `c` from t", + diff: "alter view v1(`col1.with.dot`, col2, colother) as select a, b, c from t", + cdiff: "ALTER VIEW `v1`(`col1.with.dot`, `col2`, `colother`) AS SELECT `a`, `b`, `c` FROM `t`", }, { name: "identical, spacing, case change", @@ -78,16 +81,18 @@ func TestCreateViewDiff(t *testing.T) { from t`, }, { - name: "change of query", - from: "create view v1 as select a from t", - to: "create view v1 as select a, b from t", - diff: "alter view v1 as select a, b from t", + name: "change of query", + from: "create view v1 as select a from t", + to: "create view v1 as select a, b from t", + diff: "alter view v1 as select a, b from t", + cdiff: "ALTER VIEW `v1` AS SELECT `a`, `b` FROM `t`", }, { - name: "change of view name", - from: "create view v1 as select a from t", - to: "create view v2 as select a, b from t", - diff: "alter view v1 as select a, b from t", + name: "change of view name", + from: "create view v1 as select a from t", + to: "create view v2 as select a, b from t", + diff: "alter view v1 as select a, b from t", + cdiff: "ALTER VIEW `v1` AS SELECT `a`, `b` FROM `t`", }, { name: "change of columns, spacing", @@ -95,37 +100,43 @@ func TestCreateViewDiff(t *testing.T) { to: `create view v2 as select a, b from t`, - diff: "alter view v1 as select a, b from t", + diff: "alter view v1 as select a, b from t", + cdiff: "ALTER VIEW `v1` AS SELECT `a`, `b` FROM `t`", }, { - name: "algorithm, case change", - from: "create view v1 as select a from t", - to: "create algorithm=temptable view v2 as select a FROM t", - diff: "alter algorithm = temptable view v1 as select a from t", + name: "algorithm, case change", + from: "create view v1 as select a from t", + to: "create algorithm=temptable view v2 as select a FROM t", + diff: "alter algorithm = temptable view v1 as select a from t", + cdiff: "ALTER ALGORITHM = TEMPTABLE VIEW `v1` AS SELECT `a` FROM `t`", }, { - name: "algorith, case change 2", - from: "create view v1 as select a FROM t", - to: "create algorithm=temptable view v2 as select a from t", - diff: "alter algorithm = temptable view v1 as select a from t", + name: "algorith, case change 2", + from: "create view v1 as select a FROM t", + to: "create algorithm=temptable view v2 as select a from t", + diff: "alter algorithm = temptable view v1 as select a from t", + cdiff: "ALTER ALGORITHM = TEMPTABLE VIEW `v1` AS SELECT `a` FROM `t`", }, { - name: "algorith, case change 3", - from: "create ALGORITHM=MERGE view v1 as select a FROM t", - to: "create ALGORITHM=TEMPTABLE view v2 as select a from t", - diff: "alter algorithm = TEMPTABLE view v1 as select a from t", + name: "algorith, case change 3", + from: "create ALGORITHM=MERGE view v1 as select a FROM t", + to: "create ALGORITHM=TEMPTABLE view v2 as select a from t", + diff: "alter algorithm = TEMPTABLE view v1 as select a from t", + cdiff: "ALTER ALGORITHM = TEMPTABLE VIEW `v1` AS SELECT `a` FROM `t`", }, { - name: "algorith value is case sensitive", - from: "create ALGORITHM=TEMPTABLE view v1 as select a from t", - to: "create ALGORITHM=temptable view v2 as select a from t", - diff: "alter algorithm = temptable view v1 as select a from t", + name: "algorith value is case sensitive", + from: "create ALGORITHM=TEMPTABLE view v1 as select a from t", + to: "create ALGORITHM=temptable view v2 as select a from t", + diff: "alter algorithm = temptable view v1 as select a from t", + cdiff: "ALTER ALGORITHM = TEMPTABLE VIEW `v1` AS SELECT `a` FROM `t`", }, { - name: "algorith value is case sensitive 2", - from: "create ALGORITHM=temptable view v1 as select a from t", - to: "create ALGORITHM=TEMPTABLE view v2 as select a from t", - diff: "alter algorithm = TEMPTABLE view v1 as select a from t", + name: "algorith value is case sensitive 2", + from: "create ALGORITHM=temptable view v1 as select a from t", + to: "create ALGORITHM=TEMPTABLE view v2 as select a from t", + diff: "alter algorithm = TEMPTABLE view v1 as select a from t", + cdiff: "ALTER ALGORITHM = TEMPTABLE VIEW `v1` AS SELECT `a` FROM `t`", }, } hints := &DiffHints{} @@ -154,8 +165,19 @@ func TestCreateViewDiff(t *testing.T) { assert.NoError(t, err) require.NotNil(t, alter) require.False(t, alter.IsEmpty()) - diff := alter.StatementString() - assert.Equal(t, ts.diff, diff) + { + diff := alter.StatementString() + assert.Equal(t, ts.diff, diff) + // validate we can parse back the statement + _, err := sqlparser.Parse(diff) + assert.NoError(t, err) + } + { + cdiff := alter.CanonicalStatementString() + assert.Equal(t, ts.cdiff, cdiff) + _, err := sqlparser.Parse(cdiff) + assert.NoError(t, err) + } } }) } diff --git a/go/vt/vttablet/onlineddl/executor.go b/go/vt/vttablet/onlineddl/executor.go index fa21b3ee8c2..3f6b04f34a6 100644 --- a/go/vt/vttablet/onlineddl/executor.go +++ b/go/vt/vttablet/onlineddl/executor.go @@ -2518,9 +2518,9 @@ func (e *Executor) executeMigration(ctx context.Context, onlineDDL *schema.Onlin } else { // a TABLE ddlAction = sqlparser.AlterDDLAction - onlineDDL.SQL = diff.StatementString() + onlineDDL.SQL = diff.CanonicalStatementString() } - _ = e.updateMigrationMessage(ctx, onlineDDL.UUID, diff.StatementString()) + _ = e.updateMigrationMessage(ctx, onlineDDL.UUID, diff.CanonicalStatementString()) } else { { // table does not exist, so this declarative CREATE turns out to really be an actual CREATE. No further action is needed here. From 7a2116e51577d08c0da850c2b858514bb6dc7a76 Mon Sep 17 00:00:00 2001 From: Deepthi Sigireddi Date: Wed, 27 Apr 2022 15:02:50 -0700 Subject: [PATCH 04/22] bootstrap changelog (#10147) Signed-off-by: deepthi --- docker/bootstrap/CHANGELOG.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docker/bootstrap/CHANGELOG.md b/docker/bootstrap/CHANGELOG.md index 78586437e93..427527a3928 100644 --- a/docker/bootstrap/CHANGELOG.md +++ b/docker/bootstrap/CHANGELOG.md @@ -5,5 +5,33 @@ List of changes between bootstrap image versions. ## [1] - 2020-12-18 ### Changes - Update bootstrap image to build binaries using golang 1.15 + +## [2] - 2021-06-21 +### Changes +- Update build to golang 1.16 + +## [3] - 2021-08-18 +### Changes +- Update build to golang 1.17 + +## [4] - 2022-01-18 +### Changes +- Import new keys after Oracle rotated the PGP keys for their APT repository for MySQL 8.0+. + +## [5] - 2022-03-15 +### Changes +- Update build to golang 1.18 + +## [6] - 2022-04-15 +### Changes +- Update build to golang 1.18.1 + +## [7] - N/A +- Skipped because new images did not change `bootstrap-version` in `test.go` + +## [8] - 2022-04-22 +### Changes +- Update versions of zookeeper and consul +- Get `make tools` working on M1 mac From 417172aced45e725bbac534a6de98d192e6ea5f9 Mon Sep 17 00:00:00 2001 From: Andres Taylor Date: Thu, 28 Apr 2022 10:16:51 +0200 Subject: [PATCH 05/22] feat: make gen4 plan subsharding queries better (#10151) * feat: make gen4 plan subsharding queries better Signed-off-by: Andres Taylor * chore: updated tests and engine primitives to handle Subshard opcode Signed-off-by: Andres Taylor * test: update tests after adding Subshard Signed-off-by: Andres Taylor --- go/vt/vtgate/engine/delete.go | 2 +- go/vt/vtgate/engine/delete_test.go | 2 +- go/vt/vtgate/engine/insert_test.go | 2 +- go/vt/vtgate/engine/routing.go | 7 +- go/vt/vtgate/engine/update.go | 2 +- go/vt/vtgate/engine/update_test.go | 2 +- go/vt/vtgate/planbuilder/insert.go | 2 +- go/vt/vtgate/planbuilder/physical/route.go | 5 +- go/vt/vtgate/planbuilder/route_test.go | 35 ++++---- .../vtgate/planbuilder/testdata/dml_cases.txt | 90 ++++++++++++++----- .../planbuilder/testdata/filter_cases.txt | 9 +- go/vt/vtgate/vindexes/vschema.go | 36 ++++---- 12 files changed, 124 insertions(+), 70 deletions(-) diff --git a/go/vt/vtgate/engine/delete.go b/go/vt/vtgate/engine/delete.go index 8869e3b313c..12d8cbb8afb 100644 --- a/go/vt/vtgate/engine/delete.go +++ b/go/vt/vtgate/engine/delete.go @@ -78,7 +78,7 @@ func (del *Delete) TryExecute(vcursor VCursor, bindVars map[string]*querypb.Bind switch del.Opcode { case Unsharded: return del.execUnsharded(vcursor, bindVars, rss) - case Equal, IN, Scatter, ByDestination: + case Equal, IN, Scatter, ByDestination, SubShard: return del.execMultiDestination(vcursor, bindVars, rss, del.deleteVindexEntries) default: // Unreachable. diff --git a/go/vt/vtgate/engine/delete_test.go b/go/vt/vtgate/engine/delete_test.go index 59e980f605c..99a07c804cd 100644 --- a/go/vt/vtgate/engine/delete_test.go +++ b/go/vt/vtgate/engine/delete_test.go @@ -547,7 +547,7 @@ func TestDeleteEqualSubshard(t *testing.T) { del := &Delete{ DML: &DML{ RoutingParameters: &RoutingParameters{ - Opcode: Equal, + Opcode: SubShard, Keyspace: &vindexes.Keyspace{ Name: "ks", Sharded: true, diff --git a/go/vt/vtgate/engine/insert_test.go b/go/vt/vtgate/engine/insert_test.go index 5ec28be1d4c..b5a723df469 100644 --- a/go/vt/vtgate/engine/insert_test.go +++ b/go/vt/vtgate/engine/insert_test.go @@ -712,7 +712,7 @@ func TestInsertShardedGeo(t *testing.T) { " suffix", ) for _, colVindex := range ks.Tables["t1"].ColumnVindexes { - if colVindex.IgnoreInDML() { + if colVindex.IsPartialVindex() { continue } ins.ColVindexes = append(ins.ColVindexes, colVindex) diff --git a/go/vt/vtgate/engine/routing.go b/go/vt/vtgate/engine/routing.go index 28d038f94c7..b382e46d302 100644 --- a/go/vt/vtgate/engine/routing.go +++ b/go/vt/vtgate/engine/routing.go @@ -68,8 +68,8 @@ const ( // Is used when the query explicitly sets a target destination: // in the clause e.g: UPDATE `keyspace[-]`.x1 SET foo=1 ByDestination - // NumOpcodes is the number of opcodes - NumOpcodes + // SubShard is for when we are missing one or more columns from a composite vindex + SubShard ) var opName = map[Opcode]string{ @@ -84,6 +84,7 @@ var opName = map[Opcode]string{ Reference: "Reference", None: "None", ByDestination: "ByDestination", + SubShard: "SubShard", } // MarshalJSON serializes the Opcode as a JSON string. @@ -133,7 +134,7 @@ func (rp *RoutingParameters) findRoute(vcursor VCursor, bindVars map[string]*que return rp.byDestination(vcursor, bindVars, key.DestinationAllShards{}) case ByDestination: return rp.byDestination(vcursor, bindVars, rp.TargetDestination) - case Equal, EqualUnique: + case Equal, EqualUnique, SubShard: switch rp.Vindex.(type) { case vindexes.MultiColumn: return rp.equalMultiCol(vcursor, bindVars) diff --git a/go/vt/vtgate/engine/update.go b/go/vt/vtgate/engine/update.go index 7f6e6d31e4c..815034a659c 100644 --- a/go/vt/vtgate/engine/update.go +++ b/go/vt/vtgate/engine/update.go @@ -88,7 +88,7 @@ func (upd *Update) TryExecute(vcursor VCursor, bindVars map[string]*querypb.Bind switch upd.Opcode { case Unsharded: return upd.execUnsharded(vcursor, bindVars, rss) - case Equal, EqualUnique, IN, Scatter, ByDestination: + case Equal, EqualUnique, IN, Scatter, ByDestination, SubShard: return upd.execMultiDestination(vcursor, bindVars, rss, upd.updateVindexEntries) default: // Unreachable. diff --git a/go/vt/vtgate/engine/update_test.go b/go/vt/vtgate/engine/update_test.go index 7dbd2fe6899..0cbd3b49499 100644 --- a/go/vt/vtgate/engine/update_test.go +++ b/go/vt/vtgate/engine/update_test.go @@ -884,7 +884,7 @@ func TestUpdateEqualSubshard(t *testing.T) { upd := &Update{ DML: &DML{ RoutingParameters: &RoutingParameters{ - Opcode: Equal, + Opcode: SubShard, Keyspace: &vindexes.Keyspace{ Name: "ks", Sharded: true, diff --git a/go/vt/vtgate/planbuilder/insert.go b/go/vt/vtgate/planbuilder/insert.go index d6a6573f7c5..fa397066471 100644 --- a/go/vt/vtgate/planbuilder/insert.go +++ b/go/vt/vtgate/planbuilder/insert.go @@ -295,7 +295,7 @@ func applyCommentDirectives(ins *sqlparser.Insert, eins *engine.Insert) { func getColVindexes(allColVindexes []*vindexes.ColumnVindex) (colVindexes []*vindexes.ColumnVindex) { for _, colVindex := range allColVindexes { - if colVindex.IgnoreInDML() { + if colVindex.IsPartialVindex() { continue } colVindexes = append(colVindexes, colVindex) diff --git a/go/vt/vtgate/planbuilder/physical/route.go b/go/vt/vtgate/planbuilder/physical/route.go index 3cccfd60d6b..bc529c1147e 100644 --- a/go/vt/vtgate/planbuilder/physical/route.go +++ b/go/vt/vtgate/planbuilder/physical/route.go @@ -355,7 +355,7 @@ func (r *Route) haveMatchingVindex( } v.Options = append(v.Options, newOption...) - // multi column vindex - just always add as new option for furince we do not have one already + // multi column vindex - just always add as new option option := createOption(v.ColVindex, vfunc) optionReady := option.updateWithNewColumn(colLoweredName, valueExpr, indexOfCol, value, node, v.ColVindex, opcode) if optionReady { @@ -635,6 +635,9 @@ func tupleAccess(expr sqlparser.Expr, coordinates []int) sqlparser.Expr { } func equalOrEqualUnique(vindex *vindexes.ColumnVindex) engine.Opcode { + if vindex.IsPartialVindex() { + return engine.SubShard + } if vindex.IsUnique() { return engine.EqualUnique } diff --git a/go/vt/vtgate/planbuilder/route_test.go b/go/vt/vtgate/planbuilder/route_test.go index cd4f229e48c..eb5a2310d8e 100644 --- a/go/vt/vtgate/planbuilder/route_test.go +++ b/go/vt/vtgate/planbuilder/route_test.go @@ -28,22 +28,26 @@ import ( ) /* + +This test file only tests the V3 planner. It does not test the Subshard opcode + For easy reference, opcodes are: - SelectUnsharded 0 - SelectEqualUnique 1 - SelectEqual 2 - SelectIN 3 - SelectMultiEqual 4 - SelectScatter 5 - SelectNext 6 - SelectDBA 7 - SelectReference 8 - SelectNone 9 - NumRouteOpcodes 10 + Unsharded 0 + EqualUnique 1 + Equal 2 + IN 3 + MultiEqual 4 + Scatter 5 + Next 6 + DBA 7 + Reference 8 + None 9 + Subshard 10 <- not covered + NumRouteOpcodes 11 */ func TestJoinCanMerge(t *testing.T) { - testcases := [engine.NumOpcodes][engine.NumOpcodes]bool{ + testcases := [][]bool{ {true, false, false, false, false, false, false, false, true, false, false}, {false, true, false, false, false, false, false, false, true, false, false}, {false, false, false, false, false, false, false, false, true, false, false}, @@ -60,7 +64,7 @@ func TestJoinCanMerge(t *testing.T) { ks := &vindexes.Keyspace{} for left, vals := range testcases { for right, val := range vals { - name := fmt.Sprintf("%d:%d", left, right) + name := fmt.Sprintf("%s:%s", engine.Opcode(left).String(), engine.Opcode(right).String()) t.Run(name, func(t *testing.T) { lRoute := &route{ // Setting condition will make SelectEqualUnique match itself. @@ -81,7 +85,7 @@ func TestJoinCanMerge(t *testing.T) { } func TestSubqueryCanMerge(t *testing.T) { - testcases := [engine.NumOpcodes][engine.NumOpcodes]bool{ + testcases := [][]bool{ {true, false, false, false, false, false, false, false, true, false, false}, {false, false, false, false, false, false, false, false, true, false, false}, {false, false, false, false, false, false, false, false, true, false, false}, @@ -111,7 +115,7 @@ func TestSubqueryCanMerge(t *testing.T) { } func TestUnionCanMerge(t *testing.T) { - testcases := [engine.NumOpcodes][engine.NumOpcodes]bool{ + testcases := [][]bool{ {true, false, false, false, false, false, false, false, false, false, false}, {false, false, false, false, false, false, false, false, false, false, false}, {false, false, false, false, false, false, false, false, false, false, false}, @@ -124,6 +128,7 @@ func TestUnionCanMerge(t *testing.T) { {false, false, false, false, false, false, false, false, false, false, false}, {false, false, false, false, false, false, false, false, false, false, false}, } + ks := &vindexes.Keyspace{} lRoute := &route{} rRoute := &route{} diff --git a/go/vt/vtgate/planbuilder/testdata/dml_cases.txt b/go/vt/vtgate/planbuilder/testdata/dml_cases.txt index 665d9f24c62..4480b0af93a 100644 --- a/go/vt/vtgate/planbuilder/testdata/dml_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/dml_cases.txt @@ -3309,26 +3309,7 @@ Gen4 plan same as above "Vindex": "multicolIdx" } } -{ - "QueryType": "UPDATE", - "Original": "update multicol_tbl set x = 1 where colb IN (1,2) and cola = 1", - "Instructions": { - "OperatorType": "Update", - "Variant": "Equal", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "TargetTabletType": "PRIMARY", - "MultiShardAutocommit": false, - "Query": "update multicol_tbl set x = 1 where colb in (1, 2) and cola = 1", - "Table": "multicol_tbl", - "Values": [ - "INT64(1)" - ], - "Vindex": "multicolIdx" - } -} +Gen4 plan same as above # update with a multicol vindex using an IN clause "update multicol_tbl set x = 1 where colb IN (1,2) and cola IN (3,4)" @@ -3570,7 +3551,26 @@ Gen4 plan same as above "Vindex": "multicolIdx" } } -Gen4 plan same as above +{ + "QueryType": "UPDATE", + "Original": "update multicol_tbl set x = 42 where cola = 1", + "Instructions": { + "OperatorType": "Update", + "Variant": "SubShard", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "TargetTabletType": "PRIMARY", + "MultiShardAutocommit": false, + "Query": "update multicol_tbl set x = 42 where cola = 1", + "Table": "multicol_tbl", + "Values": [ + "INT64(1)" + ], + "Vindex": "multicolIdx" + } +} # update with routing using subsharding column on lookup vindex "update multicol_tbl set name = 'bar' where cola = 1" @@ -3600,7 +3600,32 @@ Gen4 plan same as above "Vindex": "multicolIdx" } } -Gen4 plan same as above +{ + "QueryType": "UPDATE", + "Original": "update multicol_tbl set name = 'bar' where cola = 1", + "Instructions": { + "OperatorType": "Update", + "Variant": "SubShard", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "TargetTabletType": "PRIMARY", + "ChangedVindexValues": [ + "name_muticoltbl_map:4" + ], + "KsidLength": 2, + "KsidVindex": "multicolIdx", + "MultiShardAutocommit": false, + "OwnedVindexQuery": "select cola, colb, colc, `name`, `name` = 'bar' from multicol_tbl where cola = 1 for update", + "Query": "update multicol_tbl set `name` = 'bar' where cola = 1", + "Table": "multicol_tbl", + "Values": [ + "INT64(1)" + ], + "Vindex": "multicolIdx" + } +} # update with routing using subsharding column with in query "update multicol_tbl set name = 'bar' where cola in (1,2)" @@ -3654,7 +3679,26 @@ Gen4 plan same as above "Vindex": "multicolIdx" } } -Gen4 plan same as above +{ + "QueryType": "UPDATE", + "Original": "update multicol_tbl set x = 1 where name = 'foo' and cola = 2", + "Instructions": { + "OperatorType": "Update", + "Variant": "Equal", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "TargetTabletType": "PRIMARY", + "MultiShardAutocommit": false, + "Query": "update multicol_tbl set x = 1 where `name` = 'foo' and cola = 2", + "Table": "multicol_tbl", + "Values": [ + "VARCHAR(\"foo\")" + ], + "Vindex": "name_muticoltbl_map" + } +} # delete with routing using non-unique lookup vindex "delete from multicol_tbl where name = 'foo'" diff --git a/go/vt/vtgate/planbuilder/testdata/filter_cases.txt b/go/vt/vtgate/planbuilder/testdata/filter_cases.txt index 754c8a0e1c5..685fa720dc1 100644 --- a/go/vt/vtgate/planbuilder/testdata/filter_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/filter_cases.txt @@ -3838,7 +3838,7 @@ Gen4 plan same as above "Original": "select * from multicol_tbl where cola = 1", "Instructions": { "OperatorType": "Route", - "Variant": "Equal", + "Variant": "SubShard", "Keyspace": { "Name": "user", "Sharded": true @@ -3875,16 +3875,17 @@ Gen4 plan same as above "Original": "select * from multicol_tbl where cola = 1 and colb in (2,3)", "Instructions": { "OperatorType": "Route", - "Variant": "Equal", + "Variant": "IN", "Keyspace": { "Name": "user", "Sharded": true }, "FieldQuery": "select * from multicol_tbl where 1 != 1", - "Query": "select * from multicol_tbl where cola = 1 and colb in (2, 3)", + "Query": "select * from multicol_tbl where cola = 1 and colb in ::__vals1", "Table": "multicol_tbl", "Values": [ - "INT64(1)" + "INT64(1)", + "(INT64(2), INT64(3))" ], "Vindex": "multicolIdx" } diff --git a/go/vt/vtgate/vindexes/vschema.go b/go/vt/vtgate/vindexes/vschema.go index 186f9920a41..e4240064222 100644 --- a/go/vt/vtgate/vindexes/vschema.go +++ b/go/vt/vtgate/vindexes/vschema.go @@ -106,14 +106,14 @@ type Keyspace struct { // ColumnVindex contains the index info for each index of a table. type ColumnVindex struct { - Columns []sqlparser.ColIdent `json:"columns"` - Type string `json:"type"` - Name string `json:"name"` - Owned bool `json:"owned,omitempty"` - Vindex Vindex `json:"vindex"` - isUnique bool - cost int - ignoreInDML bool + Columns []sqlparser.ColIdent `json:"columns"` + Type string `json:"type"` + Name string `json:"name"` + Owned bool `json:"owned,omitempty"` + Vindex Vindex `json:"vindex"` + isUnique bool + cost int + partial bool } // IsUnique is used to tell whether the ColumnVindex @@ -129,9 +129,9 @@ func (c *ColumnVindex) Cost() int { return c.cost } -// IgnoreInDML is used to let planner and engine know that they need to be ignored for dml queries. -func (c *ColumnVindex) IgnoreInDML() bool { - return c.ignoreInDML +// IsPartialVindex is used to let planner and engine know that this is a composite vindex missing one or more columns +func (c *ColumnVindex) IsPartialVindex() bool { + return c.partial } // Column describes a column. @@ -374,13 +374,13 @@ func buildTables(ks *vschemapb.Keyspace, vschema *VSchema, ksvschema *KeyspaceSc columnSubset := columns[:i] cost++ columnVindex = &ColumnVindex{ - Columns: columnSubset, - Type: vindexInfo.Type, - Name: ind.Name, - Owned: owned, - Vindex: vindex, - cost: cost, - ignoreInDML: true, + Columns: columnSubset, + Type: vindexInfo.Type, + Name: ind.Name, + Owned: owned, + Vindex: vindex, + cost: cost, + partial: true, } t.ColumnVindexes = append(t.ColumnVindexes, columnVindex) } From 011ddf7a24571d22fd6273fd9fed229f454849bd Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Thu, 28 Apr 2022 14:44:55 +0530 Subject: [PATCH 06/22] fix: handle rconn reset when tx killer has locked the connection (#10153) Signed-off-by: Harshit Gangal --- go/vt/vterrors/constants.go | 6 ++++++ go/vt/vtgate/scatter_conn.go | 5 +---- go/vt/vtgate/scatter_conn_test.go | 12 ++++++++++++ go/vt/vttablet/tabletserver/tx_pool.go | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/go/vt/vterrors/constants.go b/go/vt/vterrors/constants.go index 2008e1ccbc1..50df5445354 100644 --- a/go/vt/vterrors/constants.go +++ b/go/vt/vterrors/constants.go @@ -41,3 +41,9 @@ const ( // PrimaryVindexNotSet is the error message to be used when there is no primary vindex found on a table PrimaryVindexNotSet = "table '%s' does not have a primary vindex" ) + +// TxKillerRollback purpose when acquire lock on connection for rolling back transaction. +const TxKillerRollback = "in use: for tx killer rollback" + +// TxClosed regex for connection closed +var TxClosed = regexp.MustCompile("transaction ([a-z0-9:]+) (?:ended|not found|in use: for tx killer rollback)") diff --git a/go/vt/vtgate/scatter_conn.go b/go/vt/vtgate/scatter_conn.go index 3d890c77ffb..ee0f6912630 100644 --- a/go/vt/vtgate/scatter_conn.go +++ b/go/vt/vtgate/scatter_conn.go @@ -20,7 +20,6 @@ import ( "context" "flag" "io" - "regexp" "sync" "time" @@ -709,8 +708,6 @@ func (stc *ScatterConn) ExecuteLock( return qr, err } -var txClosed = regexp.MustCompile("transaction ([a-z0-9:]+) (?:ended|not found)") - func wasConnectionClosed(err error) bool { sqlErr := mysql.NewSQLErrorFromError(err).(*mysql.SQLError) message := sqlErr.Error() @@ -719,7 +716,7 @@ func wasConnectionClosed(err error) bool { case mysql.CRServerGone, mysql.CRServerLost: return true case mysql.ERQueryInterrupted: - return txClosed.MatchString(message) + return vterrors.TxClosed.MatchString(message) default: return false } diff --git a/go/vt/vtgate/scatter_conn_test.go b/go/vt/vtgate/scatter_conn_test.go index dd485a2055e..276b4cad405 100644 --- a/go/vt/vtgate/scatter_conn_test.go +++ b/go/vt/vtgate/scatter_conn_test.go @@ -325,6 +325,14 @@ func TestReservedConnFail(t *testing.T) { assert.NotEqual(t, oldRId, session.Session.ShardSessions[0].ReservedId, "should have recreated a reserved connection since the last connection was lost") oldRId = session.Session.ShardSessions[0].ReservedId + sbc0.Queries = nil + sbc0.EphemeralShardErr = mysql.NewSQLError(mysql.ERQueryInterrupted, mysql.SSUnknownSQLState, "transaction 123 in use: for tx killer rollback") + _ = executeOnShardsReturnsErr(t, res, keyspace, sc, session, destinations) + assert.Equal(t, 2, len(sbc0.Queries), "one for the failed attempt, and one for the retry") + require.Equal(t, 1, len(session.ShardSessions)) + assert.NotEqual(t, oldRId, session.Session.ShardSessions[0].ReservedId, "should have recreated a reserved connection since the last connection was lost") + oldRId = session.Session.ShardSessions[0].ReservedId + sbc0.Queries = nil sbc0.EphemeralShardErr = vterrors.New(vtrpcpb.Code_CLUSTER_EVENT, "operation not allowed in state NOT_SERVING during query: query1") _ = executeOnShardsReturnsErr(t, res, keyspace, sc, session, destinations) @@ -420,6 +428,10 @@ func TestIsConnClosed(t *testing.T) { "tx not found missing tx id", mysql.NewSQLError(mysql.ERQueryInterrupted, mysql.SSUnknownSQLState, "transaction not found"), false, + }, { + "tx getting killed by tx killer", + mysql.NewSQLError(mysql.ERQueryInterrupted, mysql.SSUnknownSQLState, "transaction 111 in use: for tx killer rollback"), + true, }} for _, tCase := range testCases { diff --git a/go/vt/vttablet/tabletserver/tx_pool.go b/go/vt/vttablet/tabletserver/tx_pool.go index 12e262e6b65..4673bc1432b 100644 --- a/go/vt/vttablet/tabletserver/tx_pool.go +++ b/go/vt/vttablet/tabletserver/tx_pool.go @@ -122,7 +122,7 @@ func (tp *TxPool) Shutdown(ctx context.Context) { func (tp *TxPool) transactionKiller() { defer tp.env.LogError() - for _, conn := range tp.scp.GetOutdated(tp.Timeout(), "for tx killer rollback") { + for _, conn := range tp.scp.GetOutdated(tp.Timeout(), vterrors.TxKillerRollback) { log.Warningf("killing transaction (exceeded timeout: %v): %s", tp.Timeout(), conn.String(tp.env.Config().SanitizeLogMessages)) switch { case conn.IsTainted(): From 274e9d7cca9310125fb86798cf53901166d0688b Mon Sep 17 00:00:00 2001 From: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Date: Thu, 28 Apr 2022 16:29:52 +0300 Subject: [PATCH 07/22] EntityDiff has a 'Entities() (from Entity, to Entity) function' (#10161) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> --- go/vt/schemadiff/diff_test.go | 99 +++++++++++++++++++++------------- go/vt/schemadiff/table.go | 22 +++++++- go/vt/schemadiff/table_test.go | 23 ++++++-- go/vt/schemadiff/types.go | 2 + go/vt/schemadiff/view.go | 22 +++++++- go/vt/schemadiff/view_test.go | 40 +++++++++----- 6 files changed, 150 insertions(+), 58 deletions(-) diff --git a/go/vt/schemadiff/diff_test.go b/go/vt/schemadiff/diff_test.go index 3fa2b081b18..663062fc398 100644 --- a/go/vt/schemadiff/diff_test.go +++ b/go/vt/schemadiff/diff_test.go @@ -27,13 +27,15 @@ import ( func TestDiffTables(t *testing.T) { tt := []struct { - name string - from string - to string - diff string - cdiff string - action string - isError bool + name string + from string + to string + diff string + cdiff string + fromName string + toName string + action string + isError bool }{ { name: "identical", @@ -41,12 +43,14 @@ func TestDiffTables(t *testing.T) { to: "create table t(id int primary key)", }, { - name: "change of columns", - from: "create table t(id int primary key)", - to: "create table t(id int primary key, i int)", - diff: "alter table t add column i int", - cdiff: "ALTER TABLE `t` ADD COLUMN `i` int", - action: "alter", + name: "change of columns", + from: "create table t(id int primary key)", + to: "create table t(id int primary key, i int)", + diff: "alter table t add column i int", + cdiff: "ALTER TABLE `t` ADD COLUMN `i` int", + action: "alter", + fromName: "t", + toName: "t", }, { name: "create", @@ -54,13 +58,15 @@ func TestDiffTables(t *testing.T) { diff: "create table t (\n\tid int primary key\n)", cdiff: "CREATE TABLE `t` (\n\t`id` int PRIMARY KEY\n)", action: "create", + toName: "t", }, { - name: "drop", - from: "create table t(id int primary key)", - diff: "drop table t", - cdiff: "DROP TABLE `t`", - action: "drop", + name: "drop", + from: "create table t(id int primary key)", + diff: "drop table t", + cdiff: "DROP TABLE `t`", + action: "drop", + fromName: "t", }, { name: "none", @@ -116,6 +122,14 @@ func TestDiffTables(t *testing.T) { // validate we can parse back the statement _, err = sqlparser.Parse(diff) assert.NoError(t, err) + + eFrom, eTo := d.Entities() + if ts.fromName != "" { + assert.Equal(t, ts.fromName, eFrom.Name()) + } + if ts.toName != "" { + assert.Equal(t, ts.toName, eTo.Name()) + } } { canonicalDiff := d.CanonicalStatementString() @@ -141,13 +155,15 @@ func TestDiffTables(t *testing.T) { func TestDiffViews(t *testing.T) { tt := []struct { - name string - from string - to string - diff string - cdiff string - action string - isError bool + name string + from string + to string + diff string + cdiff string + fromName string + toName string + action string + isError bool }{ { name: "identical", @@ -155,12 +171,14 @@ func TestDiffViews(t *testing.T) { to: "create view v1 as select a, b, c from t", }, { - name: "change of column list, qualifiers", - from: "create view v1 (col1, `col2`, `col3`) as select `a`, `b`, c from t", - to: "create view v1 (`col1`, col2, colother) as select a, b, `c` from t", - diff: "alter view v1(col1, col2, colother) as select a, b, c from t", - cdiff: "ALTER VIEW `v1`(`col1`, `col2`, `colother`) AS SELECT `a`, `b`, `c` FROM `t`", - action: "alter", + name: "change of column list, qualifiers", + from: "create view v1 (col1, `col2`, `col3`) as select `a`, `b`, c from t", + to: "create view v1 (`col1`, col2, colother) as select a, b, `c` from t", + diff: "alter view v1(col1, col2, colother) as select a, b, c from t", + cdiff: "ALTER VIEW `v1`(`col1`, `col2`, `colother`) AS SELECT `a`, `b`, `c` FROM `t`", + action: "alter", + fromName: "v1", + toName: "v1", }, { name: "create", @@ -168,13 +186,15 @@ func TestDiffViews(t *testing.T) { diff: "create view v1 as select a, b, c from t", cdiff: "CREATE VIEW `v1` AS SELECT `a`, `b`, `c` FROM `t`", action: "create", + toName: "v1", }, { - name: "drop", - from: "create view v1 as select a, b, c from t", - diff: "drop view v1", - cdiff: "DROP VIEW `v1`", - action: "drop", + name: "drop", + from: "create view v1 as select a, b, c from t", + diff: "drop view v1", + cdiff: "DROP VIEW `v1`", + action: "drop", + fromName: "v1", }, { name: "none", @@ -231,6 +251,13 @@ func TestDiffViews(t *testing.T) { _, err = sqlparser.Parse(diff) assert.NoError(t, err) + eFrom, eTo := d.Entities() + if ts.fromName != "" { + assert.Equal(t, ts.fromName, eFrom.Name()) + } + if ts.toName != "" { + assert.Equal(t, ts.toName, eTo.Name()) + } } { canonicalDiff := d.CanonicalStatementString() diff --git a/go/vt/schemadiff/table.go b/go/vt/schemadiff/table.go index f5aa24e1294..939b2dac1ca 100644 --- a/go/vt/schemadiff/table.go +++ b/go/vt/schemadiff/table.go @@ -25,6 +25,8 @@ import ( // type AlterTableEntityDiff struct { + from *CreateTableEntity + to *CreateTableEntity alterTable *sqlparser.AlterTable } @@ -33,6 +35,11 @@ func (d *AlterTableEntityDiff) IsEmpty() bool { return d.Statement() == nil } +// IsEmpty implements EntityDiff +func (d *AlterTableEntityDiff) Entities() (from Entity, to Entity) { + return d.from, d.to +} + // Statement implements EntityDiff func (d *AlterTableEntityDiff) Statement() sqlparser.Statement { if d == nil { @@ -67,6 +74,11 @@ func (d *CreateTableEntityDiff) IsEmpty() bool { return d.Statement() == nil } +// IsEmpty implements EntityDiff +func (d *CreateTableEntityDiff) Entities() (from Entity, to Entity) { + return nil, &CreateTableEntity{CreateTable: *d.createTable} +} + // Statement implements EntityDiff func (d *CreateTableEntityDiff) Statement() sqlparser.Statement { if d == nil { @@ -93,6 +105,7 @@ func (d *CreateTableEntityDiff) CanonicalStatementString() (s string) { // type DropTableEntityDiff struct { + from *CreateTableEntity dropTable *sqlparser.DropTable } @@ -101,6 +114,11 @@ func (d *DropTableEntityDiff) IsEmpty() bool { return d.Statement() == nil } +// IsEmpty implements EntityDiff +func (d *DropTableEntityDiff) Entities() (from Entity, to Entity) { + return d.from, nil +} + // Statement implements EntityDiff func (d *DropTableEntityDiff) Statement() sqlparser.Statement { if d == nil { @@ -234,7 +252,7 @@ func (c *CreateTableEntity) TableDiff(other *CreateTableEntity, hints *DiffHints // - reordered keys -- we treat that as non-diff return nil, nil } - return &AlterTableEntityDiff{alterTable: alterTable}, nil + return &AlterTableEntityDiff{alterTable: alterTable, from: c, to: other}, nil } func (c *CreateTableEntity) diffTableCharset( @@ -779,5 +797,5 @@ func (c *CreateTableEntity) Drop() EntityDiff { dropTable := &sqlparser.DropTable{ FromTables: []sqlparser.TableName{c.Table}, } - return &DropTableEntityDiff{dropTable: dropTable} + return &DropTableEntityDiff{from: c, dropTable: dropTable} } diff --git a/go/vt/schemadiff/table_test.go b/go/vt/schemadiff/table_test.go index ddcace63433..9b79096fc20 100644 --- a/go/vt/schemadiff/table_test.go +++ b/go/vt/schemadiff/table_test.go @@ -30,6 +30,8 @@ func TestCreateTableDiff(t *testing.T) { name string from string to string + fromName string + toName string diff string cdiff string isError bool @@ -87,11 +89,13 @@ func TestCreateTableDiff(t *testing.T) { cdiff: "ALTER TABLE `t1` ADD COLUMN `i` int NOT NULL DEFAULT 0", }, { - name: "dropped column", - from: "create table t1 (id int primary key, `i` int not null default 0)", - to: "create table t2 (`id` int primary key)", - diff: "alter table t1 drop column i", - cdiff: "ALTER TABLE `t1` DROP COLUMN `i`", + name: "dropped column", + from: "create table t1 (id int primary key, `i` int not null default 0)", + to: "create table t2 (`id` int primary key)", + diff: "alter table t1 drop column i", + cdiff: "ALTER TABLE `t1` DROP COLUMN `i`", + fromName: "t1", + toName: "t2", }, { name: "modified column", @@ -645,6 +649,14 @@ func TestCreateTableDiff(t *testing.T) { // validate we can parse back the statement _, err := sqlparser.Parse(diff) assert.NoError(t, err) + + eFrom, eTo := alter.Entities() + if ts.fromName != "" { + assert.Equal(t, ts.fromName, eFrom.Name()) + } + if ts.toName != "" { + assert.Equal(t, ts.toName, eTo.Name()) + } } { cdiff := alter.CanonicalStatementString() @@ -652,6 +664,7 @@ func TestCreateTableDiff(t *testing.T) { _, err := sqlparser.Parse(cdiff) assert.NoError(t, err) } + } }) } diff --git a/go/vt/schemadiff/types.go b/go/vt/schemadiff/types.go index efb77c89965..faa01e601f0 100644 --- a/go/vt/schemadiff/types.go +++ b/go/vt/schemadiff/types.go @@ -56,6 +56,8 @@ type Entity interface { type EntityDiff interface { // IsEmpty returns true when the two entities are considered identical IsEmpty() bool + // Entities returns the two diffed entitied, aka "from" and "to" + Entities() (from Entity, to Entity) // Statement returns a valid SQL statement that applies the diff, e.g. an ALTER TABLE ... // It returns nil if the diff is empty Statement() sqlparser.Statement diff --git a/go/vt/schemadiff/view.go b/go/vt/schemadiff/view.go index 7d258bbb177..e09ee2077e8 100644 --- a/go/vt/schemadiff/view.go +++ b/go/vt/schemadiff/view.go @@ -20,6 +20,8 @@ import "vitess.io/vitess/go/vt/sqlparser" // type AlterViewEntityDiff struct { + from *CreateViewEntity + to *CreateViewEntity alterView *sqlparser.AlterView } @@ -28,6 +30,11 @@ func (d *AlterViewEntityDiff) IsEmpty() bool { return d.Statement() == nil } +// IsEmpty implements EntityDiff +func (d *AlterViewEntityDiff) Entities() (from Entity, to Entity) { + return d.from, d.to +} + // Statement implements EntityDiff func (d *AlterViewEntityDiff) Statement() sqlparser.Statement { if d == nil { @@ -62,6 +69,11 @@ func (d *CreateViewEntityDiff) IsEmpty() bool { return d.Statement() == nil } +// IsEmpty implements EntityDiff +func (d *CreateViewEntityDiff) Entities() (from Entity, to Entity) { + return nil, &CreateViewEntity{CreateView: *d.createView} +} + // Statement implements EntityDiff func (d *CreateViewEntityDiff) Statement() sqlparser.Statement { if d == nil { @@ -88,6 +100,7 @@ func (d *CreateViewEntityDiff) CanonicalStatementString() (s string) { // type DropViewEntityDiff struct { + from *CreateViewEntity dropView *sqlparser.DropView } @@ -96,6 +109,11 @@ func (d *DropViewEntityDiff) IsEmpty() bool { return d.Statement() == nil } +// IsEmpty implements EntityDiff +func (d *DropViewEntityDiff) Entities() (from Entity, to Entity) { + return d.from, nil +} + // Statement implements EntityDiff func (d *DropViewEntityDiff) Statement() sqlparser.Statement { if d == nil { @@ -173,7 +191,7 @@ func (c *CreateViewEntity) ViewDiff(other *CreateViewEntity, hints *DiffHints) ( Select: otherStmt.Select, CheckOption: otherStmt.CheckOption, } - return &AlterViewEntityDiff{alterView: alterView}, nil + return &AlterViewEntityDiff{alterView: alterView, from: c, to: other}, nil } // Create implements Entity interface @@ -186,5 +204,5 @@ func (c *CreateViewEntity) Drop() EntityDiff { dropView := &sqlparser.DropView{ FromTables: []sqlparser.TableName{c.ViewName}, } - return &DropViewEntityDiff{dropView: dropView} + return &DropViewEntityDiff{from: c, dropView: dropView} } diff --git a/go/vt/schemadiff/view_test.go b/go/vt/schemadiff/view_test.go index 173b4c71453..b506073884d 100644 --- a/go/vt/schemadiff/view_test.go +++ b/go/vt/schemadiff/view_test.go @@ -27,12 +27,14 @@ import ( func TestCreateViewDiff(t *testing.T) { tt := []struct { - name string - from string - to string - diff string - cdiff string - isError bool + name string + from string + to string + fromName string + toName string + diff string + cdiff string + isError bool }{ { name: "identical", @@ -60,11 +62,13 @@ func TestCreateViewDiff(t *testing.T) { to: "create view v1 (`col1`, col2, col3) as select a, b, `c` from t", }, { - name: "change of column list, qualifiers", - from: "create view v1 (col1, `col2`, `col3`) as select `a`, `b`, c from t", - to: "create view v1 (`col1`, col2, colother) as select a, b, `c` from t", - diff: "alter view v1(col1, col2, colother) as select a, b, c from t", - cdiff: "ALTER VIEW `v1`(`col1`, `col2`, `colother`) AS SELECT `a`, `b`, `c` FROM `t`", + name: "change of column list, qualifiers", + from: "create view v1 (col1, `col2`, `col3`) as select `a`, `b`, c from t", + to: "create view v1 (`col1`, col2, colother) as select a, b, `c` from t", + diff: "alter view v1(col1, col2, colother) as select a, b, c from t", + cdiff: "ALTER VIEW `v1`(`col1`, `col2`, `colother`) AS SELECT `a`, `b`, `c` FROM `t`", + fromName: "v1", + toName: "v1", }, { name: "change of column list, must have qualifiers", @@ -100,8 +104,10 @@ func TestCreateViewDiff(t *testing.T) { to: `create view v2 as select a, b from t`, - diff: "alter view v1 as select a, b from t", - cdiff: "ALTER VIEW `v1` AS SELECT `a`, `b` FROM `t`", + diff: "alter view v1 as select a, b from t", + cdiff: "ALTER VIEW `v1` AS SELECT `a`, `b` FROM `t`", + fromName: "v1", + toName: "v2", }, { name: "algorithm, case change", @@ -171,6 +177,14 @@ func TestCreateViewDiff(t *testing.T) { // validate we can parse back the statement _, err := sqlparser.Parse(diff) assert.NoError(t, err) + + eFrom, eTo := alter.Entities() + if ts.fromName != "" { + assert.Equal(t, ts.fromName, eFrom.Name()) + } + if ts.toName != "" { + assert.Equal(t, ts.toName, eTo.Name()) + } } { cdiff := alter.CanonicalStatementString() From 56dac9a4ae035148471e5e86837696919cab2ec2 Mon Sep 17 00:00:00 2001 From: Kushal Kumar <59891164+K-Kumar-01@users.noreply.github.com> Date: Thu, 28 Apr 2022 19:57:45 +0530 Subject: [PATCH 08/22] Add parsing support for Partition Definitions (#10127) * feat: update parser for partition add support for engine option Signed-off-by: Kushal Kumar * feat: update parser for partitions add support for data directory option add tests Signed-off-by: Kushal Kumar * fix: update parser grammar for partition engine Change Name from STRING to table_alias Signed-off-by: Kushal Kumar * feat: update parser for partitions add support for index directory option add test cases Signed-off-by: Kushal Kumar * feat: update parser for partitions add support for comment option add test Signed-off-by: Kushal Kumar * feat: use a list for parsing partition definition attributes move different partition options into a list (sql.y) create struct for partition definition options;update struct for partition definition update and add tests Signed-off-by: Kushal Kumar * feat: update parser for partitions add support for max_row option add test cases Signed-off-by: Kushal Kumar * feat: update parser for partitions add support for min_rows option add tests Signed-off-by: Kushal Kumar * feat: update parser for partitions add support for tablespace option add test Signed-off-by: Kushal Kumar * refactor: update structs and tests Signed-off-by: Kushal Kumar * feat: fix the datatypes for the fields of partition Signed-off-by: Manan Gupta * feat: minor refactor Signed-off-by: Manan Gupta * test: add a test for versioned comments Signed-off-by: Manan Gupta Co-authored-by: Manan Gupta --- go/vt/sqlparser/ast.go | 20 +- go/vt/sqlparser/ast_clone.go | 38 + go/vt/sqlparser/ast_equals.go | 55 +- go/vt/sqlparser/ast_format.go | 36 + go/vt/sqlparser/ast_format_fast.go | 43 + go/vt/sqlparser/ast_rewrite.go | 77 +- go/vt/sqlparser/ast_visit.go | 37 + go/vt/sqlparser/cached_size.go | 38 + go/vt/sqlparser/parse_test.go | 136 + go/vt/sqlparser/sql.go | 9818 ++++++++++++++-------------- go/vt/sqlparser/sql.y | 119 +- 11 files changed, 5566 insertions(+), 4851 deletions(-) diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index 0ca4cc43c1d..244a24a1063 100644 --- a/go/vt/sqlparser/ast.go +++ b/go/vt/sqlparser/ast.go @@ -1613,8 +1613,19 @@ type PartitionSpecAction int8 // PartitionDefinition describes a very minimal partition definition type PartitionDefinition struct { - Name ColIdent - ValueRange *PartitionValueRange + Name ColIdent + Options *PartitionDefinitionOptions +} + +type PartitionDefinitionOptions struct { + ValueRange *PartitionValueRange + Comment *Literal + Engine *PartitionEngine + DataDirectory *Literal + IndexDirectory *Literal + MaxRows *int + MinRows *int + TableSpace string } // PartitionValueRangeType is an enum for PartitionValueRange.Type @@ -1626,6 +1637,11 @@ type PartitionValueRange struct { Maxvalue bool } +type PartitionEngine struct { + Storage bool + Name string +} + // PartitionByType is an enum storing how we are partitioning a table type PartitionByType int8 diff --git a/go/vt/sqlparser/ast_clone.go b/go/vt/sqlparser/ast_clone.go index cfbcf73b28c..02d644142d0 100644 --- a/go/vt/sqlparser/ast_clone.go +++ b/go/vt/sqlparser/ast_clone.go @@ -273,6 +273,10 @@ func CloneSQLNode(in SQLNode) SQLNode { return CloneRefOfParsedComments(in) case *PartitionDefinition: return CloneRefOfPartitionDefinition(in) + case *PartitionDefinitionOptions: + return CloneRefOfPartitionDefinitionOptions(in) + case *PartitionEngine: + return CloneRefOfPartitionEngine(in) case *PartitionOption: return CloneRefOfPartitionOption(in) case *PartitionSpec: @@ -1677,7 +1681,32 @@ func CloneRefOfPartitionDefinition(n *PartitionDefinition) *PartitionDefinition } out := *n out.Name = CloneColIdent(n.Name) + out.Options = CloneRefOfPartitionDefinitionOptions(n.Options) + return &out +} + +// CloneRefOfPartitionDefinitionOptions creates a deep clone of the input. +func CloneRefOfPartitionDefinitionOptions(n *PartitionDefinitionOptions) *PartitionDefinitionOptions { + if n == nil { + return nil + } + out := *n out.ValueRange = CloneRefOfPartitionValueRange(n.ValueRange) + out.Comment = CloneRefOfLiteral(n.Comment) + out.Engine = CloneRefOfPartitionEngine(n.Engine) + out.DataDirectory = CloneRefOfLiteral(n.DataDirectory) + out.IndexDirectory = CloneRefOfLiteral(n.IndexDirectory) + out.MaxRows = CloneRefOfInt(n.MaxRows) + out.MinRows = CloneRefOfInt(n.MinRows) + return &out +} + +// CloneRefOfPartitionEngine creates a deep clone of the input. +func CloneRefOfPartitionEngine(n *PartitionEngine) *PartitionEngine { + if n == nil { + return nil + } + out := *n return &out } @@ -3282,6 +3311,15 @@ func CloneComments(n Comments) Comments { return res } +// CloneRefOfInt creates a deep clone of the input. +func CloneRefOfInt(n *int) *int { + if n == nil { + return nil + } + out := *n + return &out +} + // CloneSliceOfRefOfPartitionDefinition creates a deep clone of the input. func CloneSliceOfRefOfPartitionDefinition(n []*PartitionDefinition) []*PartitionDefinition { if n == nil { diff --git a/go/vt/sqlparser/ast_equals.go b/go/vt/sqlparser/ast_equals.go index 890f0585e8e..904a91fb320 100644 --- a/go/vt/sqlparser/ast_equals.go +++ b/go/vt/sqlparser/ast_equals.go @@ -776,6 +776,18 @@ func EqualsSQLNode(inA, inB SQLNode) bool { return false } return EqualsRefOfPartitionDefinition(a, b) + case *PartitionDefinitionOptions: + b, ok := inB.(*PartitionDefinitionOptions) + if !ok { + return false + } + return EqualsRefOfPartitionDefinitionOptions(a, b) + case *PartitionEngine: + b, ok := inB.(*PartitionEngine) + if !ok { + return false + } + return EqualsRefOfPartitionEngine(a, b) case *PartitionOption: b, ok := inB.(*PartitionOption) if !ok { @@ -2648,7 +2660,37 @@ func EqualsRefOfPartitionDefinition(a, b *PartitionDefinition) bool { return false } return EqualsColIdent(a.Name, b.Name) && - EqualsRefOfPartitionValueRange(a.ValueRange, b.ValueRange) + EqualsRefOfPartitionDefinitionOptions(a.Options, b.Options) +} + +// EqualsRefOfPartitionDefinitionOptions does deep equals between the two objects. +func EqualsRefOfPartitionDefinitionOptions(a, b *PartitionDefinitionOptions) bool { + if a == b { + return true + } + if a == nil || b == nil { + return false + } + return a.TableSpace == b.TableSpace && + EqualsRefOfPartitionValueRange(a.ValueRange, b.ValueRange) && + EqualsRefOfLiteral(a.Comment, b.Comment) && + EqualsRefOfPartitionEngine(a.Engine, b.Engine) && + EqualsRefOfLiteral(a.DataDirectory, b.DataDirectory) && + EqualsRefOfLiteral(a.IndexDirectory, b.IndexDirectory) && + EqualsRefOfInt(a.MaxRows, b.MaxRows) && + EqualsRefOfInt(a.MinRows, b.MinRows) +} + +// EqualsRefOfPartitionEngine does deep equals between the two objects. +func EqualsRefOfPartitionEngine(a, b *PartitionEngine) bool { + if a == b { + return true + } + if a == nil || b == nil { + return false + } + return a.Storage == b.Storage && + a.Name == b.Name } // EqualsRefOfPartitionOption does deep equals between the two objects. @@ -5444,6 +5486,17 @@ func EqualsComments(a, b Comments) bool { return true } +// EqualsRefOfInt does deep equals between the two objects. +func EqualsRefOfInt(a, b *int) bool { + if a == b { + return true + } + if a == nil || b == nil { + return false + } + return *a == *b +} + // EqualsSliceOfRefOfPartitionDefinition does deep equals between the two objects. func EqualsSliceOfRefOfPartitionDefinition(a, b []*PartitionDefinition) bool { if len(a) != len(b) { diff --git a/go/vt/sqlparser/ast_format.go b/go/vt/sqlparser/ast_format.go index e736d6161dd..239d1f07219 100644 --- a/go/vt/sqlparser/ast_format.go +++ b/go/vt/sqlparser/ast_format.go @@ -429,9 +429,35 @@ func (node *PartitionSpec) Format(buf *TrackedBuffer) { // Format formats the node func (node *PartitionDefinition) Format(buf *TrackedBuffer) { buf.astPrintf(node, "partition %v", node.Name) + buf.astPrintf(node, "%v", node.Options) +} + +// Format formats the node +func (node *PartitionDefinitionOptions) Format(buf *TrackedBuffer) { if node.ValueRange != nil { buf.astPrintf(node, " %v", node.ValueRange) } + if node.Engine != nil { + buf.astPrintf(node, " %v", node.Engine) + } + if node.Comment != nil { + buf.astPrintf(node, " comment %v", node.Comment) + } + if node.DataDirectory != nil { + buf.astPrintf(node, " data directory %v", node.DataDirectory) + } + if node.IndexDirectory != nil { + buf.astPrintf(node, " index directory %v", node.IndexDirectory) + } + if node.MaxRows != nil { + buf.astPrintf(node, " max_rows %d", *node.MaxRows) + } + if node.MinRows != nil { + buf.astPrintf(node, " min_rows %d", *node.MinRows) + } + if node.TableSpace != "" { + buf.astPrintf(node, " tablespace %s", node.TableSpace) + } } // Format formats the node @@ -444,6 +470,16 @@ func (node *PartitionValueRange) Format(buf *TrackedBuffer) { } } +// Format formats the node +func (node *PartitionEngine) Format(buf *TrackedBuffer) { + if node.Storage { + buf.WriteString("storage ") + } + buf.WriteString("engine ") + + buf.astPrintf(node, "%s", node.Name) +} + // Format formats the node. func (node *PartitionOption) Format(buf *TrackedBuffer) { buf.literal("partition by") diff --git a/go/vt/sqlparser/ast_format_fast.go b/go/vt/sqlparser/ast_format_fast.go index 6dead1008c3..e21805a3972 100644 --- a/go/vt/sqlparser/ast_format_fast.go +++ b/go/vt/sqlparser/ast_format_fast.go @@ -594,10 +594,43 @@ func (node *PartitionSpec) formatFast(buf *TrackedBuffer) { func (node *PartitionDefinition) formatFast(buf *TrackedBuffer) { buf.WriteString("partition ") node.Name.formatFast(buf) + node.Options.formatFast(buf) +} + +// formatFast formats the node +func (node *PartitionDefinitionOptions) formatFast(buf *TrackedBuffer) { if node.ValueRange != nil { buf.WriteByte(' ') node.ValueRange.formatFast(buf) } + if node.Engine != nil { + buf.WriteByte(' ') + node.Engine.formatFast(buf) + } + if node.Comment != nil { + buf.WriteString(" comment ") + node.Comment.formatFast(buf) + } + if node.DataDirectory != nil { + buf.WriteString(" data directory ") + node.DataDirectory.formatFast(buf) + } + if node.IndexDirectory != nil { + buf.WriteString(" index directory ") + node.IndexDirectory.formatFast(buf) + } + if node.MaxRows != nil { + buf.WriteString(" max_rows ") + buf.WriteString(fmt.Sprintf("%d", *node.MaxRows)) + } + if node.MinRows != nil { + buf.WriteString(" min_rows ") + buf.WriteString(fmt.Sprintf("%d", *node.MinRows)) + } + if node.TableSpace != "" { + buf.WriteString(" tablespace ") + buf.WriteString(node.TableSpace) + } } // formatFast formats the node @@ -612,6 +645,16 @@ func (node *PartitionValueRange) formatFast(buf *TrackedBuffer) { } } +// formatFast formats the node +func (node *PartitionEngine) formatFast(buf *TrackedBuffer) { + if node.Storage { + buf.WriteString("storage ") + } + buf.WriteString("engine ") + + buf.WriteString(node.Name) +} + // formatFast formats the node. func (node *PartitionOption) formatFast(buf *TrackedBuffer) { buf.WriteString("partition by") diff --git a/go/vt/sqlparser/ast_rewrite.go b/go/vt/sqlparser/ast_rewrite.go index 0d9f97a6603..313990e09bb 100644 --- a/go/vt/sqlparser/ast_rewrite.go +++ b/go/vt/sqlparser/ast_rewrite.go @@ -272,6 +272,10 @@ func (a *application) rewriteSQLNode(parent SQLNode, node SQLNode, replacer repl return a.rewriteRefOfParsedComments(parent, node, replacer) case *PartitionDefinition: return a.rewriteRefOfPartitionDefinition(parent, node, replacer) + case *PartitionDefinitionOptions: + return a.rewriteRefOfPartitionDefinitionOptions(parent, node, replacer) + case *PartitionEngine: + return a.rewriteRefOfPartitionEngine(parent, node, replacer) case *PartitionOption: return a.rewriteRefOfPartitionOption(parent, node, replacer) case *PartitionSpec: @@ -4151,8 +4155,55 @@ func (a *application) rewriteRefOfPartitionDefinition(parent SQLNode, node *Part }) { return false } + if !a.rewriteRefOfPartitionDefinitionOptions(node, node.Options, func(newNode, parent SQLNode) { + parent.(*PartitionDefinition).Options = newNode.(*PartitionDefinitionOptions) + }) { + return false + } + if a.post != nil { + a.cur.replacer = replacer + a.cur.parent = parent + a.cur.node = node + if !a.post(&a.cur) { + return false + } + } + return true +} +func (a *application) rewriteRefOfPartitionDefinitionOptions(parent SQLNode, node *PartitionDefinitionOptions, replacer replacerFunc) bool { + if node == nil { + return true + } + if a.pre != nil { + a.cur.replacer = replacer + a.cur.parent = parent + a.cur.node = node + if !a.pre(&a.cur) { + return true + } + } if !a.rewriteRefOfPartitionValueRange(node, node.ValueRange, func(newNode, parent SQLNode) { - parent.(*PartitionDefinition).ValueRange = newNode.(*PartitionValueRange) + parent.(*PartitionDefinitionOptions).ValueRange = newNode.(*PartitionValueRange) + }) { + return false + } + if !a.rewriteRefOfLiteral(node, node.Comment, func(newNode, parent SQLNode) { + parent.(*PartitionDefinitionOptions).Comment = newNode.(*Literal) + }) { + return false + } + if !a.rewriteRefOfPartitionEngine(node, node.Engine, func(newNode, parent SQLNode) { + parent.(*PartitionDefinitionOptions).Engine = newNode.(*PartitionEngine) + }) { + return false + } + if !a.rewriteRefOfLiteral(node, node.DataDirectory, func(newNode, parent SQLNode) { + parent.(*PartitionDefinitionOptions).DataDirectory = newNode.(*Literal) + }) { + return false + } + if !a.rewriteRefOfLiteral(node, node.IndexDirectory, func(newNode, parent SQLNode) { + parent.(*PartitionDefinitionOptions).IndexDirectory = newNode.(*Literal) }) { return false } @@ -4166,6 +4217,30 @@ func (a *application) rewriteRefOfPartitionDefinition(parent SQLNode, node *Part } return true } +func (a *application) rewriteRefOfPartitionEngine(parent SQLNode, node *PartitionEngine, replacer replacerFunc) bool { + if node == nil { + return true + } + if a.pre != nil { + a.cur.replacer = replacer + a.cur.parent = parent + a.cur.node = node + if !a.pre(&a.cur) { + return true + } + } + if a.post != nil { + if a.pre == nil { + a.cur.replacer = replacer + a.cur.parent = parent + a.cur.node = node + } + if !a.post(&a.cur) { + return false + } + } + return true +} func (a *application) rewriteRefOfPartitionOption(parent SQLNode, node *PartitionOption, replacer replacerFunc) bool { if node == nil { return true diff --git a/go/vt/sqlparser/ast_visit.go b/go/vt/sqlparser/ast_visit.go index 6374c6bdc6a..c04ff05cb0d 100644 --- a/go/vt/sqlparser/ast_visit.go +++ b/go/vt/sqlparser/ast_visit.go @@ -272,6 +272,10 @@ func VisitSQLNode(in SQLNode, f Visit) error { return VisitRefOfParsedComments(in, f) case *PartitionDefinition: return VisitRefOfPartitionDefinition(in, f) + case *PartitionDefinitionOptions: + return VisitRefOfPartitionDefinitionOptions(in, f) + case *PartitionEngine: + return VisitRefOfPartitionEngine(in, f) case *PartitionOption: return VisitRefOfPartitionOption(in, f) case *PartitionSpec: @@ -2107,9 +2111,42 @@ func VisitRefOfPartitionDefinition(in *PartitionDefinition, f Visit) error { if err := VisitColIdent(in.Name, f); err != nil { return err } + if err := VisitRefOfPartitionDefinitionOptions(in.Options, f); err != nil { + return err + } + return nil +} +func VisitRefOfPartitionDefinitionOptions(in *PartitionDefinitionOptions, f Visit) error { + if in == nil { + return nil + } + if cont, err := f(in); err != nil || !cont { + return err + } if err := VisitRefOfPartitionValueRange(in.ValueRange, f); err != nil { return err } + if err := VisitRefOfLiteral(in.Comment, f); err != nil { + return err + } + if err := VisitRefOfPartitionEngine(in.Engine, f); err != nil { + return err + } + if err := VisitRefOfLiteral(in.DataDirectory, f); err != nil { + return err + } + if err := VisitRefOfLiteral(in.IndexDirectory, f); err != nil { + return err + } + return nil +} +func VisitRefOfPartitionEngine(in *PartitionEngine, f Visit) error { + if in == nil { + return nil + } + if cont, err := f(in); err != nil || !cont { + return err + } return nil } func VisitRefOfPartitionOption(in *PartitionOption, f Visit) error { diff --git a/go/vt/sqlparser/cached_size.go b/go/vt/sqlparser/cached_size.go index 5e9d03040d8..1ddde521b52 100644 --- a/go/vt/sqlparser/cached_size.go +++ b/go/vt/sqlparser/cached_size.go @@ -2184,8 +2184,46 @@ func (cached *PartitionDefinition) CachedSize(alloc bool) int64 { } // field Name vitess.io/vitess/go/vt/sqlparser.ColIdent size += cached.Name.CachedSize(false) + // field Options *vitess.io/vitess/go/vt/sqlparser.PartitionDefinitionOptions + size += cached.Options.CachedSize(true) + return size +} +func (cached *PartitionDefinitionOptions) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(80) + } // field ValueRange *vitess.io/vitess/go/vt/sqlparser.PartitionValueRange size += cached.ValueRange.CachedSize(true) + // field Comment *vitess.io/vitess/go/vt/sqlparser.Literal + size += cached.Comment.CachedSize(true) + // field Engine *vitess.io/vitess/go/vt/sqlparser.PartitionEngine + size += cached.Engine.CachedSize(true) + // field DataDirectory *vitess.io/vitess/go/vt/sqlparser.Literal + size += cached.DataDirectory.CachedSize(true) + // field IndexDirectory *vitess.io/vitess/go/vt/sqlparser.Literal + size += cached.IndexDirectory.CachedSize(true) + // field MaxRows *int + size += hack.RuntimeAllocSize(int64(8)) + // field MinRows *int + size += hack.RuntimeAllocSize(int64(8)) + // field TableSpace string + size += hack.RuntimeAllocSize(int64(len(cached.TableSpace))) + return size +} +func (cached *PartitionEngine) CachedSize(alloc bool) int64 { + if cached == nil { + return int64(0) + } + size := int64(0) + if alloc { + size += int64(24) + } + // field Name string + size += hack.RuntimeAllocSize(int64(len(cached.Name))) return size } func (cached *PartitionOption) CachedSize(alloc bool) int64 { diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 1d6636c5b49..9d241a4c1ed 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -4397,6 +4397,66 @@ PARTITIONS 6`, output: `create table t2 ( val INT ) partition by list (val) (partition mypart values in (1, 3, 5), partition MyPart values in (2, 4, 6))`, + }, + { + input: `CREATE TABLE t2 (val INT) + PARTITION BY LIST(val)( + PARTITION mypart VALUES IN (1,3,5) STORAGE ENGINE = FOOBAR, + PARTITION MyPart VALUES IN (2,4,6) +)`, + output: `create table t2 ( + val INT +) partition by list (val) (partition mypart values in (1, 3, 5) storage engine FOOBAR, partition MyPart values in (2, 4, 6))`, + }, + { + input: `CREATE TABLE t2 (val INT) + PARTITION BY LIST(val)( + PARTITION mypart VALUES IN (1,3,5) ENGINE = FOOBAR, + PARTITION MyPart VALUES IN (2,4,6) +)`, + output: `create table t2 ( + val INT +) partition by list (val) (partition mypart values in (1, 3, 5) engine FOOBAR, partition MyPart values in (2, 4, 6))`, + }, + { + input: `CREATE TABLE t2 (val INT) + PARTITION BY LIST(val)( + PARTITION mypart VALUES IN (1,3,5) STORAGE ENGINE FOOBAR, + PARTITION MyPart VALUES IN (2,4,6) +)`, + output: `create table t2 ( + val INT +) partition by list (val) (partition mypart values in (1, 3, 5) storage engine FOOBAR, partition MyPart values in (2, 4, 6))`, + }, + { + input: `CREATE TABLE t2 (val INT) + PARTITION BY LIST(val)( + PARTITION mypart VALUES IN (1,3,5) STORAGE ENGINE FOOBAR COMMENT = 'test', + PARTITION MyPart VALUES IN (2,4,6) comment 'test2' +)`, + output: `create table t2 ( + val INT +) partition by list (val) (partition mypart values in (1, 3, 5) storage engine FOOBAR comment 'test', partition MyPart values in (2, 4, 6) comment 'test2')`, + }, + { + input: `CREATE TABLE t2 (val INT) + PARTITION BY LIST(val)( + PARTITION mypart VALUES IN (1,3,5) STORAGE ENGINE FOOBAR DATA DIRECTORY = 'test', + PARTITION MyPart VALUES IN (2,4,6) DATA DIRECTORY 'test2' +)`, + output: `create table t2 ( + val INT +) partition by list (val) (partition mypart values in (1, 3, 5) storage engine FOOBAR data directory 'test', partition MyPart values in (2, 4, 6) data directory 'test2')`, + }, + { + input: `CREATE TABLE t2 (val INT) + PARTITION BY LIST(val)( + PARTITION mypart VALUES IN (1,3,5) INDEX DIRECTORY = 'test', + PARTITION MyPart VALUES IN (2,4,6) INDEX DIRECTORY 'test2' +)`, + output: `create table t2 ( + val INT +) partition by list (val) (partition mypart values in (1, 3, 5) index directory 'test', partition MyPart values in (2, 4, 6) index directory 'test2')`, }, { input: `create table t1 (id int primary key) partition by list (id) (partition p1 values in(11,21), partition p2 values in (12,22))`, @@ -4404,6 +4464,46 @@ PARTITIONS 6`, id int primary key ) partition by list (id) (partition p1 values in (11, 21), partition p2 values in (12, 22))`, }, + { + input: `CREATE TABLE t2 (val INT) + PARTITION BY LIST(val)( + PARTITION mypart VALUES IN (1,3,5) COMMENT = 'before' STORAGE ENGINE FOOBAR DATA DIRECTORY = 'test', + PARTITION MyPart VALUES IN (2,4,6) DATA DIRECTORY 'test2' +)`, + output: `create table t2 ( + val INT +) partition by list (val) (partition mypart values in (1, 3, 5) storage engine FOOBAR comment 'before' data directory 'test', partition MyPart values in (2, 4, 6) data directory 'test2')`, + }, + { + input: `CREATE TABLE t2 (val INT) + PARTITION BY LIST(val)( + PARTITION mypart VALUES IN (1,3,5) MAX_ROWS = 4, + PARTITION MyPart VALUES IN (2,4,6) MAX_ROWS 10 +)`, + output: `create table t2 ( + val INT +) partition by list (val) (partition mypart values in (1, 3, 5) max_rows 4, partition MyPart values in (2, 4, 6) max_rows 10)`, + }, + { + input: `CREATE TABLE t2 (val INT) + PARTITION BY LIST(val)( + PARTITION mypart VALUES IN (1,3,5) MIN_ROWS = 4, + PARTITION MyPart VALUES IN (2,4,6) MIN_ROWS 10 +)`, + output: `create table t2 ( + val INT +) partition by list (val) (partition mypart values in (1, 3, 5) min_rows 4, partition MyPart values in (2, 4, 6) min_rows 10)`, + }, + { + input: `CREATE TABLE t2 (val INT) + PARTITION BY LIST(val)( + PARTITION mypart VALUES IN (1,3,5) TABLESPACE = innodb_system, + PARTITION MyPart VALUES IN (2,4,6) TABLESPACE innodb_system +)`, + output: `create table t2 ( + val INT +) partition by list (val) (partition mypart values in (1, 3, 5) tablespace innodb_system, partition MyPart values in (2, 4, 6) tablespace innodb_system)`, + }, } for _, test := range createTableQueries { sql := strings.TrimSpace(test.input) @@ -4716,6 +4816,42 @@ func TestParseLobstersQueries(t *testing.T) { } } +func TestParseVersionedComments(t *testing.T) { + testcases := []struct { + input string + mysqlVersion string + output string + }{ + { + input: `CREATE TABLE table1 (id int) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 /*!50900 PARTITION BY RANGE (id) (PARTITION x VALUES LESS THAN (5) ENGINE = InnoDB, PARTITION t VALUES LESS THAN (20) ENGINE = InnoDB) */`, + mysqlVersion: "50401", + output: `create table table1 ( + id int +) ENGINE InnoDB, + CHARSET utf8mb4`, + }, { + input: `CREATE TABLE table1 (id int) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 /*!50900 PARTITION BY RANGE (id) (PARTITION x VALUES LESS THAN (5) ENGINE = InnoDB, PARTITION t VALUES LESS THAN (20) ENGINE = InnoDB) */`, + mysqlVersion: "80001", + output: `create table table1 ( + id int +) ENGINE InnoDB, + CHARSET utf8mb4 partition by range (id) (partition x values less than (5) engine InnoDB, partition t values less than (20) engine InnoDB)`, + }, + } + + for _, testcase := range testcases { + t.Run(testcase.input+":"+testcase.mysqlVersion, func(t *testing.T) { + oldMySQLVersion := MySQLVersion + defer func() { MySQLVersion = oldMySQLVersion }() + MySQLVersion = testcase.mysqlVersion + tree, err := Parse(testcase.input) + require.NoError(t, err, testcase.input) + out := String(tree) + require.Equal(t, testcase.output, out) + }) + } +} + func BenchmarkParseTraces(b *testing.B) { for _, trace := range []string{"django_queries.txt", "lobsters.sql.gz"} { b.Run(trace, func(b *testing.B) { diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 859f3f918ec..5c4ed6365fd 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -1245,17 +1245,17 @@ var yyExca = [...]int{ 327, 151, -2, 455, -1, 55, - 35, 653, - 231, 653, - 242, 653, - 277, 667, - 278, 667, - -2, 655, + 35, 670, + 231, 670, + 242, 670, + 277, 684, + 278, 684, + -2, 672, -1, 60, - 233, 680, - -2, 678, + 233, 697, + -2, 695, -1, 114, - 230, 1199, + 230, 1216, -2, 119, -1, 116, 1, 146, @@ -1271,26 +1271,26 @@ var yyExca = [...]int{ 327, 151, -2, 464, -1, 676, - 215, 1220, - -2, 1216, + 215, 1237, + -2, 1233, -1, 677, - 215, 1221, - -2, 1217, + 215, 1238, + -2, 1234, -1, 751, - 59, 748, - -2, 763, + 59, 765, + -2, 780, -1, 788, - 147, 1618, + 147, 1635, -2, 112, -1, 789, - 147, 1464, + 147, 1481, -2, 113, -1, 795, - 147, 1547, - -2, 1193, + 147, 1564, + -2, 1210, -1, 943, - 147, 1395, - -2, 1190, + 147, 1412, + -2, 1207, -1, 981, 241, 41, 246, 41, @@ -1300,11 +1300,11 @@ var yyExca = [...]int{ 596, 503, -2, 151, -1, 1295, - 59, 749, - -2, 768, + 59, 766, + -2, 785, -1, 1296, - 59, 750, - -2, 769, + 59, 767, + -2, 786, -1, 1349, 131, 151, 171, 151, @@ -1319,8 +1319,8 @@ var yyExca = [...]int{ 246, 42, -2, 370, -1, 1734, - 215, 1225, - -2, 1219, + 215, 1242, + -2, 1236, -1, 1817, 131, 151, 171, 151, @@ -1331,1809 +1331,1312 @@ var yyExca = [...]int{ -2, 172, -1, 2057, 86, 39, - -2, 805, + -2, 822, -1, 2109, 77, 94, 86, 94, - -2, 825, - -1, 2307, - 49, 1161, - -2, 1155, - -1, 2498, + -2, 842, + -1, 2173, + 571, 598, + -2, 585, + -1, 2306, + 49, 1178, + -2, 1172, + -1, 2512, 86, 39, - -2, 806, - -1, 2536, + -2, 823, + -1, 2550, 7, 53, 18, 53, 20, 53, 87, 53, - -2, 797, - -1, 2812, - 22, 1549, - 32, 1549, - 172, 1549, - 253, 1549, - 307, 1549, - 308, 1549, - 309, 1549, - 310, 1549, - 311, 1549, - 312, 1549, - 313, 1549, - 315, 1549, - 316, 1549, - 317, 1549, - 318, 1549, - 319, 1549, - 320, 1549, - 321, 1549, - 322, 1549, - 323, 1549, - 324, 1549, - 325, 1549, - 326, 1549, - 328, 1549, - 330, 1549, - 331, 1549, - 332, 1549, - 333, 1549, - 334, 1549, - 335, 1549, - 336, 1549, - 337, 1549, - 338, 1549, - 341, 1549, - 342, 1549, - 343, 1549, - 344, 1549, - 345, 1549, - 346, 1549, - 347, 1549, - 348, 1549, - 349, 1549, - 461, 1549, + -2, 814, + -1, 2844, + 22, 1566, + 32, 1566, + 172, 1566, + 253, 1566, + 307, 1566, + 308, 1566, + 309, 1566, + 310, 1566, + 311, 1566, + 312, 1566, + 313, 1566, + 315, 1566, + 316, 1566, + 317, 1566, + 318, 1566, + 319, 1566, + 320, 1566, + 321, 1566, + 322, 1566, + 323, 1566, + 324, 1566, + 325, 1566, + 326, 1566, + 328, 1566, + 330, 1566, + 331, 1566, + 332, 1566, + 333, 1566, + 334, 1566, + 335, 1566, + 336, 1566, + 337, 1566, + 338, 1566, + 341, 1566, + 342, 1566, + 343, 1566, + 344, 1566, + 345, 1566, + 346, 1566, + 347, 1566, + 348, 1566, + 349, 1566, + 461, 1566, -2, 543, } const yyPrivate = 57344 -const yyLast = 40800 +const yyLast = 40501 var yyAct = [...]int{ - 676, 2878, 2877, 2860, 2754, 1814, 2597, 1352, 2814, 2854, - 2810, 2430, 2794, 1748, 2360, 2266, 2367, 2011, 685, 2401, - 3, 2713, 2318, 1121, 678, 766, 2321, 96, 2627, 1877, - 598, 1310, 744, 2412, 1274, 2730, 2369, 1768, 2319, 2045, - 2413, 594, 2322, 2507, 2501, 2632, 620, 2415, 1787, 2265, - 679, 182, 2527, 2264, 182, 2308, 559, 182, 667, 670, - 2316, 668, 574, 2072, 182, 2103, 2493, 669, 37, 1070, - 591, 1847, 182, 590, 2211, 2170, 2141, 1867, 1852, 2142, - 154, 2143, 1803, 36, 1406, 592, 767, 182, 2092, 38, - 793, 2064, 1297, 1792, 2080, 2047, 140, 946, 1704, 2228, - 1634, 1644, 586, 1011, 746, 1728, 1791, 1433, 1886, 574, - 1919, 1866, 574, 182, 574, 1854, 1592, 976, 971, 2111, - 2135, 1341, 1319, 1794, 95, 1277, 603, 1772, 91, 1206, - 1750, 1656, 790, 1611, 1142, 1541, 953, 1537, 1440, 1703, - 950, 1864, 982, 1338, 1779, 748, 1523, 752, 977, 978, - 1340, 954, 1324, 1700, 1113, 1401, 758, 1119, 1546, 1054, - 979, 1843, 756, 753, 780, 769, 98, 989, 1425, 754, - 157, 123, 124, 76, 1741, 581, 1773, 97, 1213, 1209, - 2763, 2163, 89, 2861, 2398, 85, 1879, 1880, 1881, 1879, - 2190, 2189, 1917, 2161, 755, 77, 2219, 1099, 1509, 117, - 8, 118, 2220, 7, 774, 6, 779, 2881, 184, 185, - 186, 90, 2888, 2887, 1745, 1746, 1599, 125, 119, 760, - 1598, 1597, 1596, 1595, 1594, 1449, 1016, 1577, 1586, 947, - 1143, 584, 531, 585, 2828, 2043, 2304, 962, 2074, 957, - 2874, 582, 2838, 2851, 2562, 1604, 1013, 2709, 1143, 2384, - 2708, 747, 787, 2590, 745, 1015, 2591, 2873, 1014, 1027, - 1028, 2804, 1031, 1032, 1033, 1034, 761, 78, 1037, 1038, - 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, - 1049, 1050, 1051, 768, 78, 794, 78, 119, 992, 80, - 2864, 2880, 2774, 1859, 1731, 993, 969, 2888, 2849, 102, - 2598, 2795, 1905, 2803, 2773, 78, 2227, 1017, 1018, 1019, - 2464, 1415, 2357, 2358, 2044, 1957, 968, 1857, 967, 2120, - 2356, 1024, 2119, 2198, 1342, 2121, 1343, 2197, 2218, 2083, - 1954, 178, 1808, 2645, 1029, 1153, 1809, 1810, 1057, 1089, - 104, 105, 738, 108, 87, 1077, 114, 1116, 737, 179, - 1078, 119, 526, 1153, 2084, 120, 961, 142, 1076, 963, - 1075, 87, 1175, 87, 966, 1077, 1063, 1064, 162, 1106, - 1078, 1108, 740, 741, 742, 743, 1747, 1686, 751, 1955, - 2755, 2164, 87, 2718, 1176, 1177, 1178, 1179, 1180, 1181, - 1182, 1184, 1183, 1185, 1186, 1094, 1095, 2132, 1066, 152, - 1827, 1826, 1090, 1083, 141, 2504, 782, 783, 2432, 1105, - 1107, 2455, 563, 2453, 2254, 563, 2171, 1053, 572, 1585, - 576, 1281, 964, 570, 1887, 159, 2425, 160, 1529, 563, - 1149, 2193, 1920, 1141, 2426, 1931, 1928, 1930, 1929, 2863, - 1587, 1588, 1589, 129, 130, 151, 150, 177, 1149, 1115, - 1925, 1499, 1030, 966, 563, 958, 1856, 1933, 1524, 1934, - 1110, 1935, 960, 959, 1678, 1667, 1668, 1669, 1670, 1680, - 1671, 1672, 1673, 1685, 1681, 1674, 1675, 1682, 1683, 1684, - 1676, 1677, 1679, 1091, 1084, 1098, 1096, 966, 1052, 2433, - 1092, 1093, 1936, 1059, 970, 1500, 1097, 1501, 2206, 1036, - 1924, 1035, 1103, 2583, 2434, 1926, 1104, 2829, 1922, 1000, - 2409, 964, 1890, 1788, 998, 972, 1109, 2229, 973, 973, - 1009, 1008, 87, 1007, 2847, 1284, 182, 1006, 182, 1005, - 1004, 182, 1003, 1002, 997, 965, 1418, 2373, 1010, 1102, - 1187, 951, 1923, 146, 127, 153, 134, 126, 951, 147, - 148, 1955, 1056, 985, 951, 163, 1187, 2868, 949, 984, - 574, 1123, 574, 574, 168, 135, 2255, 2210, 991, 2048, - 2050, 1087, 1538, 1865, 1439, 781, 2858, 574, 574, 138, - 136, 131, 132, 133, 137, 2207, 1907, 2391, 1026, 1911, - 1534, 128, 1129, 1020, 2192, 991, 1413, 1412, 2231, 1135, - 139, 1411, 1073, 2182, 1079, 1080, 1081, 1082, 564, 2383, - 2363, 564, 991, 1535, 1148, 1145, 1146, 1147, 1152, 1154, - 1151, 2408, 1150, 2223, 965, 564, 1117, 1118, 1409, 1144, - 530, 1530, 1148, 1145, 1146, 1147, 1152, 1154, 1151, 1969, - 1150, 2195, 2762, 2162, 1055, 525, 37, 1144, 1774, 1775, - 564, 2205, 1001, 1528, 2204, 2364, 2165, 999, 965, 2751, - 2241, 2240, 2239, 2233, 2543, 2237, 990, 2232, 2523, 2230, - 2116, 994, 984, 2079, 2235, 2035, 1124, 155, 1438, 1858, - 2366, 995, 1740, 2234, 2505, 1190, 1191, 1192, 1193, 2719, - 1188, 1189, 2772, 990, 2361, 1198, 991, 1201, 994, 984, - 2236, 2238, 2705, 1328, 1253, 1068, 1815, 81, 995, 2213, - 990, 2371, 2372, 1187, 2212, 1186, 1267, 1100, 2362, 1125, - 1126, 2355, 86, 1547, 116, 2213, 763, 1114, 996, 2049, - 2212, 2768, 1194, 2879, 111, 2579, 991, 1616, 182, 86, - 1072, 86, 574, 574, 1511, 1510, 1512, 1513, 1514, 1111, - 2368, 1617, 1618, 1615, 149, 1272, 1956, 2517, 182, 991, - 86, 1012, 1921, 1531, 1065, 1344, 1062, 1086, 1139, 2247, - 1285, 1273, 1074, 77, 1906, 746, 1290, 574, 1088, 1138, - 1288, 182, 1136, 1657, 1137, 1983, 574, 143, 2856, 1657, - 144, 2857, 574, 2855, 990, 1525, 1025, 1526, 2820, 1211, - 1527, 1212, 1215, 2154, 112, 1157, 1158, 1158, 178, 790, - 2641, 2554, 2818, 1287, 2553, 2370, 1894, 1291, 1159, 1448, - 1447, 2822, 2823, 748, 1437, 1904, 2869, 2373, 1902, 2371, - 2372, 1899, 120, 1273, 990, 1289, 2819, 1000, 998, 95, - 984, 987, 988, 2843, 951, 162, 1899, 2780, 981, 985, - 1259, 1260, 1261, 1262, 1263, 2544, 1329, 990, 1159, 2744, - 1101, 1278, 1159, 984, 987, 988, 1548, 951, 1903, 980, - 2871, 981, 985, 184, 185, 186, 1339, 1636, 2700, 1992, - 1071, 98, 2613, 1901, 2612, 1780, 1781, 2125, 1159, 2781, - 156, 161, 158, 164, 165, 166, 167, 169, 170, 171, - 172, 2745, 159, 2844, 160, 1058, 173, 174, 175, 176, - 2870, 2561, 1275, 1181, 1182, 1184, 1183, 1185, 1186, 2560, - 1309, 1961, 1962, 1963, 177, 745, 2399, 2389, 1306, 747, - 87, 1286, 2365, 2370, 1179, 1180, 1181, 1182, 1184, 1183, - 1185, 1186, 178, 2139, 1614, 2373, 182, 1334, 1335, 1156, - 1402, 1157, 1158, 1159, 1606, 1608, 1609, 1637, 2249, 1410, - 1159, 2138, 794, 1979, 1862, 1159, 120, 1176, 1177, 1178, - 1179, 1180, 1181, 1182, 1184, 1183, 1185, 1186, 1607, 162, - 574, 1159, 1435, 1518, 1519, 785, 1504, 1503, 1159, 1156, - 1444, 1157, 1158, 1156, 1446, 1157, 1158, 574, 574, 1502, - 574, 1493, 574, 574, 1487, 574, 574, 574, 574, 574, - 574, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1161, 1156, - 574, 1157, 1158, 1445, 182, 1482, 1304, 690, 691, 692, - 1484, 1483, 163, 1661, 1458, 1978, 159, 1662, 160, 2748, - 182, 168, 2729, 1304, 2429, 2747, 1517, 2012, 1477, 1478, - 1292, 574, 2746, 182, 1974, 184, 185, 186, 177, 2551, - 1516, 2640, 1159, 1973, 1536, 2638, 1506, 574, 2609, 182, - 2459, 1304, 1424, 1416, 1417, 2558, 1304, 1431, 1159, 2550, - 2461, 1313, 2148, 2136, 1156, 182, 1157, 1158, 2000, 1269, - 1915, 1156, 182, 1157, 1158, 1914, 1156, 1443, 1157, 1158, - 1771, 182, 182, 182, 182, 182, 182, 182, 182, 182, - 574, 1753, 1156, 1578, 1157, 1158, 1408, 1479, 1544, 1156, - 1507, 1157, 1158, 1515, 574, 574, 1494, 1442, 677, 1505, - 1314, 1490, 1489, 1485, 1486, 1488, 1315, 1434, 1159, 1491, - 1492, 1112, 182, 1421, 1128, 1304, 1422, 1420, 184, 185, - 186, 2726, 2123, 1551, 155, 1441, 1441, 92, 94, 1543, - 1555, 1304, 1557, 1558, 1559, 1560, 163, 2725, 93, 1564, - 1495, 2516, 184, 185, 186, 168, 1875, 2070, 2862, 183, - 2694, 1576, 183, 2834, 1304, 183, 2693, 1159, 1635, 2596, - 575, 2172, 183, 1156, 2151, 1157, 1158, 1480, 2070, 2801, - 183, 1647, 574, 1539, 1638, 1642, 1823, 1641, 1641, 1156, - 2350, 1157, 1158, 1639, 1639, 183, 1304, 574, 574, 1955, - 2020, 1304, 1304, 1451, 100, 1452, 2826, 1454, 1456, 119, - 1612, 1460, 1462, 1464, 1466, 1468, 1610, 575, 2518, 1658, - 575, 183, 575, 1619, 1553, 1621, 1622, 1623, 1624, 1625, - 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, 968, 1620, - 967, 2081, 1414, 1701, 1159, 1575, 1155, 1574, 1159, 1156, - 2845, 1157, 1158, 1549, 1550, 2767, 1175, 1732, 2222, 2070, - 182, 1582, 1583, 2070, 2788, 574, 2081, 1554, 155, 184, - 185, 186, 1970, 1873, 1561, 1562, 1563, 1613, 1176, 1177, - 1178, 1179, 1180, 1181, 1182, 1184, 1183, 1185, 1186, 182, - 2070, 2784, 574, 2089, 1758, 1701, 1759, 2478, 1156, 2379, - 1157, 1158, 182, 92, 2112, 1159, 574, 184, 185, 186, - 94, 182, 2089, 182, 93, 182, 182, 574, 2776, 1304, - 574, 2292, 1317, 1159, 1734, 2070, 2764, 2759, 2588, 2761, - 2538, 574, 1732, 2478, 1304, 2070, 2701, 2516, 1824, 95, - 790, 1736, 1737, 790, 1972, 2588, 1304, 156, 161, 158, - 164, 165, 166, 167, 169, 170, 171, 172, 95, 2070, - 2586, 1899, 1304, 173, 174, 175, 176, 2113, 1304, 1733, - 1764, 1807, 1159, 2521, 1304, 1156, 2115, 1157, 1158, 1156, - 1790, 1157, 1158, 1155, 1304, 1970, 574, 1316, 2005, 1304, - 2381, 2380, 1868, 1869, 1870, 2377, 2378, 1872, 1874, 1734, - 1177, 1178, 1179, 1180, 1181, 1182, 1184, 1183, 1185, 1186, - 1818, 574, 2377, 2376, 1752, 760, 2005, 574, 1444, 2089, - 1304, 1444, 1828, 1444, 1829, 1830, 1831, 1832, 1819, 1898, - 1970, 1304, 1801, 1955, 2191, 1900, 1156, 1989, 1157, 1158, - 1839, 1840, 1841, 1842, 1785, 1766, 1405, 2176, 1822, 2168, - 2169, 1988, 1849, 1888, 1156, 1304, 1157, 1158, 1783, 574, - 1805, 1635, 1855, 2070, 2069, 2317, 1635, 1635, 1806, 2791, - 1643, 1833, 1834, 1835, 1836, 2516, 1159, 1649, 1650, 1821, - 1820, 156, 161, 158, 164, 165, 166, 167, 169, 170, - 171, 172, 1899, 794, 1405, 1404, 794, 173, 174, 175, - 176, 2112, 182, 1156, 1899, 1157, 1158, 1159, 1885, 182, - 1882, 1159, 1350, 1349, 182, 182, 1159, 2088, 182, 1175, - 182, 1968, 1850, 1159, 1778, 1893, 1308, 182, 1896, 1735, - 1897, 1861, 1738, 1739, 182, 1863, 1871, 1860, 1743, 1845, - 1846, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1184, 1183, - 1185, 1186, 1590, 1892, 1533, 1850, 1908, 1891, 1895, 2698, - 182, 1910, 1336, 2066, 2113, 574, 1912, 1913, 1909, 1763, - 992, 2089, 975, 1955, 750, 974, 1159, 993, 94, 87, - 1159, 2563, 2715, 1311, 1159, 2691, 2652, 1441, 2402, 2578, - 2580, 2575, 1159, 2480, 2556, 2470, 2469, 1175, 2476, 1946, - 1947, 101, 1159, 1407, 1949, 2467, 1848, 1156, 1159, 1157, - 1158, 2427, 100, 1950, 99, 2404, 2400, 2177, 1918, 1176, - 1177, 1178, 1179, 1180, 1181, 1182, 1184, 1183, 1185, 1186, - 1159, 2564, 2565, 2566, 183, 1970, 183, 1159, 1156, 183, - 1157, 1158, 1156, 1844, 1157, 1158, 1838, 1156, 1837, 1157, - 1158, 87, 1159, 1939, 1156, 1612, 1157, 1158, 2466, 1521, - 1436, 2145, 1432, 2140, 1159, 101, 2029, 1965, 575, 1967, - 575, 575, 1175, 1159, 2028, 1171, 100, 1172, 99, 1057, - 1403, 1304, 113, 1966, 2027, 575, 575, 94, 2528, 2529, - 2026, 1173, 1174, 1170, 1176, 1177, 1178, 1179, 1180, 1181, - 1182, 1184, 1183, 1185, 1186, 1953, 1473, 1156, 1159, 1157, - 1158, 1156, 2025, 1157, 1158, 1156, 2431, 1157, 1158, 2024, - 2716, 1859, 1613, 1156, 182, 1157, 1158, 1756, 2567, 1964, - 1580, 2144, 182, 1156, 2023, 1157, 1158, 574, 2886, 1156, - 2884, 1157, 1158, 574, 2041, 1304, 2022, 2840, 2815, 2531, - 2054, 2534, 1470, 1641, 574, 2021, 1474, 1475, 1476, 1639, - 2396, 1156, 2395, 1157, 1158, 2394, 2317, 1982, 1156, 2155, - 1157, 1158, 1940, 2533, 2058, 2568, 2569, 182, 2145, 1159, - 2622, 182, 2621, 1156, 2339, 1157, 1158, 2831, 2085, 2340, - 2015, 1159, 1581, 2336, 2335, 1156, 2122, 1157, 1158, 1471, - 1472, 1762, 2802, 1998, 1156, 2337, 1157, 1158, 2522, 1770, - 2338, 1734, 2341, 1159, 2098, 2099, 1312, 1159, 2309, 2311, - 2297, 660, 2094, 2097, 2098, 2099, 2095, 2312, 2096, 2100, - 2620, 2296, 2528, 2529, 2174, 37, 1159, 2067, 2743, 1156, - 574, 1157, 1158, 2631, 2105, 182, 183, 1278, 2633, 2042, - 575, 575, 182, 2512, 1532, 2509, 1733, 764, 2306, 2375, - 2104, 2014, 2052, 2508, 574, 765, 183, 736, 2130, 2149, - 1653, 574, 2063, 2013, 2068, 1444, 1444, 1022, 2126, 2071, - 574, 2078, 1021, 573, 1654, 575, 2441, 92, 2144, 183, - 2216, 1127, 2188, 2184, 575, 2010, 2187, 2110, 93, 2009, - 575, 2167, 2114, 182, 182, 182, 182, 182, 2183, 2117, - 1156, 1855, 1157, 1158, 120, 2124, 2514, 2127, 2008, 94, - 182, 182, 1156, 2866, 1157, 1158, 2392, 1980, 1159, 1943, - 792, 1780, 1781, 948, 2760, 955, 182, 2133, 2134, 2137, - 2147, 2711, 2374, 2102, 1156, 1159, 1157, 1158, 1156, 2146, - 1157, 1158, 1767, 1932, 2152, 1635, 2494, 92, 2295, 1424, - 2156, 2157, 2158, 99, 94, 2186, 2294, 1156, 93, 1157, - 1158, 2094, 2097, 2098, 2099, 2095, 101, 2096, 2100, 772, - 773, 101, 2178, 2179, 1959, 2735, 2734, 100, 746, 99, - 2639, 2637, 100, 2246, 99, 2636, 2629, 2185, 94, 2576, - 2513, 2511, 2405, 1883, 2032, 2033, 1419, 101, 771, 1641, - 2006, 1641, 100, 2628, 1641, 1639, 574, 1639, 100, 1641, - 1639, 2267, 2224, 2267, 2502, 1639, 2267, 2002, 2081, 2842, - 2841, 2267, 574, 2066, 2256, 2225, 2208, 1990, 1754, 2286, - 1330, 2279, 2280, 2281, 2282, 2272, 2269, 182, 1321, 2842, - 2273, 574, 2226, 2242, 183, 2243, 106, 107, 2749, 1156, - 574, 1157, 1158, 2549, 762, 103, 88, 574, 574, 1, - 182, 182, 182, 182, 182, 2817, 1156, 543, 1157, 1158, - 1744, 1276, 182, 2286, 2260, 2813, 2314, 182, 575, 1508, - 182, 2329, 182, 1498, 2320, 182, 182, 182, 2599, 2320, - 1702, 2712, 2173, 2349, 1889, 575, 575, 2574, 575, 1853, - 575, 575, 2300, 575, 575, 575, 575, 575, 575, 983, - 2285, 145, 2287, 2214, 2323, 1159, 2215, 1816, 575, 1817, - 2390, 2797, 183, 110, 752, 2298, 182, 944, 109, 2299, - 2301, 2274, 2275, 2276, 2277, 2278, 986, 1085, 183, 574, - 753, 1884, 2589, 2131, 1291, 2105, 754, 2351, 574, 575, - 2352, 183, 1825, 182, 2331, 2332, 1356, 2334, 1354, 2342, - 2346, 2347, 95, 182, 1355, 575, 2330, 183, 2353, 2333, - 1353, 1358, 2407, 1357, 1991, 1584, 2359, 1543, 182, 571, - 2101, 182, 180, 183, 1345, 2411, 2288, 2289, 2290, 1322, - 183, 2442, 1023, 2386, 2385, 533, 2382, 2001, 1916, 183, - 183, 183, 183, 183, 183, 183, 183, 183, 575, 539, - 1199, 1579, 2293, 2419, 2118, 791, 2418, 784, 2387, 2388, - 1755, 2056, 575, 575, 1855, 2410, 2325, 1302, 1298, 2506, - 2305, 2422, 2307, 2073, 2310, 2303, 2406, 2742, 2630, 2789, - 183, 2128, 1299, 1318, 1981, 1655, 1156, 2291, 1157, 1158, - 2475, 1795, 1605, 2436, 2439, 2440, 2437, 1302, 1298, 596, - 595, 593, 2059, 574, 182, 2082, 2444, 1760, 1761, 1301, - 1162, 1300, 1299, 680, 2046, 2451, 1331, 2093, 2091, 2445, - 2090, 1941, 1802, 2328, 2448, 2449, 2530, 2450, 2526, 2876, - 2452, 2809, 2454, 1797, 2456, 1793, 2065, 1295, 1296, 1301, - 575, 1300, 604, 597, 589, 2546, 2417, 2194, 2428, 2196, - 2129, 2424, 1140, 1294, 583, 575, 575, 956, 1652, 2717, - 2703, 182, 1958, 2463, 1293, 1665, 2495, 2496, 1666, 2397, - 1876, 63, 41, 2510, 1693, 578, 2827, 2503, 1131, 2552, - 778, 32, 31, 30, 182, 2535, 29, 28, 23, 2515, - 22, 21, 20, 19, 25, 18, 2532, 17, 16, 2837, - 2865, 115, 182, 2500, 50, 182, 182, 182, 2539, 47, - 45, 792, 122, 792, 792, 574, 574, 121, 183, 48, - 2547, 2548, 44, 575, 1060, 42, 2540, 27, 1130, 1132, - 26, 15, 2419, 14, 2525, 2418, 13, 12, 11, 10, - 9, 5, 574, 574, 574, 574, 4, 183, 35, 34, - 575, 33, 2581, 2582, 1134, 24, 2541, 2542, 2, 2160, - 183, 1878, 0, 0, 575, 2595, 0, 0, 0, 183, - 0, 183, 0, 183, 183, 575, 0, 0, 575, 2584, - 0, 2593, 2594, 0, 0, 0, 0, 0, 0, 575, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2608, - 0, 0, 0, 0, 0, 1641, 0, 1641, 182, 0, - 0, 1639, 0, 1639, 2557, 0, 2559, 2267, 0, 2267, - 0, 2625, 0, 0, 0, 0, 0, 2604, 0, 0, - 0, 0, 574, 0, 574, 0, 0, 1270, 2617, 0, - 2616, 0, 0, 0, 575, 0, 0, 0, 0, 0, - 0, 2646, 0, 0, 0, 2626, 0, 2320, 0, 2648, - 2635, 2634, 0, 746, 2654, 2642, 0, 1641, 2650, 575, - 0, 2644, 0, 1639, 0, 575, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2605, 2323, 574, - 0, 0, 2323, 1282, 1283, 0, 0, 0, 37, 0, - 0, 2658, 0, 0, 0, 0, 0, 0, 0, 574, - 0, 0, 2695, 0, 0, 0, 2697, 575, 0, 2696, - 0, 0, 0, 0, 0, 0, 2699, 0, 1326, 0, - 574, 0, 2714, 2706, 574, 574, 0, 792, 0, 2707, - 0, 0, 0, 1346, 2655, 2656, 0, 0, 0, 0, - 0, 0, 0, 2702, 0, 0, 0, 0, 0, 0, - 183, 0, 0, 574, 0, 2739, 0, 183, 0, 2736, - 2737, 0, 183, 183, 2741, 2738, 183, 0, 183, 0, - 0, 0, 2750, 0, 0, 183, 2752, 0, 0, 0, - 0, 0, 183, 746, 0, 0, 0, 0, 2756, 0, - 2753, 0, 574, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2323, 0, 0, 183, 0, - 0, 0, 0, 575, 0, 0, 574, 182, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2758, - 0, 0, 2766, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 574, 2769, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 574, 574, - 0, 0, 2782, 0, 0, 0, 0, 574, 0, 37, - 2320, 2790, 2787, 2792, 0, 0, 182, 574, 1303, 2796, - 0, 2714, 2798, 2805, 0, 0, 0, 0, 0, 2808, - 0, 0, 0, 2824, 2816, 0, 2821, 0, 0, 0, - 0, 0, 0, 2830, 0, 0, 0, 0, 0, 2836, - 0, 948, 2839, 0, 0, 0, 0, 574, 37, 0, - 0, 0, 661, 0, 1270, 574, 0, 2848, 1450, 1450, - 0, 1450, 2852, 1450, 1450, 2850, 1459, 1450, 1450, 1450, - 1450, 1450, 2859, 2853, 0, 0, 1641, 0, 2867, 1270, - 1270, 948, 1639, 0, 2846, 0, 2872, 0, 0, 0, - 0, 0, 183, 0, 0, 0, 0, 0, 2883, 2882, - 183, 0, 0, 181, 0, 575, 529, 0, 0, 569, - 2875, 575, 1520, 1641, 0, 0, 529, 2885, 0, 1639, - 1641, 0, 575, 0, 529, 0, 1639, 0, 1540, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, - 0, 0, 178, 0, 0, 183, 0, 0, 0, 183, - 0, 0, 0, 2166, 0, 777, 0, 777, 0, 0, - 0, 0, 0, 0, 0, 529, 120, 0, 142, 0, - 0, 792, 0, 0, 0, 0, 0, 0, 0, 162, - 0, 0, 0, 0, 0, 792, 792, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 575, 0, - 152, 0, 0, 183, 0, 141, 0, 0, 0, 0, - 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 575, 0, 0, 0, 159, 0, 160, 575, - 0, 0, 0, 0, 0, 0, 0, 0, 575, 0, - 0, 0, 0, 0, 1427, 1428, 151, 150, 177, 0, - 0, 0, 0, 1648, 0, 0, 0, 0, 0, 0, - 1270, 183, 183, 183, 183, 183, 0, 0, 1663, 1664, - 0, 0, 0, 0, 0, 0, 0, 0, 183, 183, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 792, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1757, 0, 0, 0, - 0, 0, 0, 0, 146, 1429, 153, 0, 1426, 0, - 147, 148, 0, 0, 0, 0, 163, 0, 0, 0, - 0, 0, 0, 1769, 0, 168, 0, 0, 0, 0, - 0, 0, 0, 0, 575, 0, 0, 1326, 0, 0, - 792, 0, 0, 0, 0, 0, 0, 0, 792, 0, - 575, 792, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 948, 0, 0, 183, 0, 0, 0, 575, - 0, 0, 0, 0, 0, 0, 0, 0, 575, 0, - 0, 0, 0, 0, 0, 575, 575, 0, 183, 183, - 183, 183, 183, 0, 0, 0, 0, 0, 178, 0, - 183, 0, 0, 0, 0, 183, 0, 0, 183, 1423, - 183, 0, 0, 183, 183, 183, 0, 955, 0, 0, - 0, 0, 120, 0, 142, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 162, 0, 0, 155, 0, - 0, 0, 948, 0, 0, 0, 0, 0, 955, 0, - 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 152, 575, 0, 0, - 0, 141, 0, 0, 0, 0, 575, 0, 0, 0, - 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, - 948, 183, 159, 0, 160, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 183, 0, 0, 183, - 1427, 1428, 151, 150, 177, 149, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 529, 0, - 529, 0, 0, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, - 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 676, 2893, 2780, 2887, 1814, 2617, 2846, 2911, 2910, 2842, + 1352, 2444, 2826, 2739, 1768, 2359, 2366, 2011, 1748, 766, + 2265, 3, 2400, 1121, 669, 37, 2756, 744, 1750, 2317, + 598, 2320, 2647, 1877, 685, 2045, 2426, 2427, 1310, 594, + 96, 2321, 670, 2368, 2521, 2515, 2318, 2264, 667, 2652, + 668, 182, 679, 2263, 182, 2080, 559, 182, 1772, 620, + 1787, 2315, 574, 2429, 182, 591, 2103, 2541, 2307, 2072, + 2507, 1070, 182, 1847, 2141, 2170, 2210, 1867, 1852, 592, + 2142, 1803, 2143, 767, 2092, 678, 1791, 182, 36, 1297, + 1406, 2064, 154, 946, 2047, 1274, 590, 38, 1704, 2227, + 793, 1634, 748, 1644, 752, 1728, 140, 1792, 1866, 574, + 1886, 989, 574, 182, 574, 1854, 1919, 746, 1592, 2135, + 1703, 95, 769, 1319, 1341, 976, 971, 1433, 91, 603, + 2111, 1449, 790, 1794, 1277, 1099, 1656, 1206, 1611, 1142, + 953, 1537, 1541, 1440, 950, 1731, 982, 1864, 979, 1011, + 1523, 1779, 977, 978, 954, 1773, 1340, 1843, 1324, 1338, + 1113, 157, 1119, 586, 758, 1700, 98, 117, 753, 1546, + 118, 1401, 1425, 102, 123, 124, 756, 754, 1054, 780, + 76, 1741, 97, 1213, 581, 85, 1209, 2789, 2163, 89, + 2894, 1879, 1880, 1881, 1879, 2397, 2189, 2188, 1917, 2161, + 1509, 2600, 1143, 2418, 755, 77, 774, 2218, 779, 119, + 2219, 531, 8, 2921, 104, 105, 2415, 108, 90, 760, + 114, 125, 7, 179, 6, 1599, 526, 184, 185, 186, + 1745, 1746, 1598, 1597, 1596, 1595, 1594, 947, 1016, 993, + 1577, 584, 1586, 585, 2861, 2914, 740, 741, 742, 743, + 582, 2920, 751, 2043, 2303, 962, 2074, 957, 747, 745, + 2416, 2907, 2871, 2884, 794, 1024, 2576, 1604, 787, 2735, + 2383, 2734, 1015, 761, 2610, 969, 992, 2611, 119, 1014, + 782, 783, 2422, 768, 968, 2906, 2836, 967, 1957, 2897, + 2806, 2882, 1013, 2618, 2827, 1017, 1018, 1019, 78, 1905, + 78, 80, 2835, 2226, 78, 1027, 1028, 1153, 1031, 1032, + 1033, 1034, 1143, 1029, 1037, 1038, 1039, 1040, 1041, 1042, + 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 2913, + 78, 1859, 178, 2805, 2478, 2921, 1175, 1415, 966, 2044, + 1063, 1064, 119, 961, 2197, 1106, 963, 1108, 2196, 2665, + 2356, 2357, 1955, 2355, 2083, 1857, 120, 2744, 1176, 1177, + 1178, 1179, 1180, 1181, 1182, 1184, 1183, 1185, 1186, 162, + 1686, 2217, 1066, 1809, 1810, 87, 1342, 87, 1343, 2084, + 1954, 87, 1808, 1116, 1089, 1105, 1107, 738, 1057, 737, + 2419, 2120, 1747, 2781, 2119, 1077, 964, 2121, 1094, 1095, + 1078, 1077, 1149, 1090, 2518, 1141, 1078, 87, 178, 2164, + 1083, 2125, 2253, 2132, 1076, 2446, 1075, 1153, 1827, 1826, + 563, 1585, 563, 2469, 2467, 572, 159, 576, 160, 570, + 1281, 1529, 120, 2171, 142, 1053, 1887, 563, 2439, 2192, + 966, 1920, 958, 2896, 1499, 162, 2440, 563, 177, 960, + 959, 1524, 1092, 1093, 1587, 1588, 1589, 1678, 1667, 1668, + 1669, 1670, 1680, 1671, 1672, 1673, 1685, 1681, 1674, 1675, + 1682, 1683, 1684, 1676, 1677, 1679, 152, 1030, 1103, 1925, + 1110, 141, 1104, 1098, 1091, 1115, 2602, 970, 1500, 1096, + 1501, 1084, 1109, 1933, 1856, 1934, 2447, 1935, 964, 1097, + 1059, 2205, 159, 2601, 160, 1931, 1928, 1930, 1929, 965, + 1936, 1036, 1149, 1035, 2448, 1102, 1924, 2862, 1922, 2722, + 129, 130, 151, 150, 177, 2598, 182, 87, 182, 1000, + 1890, 182, 972, 1788, 1926, 973, 973, 966, 1052, 1009, + 991, 1008, 1007, 998, 1006, 1005, 1004, 1003, 1002, 997, + 1284, 2891, 1187, 2372, 1418, 1010, 163, 1955, 1923, 2880, + 574, 1123, 574, 574, 2254, 168, 1087, 951, 1187, 951, + 2901, 949, 991, 2209, 985, 951, 1538, 574, 574, 984, + 2048, 2050, 1865, 781, 1439, 2206, 1148, 1145, 1146, 1147, + 1152, 1154, 1151, 1911, 1150, 1534, 1129, 1020, 2390, 2191, + 1135, 1144, 1056, 37, 1073, 991, 1079, 1080, 1081, 1082, + 1413, 965, 1907, 1412, 1411, 2181, 564, 1535, 564, 1409, + 146, 127, 153, 134, 126, 530, 147, 148, 1117, 1118, + 2382, 2777, 163, 564, 1530, 2222, 2597, 2557, 990, 1774, + 1775, 168, 135, 564, 984, 987, 988, 525, 951, 2788, + 2162, 1969, 981, 985, 1188, 1189, 138, 136, 131, 132, + 133, 137, 2194, 2745, 1026, 2537, 2204, 1815, 128, 2203, + 990, 2116, 1001, 980, 2079, 994, 984, 139, 155, 1190, + 1191, 1192, 1193, 2519, 2165, 995, 999, 1111, 1438, 1198, + 2035, 1201, 1740, 1328, 1055, 1124, 1148, 1145, 1146, 1147, + 1152, 1154, 1151, 990, 1150, 996, 1528, 2794, 965, 1253, + 1068, 1144, 1272, 1187, 991, 2212, 1267, 1858, 1186, 81, + 2211, 2804, 116, 2354, 1125, 1126, 184, 185, 186, 1956, + 1636, 2212, 2420, 2421, 763, 1194, 2211, 1114, 182, 991, + 2049, 1100, 574, 574, 1547, 2423, 1511, 1510, 1512, 1513, + 1514, 2800, 111, 86, 155, 86, 1012, 2593, 182, 86, + 2531, 1921, 1086, 2889, 1285, 1072, 2890, 1531, 2888, 1344, + 1287, 2912, 991, 1088, 1291, 1288, 1273, 574, 1139, 2246, + 748, 182, 1065, 77, 1062, 86, 574, 1657, 746, 1290, + 1074, 1138, 574, 1657, 2154, 1983, 2661, 2852, 1158, 1616, + 1906, 1136, 2568, 1137, 2567, 1894, 1211, 1215, 1212, 790, + 1637, 2850, 990, 1617, 1618, 1615, 1448, 994, 984, 2812, + 2854, 2855, 112, 1157, 1158, 1447, 1437, 995, 2370, 2371, + 1904, 149, 1289, 1902, 1000, 2851, 95, 990, 1273, 998, + 2876, 2362, 2902, 984, 987, 988, 1899, 951, 1525, 2558, + 1526, 981, 985, 1527, 87, 1259, 1260, 1261, 1262, 1263, + 2904, 2813, 1159, 1329, 143, 1899, 2730, 144, 1614, 2729, + 990, 1278, 1025, 1179, 1180, 1181, 1182, 1184, 1183, 1185, + 1186, 98, 1159, 1903, 1101, 2770, 2363, 1548, 1961, 1962, + 1963, 156, 161, 158, 164, 165, 166, 167, 169, 170, + 171, 172, 1901, 1058, 2443, 1071, 2720, 173, 174, 175, + 176, 2365, 1181, 1182, 1184, 1183, 1185, 1186, 690, 691, + 692, 1275, 2633, 1159, 1292, 2360, 2903, 2771, 1339, 1159, + 745, 1286, 2369, 2632, 1309, 1306, 747, 1606, 1608, 1609, + 2575, 794, 2370, 2371, 2372, 2878, 182, 2574, 2398, 2361, + 1402, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1161, 1410, + 1159, 1607, 1334, 1335, 1159, 2388, 2139, 156, 161, 158, + 164, 165, 166, 167, 169, 170, 171, 172, 2475, 1518, + 574, 2367, 1435, 173, 174, 175, 176, 1780, 1781, 1516, + 1444, 2138, 1506, 1156, 1446, 1157, 1158, 574, 574, 1862, + 574, 1519, 574, 574, 1175, 574, 574, 574, 574, 574, + 574, 2755, 1304, 1156, 1504, 1157, 1158, 184, 185, 186, + 574, 2565, 2248, 1445, 182, 1482, 1176, 1177, 1178, 1179, + 1180, 1181, 1182, 1184, 1183, 1185, 1186, 785, 1503, 1502, + 182, 1493, 1517, 1304, 1159, 1487, 2369, 1484, 1477, 1478, + 1304, 574, 1515, 182, 1156, 1505, 1157, 1158, 2372, 1304, + 1156, 1483, 1157, 1158, 1536, 1458, 1661, 574, 1495, 182, + 1662, 2877, 1313, 1431, 184, 185, 186, 2797, 2123, 184, + 185, 186, 1424, 1875, 2796, 182, 184, 185, 186, 2774, + 1873, 1156, 182, 1157, 1158, 1156, 2773, 1157, 1158, 1441, + 1441, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 574, 2772, 2725, 1479, 2660, 2658, 2629, 1443, 2572, 1416, + 1417, 1314, 2564, 2148, 574, 574, 2473, 1304, 2136, 1451, + 1269, 1452, 1442, 1454, 1456, 1408, 1414, 1460, 1462, 1464, + 1466, 1468, 182, 184, 185, 186, 1915, 1421, 1159, 1422, + 1420, 1914, 1771, 1434, 1753, 1551, 2530, 1578, 1544, 1507, + 1494, 1490, 1555, 2364, 1557, 1558, 1559, 1560, 1175, 1543, + 2221, 1564, 1159, 1489, 1488, 1156, 1480, 1157, 1158, 1485, + 1486, 1315, 1979, 1576, 1112, 1491, 1492, 1128, 1635, 2752, + 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1184, 1183, 1185, + 1186, 1647, 574, 101, 2070, 2895, 677, 1539, 92, 1638, + 1642, 1549, 1550, 1612, 100, 94, 99, 574, 574, 93, + 119, 2867, 1304, 1641, 1641, 1554, 968, 2070, 2833, 967, + 2020, 1304, 1561, 1562, 1563, 2751, 2228, 2714, 1619, 1658, + 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, + 1631, 1632, 1633, 1620, 1978, 1553, 92, 183, 94, 1610, + 183, 1159, 2713, 183, 2070, 2820, 2616, 93, 575, 2172, + 183, 1575, 1574, 1304, 1639, 1639, 2081, 1732, 183, 1156, + 182, 1157, 1158, 1304, 2081, 574, 1582, 1583, 2070, 2816, + 2808, 1304, 2151, 183, 2070, 2790, 2608, 2787, 2492, 1304, + 1613, 2070, 2721, 1156, 1823, 1157, 1158, 2532, 1758, 182, + 1759, 1155, 574, 2608, 1304, 575, 1304, 2230, 575, 183, + 575, 1304, 182, 2349, 1701, 2799, 574, 2070, 2606, 1899, + 1304, 182, 1955, 182, 1974, 182, 182, 574, 2535, 1304, + 574, 1643, 1175, 1973, 1968, 1155, 1304, 2089, 1649, 1650, + 2070, 574, 1732, 100, 1734, 2530, 95, 1824, 2005, 1304, + 790, 1736, 1737, 790, 1176, 1177, 1178, 1179, 1180, 1181, + 1182, 1184, 1183, 1185, 1186, 95, 1701, 2380, 2379, 2240, + 2239, 2238, 2232, 2858, 2236, 2088, 2231, 1764, 2229, 2376, + 2377, 2089, 1156, 2234, 1157, 1158, 1733, 1159, 2376, 2375, + 1735, 1790, 2233, 1738, 1739, 2492, 574, 2000, 2089, 1304, + 1970, 1304, 1868, 1869, 1870, 1955, 2190, 1872, 1874, 2235, + 2237, 1970, 1833, 1834, 1835, 1836, 1405, 2175, 2378, 1734, + 2291, 574, 2168, 2169, 2112, 760, 1807, 574, 1444, 2089, + 1763, 1444, 1818, 1444, 1819, 1970, 1752, 2005, 1828, 1898, + 1829, 1830, 1831, 1832, 1801, 1176, 1177, 1178, 1179, 1180, + 1181, 1182, 1184, 1183, 1185, 1186, 1839, 1840, 1841, 1842, + 1888, 1785, 1989, 1766, 1849, 1159, 1822, 2070, 2069, 574, + 1304, 1635, 1855, 1988, 1783, 1159, 1635, 1635, 1175, 1405, + 1404, 1171, 794, 1172, 1806, 794, 1805, 2113, 1350, 1349, + 1899, 1882, 1317, 1821, 1820, 1778, 2115, 1173, 1174, 1170, + 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1184, 1183, 1185, + 1186, 1159, 182, 2316, 1885, 1308, 1743, 1590, 1156, 182, + 1157, 1158, 1159, 2530, 182, 182, 1533, 1159, 182, 2112, + 182, 993, 1159, 1336, 1900, 975, 1850, 182, 974, 2823, + 87, 1441, 1159, 101, 182, 1845, 1846, 2012, 1861, 1863, + 1860, 1159, 1871, 2741, 100, 1893, 99, 1316, 1896, 1159, + 1897, 750, 1908, 1311, 1159, 94, 2711, 1892, 992, 1850, + 182, 1891, 1910, 1895, 1159, 574, 2577, 1912, 1913, 2672, + 1909, 1177, 1178, 1179, 1180, 1181, 1182, 1184, 1183, 1185, + 1186, 1899, 2113, 2592, 2785, 1159, 1156, 2589, 1157, 1158, + 2401, 1955, 2570, 2445, 2484, 1304, 1156, 1159, 1157, 1158, + 2718, 1946, 1947, 2536, 2483, 2594, 1949, 1159, 1407, 2066, + 1848, 2581, 2441, 1304, 2552, 1950, 2578, 2579, 2580, 1159, + 1918, 2403, 2144, 2494, 94, 1159, 2399, 2176, 87, 1844, + 2742, 2490, 1156, 1838, 1157, 1158, 2481, 1837, 1612, 1521, + 1159, 1436, 1432, 1156, 1403, 1157, 1158, 2140, 1156, 1159, + 1157, 1158, 113, 1156, 1159, 1157, 1158, 1939, 2582, 2583, + 1159, 1859, 1965, 1156, 1967, 1157, 1158, 2480, 2145, 2145, + 1992, 1057, 1156, 1756, 1157, 1158, 2919, 1966, 2917, 2029, + 1156, 1970, 1157, 1158, 1159, 1156, 2873, 1157, 1158, 2028, + 2542, 2543, 2847, 1159, 2545, 1156, 2395, 1157, 1158, 1580, + 2394, 2027, 1159, 2393, 2316, 2155, 1940, 2026, 1159, 2548, + 1953, 1762, 183, 1159, 183, 2547, 1156, 183, 1157, 1158, + 1159, 2338, 2025, 2335, 182, 1613, 2339, 2334, 1156, 2864, + 1157, 1158, 182, 2834, 1964, 1770, 2024, 574, 1156, 1312, + 1157, 1158, 2023, 574, 2041, 2296, 575, 2295, 575, 575, + 1156, 2058, 1157, 1158, 574, 2054, 1156, 1473, 1157, 1158, + 2052, 1581, 2769, 575, 575, 2336, 2022, 1159, 2523, 1641, + 2337, 1156, 1982, 1157, 1158, 2021, 2522, 182, 1980, 2653, + 1156, 182, 1157, 1158, 2015, 1156, 2651, 1157, 1158, 2085, + 2014, 1156, 37, 1157, 1158, 2013, 2122, 764, 2526, 1159, + 2305, 2105, 2010, 1532, 736, 765, 1159, 1474, 1475, 1476, + 2071, 1998, 1159, 1470, 2374, 1156, 2130, 1157, 1158, 2149, + 1639, 1734, 1022, 2642, 1156, 2641, 1157, 1158, 2340, 1653, + 2098, 2099, 1021, 1156, 2067, 1157, 1158, 1159, 1127, 1156, + 574, 1157, 1158, 1654, 1156, 182, 1157, 1158, 92, 2009, + 2455, 1156, 182, 1157, 1158, 2032, 2033, 1278, 2042, 93, + 1471, 1472, 2144, 1733, 574, 2104, 2183, 2215, 2133, 2134, + 2182, 574, 2063, 2640, 120, 1444, 1444, 2068, 2167, 2528, + 574, 2008, 2078, 94, 2308, 2310, 660, 2899, 2006, 2391, + 2126, 1943, 2187, 2311, 2002, 2186, 1780, 1781, 1156, 2110, + 1157, 1158, 2786, 182, 182, 182, 182, 182, 2737, 2373, + 2102, 1855, 2117, 2114, 1767, 92, 99, 772, 773, 2001, + 182, 182, 94, 2124, 183, 2127, 93, 2294, 575, 575, + 1156, 1932, 1157, 1158, 2508, 2293, 182, 1156, 2137, 1157, + 1158, 101, 1959, 1156, 183, 1157, 1158, 2761, 573, 2146, + 2760, 2659, 100, 100, 99, 1635, 2657, 2156, 2157, 2158, + 2152, 2656, 2649, 575, 2590, 2185, 2527, 183, 1156, 1424, + 1157, 1158, 575, 2094, 2097, 2098, 2099, 2095, 575, 2096, + 2100, 2525, 2404, 1159, 1883, 1419, 2147, 771, 2245, 2648, + 2516, 2081, 2875, 2874, 101, 792, 2066, 2255, 948, 2184, + 955, 746, 2177, 2178, 1972, 100, 1990, 2094, 2097, 2098, + 2099, 2095, 1754, 2096, 2100, 1330, 574, 2542, 2543, 1321, + 2875, 2266, 2775, 2266, 2563, 1641, 2266, 1641, 762, 2224, + 1641, 2266, 574, 106, 107, 1641, 103, 88, 2207, 2285, + 1, 2849, 543, 2271, 101, 2223, 2268, 182, 2272, 1744, + 1276, 574, 2845, 2241, 2225, 100, 2242, 99, 1508, 1498, + 574, 2213, 2619, 1702, 2214, 2738, 94, 574, 574, 2409, + 182, 182, 182, 182, 182, 2407, 1639, 1889, 1639, 2588, + 2313, 1639, 182, 2285, 2259, 1853, 1639, 182, 983, 145, + 182, 752, 182, 1816, 2319, 182, 182, 182, 2328, 2319, + 2298, 1817, 2278, 2279, 2280, 2281, 2829, 2322, 2348, 110, + 944, 1291, 2105, 2299, 1156, 109, 1157, 1158, 2414, 986, + 2284, 2286, 2273, 2274, 2275, 2276, 2277, 1085, 1884, 2609, + 2389, 2131, 183, 1825, 2411, 2297, 182, 2300, 2410, 2408, + 2287, 2288, 2289, 1356, 1354, 1355, 1353, 1358, 1357, 574, + 1991, 1584, 571, 2101, 180, 753, 2329, 574, 2350, 2332, + 1345, 2351, 182, 2290, 754, 2341, 575, 1322, 1023, 95, + 533, 2425, 182, 2381, 1916, 2345, 2346, 2352, 2330, 2331, + 539, 2333, 2406, 575, 575, 1199, 575, 182, 575, 575, + 182, 575, 575, 575, 575, 575, 575, 1543, 2358, 2327, + 2456, 1579, 2292, 2118, 2385, 2384, 575, 1302, 1298, 791, + 183, 784, 2433, 1755, 2432, 2056, 1302, 1298, 2324, 2520, + 2304, 2306, 1299, 2073, 2309, 2302, 183, 2768, 2650, 2821, + 2128, 1299, 1318, 1855, 2424, 1981, 1655, 575, 1795, 183, + 2436, 1605, 2405, 596, 595, 593, 2059, 1760, 1761, 1301, + 2082, 1300, 1162, 575, 680, 183, 1295, 1296, 1301, 2489, + 1300, 2046, 1331, 2451, 2450, 2453, 2454, 2093, 2091, 2090, + 1941, 183, 574, 182, 2386, 2387, 1802, 2544, 183, 2540, + 2909, 2841, 2459, 1797, 1793, 2065, 2465, 183, 183, 183, + 183, 183, 183, 183, 183, 183, 575, 604, 2458, 2462, + 2463, 597, 2464, 589, 2560, 2466, 2431, 2468, 2193, 2470, + 575, 575, 2442, 2195, 2129, 2438, 1140, 1294, 583, 956, + 1652, 2743, 2792, 1958, 2477, 1293, 1665, 1666, 183, 2396, + 182, 2173, 1876, 2514, 63, 41, 1693, 578, 2860, 2509, + 2510, 1131, 778, 32, 31, 30, 29, 28, 2566, 23, + 22, 21, 2517, 182, 20, 2524, 19, 25, 18, 2529, + 17, 2549, 16, 2417, 2539, 2870, 2898, 115, 50, 47, + 45, 182, 122, 121, 182, 182, 182, 48, 44, 1060, + 2546, 42, 27, 661, 574, 574, 2555, 2556, 575, 2553, + 26, 2433, 15, 2432, 14, 13, 2554, 12, 2595, 2596, + 11, 10, 2561, 575, 575, 9, 2562, 5, 4, 35, + 34, 33, 1134, 24, 2571, 2, 2573, 2413, 2412, 2160, + 1878, 0, 0, 0, 0, 0, 574, 574, 574, 574, + 0, 0, 0, 0, 181, 0, 0, 529, 0, 0, + 569, 0, 0, 0, 0, 0, 792, 529, 792, 792, + 0, 0, 0, 0, 0, 529, 2615, 0, 0, 0, + 0, 0, 0, 1130, 1132, 0, 183, 2613, 2614, 0, + 759, 575, 0, 0, 0, 0, 0, 2628, 0, 0, + 0, 0, 0, 0, 0, 0, 777, 0, 777, 0, + 0, 0, 182, 0, 0, 183, 529, 0, 575, 0, + 0, 2266, 2625, 2266, 0, 1641, 2624, 1641, 183, 0, + 2645, 0, 575, 0, 0, 0, 574, 183, 574, 183, + 2637, 183, 183, 575, 2636, 0, 575, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2666, 575, 0, 37, + 2646, 2319, 0, 0, 0, 2655, 2599, 2670, 2668, 2654, + 2603, 2604, 2605, 2674, 2664, 2322, 1639, 2662, 1639, 2322, + 746, 0, 0, 0, 0, 0, 0, 1641, 0, 0, + 0, 0, 1270, 574, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2678, 0, 0, 182, 2719, 0, 2675, + 2676, 0, 575, 0, 0, 0, 0, 0, 0, 574, + 0, 0, 0, 2715, 2717, 0, 2716, 0, 0, 0, + 0, 0, 0, 0, 2731, 0, 0, 575, 1639, 0, + 574, 2723, 2740, 575, 574, 574, 2733, 0, 1282, 1283, + 2732, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2762, 2763, 0, 574, 0, 0, 0, 0, 0, 2765, + 0, 2764, 0, 1326, 0, 575, 0, 2779, 0, 0, + 2778, 0, 792, 0, 0, 0, 0, 2776, 1346, 0, + 0, 0, 0, 2782, 0, 0, 0, 0, 2322, 0, + 0, 0, 574, 0, 0, 0, 746, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2784, 182, 183, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 183, 183, 574, 182, 183, 2767, 183, 0, 0, 0, + 2726, 2727, 2728, 183, 0, 2795, 2801, 0, 0, 2798, + 183, 0, 37, 0, 0, 2791, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 574, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, + 574, 574, 2819, 0, 0, 2814, 2319, 0, 2822, 574, + 0, 37, 2824, 2828, 0, 0, 0, 0, 182, 574, + 0, 0, 0, 2740, 2830, 2837, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2856, 2840, 2848, 2853, 0, + 0, 0, 0, 0, 0, 2863, 0, 0, 0, 0, + 0, 0, 2872, 0, 2869, 0, 0, 0, 0, 574, + 0, 0, 0, 0, 0, 0, 0, 0, 574, 2881, + 0, 0, 0, 2879, 2885, 0, 0, 2883, 0, 2892, + 0, 0, 0, 0, 0, 0, 948, 0, 0, 2900, + 0, 2886, 0, 0, 0, 0, 0, 2905, 0, 1270, + 0, 0, 0, 1450, 1450, 1641, 1450, 0, 1450, 1450, + 0, 1459, 1450, 1450, 1450, 1450, 1450, 2916, 2915, 0, + 0, 0, 0, 0, 1270, 1270, 948, 0, 2908, 529, + 0, 529, 0, 0, 529, 2918, 0, 0, 1303, 0, + 0, 0, 1641, 0, 0, 0, 0, 0, 0, 1641, + 183, 0, 0, 0, 0, 0, 1639, 1520, 183, 0, + 0, 178, 0, 575, 0, 0, 0, 0, 0, 575, + 0, 0, 2166, 1540, 0, 0, 0, 0, 0, 0, + 575, 0, 0, 0, 0, 120, 0, 142, 0, 0, + 0, 0, 0, 1639, 0, 0, 0, 0, 162, 0, + 1639, 0, 0, 183, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 792, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, + 792, 792, 0, 0, 141, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 159, 178, 160, 0, 0, + 0, 0, 0, 0, 0, 0, 575, 0, 0, 0, + 0, 183, 0, 1427, 1428, 151, 150, 177, 183, 0, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 1271, + 575, 0, 0, 162, 0, 0, 0, 575, 0, 0, + 0, 0, 0, 0, 0, 0, 575, 0, 1648, 0, + 0, 0, 0, 0, 0, 1270, 0, 0, 0, 0, + 0, 0, 0, 1663, 1664, 0, 0, 0, 0, 183, + 183, 183, 183, 183, 0, 0, 0, 0, 0, 0, + 0, 529, 0, 0, 0, 0, 183, 183, 0, 0, + 159, 0, 160, 0, 0, 0, 0, 0, 0, 0, + 792, 759, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 146, 1429, 153, 0, 1426, 0, 147, + 148, 0, 0, 0, 529, 163, 0, 0, 0, 0, + 0, 1757, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 575, 183, 0, 0, 0, 1952, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 146, 1429, 153, 0, 1426, 0, 147, 148, 0, 0, - 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, - 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1326, 0, 0, 792, 0, 0, 0, 0, + 0, 0, 575, 792, 0, 0, 792, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 948, 575, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 0, 0, 0, 575, 0, 0, + 163, 0, 0, 0, 0, 0, 575, 0, 0, 168, + 0, 0, 0, 575, 575, 0, 183, 183, 183, 183, + 183, 0, 0, 0, 0, 0, 0, 155, 183, 0, + 0, 0, 955, 183, 0, 0, 183, 0, 183, 0, + 0, 183, 183, 183, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 948, 0, 0, + 0, 0, 0, 955, 0, 0, 1423, 0, 0, 529, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, + 0, 142, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 162, 0, 0, 575, 0, 0, 0, 0, + 0, 0, 0, 575, 149, 948, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 1271, 0, 183, 0, + 0, 0, 155, 152, 0, 0, 0, 0, 141, 0, + 0, 0, 0, 183, 0, 0, 183, 143, 0, 0, + 144, 1271, 1271, 0, 0, 0, 0, 529, 0, 159, + 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1496, 0, 0, 0, 1427, 1428, 151, + 150, 177, 0, 0, 0, 0, 529, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1542, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 529, 0, + 0, 1952, 0, 0, 0, 529, 0, 0, 575, 183, + 0, 0, 0, 0, 1565, 1566, 529, 529, 529, 529, + 529, 529, 529, 0, 0, 0, 0, 0, 0, 0, + 156, 161, 158, 164, 165, 166, 167, 169, 170, 171, + 172, 0, 0, 0, 0, 0, 173, 174, 175, 176, + 0, 0, 0, 0, 0, 529, 0, 146, 1429, 153, + 0, 1426, 0, 147, 148, 0, 183, 0, 0, 163, + 0, 184, 185, 186, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, - 0, 156, 161, 158, 164, 165, 166, 167, 169, 170, - 171, 172, 0, 0, 0, 0, 0, 173, 174, 175, - 176, 0, 183, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1271, 0, - 183, 0, 0, 183, 183, 183, 0, 0, 0, 0, - 0, 0, 0, 575, 575, 0, 0, 0, 0, 0, - 0, 0, 1305, 1307, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 575, 575, 575, 575, 0, 0, 0, 0, 0, 0, - 529, 0, 0, 0, 155, 0, 0, 687, 79, 0, - 0, 0, 792, 0, 0, 0, 0, 0, 0, 0, - 759, 0, 0, 0, 0, 0, 0, 0, 1769, 0, - 0, 0, 0, 0, 2060, 0, 0, 0, 0, 0, - 0, 0, 0, 529, 0, 2075, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 777, + 183, 183, 183, 0, 563, 0, 777, 777, 0, 0, + 575, 575, 1271, 0, 0, 156, 161, 158, 164, 165, + 166, 167, 169, 170, 171, 172, 0, 0, 0, 0, + 0, 173, 174, 175, 176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 560, 0, 792, 0, 0, + 0, 0, 575, 575, 575, 575, 777, 1542, 777, 777, + 777, 777, 777, 1769, 0, 0, 0, 0, 0, 2060, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2075, 155, 0, 1496, 0, 0, 0, 0, 0, 0, + 0, 547, 1305, 1307, 0, 0, 0, 0, 777, 0, + 0, 0, 0, 545, 0, 0, 0, 0, 0, 0, + 0, 0, 759, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, + 0, 0, 1542, 0, 529, 0, 529, 0, 529, 1804, + 0, 0, 575, 542, 575, 0, 0, 0, 0, 0, + 0, 0, 555, 0, 0, 0, 0, 0, 149, 0, + 0, 0, 0, 0, 0, 0, 2150, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 575, 149, 575, 0, 0, 749, 0, 79, 0, 0, + 1769, 143, 0, 0, 144, 0, 0, 2174, 0, 575, + 564, 2868, 0, 0, 0, 0, 2179, 0, 0, 0, + 0, 1373, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 776, 575, 0, 0, 0, 0, + 0, 0, 532, 0, 534, 548, 0, 566, 0, 565, + 538, 0, 536, 540, 549, 541, 575, 535, 0, 546, + 575, 575, 537, 550, 551, 553, 556, 557, 558, 554, + 0, 544, 567, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 575, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 587, 0, 156, 161, 158, 164, 165, 166, + 167, 169, 170, 171, 172, 0, 0, 0, 0, 0, + 173, 174, 175, 176, 0, 0, 0, 1270, 575, 1270, + 0, 0, 1270, 0, 770, 529, 0, 1270, 0, 0, + 0, 0, 529, 183, 0, 0, 0, 529, 529, 0, + 0, 529, 792, 1944, 0, 0, 0, 0, 575, 183, + 529, 1361, 0, 0, 0, 0, 0, 529, 1450, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2301, 0, 0, + 0, 0, 0, 529, 575, 0, 792, 0, 0, 0, + 1270, 0, 0, 2326, 1450, 1270, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 575, 575, 0, 0, + 0, 0, 0, 0, 0, 575, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 575, 568, 0, 0, 0, + 0, 0, 1374, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 777, 0, 0, 562, + 0, 0, 0, 0, 0, 575, 0, 0, 0, 0, + 0, 0, 0, 0, 575, 948, 0, 0, 1270, 0, + 0, 0, 0, 1769, 0, 0, 1387, 1390, 1391, 1392, + 1393, 1394, 1395, 0, 1396, 1397, 1398, 1399, 1400, 1375, + 1376, 1377, 1378, 1359, 1360, 1388, 0, 1362, 0, 1363, + 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 0, 0, + 1372, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 0, + 0, 0, 0, 777, 777, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1542, 0, 0, 529, 0, 1659, + 0, 0, 0, 1660, 0, 1496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 749, 0, 0, 0, 0, - 0, 0, 0, 0, 143, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2150, 0, 0, 0, 0, 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1769, 0, 575, 0, 0, - 0, 0, 2175, 0, 0, 0, 0, 0, 0, 0, - 0, 2180, 0, 0, 0, 0, 0, 0, 575, 0, - 0, 0, 575, 575, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 687, 79, 2301, 0, + 529, 0, 0, 0, 529, 0, 1279, 0, 0, 0, + 0, 0, 1305, 1742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 529, 0, - 0, 575, 0, 0, 0, 0, 0, 156, 161, 158, - 164, 165, 166, 167, 169, 170, 171, 172, 0, 0, - 0, 0, 0, 173, 174, 175, 176, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 575, 0, 0, 0, 0, 1271, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 575, 183, 0, 0, 0, 0, - 1271, 1271, 1270, 0, 1270, 0, 529, 1270, 0, 0, - 0, 0, 1270, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1496, 0, 0, 0, 0, 792, 0, 0, - 575, 0, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 1450, 0, 0, 575, 575, 0, 0, - 0, 1542, 0, 0, 0, 575, 0, 0, 0, 0, - 0, 0, 2302, 0, 183, 575, 0, 529, 0, 0, - 0, 792, 0, 0, 529, 1270, 0, 0, 2327, 1450, - 1270, 0, 0, 1565, 1566, 529, 529, 529, 529, 529, - 529, 529, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 575, 0, 0, 0, 0, - 0, 0, 0, 575, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1659, - 0, 0, 0, 1660, 0, 0, 0, 0, 0, 0, - 948, 0, 0, 1270, 0, 0, 0, 0, 0, 1769, - 0, 0, 0, 0, 0, 0, 0, 0, 777, 0, - 0, 0, 0, 0, 0, 777, 777, 0, 0, 0, - 0, 1271, 0, 0, 0, 0, 0, 0, 0, 0, + 1389, 0, 0, 0, 0, 1765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1305, 1742, 0, 0, 0, 0, 0, 0, + 528, 0, 0, 0, 0, 0, 0, 0, 529, 0, + 577, 0, 0, 0, 749, 2159, 79, 0, 739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 777, 1542, 777, 777, 777, - 777, 777, 0, 0, 0, 1765, 0, 0, 0, 0, + 0, 0, 0, 0, 749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1496, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 777, 0, 0, - 0, 0, 0, 0, 2302, 0, 0, 1120, 0, 1120, - 1120, 759, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 529, 0, 79, 0, 0, 0, - 0, 1542, 0, 529, 0, 529, 0, 529, 1804, 0, + 1769, 1769, 0, 0, 0, 0, 0, 0, 0, 952, + 0, 0, 0, 0, 0, 0, 529, 529, 529, 529, + 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 529, 529, 0, 0, 0, 0, 0, + 0, 0, 2620, 2621, 2622, 2623, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 749, 1195, 1196, 1197, 0, 1200, 0, - 1202, 1203, 1204, 1205, 0, 1208, 1210, 1210, 0, 1210, - 1214, 1214, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, - 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, - 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, - 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 0, - 1254, 1255, 1256, 1257, 1258, 0, 1769, 1769, 0, 1214, - 1214, 1214, 1214, 1214, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 777, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2600, 2601, 2602, 2603, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1270, 0, 1270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1160, 1271, 0, 1271, 0, 0, 1271, + 0, 0, 0, 0, 1271, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1270, 777, 0, + 0, 1207, 2667, 0, 2669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2660, 2662, 2661, 2671, 2672, 2673, 2674, 2675, - 2676, 2677, 626, 0, 0, 0, 0, 1280, 1270, 0, - 1270, 0, 0, 749, 0, 0, 0, 749, 0, 0, - 0, 0, 0, 749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 529, 0, 0, 0, 1270, 0, - 0, 529, 0, 2647, 0, 2649, 529, 529, 0, 0, - 529, 0, 1944, 0, 0, 0, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 529, 0, 0, 0, + 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1271, 0, 0, + 0, 0, 1271, 529, 529, 529, 529, 529, 0, 1769, + 0, 0, 0, 0, 0, 2342, 0, 0, 0, 0, + 529, 0, 587, 1496, 0, 529, 0, 0, 529, 2353, + 1542, 0, 0, 0, 0, 792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2758, 0, 0, 0, + 2758, 2758, 0, 0, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, - 1769, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1971, 0, 0, 0, 1975, 0, 1976, 1977, - 792, 0, 0, 0, 0, 0, 0, 1985, 0, 0, + 0, 0, 0, 0, 0, 1271, 0, 0, 0, 1769, + 0, 0, 1971, 0, 0, 529, 1975, 0, 1976, 1977, + 0, 0, 0, 0, 0, 529, 1320, 1985, 0, 0, 1986, 1987, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2732, 0, 0, 0, 2732, 2732, 0, 0, 0, + 529, 0, 0, 529, 0, 0, 0, 0, 1769, 0, 0, 0, 0, 0, 0, 0, 0, 1993, 1994, 1995, - 1996, 1997, 0, 1999, 0, 777, 0, 0, 0, 2003, - 776, 2004, 0, 0, 1769, 2007, 0, 0, 0, 0, + 1996, 1997, 0, 1999, 0, 0, 0, 0, 0, 2003, + 0, 2004, 0, 0, 0, 2007, 0, 0, 1769, 0, 0, 0, 0, 2016, 2017, 2018, 2019, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2030, 2031, 0, 0, 0, 0, 0, 0, 2036, 2037, 2038, 2039, 2040, 0, - 1765, 0, 0, 1769, 0, 0, 0, 2666, 2667, 0, - 0, 2053, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1769, 587, 0, - 0, 0, 777, 777, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1542, 0, 0, 529, 0, 0, 0, - 0, 0, 0, 0, 1496, 0, 0, 0, 0, 0, - 770, 1270, 0, 2783, 0, 0, 0, 671, 0, 621, - 675, 623, 672, 673, 0, 619, 622, 674, 0, 792, - 792, 0, 0, 0, 0, 0, 0, 0, 2806, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2811, 529, - 0, 0, 0, 529, 624, 625, 2659, 2663, 2664, 2665, - 2668, 2669, 2670, 2678, 2680, 649, 2679, 2681, 2682, 2683, - 2686, 2687, 2688, 2689, 2684, 2685, 2690, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1769, 0, - 0, 0, 0, 0, 0, 0, 2811, 0, 0, 0, - 0, 184, 185, 186, 0, 0, 0, 1120, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 529, 0, 0, - 0, 1120, 1120, 0, 2159, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 563, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1279, 0, - 0, 0, 0, 0, 0, 529, 529, 529, 529, 529, - 0, 0, 0, 0, 0, 560, 0, 0, 0, 0, - 0, 0, 529, 529, 0, 0, 0, 0, 0, 0, - 2253, 0, 0, 0, 0, 0, 0, 0, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2268, 0, 528, 777, 0, 0, 0, 0, 0, 0, - 0, 547, 577, 0, 0, 0, 0, 0, 0, 0, - 739, 2283, 2284, 545, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1271, 0, 1271, 0, 0, 1271, 0, - 0, 0, 0, 1271, 0, 0, 0, 0, 0, 0, - 0, 952, 0, 542, 0, 0, 0, 777, 0, 0, - 0, 0, 555, 0, 0, 2326, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 552, 0, 0, - 0, 0, 2344, 2345, 0, 0, 0, 0, 0, 529, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1796, 0, 0, 0, 1271, 0, 0, 0, - 564, 1271, 529, 529, 529, 529, 529, 0, 0, 0, - 0, 0, 0, 0, 2343, 0, 0, 0, 0, 529, - 0, 0, 1496, 0, 529, 0, 0, 529, 2354, 1542, - 0, 0, 532, 0, 534, 548, 0, 566, 0, 565, - 538, 0, 536, 540, 549, 541, 0, 535, 0, 546, - 0, 0, 537, 550, 551, 553, 556, 557, 558, 554, - 0, 544, 567, 0, 0, 0, 0, 0, 529, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1271, 0, 0, 0, 0, 0, - 2443, 0, 0, 0, 0, 529, 0, 2447, 0, 0, - 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, - 0, 2457, 2458, 2460, 2462, 0, 0, 0, 0, 0, - 529, 2468, 0, 529, 0, 0, 2472, 2473, 2474, 0, - 0, 0, 0, 2477, 0, 0, 0, 0, 0, 2479, - 0, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, - 2490, 2491, 0, 0, 2492, 0, 0, 0, 0, 1160, - 2497, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1207, 0, 0, - 0, 0, 0, 2519, 2520, 0, 0, 2524, 0, 0, - 0, 0, 0, 0, 0, 0, 529, 0, 2835, 0, - 0, 0, 0, 0, 0, 2536, 2537, 0, 1373, 0, - 0, 0, 0, 0, 0, 0, 568, 0, 0, 0, + 1765, 0, 1270, 0, 2815, 0, 0, 0, 0, 0, + 0, 2053, 0, 0, 0, 0, 529, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 792, 792, 0, 0, + 0, 0, 0, 0, 0, 2838, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2843, 0, 0, 0, 0, + 0, 0, 1061, 0, 1067, 0, 0, 1069, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 561, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 587, 562, - 0, 1373, 1960, 529, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2587, 0, 0, 0, 0, 529, 0, 0, 0, + 0, 0, 0, 529, 0, 0, 1120, 0, 1120, 1120, + 0, 0, 0, 0, 0, 1769, 0, 0, 0, 0, + 0, 0, 0, 0, 2843, 79, 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 529, 0, 0, 529, 529, 529, + 0, 0, 749, 1195, 1196, 1197, 0, 1200, 0, 1202, + 1203, 1204, 1205, 0, 1208, 1210, 1210, 0, 1210, 1214, + 1214, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, + 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, + 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, + 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 0, 1254, + 1255, 1256, 1257, 1258, 0, 0, 0, 0, 1214, 1214, + 1214, 1214, 1214, 0, 0, 0, 0, 0, 0, 78, + 39, 40, 80, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1271, 0, 1271, 1545, 0, 84, + 0, 0, 0, 43, 69, 70, 0, 67, 71, 0, + 0, 0, 0, 0, 0, 1496, 68, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2252, 0, 0, 0, 1271, 0, 1280, 0, 0, 0, + 0, 0, 749, 0, 0, 56, 749, 0, 0, 0, + 2267, 0, 749, 0, 0, 0, 87, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2282, 2283, 0, 0, 0, 0, 0, 0, 0, + 1600, 1601, 1602, 1603, 0, 0, 0, 1333, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1496, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1645, 1646, 0, 0, 2325, 0, 0, 0, 1651, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2343, 2344, 1687, 1688, 1689, 1690, 1691, 1692, + 1694, 1698, 1699, 587, 1705, 1706, 1707, 1708, 1709, 1710, + 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, + 1721, 1722, 1723, 1724, 1725, 1726, 1727, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, + 49, 52, 51, 54, 0, 66, 0, 0, 75, 72, + 0, 0, 0, 0, 0, 587, 2680, 2682, 2681, 2691, + 2692, 2693, 2694, 2695, 2696, 2697, 626, 0, 0, 0, + 0, 55, 83, 82, 0, 0, 64, 65, 53, 0, + 1496, 0, 0, 0, 73, 74, 0, 0, 0, 0, + 0, 1776, 1777, 0, 0, 0, 529, 0, 0, 0, + 0, 0, 1351, 0, 0, 0, 0, 0, 0, 2457, + 0, 0, 0, 0, 0, 0, 2461, 0, 0, 1813, + 57, 58, 0, 59, 60, 61, 62, 0, 0, 1271, + 2471, 2472, 2474, 2476, 0, 0, 0, 0, 0, 0, + 2482, 0, 0, 0, 0, 2486, 2487, 2488, 0, 0, + 1373, 0, 2491, 0, 0, 0, 0, 0, 2493, 0, + 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, + 2505, 1496, 0, 2506, 0, 0, 0, 0, 1851, 2511, + 1481, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1522, + 0, 0, 2533, 2534, 0, 0, 2538, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2550, 2551, 0, 0, 0, 0, + 0, 1552, 0, 0, 0, 0, 0, 0, 1556, 0, + 81, 0, 0, 0, 0, 0, 1120, 0, 0, 1567, + 1568, 1569, 1570, 1571, 1572, 1573, 0, 0, 0, 0, + 1120, 1120, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, + 1361, 2686, 2687, 0, 0, 0, 0, 0, 1593, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2607, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 671, 0, 621, 675, 623, 672, 673, 0, 619, + 622, 674, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1374, 0, 0, 2634, 0, 0, 0, 2635, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 624, 625, + 2679, 2683, 2684, 2685, 2688, 2689, 2690, 2698, 2700, 649, + 2699, 2701, 2702, 2703, 2706, 2707, 2708, 2709, 2704, 2705, + 2710, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1387, 1390, 1391, 1392, 1393, + 1394, 1395, 1984, 1396, 1397, 1398, 1399, 1400, 1375, 1376, + 1377, 1378, 1359, 1360, 1388, 0, 1362, 0, 1363, 1364, + 1365, 1366, 1367, 1368, 1369, 1370, 1371, 0, 0, 1372, + 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1207, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1782, 0, + 0, 1796, 0, 0, 0, 0, 0, 1786, 0, 1789, + 0, 0, 1593, 0, 0, 0, 2055, 0, 0, 688, + 689, 2736, 0, 0, 0, 1640, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2746, 2747, 2748, 0, 2749, + 2750, 0, 0, 0, 0, 2753, 0, 2754, 2757, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1320, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2783, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1389, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2803, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2809, 0, 0, 0, 0, + 0, 2810, 2811, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2817, + 0, 0, 0, 0, 0, 0, 0, 0, 1593, 0, + 0, 0, 0, 0, 0, 1927, 0, 0, 0, 0, + 1937, 1938, 0, 0, 1942, 0, 0, 0, 0, 0, + 0, 0, 0, 1945, 0, 0, 0, 0, 0, 0, + 1948, 0, 0, 0, 2859, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2865, 688, 689, 0, + 2866, 0, 0, 1640, 0, 2220, 1951, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1960, 0, 2243, 2244, 0, 0, 0, 2247, 0, + 0, 0, 0, 2249, 2250, 2251, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2256, 2257, 2258, 0, 0, + 1705, 2260, 0, 2261, 2262, 0, 0, 0, 2269, 2270, + 0, 0, 0, 0, 0, 0, 1705, 1705, 1705, 1705, + 1705, 587, 587, 587, 587, 0, 0, 0, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 0, + 0, 0, 0, 0, 0, 0, 2314, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87, 2034, + 0, 0, 0, 2347, 681, 688, 689, 690, 691, 692, + 682, 684, 0, 0, 0, 683, 2051, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 686, 693, + 694, 0, 0, 0, 749, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2086, 2087, 0, 0, 0, 2402, + 0, 0, 0, 2106, 0, 2107, 2108, 0, 0, 0, + 0, 0, 0, 0, 2434, 2435, 0, 2109, 0, 0, + 0, 0, 0, 0, 0, 0, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2614, 0, 1320, 0, 2615, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1061, 0, 1067, 0, 1361, 1069, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1271, - 2034, 1271, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1361, 0, 0, 0, 0, 0, 2051, 0, 0, - 1496, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 749, 0, 0, 0, 1271, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1374, - 0, 0, 0, 0, 0, 2086, 2087, 0, 0, 0, - 0, 0, 0, 0, 2106, 0, 2107, 2108, 0, 0, - 0, 2710, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2720, 2721, 2722, 0, 2723, - 2724, 0, 1374, 0, 0, 2727, 0, 2728, 2731, 0, - 0, 0, 0, 1387, 1390, 1391, 1392, 1393, 1394, 1395, - 0, 1396, 1397, 1398, 1399, 1400, 1375, 1376, 1377, 1378, - 1359, 1360, 1388, 0, 1362, 0, 1363, 1364, 1365, 1366, - 1367, 1368, 1369, 1370, 1371, 0, 2757, 1372, 1379, 1380, - 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1390, 1391, 1392, - 1393, 1394, 1395, 0, 1396, 1397, 1398, 1399, 1400, 1375, - 1376, 1377, 1378, 1359, 1360, 1388, 0, 1362, 2181, 1363, - 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 0, 0, - 1372, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 0, - 0, 0, 0, 0, 0, 0, 2771, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2777, - 0, 0, 0, 0, 0, 2778, 2779, 0, 0, 1333, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2785, 0, 0, 0, 0, 0, 529, - 0, 0, 0, 0, 2793, 0, 0, 0, 0, 0, - 0, 0, 0, 1545, 0, 0, 0, 1389, 0, 0, - 0, 0, 0, 0, 0, 78, 39, 40, 80, 0, - 0, 0, 1271, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2832, 84, 0, 0, 2833, 43, - 69, 70, 0, 67, 71, 0, 0, 0, 0, 0, - 1389, 0, 68, 0, 0, 0, 0, 0, 1496, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 56, 0, 0, 1796, 0, 1600, 1601, 1602, 1603, - 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2324, 0, 79, 0, 0, 1796, 1796, 1796, - 1796, 1796, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2106, 749, 0, 1645, 1646, 1796, - 0, 0, 1796, 0, 1351, 1651, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1687, 1688, 1689, 1690, 1691, 1692, 1694, 1698, 1699, 587, - 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, - 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, - 1725, 1726, 1727, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2416, 0, 0, 0, 0, 0, 0, 0, - 0, 587, 1481, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 46, 49, 52, 51, 54, - 0, 66, 0, 0, 75, 72, 0, 0, 0, 0, - 0, 1522, 0, 0, 0, 2446, 0, 1776, 1777, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 83, 82, - 0, 0, 64, 65, 53, 0, 0, 0, 0, 0, - 73, 74, 0, 1552, 0, 1813, 0, 0, 0, 0, - 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1567, 1568, 1569, 1570, 1571, 1572, 1573, 0, 2055, - 0, 0, 688, 689, 0, 0, 57, 58, 1640, 59, - 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1593, 0, 0, 0, 1851, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1796, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2545, 0, 695, 696, 697, 698, 699, 700, 701, - 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, - 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, - 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 0, 0, 0, 2585, 0, 0, - 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, - 0, 681, 688, 689, 690, 691, 692, 682, 684, 0, - 86, 0, 683, 0, 0, 0, 0, 0, 0, 0, + 0, 2153, 0, 2479, 0, 87, 0, 0, 0, 0, + 2485, 681, 688, 689, 690, 691, 692, 682, 684, 0, + 0, 0, 683, 0, 0, 0, 0, 2180, 0, 0, 0, 0, 0, 0, 0, 686, 693, 694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1782, 2619, 0, 2623, 2624, 0, 0, 0, 0, 1786, - 0, 1789, 0, 0, 1593, 0, 0, 0, 0, 0, - 0, 2420, 2421, 0, 0, 0, 2324, 0, 79, 0, - 2324, 0, 0, 695, 696, 697, 698, 699, 700, 701, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2198, + 2199, 2200, 2201, 2202, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1593, 2208, 587, 0, + 0, 2434, 2435, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2216, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 0, 0, 0, 0, 1984, 0, + 732, 733, 734, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2704, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1207, 0, 0, 0, 0, 0, + 0, 0, 671, 0, 0, 675, 0, 672, 673, 0, + 0, 0, 674, 0, 0, 2612, 0, 0, 0, 0, + 0, 0, 0, 1796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2323, 0, 79, 0, 0, 1796, 1796, 1796, 1796, + 1796, 0, 0, 0, 0, 0, 0, 0, 2626, 0, + 2627, 0, 0, 2106, 749, 2630, 2631, 0, 1796, 0, + 0, 1796, 0, 0, 0, 0, 0, 0, 0, 2638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2324, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1219, 1220, 1221, - 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, - 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1242, - 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1320, - 1593, 0, 0, 0, 0, 0, 0, 1927, 0, 0, - 0, 0, 1937, 1938, 0, 0, 1942, 0, 0, 79, - 0, 0, 0, 0, 0, 1945, 0, 0, 0, 0, - 0, 0, 1948, 0, 0, 0, 0, 0, 0, 0, - 87, 0, 0, 0, 0, 0, 681, 688, 689, 690, - 691, 692, 682, 684, 0, 0, 0, 683, 1951, 671, - 0, 0, 675, 2786, 672, 673, 0, 0, 79, 674, - 686, 693, 694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2663, 0, 0, 0, + 0, 0, 2392, 0, 0, 0, 0, 2671, 0, 0, + 2673, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2430, 0, 0, 0, 2677, 0, 0, 0, 2428, 0, + 0, 0, 0, 0, 0, 2712, 0, 0, 2437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2449, 0, 0, 2452, 0, 0, 0, + 0, 0, 0, 2460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2420, 2421, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 695, 696, - 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, - 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, - 727, 728, 729, 730, 731, 732, 733, 734, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2221, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2244, - 2245, 0, 0, 0, 2248, 0, 0, 0, 0, 2250, - 2251, 2252, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2257, 2258, 2259, 0, 0, 1705, 2261, 0, 2262, - 2263, 0, 0, 0, 2270, 2271, 0, 0, 0, 0, - 0, 0, 1705, 1705, 1705, 1705, 1705, 587, 587, 587, - 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 688, 689, 0, 0, 0, 0, 1640, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2315, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2766, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2348, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2153, 695, 696, 697, 698, 699, 700, - 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, - 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, - 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, - 731, 732, 733, 734, 735, 2403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2199, 2200, 2201, 2202, 2203, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1593, 2209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1796, 0, 0, 587, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2569, + 2807, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2584, 0, 0, + 2585, 2586, 2587, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2465, 0, 0, 0, 0, 0, 0, 2471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2857, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, + 0, 0, 0, 0, 2639, 0, 2643, 2644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2323, + 0, 79, 0, 2323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2577, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2393, 0, 0, 2592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2414, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2423, 0, 0, 0, 0, 0, 0, 0, 0, - 2606, 0, 2607, 0, 0, 0, 2435, 2610, 2611, 2438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2643, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2651, - 0, 0, 2653, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2657, 0, 0, 0, - 0, 0, 2499, 0, 0, 0, 0, 2692, 0, 0, + 0, 0, 2323, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1219, 1220, 1221, 1222, + 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, + 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1242, 1243, + 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 352, 2818, 0, + 926, 911, 449, 79, 857, 929, 826, 845, 939, 848, + 851, 893, 805, 871, 370, 842, 797, 830, 800, 837, + 801, 828, 859, 244, 825, 913, 875, 928, 325, 241, + 807, 831, 384, 847, 193, 895, 425, 228, 335, 332, + 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, + 935, 329, 881, 0, 434, 355, 0, 0, 0, 861, + 917, 869, 907, 856, 894, 815, 880, 930, 843, 890, + 931, 287, 226, 192, 367, 435, 259, 0, 0, 0, + 0, 184, 185, 186, 0, 2831, 0, 2832, 0, 0, + 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, + 299, 300, 302, 304, 309, 316, 322, 839, 887, 925, + 840, 889, 239, 285, 246, 238, 453, 936, 916, 804, + 868, 924, 0, 0, 209, 927, 863, 0, 892, 0, + 942, 799, 883, 0, 802, 806, 938, 920, 834, 249, + 0, 0, 0, 0, 0, 0, 0, 860, 870, 904, + 854, 0, 0, 0, 0, 0, 0, 0, 832, 0, + 879, 0, 0, 0, 811, 803, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 858, 0, 0, + 0, 814, 0, 833, 905, 0, 796, 268, 808, 356, + 231, 0, 909, 919, 855, 487, 923, 853, 852, 899, + 812, 915, 846, 324, 810, 293, 188, 205, 0, 844, + 366, 407, 413, 914, 829, 838, 229, 836, 411, 380, + 471, 213, 257, 404, 385, 409, 392, 260, 878, 897, + 410, 330, 458, 399, 468, 488, 489, 237, 360, 478, + 447, 484, 501, 206, 234, 374, 440, 474, 431, 353, + 454, 455, 292, 430, 266, 191, 328, 494, 204, 419, + 221, 211, 197, 442, 466, 218, 422, 0, 0, 503, + 199, 464, 439, 349, 289, 290, 198, 0, 403, 242, + 264, 232, 369, 461, 462, 230, 504, 208, 483, 201, + 1122, 482, 362, 457, 465, 350, 340, 200, 463, 348, + 339, 295, 314, 315, 253, 275, 397, 333, 398, 276, + 358, 357, 359, 194, 475, 0, 195, 0, 436, 476, + 505, 214, 215, 216, 824, 252, 256, 263, 265, 271, + 272, 279, 326, 373, 396, 394, 400, 910, 452, 469, + 479, 486, 492, 493, 495, 496, 497, 498, 499, 500, + 361, 278, 432, 294, 331, 902, 941, 379, 412, 219, + 473, 433, 819, 823, 817, 884, 818, 873, 874, 820, + 932, 933, 934, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 0, 906, 813, 0, 821, 822, 0, 912, 921, + 922, 524, 341, 424, 470, 296, 308, 311, 301, 320, + 0, 321, 297, 298, 303, 305, 306, 307, 312, 313, + 317, 323, 877, 187, 202, 327, 937, 401, 261, 502, + 481, 477, 798, 816, 236, 827, 835, 0, 841, 849, + 850, 862, 864, 865, 866, 867, 885, 886, 888, 896, + 898, 901, 903, 908, 918, 940, 189, 190, 203, 212, + 222, 235, 250, 258, 269, 274, 277, 282, 283, 286, + 291, 337, 343, 344, 345, 346, 363, 364, 365, 368, + 371, 372, 375, 377, 378, 381, 388, 389, 390, 391, + 393, 395, 402, 406, 414, 415, 416, 417, 418, 420, + 421, 426, 427, 428, 429, 437, 441, 459, 460, 472, + 485, 490, 270, 467, 491, 0, 336, 876, 882, 338, + 254, 273, 284, 891, 480, 438, 207, 408, 262, 196, + 225, 210, 233, 248, 251, 288, 347, 354, 383, 387, + 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, + 351, 240, 386, 872, 900, 334, 450, 451, 280, 352, + 0, 0, 926, 911, 449, 0, 857, 929, 826, 845, + 939, 848, 851, 893, 805, 871, 370, 842, 797, 830, + 800, 837, 801, 828, 859, 244, 825, 913, 875, 928, + 325, 241, 807, 831, 384, 847, 193, 895, 425, 228, + 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, + 443, 376, 935, 329, 881, 0, 434, 355, 0, 0, + 0, 861, 917, 869, 907, 856, 894, 815, 880, 930, + 843, 890, 931, 287, 226, 192, 367, 435, 259, 0, + 0, 0, 0, 184, 185, 186, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, + 319, 318, 299, 300, 302, 304, 309, 316, 322, 839, + 887, 925, 840, 889, 239, 285, 246, 238, 453, 936, + 916, 804, 868, 924, 0, 0, 209, 927, 863, 0, + 892, 0, 942, 799, 883, 0, 802, 806, 938, 920, + 834, 249, 0, 0, 0, 0, 0, 0, 0, 860, + 870, 904, 854, 0, 0, 0, 0, 0, 2354, 0, + 832, 0, 879, 0, 0, 0, 811, 803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2740, - 587, 0, 2555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2570, 0, 0, 2571, 2572, 2573, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 858, + 0, 0, 0, 814, 0, 833, 905, 0, 796, 268, + 808, 356, 231, 0, 909, 919, 855, 487, 923, 853, + 852, 899, 812, 915, 846, 324, 810, 293, 188, 205, + 0, 844, 366, 407, 413, 914, 829, 838, 229, 836, + 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, + 878, 897, 410, 330, 458, 399, 468, 488, 489, 237, + 360, 478, 447, 484, 501, 206, 234, 374, 440, 474, + 431, 353, 454, 455, 292, 430, 266, 191, 328, 494, + 204, 419, 221, 211, 197, 442, 466, 218, 422, 0, + 0, 503, 199, 464, 439, 349, 289, 290, 198, 0, + 403, 242, 264, 232, 369, 461, 462, 230, 504, 208, + 483, 201, 1122, 482, 362, 457, 465, 350, 340, 200, + 463, 348, 339, 295, 314, 315, 253, 275, 397, 333, + 398, 276, 358, 357, 359, 194, 475, 0, 195, 0, + 436, 476, 505, 214, 215, 216, 824, 252, 256, 263, + 265, 271, 272, 279, 326, 373, 396, 394, 400, 910, + 452, 469, 479, 486, 492, 493, 495, 496, 497, 498, + 499, 500, 361, 278, 432, 294, 331, 902, 941, 379, + 412, 219, 473, 433, 819, 823, 817, 884, 818, 873, + 874, 820, 932, 933, 934, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 0, 906, 813, 0, 821, 822, 0, + 912, 921, 922, 524, 341, 424, 470, 296, 308, 311, + 301, 320, 0, 321, 297, 298, 303, 305, 306, 307, + 312, 313, 317, 323, 877, 187, 202, 327, 937, 401, + 261, 502, 481, 477, 798, 816, 236, 827, 835, 0, + 841, 849, 850, 862, 864, 865, 866, 867, 885, 886, + 888, 896, 898, 901, 903, 908, 918, 940, 189, 190, + 203, 212, 222, 235, 250, 258, 269, 274, 277, 282, + 283, 286, 291, 337, 343, 344, 345, 346, 363, 364, + 365, 368, 371, 372, 375, 377, 378, 381, 388, 389, + 390, 391, 393, 395, 402, 406, 414, 415, 416, 417, + 418, 420, 421, 426, 427, 428, 429, 437, 441, 459, + 460, 472, 485, 490, 270, 467, 491, 0, 336, 876, + 882, 338, 254, 273, 284, 891, 480, 438, 207, 408, + 262, 196, 225, 210, 233, 248, 251, 288, 347, 354, + 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, + 446, 448, 351, 240, 386, 872, 900, 334, 450, 451, + 280, 352, 0, 0, 926, 911, 449, 0, 857, 929, + 826, 845, 939, 848, 851, 893, 805, 871, 370, 842, + 797, 830, 800, 837, 801, 828, 859, 244, 825, 913, + 875, 928, 325, 241, 807, 831, 384, 847, 193, 895, + 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, + 342, 382, 443, 376, 935, 329, 881, 0, 434, 355, + 0, 0, 0, 861, 917, 869, 907, 856, 894, 815, + 880, 930, 843, 890, 931, 287, 226, 192, 367, 435, + 259, 0, 0, 0, 0, 184, 185, 186, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, + 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, + 322, 839, 887, 925, 840, 889, 239, 285, 246, 238, + 453, 936, 916, 804, 868, 924, 0, 0, 209, 927, + 863, 0, 892, 0, 942, 799, 883, 0, 802, 806, + 938, 920, 834, 249, 0, 0, 0, 0, 0, 0, + 0, 860, 870, 904, 854, 0, 0, 0, 0, 0, + 2312, 0, 832, 0, 879, 0, 0, 0, 811, 803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, + 0, 858, 0, 0, 0, 814, 0, 833, 905, 0, + 796, 268, 808, 356, 231, 0, 909, 919, 855, 487, + 923, 853, 852, 899, 812, 915, 846, 324, 810, 293, + 188, 205, 0, 844, 366, 407, 413, 914, 829, 838, + 229, 836, 411, 380, 471, 213, 257, 404, 385, 409, + 392, 260, 878, 897, 410, 330, 458, 399, 468, 488, + 489, 237, 360, 478, 447, 484, 501, 206, 234, 374, + 440, 474, 431, 353, 454, 455, 292, 430, 266, 191, + 328, 494, 204, 419, 221, 211, 197, 442, 466, 218, + 422, 0, 0, 503, 199, 464, 439, 349, 289, 290, + 198, 0, 403, 242, 264, 232, 369, 461, 462, 230, + 504, 208, 483, 201, 1122, 482, 362, 457, 465, 350, + 340, 200, 463, 348, 339, 295, 314, 315, 253, 275, + 397, 333, 398, 276, 358, 357, 359, 194, 475, 0, + 195, 0, 436, 476, 505, 214, 215, 216, 824, 252, + 256, 263, 265, 271, 272, 279, 326, 373, 396, 394, + 400, 910, 452, 469, 479, 486, 492, 493, 495, 496, + 497, 498, 499, 500, 361, 278, 432, 294, 331, 902, + 941, 379, 412, 219, 473, 433, 819, 823, 817, 884, + 818, 873, 874, 820, 932, 933, 934, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 0, 906, 813, 0, 821, + 822, 0, 912, 921, 922, 524, 341, 424, 470, 296, + 308, 311, 301, 320, 0, 321, 297, 298, 303, 305, + 306, 307, 312, 313, 317, 323, 877, 187, 202, 327, + 937, 401, 261, 502, 481, 477, 798, 816, 236, 827, + 835, 0, 841, 849, 850, 862, 864, 865, 866, 867, + 885, 886, 888, 896, 898, 901, 903, 908, 918, 940, + 189, 190, 203, 212, 222, 235, 250, 258, 269, 274, + 277, 282, 283, 286, 291, 337, 343, 344, 345, 346, + 363, 364, 365, 368, 371, 372, 375, 377, 378, 381, + 388, 389, 390, 391, 393, 395, 402, 406, 414, 415, + 416, 417, 418, 420, 421, 426, 427, 428, 429, 437, + 441, 459, 460, 472, 485, 490, 270, 467, 491, 0, + 336, 876, 882, 338, 254, 273, 284, 891, 480, 438, + 207, 408, 262, 196, 225, 210, 233, 248, 251, 288, + 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, + 444, 445, 446, 448, 351, 240, 386, 872, 900, 334, + 450, 451, 280, 352, 0, 0, 926, 911, 449, 0, + 857, 929, 826, 845, 939, 848, 851, 893, 805, 871, + 370, 842, 797, 830, 800, 837, 801, 828, 859, 244, + 825, 913, 875, 928, 325, 241, 807, 831, 384, 847, + 193, 895, 425, 228, 335, 332, 456, 255, 247, 243, + 227, 281, 342, 382, 443, 376, 935, 329, 881, 0, + 434, 355, 0, 0, 0, 861, 917, 869, 907, 856, + 894, 815, 880, 930, 843, 890, 931, 287, 226, 192, + 367, 435, 259, 0, 0, 0, 0, 184, 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, + 309, 316, 322, 839, 887, 925, 840, 889, 239, 285, + 246, 238, 453, 936, 916, 804, 868, 924, 0, 0, + 209, 927, 863, 0, 892, 0, 942, 799, 883, 0, + 802, 806, 938, 920, 834, 249, 0, 0, 0, 0, + 0, 0, 0, 860, 870, 904, 854, 0, 0, 0, + 0, 0, 1784, 0, 832, 0, 879, 0, 0, 0, + 811, 803, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 858, 0, 0, 0, 814, 0, 833, + 905, 0, 796, 268, 808, 356, 231, 0, 909, 919, + 855, 487, 923, 853, 852, 899, 812, 915, 846, 324, + 810, 293, 188, 205, 0, 844, 366, 407, 413, 914, + 829, 838, 229, 836, 411, 380, 471, 213, 257, 404, + 385, 409, 392, 260, 878, 897, 410, 330, 458, 399, + 468, 488, 489, 237, 360, 478, 447, 484, 501, 206, + 234, 374, 440, 474, 431, 353, 454, 455, 292, 430, + 266, 191, 328, 494, 204, 419, 221, 211, 197, 442, + 466, 218, 422, 0, 0, 503, 199, 464, 439, 349, + 289, 290, 198, 0, 403, 242, 264, 232, 369, 461, + 462, 230, 504, 208, 483, 201, 1122, 482, 362, 457, + 465, 350, 340, 200, 463, 348, 339, 295, 314, 315, + 253, 275, 397, 333, 398, 276, 358, 357, 359, 194, + 475, 0, 195, 0, 436, 476, 505, 214, 215, 216, + 824, 252, 256, 263, 265, 271, 272, 279, 326, 373, + 396, 394, 400, 910, 452, 469, 479, 486, 492, 493, + 495, 496, 497, 498, 499, 500, 361, 278, 432, 294, + 331, 902, 941, 379, 412, 219, 473, 433, 819, 823, + 817, 884, 818, 873, 874, 820, 932, 933, 934, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 0, 906, 813, + 0, 821, 822, 0, 912, 921, 922, 524, 341, 424, + 470, 296, 308, 311, 301, 320, 0, 321, 297, 298, + 303, 305, 306, 307, 312, 313, 317, 323, 877, 187, + 202, 327, 937, 401, 261, 502, 481, 477, 798, 816, + 236, 827, 835, 0, 841, 849, 850, 862, 864, 865, + 866, 867, 885, 886, 888, 896, 898, 901, 903, 908, + 918, 940, 189, 190, 203, 212, 222, 235, 250, 258, + 269, 274, 277, 282, 283, 286, 291, 337, 343, 344, + 345, 346, 363, 364, 365, 368, 371, 372, 375, 377, + 378, 381, 388, 389, 390, 391, 393, 395, 402, 406, + 414, 415, 416, 417, 418, 420, 421, 426, 427, 428, + 429, 437, 441, 459, 460, 472, 485, 490, 270, 467, + 491, 0, 336, 876, 882, 338, 254, 273, 284, 891, + 480, 438, 207, 408, 262, 196, 225, 210, 233, 248, + 251, 288, 347, 354, 383, 387, 267, 245, 223, 405, + 220, 423, 444, 445, 446, 448, 351, 240, 386, 872, + 900, 334, 450, 451, 280, 352, 0, 0, 926, 911, + 449, 0, 857, 929, 826, 845, 939, 848, 851, 893, + 805, 871, 370, 842, 797, 830, 800, 837, 801, 828, + 859, 244, 825, 913, 875, 928, 325, 241, 807, 831, + 384, 847, 193, 895, 425, 228, 335, 332, 456, 255, + 247, 243, 227, 281, 342, 382, 443, 376, 935, 329, + 881, 0, 434, 355, 0, 0, 0, 861, 917, 869, + 907, 856, 894, 815, 880, 930, 843, 890, 931, 287, + 226, 192, 367, 435, 259, 0, 87, 0, 0, 184, + 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, + 302, 304, 309, 316, 322, 839, 887, 925, 840, 889, + 239, 285, 246, 238, 453, 936, 916, 804, 868, 924, + 0, 0, 209, 927, 863, 0, 892, 0, 942, 799, + 883, 0, 802, 806, 938, 920, 834, 249, 0, 0, + 0, 0, 0, 0, 0, 860, 870, 904, 854, 0, + 0, 0, 0, 0, 0, 0, 832, 0, 879, 0, + 0, 0, 811, 803, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 858, 0, 0, 0, 814, + 0, 833, 905, 0, 796, 268, 808, 356, 231, 0, + 909, 919, 855, 487, 923, 853, 852, 899, 812, 915, + 846, 324, 810, 293, 188, 205, 0, 844, 366, 407, + 413, 914, 829, 838, 229, 836, 411, 380, 471, 213, + 257, 404, 385, 409, 392, 260, 878, 897, 410, 330, + 458, 399, 468, 488, 489, 237, 360, 478, 447, 484, + 501, 206, 234, 374, 440, 474, 431, 353, 454, 455, + 292, 430, 266, 191, 328, 494, 204, 419, 221, 211, + 197, 442, 466, 218, 422, 0, 0, 503, 199, 464, + 439, 349, 289, 290, 198, 0, 403, 242, 264, 232, + 369, 461, 462, 230, 504, 208, 483, 201, 1122, 482, + 362, 457, 465, 350, 340, 200, 463, 348, 339, 295, + 314, 315, 253, 275, 397, 333, 398, 276, 358, 357, + 359, 194, 475, 0, 195, 0, 436, 476, 505, 214, + 215, 216, 824, 252, 256, 263, 265, 271, 272, 279, + 326, 373, 396, 394, 400, 910, 452, 469, 479, 486, + 492, 493, 495, 496, 497, 498, 499, 500, 361, 278, + 432, 294, 331, 902, 941, 379, 412, 219, 473, 433, + 819, 823, 817, 884, 818, 873, 874, 820, 932, 933, + 934, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 0, + 906, 813, 0, 821, 822, 0, 912, 921, 922, 524, + 341, 424, 470, 296, 308, 311, 301, 320, 0, 321, + 297, 298, 303, 305, 306, 307, 312, 313, 317, 323, + 877, 187, 202, 327, 937, 401, 261, 502, 481, 477, + 798, 816, 236, 827, 835, 0, 841, 849, 850, 862, + 864, 865, 866, 867, 885, 886, 888, 896, 898, 901, + 903, 908, 918, 940, 189, 190, 203, 212, 222, 235, + 250, 258, 269, 274, 277, 282, 283, 286, 291, 337, + 343, 344, 345, 346, 363, 364, 365, 368, 371, 372, + 375, 377, 378, 381, 388, 389, 390, 391, 393, 395, + 402, 406, 414, 415, 416, 417, 418, 420, 421, 426, + 427, 428, 429, 437, 441, 459, 460, 472, 485, 490, + 270, 467, 491, 0, 336, 876, 882, 338, 254, 273, + 284, 891, 480, 438, 207, 408, 262, 196, 225, 210, + 233, 248, 251, 288, 347, 354, 383, 387, 267, 245, + 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, + 386, 872, 900, 334, 450, 451, 280, 352, 0, 0, + 926, 911, 449, 0, 857, 929, 826, 845, 939, 848, + 851, 893, 805, 871, 370, 842, 797, 830, 800, 837, + 801, 828, 859, 244, 825, 913, 875, 928, 325, 241, + 807, 831, 384, 847, 193, 895, 425, 228, 335, 332, + 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, + 935, 329, 881, 0, 434, 355, 0, 0, 0, 861, + 917, 869, 907, 856, 894, 815, 880, 930, 843, 890, + 931, 287, 226, 192, 367, 435, 259, 0, 0, 0, + 0, 184, 185, 186, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, + 299, 300, 302, 304, 309, 316, 322, 839, 887, 925, + 840, 889, 239, 285, 246, 238, 453, 936, 916, 804, + 868, 924, 0, 0, 209, 927, 863, 0, 892, 0, + 942, 799, 883, 0, 802, 806, 938, 920, 834, 249, + 0, 0, 0, 0, 0, 0, 0, 860, 870, 904, + 854, 0, 0, 0, 0, 0, 0, 0, 832, 0, + 879, 0, 0, 0, 811, 803, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 858, 0, 0, + 0, 814, 0, 833, 905, 0, 796, 268, 808, 356, + 231, 0, 909, 919, 855, 487, 923, 853, 852, 899, + 812, 915, 846, 324, 810, 293, 188, 205, 0, 844, + 366, 407, 413, 914, 829, 838, 229, 836, 411, 380, + 471, 213, 257, 404, 385, 409, 392, 260, 878, 897, + 410, 330, 458, 399, 468, 488, 489, 237, 360, 478, + 447, 484, 501, 206, 234, 374, 440, 474, 431, 353, + 454, 455, 292, 430, 266, 191, 328, 494, 204, 419, + 221, 211, 197, 442, 466, 218, 422, 0, 0, 503, + 199, 464, 439, 349, 289, 290, 198, 0, 403, 242, + 264, 232, 369, 461, 462, 230, 504, 208, 483, 201, + 1122, 482, 362, 457, 465, 350, 340, 200, 463, 348, + 339, 295, 314, 315, 253, 275, 397, 333, 398, 276, + 358, 357, 359, 194, 475, 0, 195, 0, 436, 476, + 505, 214, 215, 216, 824, 252, 256, 263, 265, 271, + 272, 279, 326, 373, 396, 394, 400, 910, 452, 469, + 479, 486, 492, 493, 495, 496, 497, 498, 499, 500, + 361, 278, 432, 294, 331, 902, 941, 379, 412, 219, + 473, 433, 819, 823, 817, 884, 818, 873, 874, 820, + 932, 933, 934, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 0, 906, 813, 0, 821, 822, 0, 912, 921, + 922, 524, 341, 424, 470, 296, 308, 311, 301, 320, + 0, 321, 297, 298, 303, 305, 306, 307, 312, 313, + 317, 323, 877, 187, 202, 327, 937, 401, 261, 502, + 481, 477, 798, 816, 236, 827, 835, 0, 841, 849, + 850, 862, 864, 865, 866, 867, 885, 886, 888, 896, + 898, 901, 903, 908, 918, 940, 189, 190, 203, 212, + 222, 235, 250, 258, 269, 274, 277, 282, 283, 286, + 291, 337, 343, 344, 345, 346, 363, 364, 365, 368, + 371, 372, 375, 377, 378, 381, 388, 389, 390, 391, + 393, 395, 402, 406, 414, 415, 416, 417, 418, 420, + 421, 426, 427, 428, 429, 437, 441, 459, 460, 472, + 485, 490, 270, 467, 491, 0, 336, 876, 882, 338, + 254, 273, 284, 891, 480, 438, 207, 408, 262, 196, + 225, 210, 233, 248, 251, 288, 347, 354, 383, 387, + 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, + 351, 240, 386, 872, 900, 334, 450, 451, 280, 352, + 0, 0, 926, 911, 449, 0, 857, 929, 826, 845, + 939, 848, 851, 893, 805, 871, 370, 842, 797, 830, + 800, 837, 801, 828, 859, 244, 825, 913, 875, 928, + 325, 241, 807, 831, 384, 847, 193, 895, 425, 228, + 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, + 443, 376, 935, 329, 881, 0, 434, 355, 0, 0, + 0, 861, 917, 869, 907, 856, 894, 815, 880, 930, + 843, 890, 931, 287, 226, 192, 367, 435, 259, 0, + 0, 0, 0, 184, 185, 186, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, + 319, 318, 299, 300, 302, 304, 309, 316, 322, 839, + 887, 925, 840, 889, 239, 285, 246, 238, 453, 936, + 916, 804, 868, 924, 0, 0, 943, 927, 863, 0, + 892, 0, 942, 799, 883, 0, 802, 806, 938, 920, + 834, 249, 0, 0, 0, 0, 0, 0, 0, 860, + 870, 904, 854, 0, 0, 0, 0, 0, 0, 0, + 832, 0, 879, 0, 0, 0, 811, 803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 858, + 0, 0, 0, 814, 0, 833, 905, 0, 796, 268, + 808, 356, 231, 0, 909, 919, 855, 487, 923, 853, + 852, 899, 812, 915, 846, 324, 810, 293, 188, 205, + 0, 844, 366, 407, 413, 914, 829, 838, 229, 836, + 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, + 878, 897, 410, 330, 458, 399, 468, 488, 489, 237, + 360, 478, 447, 484, 501, 206, 234, 374, 440, 474, + 431, 353, 454, 455, 292, 430, 266, 191, 328, 494, + 204, 419, 221, 211, 197, 442, 466, 218, 422, 0, + 0, 503, 199, 464, 439, 349, 289, 290, 198, 0, + 403, 242, 264, 232, 369, 461, 462, 230, 504, 208, + 483, 201, 809, 482, 362, 457, 465, 350, 340, 200, + 463, 348, 339, 295, 314, 315, 253, 275, 397, 333, + 398, 276, 358, 357, 359, 194, 475, 0, 195, 0, + 436, 476, 505, 214, 215, 216, 824, 252, 256, 263, + 265, 271, 272, 279, 326, 373, 396, 394, 400, 910, + 452, 469, 479, 486, 492, 493, 495, 496, 497, 498, + 499, 500, 795, 789, 788, 294, 331, 902, 941, 379, + 412, 219, 473, 433, 819, 823, 817, 884, 818, 873, + 874, 820, 932, 933, 934, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 0, 906, 813, 0, 821, 822, 0, + 912, 921, 922, 524, 341, 424, 470, 296, 308, 311, + 301, 320, 0, 321, 297, 298, 303, 305, 306, 307, + 312, 313, 317, 323, 877, 187, 202, 327, 937, 401, + 261, 502, 481, 477, 798, 816, 236, 827, 835, 0, + 841, 849, 850, 862, 864, 865, 866, 867, 885, 886, + 888, 896, 898, 901, 903, 908, 918, 940, 189, 190, + 203, 212, 222, 235, 250, 258, 269, 274, 277, 282, + 283, 286, 291, 337, 343, 344, 345, 346, 363, 364, + 365, 368, 371, 372, 375, 377, 378, 381, 388, 389, + 390, 391, 393, 395, 402, 406, 414, 415, 416, 417, + 418, 420, 421, 426, 427, 428, 429, 437, 441, 459, + 460, 472, 485, 490, 270, 467, 491, 0, 336, 876, + 882, 338, 254, 273, 284, 891, 480, 438, 207, 408, + 262, 196, 225, 210, 233, 248, 251, 288, 347, 354, + 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, + 446, 448, 351, 240, 386, 872, 900, 334, 450, 451, + 280, 352, 0, 0, 926, 911, 449, 0, 857, 929, + 826, 845, 939, 848, 851, 893, 805, 871, 370, 842, + 797, 830, 800, 837, 801, 828, 859, 244, 825, 913, + 875, 928, 325, 241, 807, 831, 384, 847, 193, 895, + 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, + 342, 382, 443, 376, 935, 329, 881, 0, 434, 355, + 0, 0, 0, 861, 917, 869, 907, 856, 894, 815, + 880, 930, 843, 890, 931, 287, 226, 192, 367, 435, + 259, 0, 0, 0, 0, 184, 185, 186, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, + 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, + 322, 839, 887, 925, 840, 889, 239, 285, 246, 238, + 453, 936, 916, 804, 868, 924, 0, 0, 943, 927, + 863, 0, 892, 0, 942, 799, 883, 0, 802, 806, + 938, 920, 834, 249, 0, 0, 0, 0, 0, 0, + 0, 860, 870, 904, 854, 0, 0, 0, 0, 0, + 0, 0, 832, 0, 879, 0, 0, 0, 811, 803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 352, 0, 0, 926, - 911, 449, 2825, 857, 929, 826, 845, 939, 848, 851, - 893, 805, 871, 370, 842, 797, 830, 800, 837, 801, - 828, 859, 244, 825, 913, 875, 928, 325, 241, 807, - 831, 384, 847, 193, 895, 425, 228, 335, 332, 456, - 255, 247, 243, 227, 281, 342, 382, 443, 376, 935, - 329, 881, 0, 434, 355, 0, 0, 0, 861, 917, - 869, 907, 856, 894, 815, 880, 930, 843, 890, 931, - 287, 226, 192, 367, 435, 259, 0, 0, 0, 0, - 184, 185, 186, 0, 2799, 0, 2800, 0, 0, 0, - 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, - 300, 302, 304, 309, 316, 322, 839, 887, 925, 840, - 889, 239, 285, 246, 238, 453, 936, 916, 804, 868, - 924, 0, 0, 209, 927, 863, 0, 892, 0, 942, - 799, 883, 0, 802, 806, 938, 920, 834, 249, 0, - 0, 0, 0, 0, 0, 0, 860, 870, 904, 854, - 0, 0, 0, 0, 0, 0, 0, 832, 0, 879, - 0, 0, 0, 811, 803, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2770, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 858, 0, 0, 0, - 814, 0, 833, 905, 0, 796, 268, 808, 356, 231, - 0, 909, 919, 855, 487, 923, 853, 852, 899, 812, - 915, 846, 324, 810, 293, 188, 205, 0, 844, 366, - 407, 413, 914, 829, 838, 229, 836, 411, 380, 471, - 213, 257, 404, 385, 409, 392, 260, 878, 897, 410, - 330, 458, 399, 468, 488, 489, 237, 360, 478, 447, - 484, 501, 206, 234, 374, 440, 474, 431, 353, 454, - 455, 292, 430, 266, 191, 328, 494, 204, 419, 221, - 211, 197, 442, 466, 218, 422, 0, 0, 503, 199, - 464, 439, 349, 289, 290, 198, 0, 403, 242, 264, - 232, 369, 461, 462, 230, 504, 208, 483, 201, 1122, - 482, 362, 457, 465, 350, 340, 200, 463, 348, 339, - 295, 314, 315, 253, 275, 397, 333, 398, 276, 358, - 357, 359, 194, 475, 0, 195, 0, 436, 476, 505, - 214, 215, 216, 824, 252, 256, 263, 265, 271, 272, - 279, 326, 373, 396, 394, 400, 910, 452, 469, 479, - 486, 492, 493, 495, 496, 497, 498, 499, 500, 361, - 278, 432, 294, 331, 902, 941, 379, 412, 219, 473, - 433, 819, 823, 817, 884, 818, 873, 874, 820, 932, - 933, 934, 506, 507, 508, 509, 510, 511, 512, 513, - 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 0, 906, 813, 0, 821, 822, 0, 912, 921, 922, - 524, 341, 424, 470, 296, 308, 311, 301, 320, 0, - 321, 297, 298, 303, 305, 306, 307, 312, 313, 317, - 323, 877, 187, 202, 327, 937, 401, 261, 502, 481, - 477, 798, 816, 236, 827, 835, 0, 841, 849, 850, - 862, 864, 865, 866, 867, 885, 886, 888, 896, 898, - 901, 903, 908, 918, 940, 189, 190, 203, 212, 222, - 235, 250, 258, 269, 274, 277, 282, 283, 286, 291, - 337, 343, 344, 345, 346, 363, 364, 365, 368, 371, - 372, 375, 377, 378, 381, 388, 389, 390, 391, 393, - 395, 402, 406, 414, 415, 416, 417, 418, 420, 421, - 426, 427, 428, 429, 437, 441, 459, 460, 472, 485, - 490, 270, 467, 491, 0, 336, 876, 882, 338, 254, - 273, 284, 891, 480, 438, 207, 408, 262, 196, 225, - 210, 233, 248, 251, 288, 347, 354, 383, 387, 267, - 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, - 240, 386, 872, 900, 334, 450, 451, 280, 352, 0, - 0, 926, 911, 449, 0, 857, 929, 826, 845, 939, - 848, 851, 893, 805, 871, 370, 842, 797, 830, 800, - 837, 801, 828, 859, 244, 825, 913, 875, 928, 325, - 241, 807, 831, 384, 847, 193, 895, 425, 228, 335, - 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, - 376, 935, 329, 881, 0, 434, 355, 0, 0, 0, - 861, 917, 869, 907, 856, 894, 815, 880, 930, 843, - 890, 931, 287, 226, 192, 367, 435, 259, 0, 0, - 0, 0, 184, 185, 186, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, - 318, 299, 300, 302, 304, 309, 316, 322, 839, 887, - 925, 840, 889, 239, 285, 246, 238, 453, 936, 916, - 804, 868, 924, 0, 0, 209, 927, 863, 0, 892, - 0, 942, 799, 883, 0, 802, 806, 938, 920, 834, - 249, 0, 0, 0, 0, 0, 0, 0, 860, 870, - 904, 854, 0, 0, 0, 0, 0, 2355, 0, 832, - 0, 879, 0, 0, 0, 811, 803, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 858, 0, - 0, 0, 814, 0, 833, 905, 0, 796, 268, 808, - 356, 231, 0, 909, 919, 855, 487, 923, 853, 852, - 899, 812, 915, 846, 324, 810, 293, 188, 205, 0, - 844, 366, 407, 413, 914, 829, 838, 229, 836, 411, - 380, 471, 213, 257, 404, 385, 409, 392, 260, 878, - 897, 410, 330, 458, 399, 468, 488, 489, 237, 360, - 478, 447, 484, 501, 206, 234, 374, 440, 474, 431, - 353, 454, 455, 292, 430, 266, 191, 328, 494, 204, - 419, 221, 211, 197, 442, 466, 218, 422, 0, 0, - 503, 199, 464, 439, 349, 289, 290, 198, 0, 403, - 242, 264, 232, 369, 461, 462, 230, 504, 208, 483, - 201, 1122, 482, 362, 457, 465, 350, 340, 200, 463, - 348, 339, 295, 314, 315, 253, 275, 397, 333, 398, - 276, 358, 357, 359, 194, 475, 0, 195, 0, 436, - 476, 505, 214, 215, 216, 824, 252, 256, 263, 265, - 271, 272, 279, 326, 373, 396, 394, 400, 910, 452, - 469, 479, 486, 492, 493, 495, 496, 497, 498, 499, - 500, 361, 278, 432, 294, 331, 902, 941, 379, 412, - 219, 473, 433, 819, 823, 817, 884, 818, 873, 874, - 820, 932, 933, 934, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 0, 906, 813, 0, 821, 822, 0, 912, - 921, 922, 524, 341, 424, 470, 296, 308, 311, 301, - 320, 0, 321, 297, 298, 303, 305, 306, 307, 312, - 313, 317, 323, 877, 187, 202, 327, 937, 401, 261, - 502, 481, 477, 798, 816, 236, 827, 835, 0, 841, - 849, 850, 862, 864, 865, 866, 867, 885, 886, 888, - 896, 898, 901, 903, 908, 918, 940, 189, 190, 203, - 212, 222, 235, 250, 258, 269, 274, 277, 282, 283, - 286, 291, 337, 343, 344, 345, 346, 363, 364, 365, - 368, 371, 372, 375, 377, 378, 381, 388, 389, 390, - 391, 393, 395, 402, 406, 414, 415, 416, 417, 418, - 420, 421, 426, 427, 428, 429, 437, 441, 459, 460, - 472, 485, 490, 270, 467, 491, 0, 336, 876, 882, - 338, 254, 273, 284, 891, 480, 438, 207, 408, 262, - 196, 225, 210, 233, 248, 251, 288, 347, 354, 383, - 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, - 448, 351, 240, 386, 872, 900, 334, 450, 451, 280, - 352, 0, 0, 926, 911, 449, 0, 857, 929, 826, - 845, 939, 848, 851, 893, 805, 871, 370, 842, 797, - 830, 800, 837, 801, 828, 859, 244, 825, 913, 875, - 928, 325, 241, 807, 831, 384, 847, 193, 895, 425, - 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, - 382, 443, 376, 935, 329, 881, 0, 434, 355, 0, - 0, 0, 861, 917, 869, 907, 856, 894, 815, 880, - 930, 843, 890, 931, 287, 226, 192, 367, 435, 259, - 0, 0, 0, 0, 184, 185, 186, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, - 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, - 839, 887, 925, 840, 889, 239, 285, 246, 238, 453, - 936, 916, 804, 868, 924, 0, 0, 209, 927, 863, - 0, 892, 0, 942, 799, 883, 0, 802, 806, 938, - 920, 834, 249, 0, 0, 0, 0, 0, 0, 0, - 860, 870, 904, 854, 0, 0, 0, 0, 0, 2313, - 0, 832, 0, 879, 0, 0, 0, 811, 803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 858, 0, 0, 0, 814, 0, 833, 905, 0, 796, - 268, 808, 356, 231, 0, 909, 919, 855, 487, 923, - 853, 852, 899, 812, 915, 846, 324, 810, 293, 188, - 205, 0, 844, 366, 407, 413, 914, 829, 838, 229, - 836, 411, 380, 471, 213, 257, 404, 385, 409, 392, - 260, 878, 897, 410, 330, 458, 399, 468, 488, 489, - 237, 360, 478, 447, 484, 501, 206, 234, 374, 440, - 474, 431, 353, 454, 455, 292, 430, 266, 191, 328, - 494, 204, 419, 221, 211, 197, 442, 466, 218, 422, - 0, 0, 503, 199, 464, 439, 349, 289, 290, 198, - 0, 403, 242, 264, 232, 369, 461, 462, 230, 504, - 208, 483, 201, 1122, 482, 362, 457, 465, 350, 340, - 200, 463, 348, 339, 295, 314, 315, 253, 275, 397, - 333, 398, 276, 358, 357, 359, 194, 475, 0, 195, - 0, 436, 476, 505, 214, 215, 216, 824, 252, 256, - 263, 265, 271, 272, 279, 326, 373, 396, 394, 400, - 910, 452, 469, 479, 486, 492, 493, 495, 496, 497, - 498, 499, 500, 361, 278, 432, 294, 331, 902, 941, - 379, 412, 219, 473, 433, 819, 823, 817, 884, 818, - 873, 874, 820, 932, 933, 934, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, - 520, 521, 522, 523, 0, 906, 813, 0, 821, 822, - 0, 912, 921, 922, 524, 341, 424, 470, 296, 308, - 311, 301, 320, 0, 321, 297, 298, 303, 305, 306, - 307, 312, 313, 317, 323, 877, 187, 202, 327, 937, - 401, 261, 502, 481, 477, 798, 816, 236, 827, 835, - 0, 841, 849, 850, 862, 864, 865, 866, 867, 885, - 886, 888, 896, 898, 901, 903, 908, 918, 940, 189, - 190, 203, 212, 222, 235, 250, 258, 269, 274, 277, - 282, 283, 286, 291, 337, 343, 344, 345, 346, 363, - 364, 365, 368, 371, 372, 375, 377, 378, 381, 388, - 389, 390, 391, 393, 395, 402, 406, 414, 415, 416, - 417, 418, 420, 421, 426, 427, 428, 429, 437, 441, - 459, 460, 472, 485, 490, 270, 467, 491, 0, 336, - 876, 882, 338, 254, 273, 284, 891, 480, 438, 207, - 408, 262, 196, 225, 210, 233, 248, 251, 288, 347, - 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, - 445, 446, 448, 351, 240, 386, 872, 900, 334, 450, - 451, 280, 352, 0, 0, 926, 911, 449, 0, 857, - 929, 826, 845, 939, 848, 851, 893, 805, 871, 370, - 842, 797, 830, 800, 837, 801, 828, 859, 244, 825, - 913, 875, 928, 325, 241, 807, 831, 384, 847, 193, - 895, 425, 228, 335, 332, 456, 255, 247, 243, 227, - 281, 342, 382, 443, 376, 935, 329, 881, 0, 434, - 355, 0, 0, 0, 861, 917, 869, 907, 856, 894, - 815, 880, 930, 843, 890, 931, 287, 226, 192, 367, - 435, 259, 0, 0, 0, 0, 184, 185, 186, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, - 316, 322, 839, 887, 925, 840, 889, 239, 285, 246, - 238, 453, 936, 916, 804, 868, 924, 0, 0, 209, - 927, 863, 0, 892, 0, 942, 799, 883, 0, 802, - 806, 938, 920, 834, 249, 0, 0, 0, 0, 0, - 0, 0, 860, 870, 904, 854, 0, 0, 0, 0, - 0, 1784, 0, 832, 0, 879, 0, 0, 0, 811, - 803, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 858, 0, 0, 0, 814, 0, 833, 905, - 0, 796, 268, 808, 356, 231, 0, 909, 919, 855, - 487, 923, 853, 852, 899, 812, 915, 846, 324, 810, - 293, 188, 205, 0, 844, 366, 407, 413, 914, 829, - 838, 229, 836, 411, 380, 471, 213, 257, 404, 385, - 409, 392, 260, 878, 897, 410, 330, 458, 399, 468, - 488, 489, 237, 360, 478, 447, 484, 501, 206, 234, - 374, 440, 474, 431, 353, 454, 455, 292, 430, 266, - 191, 328, 494, 204, 419, 221, 211, 197, 442, 466, - 218, 422, 0, 0, 503, 199, 464, 439, 349, 289, - 290, 198, 0, 403, 242, 264, 232, 369, 461, 462, - 230, 504, 208, 483, 201, 1122, 482, 362, 457, 465, - 350, 340, 200, 463, 348, 339, 295, 314, 315, 253, - 275, 397, 333, 398, 276, 358, 357, 359, 194, 475, - 0, 195, 0, 436, 476, 505, 214, 215, 216, 824, - 252, 256, 263, 265, 271, 272, 279, 326, 373, 396, - 394, 400, 910, 452, 469, 479, 486, 492, 493, 495, - 496, 497, 498, 499, 500, 361, 278, 432, 294, 331, - 902, 941, 379, 412, 219, 473, 433, 819, 823, 817, - 884, 818, 873, 874, 820, 932, 933, 934, 506, 507, - 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 0, 906, 813, 0, - 821, 822, 0, 912, 921, 922, 524, 341, 424, 470, - 296, 308, 311, 301, 320, 0, 321, 297, 298, 303, - 305, 306, 307, 312, 313, 317, 323, 877, 187, 202, - 327, 937, 401, 261, 502, 481, 477, 798, 816, 236, - 827, 835, 0, 841, 849, 850, 862, 864, 865, 866, - 867, 885, 886, 888, 896, 898, 901, 903, 908, 918, - 940, 189, 190, 203, 212, 222, 235, 250, 258, 269, - 274, 277, 282, 283, 286, 291, 337, 343, 344, 345, - 346, 363, 364, 365, 368, 371, 372, 375, 377, 378, - 381, 388, 389, 390, 391, 393, 395, 402, 406, 414, - 415, 416, 417, 418, 420, 421, 426, 427, 428, 429, - 437, 441, 459, 460, 472, 485, 490, 270, 467, 491, - 0, 336, 876, 882, 338, 254, 273, 284, 891, 480, - 438, 207, 408, 262, 196, 225, 210, 233, 248, 251, - 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, - 423, 444, 445, 446, 448, 351, 240, 386, 872, 900, - 334, 450, 451, 280, 352, 0, 0, 926, 911, 449, - 0, 857, 929, 826, 845, 939, 848, 851, 893, 805, - 871, 370, 842, 797, 830, 800, 837, 801, 828, 859, - 244, 825, 913, 875, 928, 325, 241, 807, 831, 384, - 847, 193, 895, 425, 228, 335, 332, 456, 255, 247, - 243, 227, 281, 342, 382, 443, 376, 935, 329, 881, - 0, 434, 355, 0, 0, 0, 861, 917, 869, 907, - 856, 894, 815, 880, 930, 843, 890, 931, 287, 226, - 192, 367, 435, 259, 0, 87, 0, 0, 184, 185, - 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, - 304, 309, 316, 322, 839, 887, 925, 840, 889, 239, - 285, 246, 238, 453, 936, 916, 804, 868, 924, 0, - 0, 209, 927, 863, 0, 892, 0, 942, 799, 883, - 0, 802, 806, 938, 920, 834, 249, 0, 0, 0, - 0, 0, 0, 0, 860, 870, 904, 854, 0, 0, - 0, 0, 0, 0, 0, 832, 0, 879, 0, 0, - 0, 811, 803, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 858, 0, 0, 0, 814, 0, - 833, 905, 0, 796, 268, 808, 356, 231, 0, 909, - 919, 855, 487, 923, 853, 852, 899, 812, 915, 846, - 324, 810, 293, 188, 205, 0, 844, 366, 407, 413, - 914, 829, 838, 229, 836, 411, 380, 471, 213, 257, - 404, 385, 409, 392, 260, 878, 897, 410, 330, 458, - 399, 468, 488, 489, 237, 360, 478, 447, 484, 501, - 206, 234, 374, 440, 474, 431, 353, 454, 455, 292, - 430, 266, 191, 328, 494, 204, 419, 221, 211, 197, - 442, 466, 218, 422, 0, 0, 503, 199, 464, 439, - 349, 289, 290, 198, 0, 403, 242, 264, 232, 369, - 461, 462, 230, 504, 208, 483, 201, 1122, 482, 362, - 457, 465, 350, 340, 200, 463, 348, 339, 295, 314, - 315, 253, 275, 397, 333, 398, 276, 358, 357, 359, - 194, 475, 0, 195, 0, 436, 476, 505, 214, 215, - 216, 824, 252, 256, 263, 265, 271, 272, 279, 326, - 373, 396, 394, 400, 910, 452, 469, 479, 486, 492, - 493, 495, 496, 497, 498, 499, 500, 361, 278, 432, - 294, 331, 902, 941, 379, 412, 219, 473, 433, 819, - 823, 817, 884, 818, 873, 874, 820, 932, 933, 934, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, - 516, 517, 518, 519, 520, 521, 522, 523, 0, 906, - 813, 0, 821, 822, 0, 912, 921, 922, 524, 341, - 424, 470, 296, 308, 311, 301, 320, 0, 321, 297, - 298, 303, 305, 306, 307, 312, 313, 317, 323, 877, - 187, 202, 327, 937, 401, 261, 502, 481, 477, 798, - 816, 236, 827, 835, 0, 841, 849, 850, 862, 864, - 865, 866, 867, 885, 886, 888, 896, 898, 901, 903, - 908, 918, 940, 189, 190, 203, 212, 222, 235, 250, - 258, 269, 274, 277, 282, 283, 286, 291, 337, 343, - 344, 345, 346, 363, 364, 365, 368, 371, 372, 375, - 377, 378, 381, 388, 389, 390, 391, 393, 395, 402, - 406, 414, 415, 416, 417, 418, 420, 421, 426, 427, - 428, 429, 437, 441, 459, 460, 472, 485, 490, 270, - 467, 491, 0, 336, 876, 882, 338, 254, 273, 284, - 891, 480, 438, 207, 408, 262, 196, 225, 210, 233, - 248, 251, 288, 347, 354, 383, 387, 267, 245, 223, - 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, - 872, 900, 334, 450, 451, 280, 352, 0, 0, 926, - 911, 449, 0, 857, 929, 826, 845, 939, 848, 851, - 893, 805, 871, 370, 842, 797, 830, 800, 837, 801, - 828, 859, 244, 825, 913, 875, 928, 325, 241, 807, - 831, 384, 847, 193, 895, 425, 228, 335, 332, 456, - 255, 247, 243, 227, 281, 342, 382, 443, 376, 935, - 329, 881, 0, 434, 355, 0, 0, 0, 861, 917, - 869, 907, 856, 894, 815, 880, 930, 843, 890, 931, - 287, 226, 192, 367, 435, 259, 0, 0, 0, 0, - 184, 185, 186, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, - 300, 302, 304, 309, 316, 322, 839, 887, 925, 840, - 889, 239, 285, 246, 238, 453, 936, 916, 804, 868, - 924, 0, 0, 209, 927, 863, 0, 892, 0, 942, - 799, 883, 0, 802, 806, 938, 920, 834, 249, 0, - 0, 0, 0, 0, 0, 0, 860, 870, 904, 854, - 0, 0, 0, 0, 0, 0, 0, 832, 0, 879, - 0, 0, 0, 811, 803, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 858, 0, 0, 0, - 814, 0, 833, 905, 0, 796, 268, 808, 356, 231, - 0, 909, 919, 855, 487, 923, 853, 852, 899, 812, - 915, 846, 324, 810, 293, 188, 205, 0, 844, 366, - 407, 413, 914, 829, 838, 229, 836, 411, 380, 471, - 213, 257, 404, 385, 409, 392, 260, 878, 897, 410, - 330, 458, 399, 468, 488, 489, 237, 360, 478, 447, - 484, 501, 206, 234, 374, 440, 474, 431, 353, 454, - 455, 292, 430, 266, 191, 328, 494, 204, 419, 221, - 211, 197, 442, 466, 218, 422, 0, 0, 503, 199, - 464, 439, 349, 289, 290, 198, 0, 403, 242, 264, - 232, 369, 461, 462, 230, 504, 208, 483, 201, 1122, - 482, 362, 457, 465, 350, 340, 200, 463, 348, 339, - 295, 314, 315, 253, 275, 397, 333, 398, 276, 358, - 357, 359, 194, 475, 0, 195, 0, 436, 476, 505, - 214, 215, 216, 824, 252, 256, 263, 265, 271, 272, - 279, 326, 373, 396, 394, 400, 910, 452, 469, 479, - 486, 492, 493, 495, 496, 497, 498, 499, 500, 361, - 278, 432, 294, 331, 902, 941, 379, 412, 219, 473, - 433, 819, 823, 817, 884, 818, 873, 874, 820, 932, - 933, 934, 506, 507, 508, 509, 510, 511, 512, 513, - 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 0, 906, 813, 0, 821, 822, 0, 912, 921, 922, - 524, 341, 424, 470, 296, 308, 311, 301, 320, 0, - 321, 297, 298, 303, 305, 306, 307, 312, 313, 317, - 323, 877, 187, 202, 327, 937, 401, 261, 502, 481, - 477, 798, 816, 236, 827, 835, 0, 841, 849, 850, - 862, 864, 865, 866, 867, 885, 886, 888, 896, 898, - 901, 903, 908, 918, 940, 189, 190, 203, 212, 222, - 235, 250, 258, 269, 274, 277, 282, 283, 286, 291, - 337, 343, 344, 345, 346, 363, 364, 365, 368, 371, - 372, 375, 377, 378, 381, 388, 389, 390, 391, 393, - 395, 402, 406, 414, 415, 416, 417, 418, 420, 421, - 426, 427, 428, 429, 437, 441, 459, 460, 472, 485, - 490, 270, 467, 491, 0, 336, 876, 882, 338, 254, - 273, 284, 891, 480, 438, 207, 408, 262, 196, 225, - 210, 233, 248, 251, 288, 347, 354, 383, 387, 267, - 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, - 240, 386, 872, 900, 334, 450, 451, 280, 352, 0, - 0, 926, 911, 449, 0, 857, 929, 826, 845, 939, - 848, 851, 893, 805, 871, 370, 842, 797, 830, 800, - 837, 801, 828, 859, 244, 825, 913, 875, 928, 325, - 241, 807, 831, 384, 847, 193, 895, 425, 228, 335, - 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, - 376, 935, 329, 881, 0, 434, 355, 0, 0, 0, - 861, 917, 869, 907, 856, 894, 815, 880, 930, 843, - 890, 931, 287, 226, 192, 367, 435, 259, 0, 0, - 0, 0, 184, 185, 186, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, - 318, 299, 300, 302, 304, 309, 316, 322, 839, 887, - 925, 840, 889, 239, 285, 246, 238, 453, 936, 916, - 804, 868, 924, 0, 0, 943, 927, 863, 0, 892, - 0, 942, 799, 883, 0, 802, 806, 938, 920, 834, - 249, 0, 0, 0, 0, 0, 0, 0, 860, 870, - 904, 854, 0, 0, 0, 0, 0, 0, 0, 832, - 0, 879, 0, 0, 0, 811, 803, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 858, 0, - 0, 0, 814, 0, 833, 905, 0, 796, 268, 808, - 356, 231, 0, 909, 919, 855, 487, 923, 853, 852, - 899, 812, 915, 846, 324, 810, 293, 188, 205, 0, - 844, 366, 407, 413, 914, 829, 838, 229, 836, 411, - 380, 471, 213, 257, 404, 385, 409, 392, 260, 878, - 897, 410, 330, 458, 399, 468, 488, 489, 237, 360, - 478, 447, 484, 501, 206, 234, 374, 440, 474, 431, - 353, 454, 455, 292, 430, 266, 191, 328, 494, 204, - 419, 221, 211, 197, 442, 466, 218, 422, 0, 0, - 503, 199, 464, 439, 349, 289, 290, 198, 0, 403, - 242, 264, 232, 369, 461, 462, 230, 504, 208, 483, - 201, 809, 482, 362, 457, 465, 350, 340, 200, 463, - 348, 339, 295, 314, 315, 253, 275, 397, 333, 398, - 276, 358, 357, 359, 194, 475, 0, 195, 0, 436, - 476, 505, 214, 215, 216, 824, 252, 256, 263, 265, - 271, 272, 279, 326, 373, 396, 394, 400, 910, 452, - 469, 479, 486, 492, 493, 495, 496, 497, 498, 499, - 500, 795, 789, 788, 294, 331, 902, 941, 379, 412, - 219, 473, 433, 819, 823, 817, 884, 818, 873, 874, - 820, 932, 933, 934, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 0, 906, 813, 0, 821, 822, 0, 912, - 921, 922, 524, 341, 424, 470, 296, 308, 311, 301, - 320, 0, 321, 297, 298, 303, 305, 306, 307, 312, - 313, 317, 323, 877, 187, 202, 327, 937, 401, 261, - 502, 481, 477, 798, 816, 236, 827, 835, 0, 841, - 849, 850, 862, 864, 865, 866, 867, 885, 886, 888, - 896, 898, 901, 903, 908, 918, 940, 189, 190, 203, - 212, 222, 235, 250, 258, 269, 274, 277, 282, 283, - 286, 291, 337, 343, 344, 345, 346, 363, 364, 365, - 368, 371, 372, 375, 377, 378, 381, 388, 389, 390, - 391, 393, 395, 402, 406, 414, 415, 416, 417, 418, - 420, 421, 426, 427, 428, 429, 437, 441, 459, 460, - 472, 485, 490, 270, 467, 491, 0, 336, 876, 882, - 338, 254, 273, 284, 891, 480, 438, 207, 408, 262, - 196, 225, 210, 233, 248, 251, 288, 347, 354, 383, - 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, - 448, 351, 240, 386, 872, 900, 334, 450, 451, 280, - 352, 0, 0, 926, 911, 449, 0, 857, 929, 826, - 845, 939, 848, 851, 893, 805, 871, 370, 842, 797, - 830, 800, 837, 801, 828, 859, 244, 825, 913, 875, - 928, 325, 241, 807, 831, 384, 847, 193, 895, 425, - 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, - 382, 443, 376, 935, 329, 881, 0, 434, 355, 0, - 0, 0, 861, 917, 869, 907, 856, 894, 815, 880, - 930, 843, 890, 931, 287, 226, 192, 367, 435, 259, - 0, 0, 0, 0, 184, 185, 186, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, - 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, - 839, 887, 925, 840, 889, 239, 285, 246, 238, 453, - 936, 916, 804, 868, 924, 0, 0, 943, 927, 863, - 0, 892, 0, 942, 799, 883, 0, 802, 806, 938, - 920, 834, 249, 0, 0, 0, 0, 0, 0, 0, - 860, 870, 904, 854, 0, 0, 0, 0, 0, 0, - 0, 832, 0, 879, 0, 0, 0, 811, 803, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 858, 0, 0, 0, 814, 0, 833, 905, 0, 796, - 268, 808, 356, 231, 0, 909, 919, 855, 487, 923, - 853, 852, 899, 812, 915, 846, 324, 810, 293, 188, - 205, 0, 844, 366, 407, 413, 914, 829, 838, 229, - 836, 411, 380, 471, 213, 257, 404, 385, 409, 392, - 260, 878, 897, 410, 330, 458, 399, 468, 488, 489, - 237, 360, 478, 447, 484, 501, 206, 234, 374, 440, - 474, 431, 353, 454, 455, 292, 430, 266, 191, 328, - 494, 204, 419, 221, 211, 197, 442, 1337, 218, 422, - 0, 0, 503, 199, 464, 439, 349, 289, 290, 198, - 0, 403, 242, 264, 232, 369, 461, 462, 230, 504, - 208, 483, 201, 809, 482, 362, 457, 465, 350, 340, - 200, 463, 348, 339, 295, 314, 315, 253, 275, 397, - 333, 398, 276, 358, 357, 359, 194, 475, 0, 195, - 0, 436, 476, 505, 214, 215, 216, 824, 252, 256, - 263, 265, 271, 272, 279, 326, 373, 396, 394, 400, - 910, 452, 469, 479, 486, 492, 493, 495, 496, 497, - 498, 499, 500, 795, 789, 788, 294, 331, 902, 941, - 379, 412, 219, 473, 433, 819, 823, 817, 884, 818, - 873, 874, 820, 932, 933, 934, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, - 520, 521, 522, 523, 0, 906, 813, 0, 821, 822, - 0, 912, 921, 922, 524, 341, 424, 470, 296, 308, - 311, 301, 320, 0, 321, 297, 298, 303, 305, 306, - 307, 312, 313, 317, 323, 877, 187, 202, 327, 937, - 401, 261, 502, 481, 477, 798, 816, 236, 827, 835, - 0, 841, 849, 850, 862, 864, 865, 866, 867, 885, - 886, 888, 896, 898, 901, 903, 908, 918, 940, 189, - 190, 203, 212, 222, 235, 250, 258, 269, 274, 277, - 282, 283, 286, 291, 337, 343, 344, 345, 346, 363, - 364, 365, 368, 371, 372, 375, 377, 378, 381, 388, - 389, 390, 391, 393, 395, 402, 406, 414, 415, 416, - 417, 418, 420, 421, 426, 427, 428, 429, 437, 441, - 459, 460, 472, 485, 490, 270, 467, 491, 0, 336, - 876, 882, 338, 254, 273, 284, 891, 480, 438, 207, - 408, 262, 196, 225, 210, 233, 248, 251, 288, 347, - 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, - 445, 446, 448, 351, 240, 386, 872, 900, 334, 450, - 451, 280, 352, 0, 0, 926, 911, 449, 0, 857, - 929, 826, 845, 939, 848, 851, 893, 805, 871, 370, - 842, 797, 830, 800, 837, 801, 828, 859, 244, 825, - 913, 875, 928, 325, 241, 807, 831, 384, 847, 193, - 895, 425, 228, 335, 332, 456, 255, 247, 243, 227, - 281, 342, 382, 443, 376, 935, 329, 881, 0, 434, - 355, 0, 0, 0, 861, 917, 869, 907, 856, 894, - 815, 880, 930, 843, 890, 931, 287, 226, 192, 367, - 435, 259, 0, 0, 0, 0, 184, 185, 186, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, - 316, 322, 839, 887, 925, 840, 889, 239, 285, 246, - 238, 453, 936, 916, 804, 868, 924, 0, 0, 943, - 927, 863, 0, 892, 0, 942, 799, 883, 0, 802, - 806, 938, 920, 834, 249, 0, 0, 0, 0, 0, - 0, 0, 860, 870, 904, 854, 0, 0, 0, 0, - 0, 0, 0, 832, 0, 879, 0, 0, 0, 811, - 803, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 858, 0, 0, 0, 814, 0, 833, 905, - 0, 796, 268, 808, 356, 231, 0, 909, 919, 855, - 487, 923, 853, 852, 899, 812, 915, 846, 324, 810, - 293, 188, 205, 0, 844, 366, 407, 413, 914, 829, - 838, 229, 836, 411, 380, 471, 213, 257, 404, 385, - 409, 392, 260, 878, 897, 410, 330, 458, 399, 468, - 488, 489, 237, 360, 478, 447, 484, 501, 206, 234, - 374, 440, 474, 431, 353, 454, 455, 292, 430, 266, - 191, 328, 494, 204, 419, 221, 211, 197, 442, 786, - 218, 422, 0, 0, 503, 199, 464, 439, 349, 289, - 290, 198, 0, 403, 242, 264, 232, 369, 461, 462, - 230, 504, 208, 483, 201, 809, 482, 362, 457, 465, - 350, 340, 200, 463, 348, 339, 295, 314, 315, 253, - 275, 397, 333, 398, 276, 358, 357, 359, 194, 475, - 0, 195, 0, 436, 476, 505, 214, 215, 216, 824, - 252, 256, 263, 265, 271, 272, 279, 326, 373, 396, - 394, 400, 910, 452, 469, 479, 486, 492, 493, 495, - 496, 497, 498, 499, 500, 795, 789, 788, 294, 331, - 902, 941, 379, 412, 219, 473, 433, 819, 823, 817, - 884, 818, 873, 874, 820, 932, 933, 934, 506, 507, - 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 0, 906, 813, 0, - 821, 822, 0, 912, 921, 922, 524, 341, 424, 470, - 296, 308, 311, 301, 320, 0, 321, 297, 298, 303, - 305, 306, 307, 312, 313, 317, 323, 877, 187, 202, - 327, 937, 401, 261, 502, 481, 477, 798, 816, 236, - 827, 835, 0, 841, 849, 850, 862, 864, 865, 866, - 867, 885, 886, 888, 896, 898, 901, 903, 908, 918, - 940, 189, 190, 203, 212, 222, 235, 250, 258, 269, - 274, 277, 282, 283, 286, 291, 337, 343, 344, 345, - 346, 363, 364, 365, 368, 371, 372, 375, 377, 378, - 381, 388, 389, 390, 391, 393, 395, 402, 406, 414, - 415, 416, 417, 418, 420, 421, 426, 427, 428, 429, - 437, 441, 459, 460, 472, 485, 490, 270, 467, 491, - 0, 336, 876, 882, 338, 254, 273, 284, 891, 480, - 438, 207, 408, 262, 196, 225, 210, 233, 248, 251, - 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, - 423, 444, 445, 446, 448, 351, 240, 386, 872, 900, - 334, 450, 451, 280, 352, 0, 0, 0, 0, 449, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 370, 0, 0, 1729, 0, 605, 0, 0, 0, - 244, 610, 0, 0, 0, 325, 241, 0, 1730, 384, - 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, - 243, 227, 281, 342, 382, 443, 376, 617, 329, 0, - 0, 434, 355, 0, 0, 0, 0, 0, 612, 613, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, - 192, 367, 435, 259, 0, 87, 0, 0, 184, 185, - 186, 681, 688, 689, 690, 691, 692, 682, 684, 0, - 0, 217, 683, 224, 628, 630, 629, 639, 640, 641, - 642, 643, 644, 645, 626, 686, 693, 694, 0, 239, - 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, - 0, 209, 0, 0, 0, 0, 0, 0, 0, 588, - 602, 0, 616, 0, 0, 0, 249, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 599, 600, 775, 0, 0, 0, 665, 0, 601, - 0, 0, 609, 695, 696, 697, 698, 699, 700, 701, - 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, - 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, - 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 611, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 268, 0, 356, 231, 0, 664, - 0, 0, 487, 0, 0, 662, 0, 0, 0, 0, - 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, - 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, - 404, 385, 409, 392, 260, 0, 0, 410, 330, 458, - 399, 468, 488, 489, 237, 360, 478, 447, 484, 501, - 206, 234, 374, 440, 474, 431, 353, 454, 455, 292, - 430, 266, 191, 328, 494, 204, 419, 221, 211, 197, - 442, 466, 218, 422, 0, 0, 503, 199, 464, 439, - 349, 289, 290, 198, 0, 403, 242, 264, 232, 369, - 461, 462, 230, 504, 208, 483, 201, 0, 482, 362, - 457, 465, 350, 340, 200, 463, 348, 339, 295, 634, - 635, 253, 275, 397, 333, 398, 276, 358, 357, 359, - 194, 475, 0, 195, 0, 436, 476, 505, 214, 215, - 216, 0, 252, 256, 263, 265, 271, 272, 279, 326, - 373, 396, 394, 400, 0, 452, 469, 479, 486, 492, - 493, 495, 496, 497, 498, 499, 500, 361, 278, 432, - 294, 331, 0, 0, 379, 412, 219, 473, 433, 671, - 663, 621, 675, 623, 672, 673, 618, 619, 622, 674, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, - 516, 517, 518, 519, 520, 521, 522, 523, 0, 666, - 608, 607, 0, 614, 615, 0, 624, 625, 627, 631, - 632, 633, 636, 637, 638, 646, 648, 649, 647, 650, - 651, 652, 655, 656, 657, 658, 653, 654, 659, 606, - 187, 202, 327, 0, 401, 261, 502, 481, 477, 0, - 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 189, 190, 203, 212, 222, 235, 250, - 258, 269, 274, 277, 282, 283, 286, 291, 337, 343, - 344, 345, 346, 363, 364, 365, 368, 371, 372, 375, - 377, 378, 381, 388, 389, 390, 391, 393, 395, 402, - 406, 414, 415, 416, 417, 418, 420, 421, 426, 427, - 428, 429, 437, 441, 459, 460, 472, 485, 490, 270, - 467, 491, 0, 336, 0, 0, 338, 254, 273, 284, - 0, 480, 438, 207, 408, 262, 196, 225, 210, 233, - 248, 251, 288, 347, 354, 383, 387, 267, 245, 223, - 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, - 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, - 0, 0, 0, 605, 0, 0, 0, 244, 610, 0, - 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, - 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, - 342, 382, 443, 376, 617, 329, 0, 0, 434, 355, - 0, 0, 0, 0, 0, 612, 613, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, - 259, 0, 87, 0, 0, 184, 185, 186, 681, 688, - 689, 690, 691, 692, 682, 684, 0, 0, 217, 683, - 224, 628, 630, 629, 639, 640, 641, 642, 643, 644, - 645, 626, 686, 693, 694, 0, 239, 285, 246, 238, - 453, 0, 0, 1695, 1696, 1697, 0, 0, 209, 0, - 0, 0, 0, 0, 0, 0, 588, 602, 0, 616, - 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 599, 600, - 0, 0, 0, 0, 665, 0, 601, 0, 0, 609, - 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, - 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, - 735, 611, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 268, 0, 356, 231, 0, 664, 0, 0, 487, - 0, 0, 662, 0, 0, 0, 0, 324, 0, 293, - 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, - 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, - 392, 260, 0, 0, 410, 330, 458, 399, 468, 488, - 489, 237, 360, 478, 447, 484, 501, 206, 234, 374, - 440, 474, 431, 353, 454, 455, 292, 430, 266, 191, - 328, 494, 204, 419, 221, 211, 197, 442, 466, 218, - 422, 0, 0, 503, 199, 464, 439, 349, 289, 290, - 198, 0, 403, 242, 264, 232, 369, 461, 462, 230, - 504, 208, 483, 201, 0, 482, 362, 457, 465, 350, - 340, 200, 463, 348, 339, 295, 634, 635, 253, 275, - 397, 333, 398, 276, 358, 357, 359, 194, 475, 0, - 195, 0, 436, 476, 505, 214, 215, 216, 0, 252, - 256, 263, 265, 271, 272, 279, 326, 373, 396, 394, - 400, 0, 452, 469, 479, 486, 492, 493, 495, 496, - 497, 498, 499, 500, 361, 278, 432, 294, 331, 0, - 0, 379, 412, 219, 473, 433, 671, 663, 621, 675, - 623, 672, 673, 618, 619, 622, 674, 506, 507, 508, - 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 0, 666, 608, 607, 0, - 614, 615, 0, 624, 625, 627, 631, 632, 633, 636, - 637, 638, 646, 648, 649, 647, 650, 651, 652, 655, - 656, 657, 658, 653, 654, 659, 606, 187, 202, 327, - 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 189, 190, 203, 212, 222, 235, 250, 258, 269, 274, - 277, 282, 283, 286, 291, 337, 343, 344, 345, 346, - 363, 364, 365, 368, 371, 372, 375, 377, 378, 381, - 388, 389, 390, 391, 393, 395, 402, 406, 414, 415, - 416, 417, 418, 420, 421, 426, 427, 428, 429, 437, - 441, 459, 460, 472, 485, 490, 270, 467, 491, 0, - 336, 0, 0, 338, 254, 273, 284, 0, 480, 438, - 207, 408, 262, 196, 225, 210, 233, 248, 251, 288, - 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, - 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, - 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, - 605, 0, 0, 0, 244, 610, 0, 0, 0, 325, - 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, - 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, - 376, 617, 329, 0, 0, 434, 355, 0, 0, 0, - 0, 0, 612, 613, 0, 0, 0, 0, 0, 0, - 1811, 0, 287, 226, 192, 367, 435, 259, 0, 87, - 0, 0, 184, 185, 186, 681, 688, 689, 690, 691, - 692, 682, 684, 0, 0, 217, 683, 224, 628, 630, - 629, 639, 640, 641, 642, 643, 644, 645, 626, 686, - 693, 694, 1812, 239, 285, 246, 238, 453, 0, 0, - 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, - 0, 0, 0, 588, 602, 0, 616, 0, 0, 0, - 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 599, 600, 0, 0, 0, - 0, 665, 0, 601, 0, 0, 609, 695, 696, 697, - 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, - 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, - 728, 729, 730, 731, 732, 733, 734, 735, 611, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, - 356, 231, 0, 664, 0, 0, 487, 0, 0, 662, - 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, - 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, - 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, - 0, 410, 330, 458, 399, 468, 488, 489, 237, 360, - 478, 447, 484, 501, 206, 234, 374, 440, 474, 431, - 353, 454, 455, 292, 430, 266, 191, 328, 494, 204, - 419, 221, 211, 197, 442, 466, 218, 422, 0, 0, - 503, 199, 464, 439, 349, 289, 290, 198, 0, 403, - 242, 264, 232, 369, 461, 462, 230, 504, 208, 483, - 201, 0, 482, 362, 457, 465, 350, 340, 200, 463, - 348, 339, 295, 634, 635, 253, 275, 397, 333, 398, - 276, 358, 357, 359, 194, 475, 0, 195, 0, 436, - 476, 505, 214, 215, 216, 0, 252, 256, 263, 265, - 271, 272, 279, 326, 373, 396, 394, 400, 0, 452, - 469, 479, 486, 492, 493, 495, 496, 497, 498, 499, - 500, 361, 278, 432, 294, 331, 0, 0, 379, 412, - 219, 473, 433, 671, 663, 621, 675, 623, 672, 673, - 618, 619, 622, 674, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 0, 666, 608, 607, 0, 614, 615, 0, - 624, 625, 627, 631, 632, 633, 636, 637, 638, 646, - 648, 649, 647, 650, 651, 652, 655, 656, 657, 658, - 653, 654, 659, 606, 187, 202, 327, 0, 401, 261, - 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 189, 190, 203, - 212, 222, 235, 250, 258, 269, 274, 277, 282, 283, - 286, 291, 337, 343, 344, 345, 346, 363, 364, 365, - 368, 371, 372, 375, 377, 378, 381, 388, 389, 390, - 391, 393, 395, 402, 406, 414, 415, 416, 417, 418, - 420, 421, 426, 427, 428, 429, 437, 441, 459, 460, - 472, 485, 490, 270, 467, 491, 0, 336, 0, 0, - 338, 254, 273, 284, 0, 480, 438, 207, 408, 262, - 196, 225, 210, 233, 248, 251, 288, 347, 354, 383, - 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, - 448, 351, 240, 386, 0, 0, 334, 450, 451, 280, - 352, 0, 0, 0, 78, 449, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, - 0, 0, 605, 0, 0, 0, 244, 610, 0, 0, - 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, - 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, - 382, 443, 376, 617, 329, 0, 0, 434, 355, 0, - 0, 0, 0, 0, 612, 613, 0, 0, 0, 0, - 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, - 0, 87, 0, 0, 184, 185, 186, 681, 688, 689, - 690, 691, 692, 682, 684, 0, 0, 217, 683, 224, - 628, 630, 629, 639, 640, 641, 642, 643, 644, 645, - 626, 686, 693, 694, 0, 239, 285, 246, 238, 453, - 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, - 0, 0, 0, 0, 0, 588, 602, 0, 616, 0, - 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 599, 600, 0, - 0, 0, 0, 665, 0, 601, 0, 0, 609, 695, - 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, - 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, - 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, - 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, - 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 268, 0, 356, 231, 0, 664, 0, 0, 487, 0, - 0, 662, 0, 0, 0, 0, 324, 0, 293, 188, - 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, - 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, - 260, 0, 0, 410, 330, 458, 399, 468, 488, 489, - 237, 360, 478, 447, 484, 501, 206, 234, 374, 440, - 474, 431, 353, 454, 455, 292, 430, 266, 191, 328, - 494, 204, 419, 221, 211, 197, 442, 466, 218, 422, - 0, 0, 503, 199, 464, 439, 349, 289, 290, 198, - 0, 403, 242, 264, 232, 369, 461, 462, 230, 504, - 208, 483, 201, 0, 482, 362, 457, 465, 350, 340, - 200, 463, 348, 339, 295, 634, 635, 253, 275, 397, - 333, 398, 276, 358, 357, 359, 194, 475, 0, 195, - 0, 436, 476, 505, 214, 215, 216, 0, 252, 256, - 263, 265, 271, 272, 279, 326, 373, 396, 394, 400, - 0, 452, 469, 479, 486, 492, 493, 495, 496, 497, - 498, 499, 500, 361, 278, 432, 294, 331, 0, 0, - 379, 412, 219, 473, 433, 671, 663, 621, 675, 623, - 672, 673, 618, 619, 622, 674, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, - 520, 521, 522, 523, 0, 666, 608, 607, 0, 614, - 615, 0, 624, 625, 627, 631, 632, 633, 636, 637, - 638, 646, 648, 649, 647, 650, 651, 652, 655, 656, - 657, 658, 653, 654, 659, 606, 187, 202, 327, 86, - 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, - 190, 203, 212, 222, 235, 250, 258, 269, 274, 277, - 282, 283, 286, 291, 337, 343, 344, 345, 346, 363, - 364, 365, 368, 371, 372, 375, 377, 378, 381, 388, - 389, 390, 391, 393, 395, 402, 406, 414, 415, 416, - 417, 418, 420, 421, 426, 427, 428, 429, 437, 441, - 459, 460, 472, 485, 490, 270, 467, 491, 0, 336, - 0, 0, 338, 254, 273, 284, 0, 480, 438, 207, - 408, 262, 196, 225, 210, 233, 248, 251, 288, 347, - 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, - 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, - 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 370, 0, 0, 0, 0, 605, - 0, 0, 0, 244, 610, 0, 0, 0, 325, 241, - 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, - 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, - 617, 329, 0, 0, 434, 355, 0, 0, 0, 0, - 0, 612, 613, 0, 0, 0, 0, 0, 0, 0, - 0, 287, 226, 192, 367, 435, 259, 0, 87, 0, - 0, 184, 185, 186, 681, 688, 689, 690, 691, 692, - 682, 684, 0, 0, 217, 683, 224, 628, 630, 629, - 639, 640, 641, 642, 643, 644, 645, 626, 686, 693, - 694, 0, 239, 285, 246, 238, 453, 0, 0, 0, - 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, - 0, 0, 588, 602, 0, 616, 0, 0, 0, 249, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 599, 600, 0, 0, 0, 0, - 665, 0, 601, 0, 0, 609, 695, 696, 697, 698, - 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, - 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 734, 735, 611, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 268, 0, 356, - 231, 0, 664, 0, 0, 487, 0, 0, 662, 0, - 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, - 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, - 471, 213, 257, 404, 385, 409, 392, 260, 2765, 0, - 410, 330, 458, 399, 468, 488, 489, 237, 360, 478, - 447, 484, 501, 206, 234, 374, 440, 474, 431, 353, - 454, 455, 292, 430, 266, 191, 328, 494, 204, 419, - 221, 211, 197, 442, 466, 218, 422, 0, 0, 503, - 199, 464, 439, 349, 289, 290, 198, 0, 403, 242, - 264, 232, 369, 461, 462, 230, 504, 208, 483, 201, - 0, 482, 362, 457, 465, 350, 340, 200, 463, 348, - 339, 295, 634, 635, 253, 275, 397, 333, 398, 276, - 358, 357, 359, 194, 475, 0, 195, 0, 436, 476, - 505, 214, 215, 216, 0, 252, 256, 263, 265, 271, - 272, 279, 326, 373, 396, 394, 400, 0, 452, 469, - 479, 486, 492, 493, 495, 496, 497, 498, 499, 500, - 361, 278, 432, 294, 331, 0, 0, 379, 412, 219, - 473, 433, 671, 663, 621, 675, 623, 672, 673, 618, - 619, 622, 674, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 0, 666, 608, 607, 0, 614, 615, 0, 624, - 625, 627, 631, 632, 633, 636, 637, 638, 646, 648, - 649, 647, 650, 651, 652, 655, 656, 657, 658, 653, - 654, 659, 606, 187, 202, 327, 0, 401, 261, 502, - 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 189, 190, 203, 212, - 222, 235, 250, 258, 269, 274, 277, 282, 283, 286, - 291, 337, 343, 344, 345, 346, 363, 364, 365, 368, - 371, 372, 375, 377, 378, 381, 388, 389, 390, 391, - 393, 395, 402, 406, 414, 415, 416, 417, 418, 420, - 421, 426, 427, 428, 429, 437, 441, 459, 460, 472, - 485, 490, 270, 467, 491, 0, 336, 0, 0, 338, - 254, 273, 284, 0, 480, 438, 207, 408, 262, 196, - 225, 210, 233, 248, 251, 288, 347, 354, 383, 387, - 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, - 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 370, 0, 0, 0, 0, 605, 0, 0, 0, - 244, 610, 0, 0, 0, 325, 241, 0, 0, 384, - 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, - 243, 227, 281, 342, 382, 443, 376, 617, 329, 0, - 0, 434, 355, 0, 0, 0, 0, 0, 612, 613, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, - 192, 367, 435, 259, 0, 87, 0, 1304, 184, 185, - 186, 681, 688, 689, 690, 691, 692, 682, 684, 0, - 0, 217, 683, 224, 628, 630, 629, 639, 640, 641, - 642, 643, 644, 645, 626, 686, 693, 694, 0, 239, - 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, - 0, 209, 0, 0, 0, 0, 0, 0, 0, 588, - 602, 0, 616, 0, 0, 0, 249, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 599, 600, 0, 0, 0, 0, 665, 0, 601, - 0, 0, 609, 695, 696, 697, 698, 699, 700, 701, - 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, - 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, - 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, - 732, 733, 734, 735, 611, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 268, 0, 356, 231, 0, 664, - 0, 0, 487, 0, 0, 662, 0, 0, 0, 0, - 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, - 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, - 404, 385, 409, 392, 260, 0, 0, 410, 330, 458, - 399, 468, 488, 489, 237, 360, 478, 447, 484, 501, - 206, 234, 374, 440, 474, 431, 353, 454, 455, 292, - 430, 266, 191, 328, 494, 204, 419, 221, 211, 197, - 442, 466, 218, 422, 0, 0, 503, 199, 464, 439, - 349, 289, 290, 198, 0, 403, 242, 264, 232, 369, - 461, 462, 230, 504, 208, 483, 201, 0, 482, 362, - 457, 465, 350, 340, 200, 463, 348, 339, 295, 634, - 635, 253, 275, 397, 333, 398, 276, 358, 357, 359, - 194, 475, 0, 195, 0, 436, 476, 505, 214, 215, - 216, 0, 252, 256, 263, 265, 271, 272, 279, 326, - 373, 396, 394, 400, 0, 452, 469, 479, 486, 492, - 493, 495, 496, 497, 498, 499, 500, 361, 278, 432, - 294, 331, 0, 0, 379, 412, 219, 473, 433, 671, - 663, 621, 675, 623, 672, 673, 618, 619, 622, 674, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, - 516, 517, 518, 519, 520, 521, 522, 523, 0, 666, - 608, 607, 0, 614, 615, 0, 624, 625, 627, 631, - 632, 633, 636, 637, 638, 646, 648, 649, 647, 650, - 651, 652, 655, 656, 657, 658, 653, 654, 659, 606, - 187, 202, 327, 0, 401, 261, 502, 481, 477, 0, - 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 189, 190, 203, 212, 222, 235, 250, - 258, 269, 274, 277, 282, 283, 286, 291, 337, 343, - 344, 345, 346, 363, 364, 365, 368, 371, 372, 375, - 377, 378, 381, 388, 389, 390, 391, 393, 395, 402, - 406, 414, 415, 416, 417, 418, 420, 421, 426, 427, - 428, 429, 437, 441, 459, 460, 472, 485, 490, 270, - 467, 491, 0, 336, 0, 0, 338, 254, 273, 284, - 0, 480, 438, 207, 408, 262, 196, 225, 210, 233, - 248, 251, 288, 347, 354, 383, 387, 267, 245, 223, - 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, - 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, - 0, 0, 0, 605, 0, 0, 0, 244, 610, 0, - 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, - 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, - 342, 382, 443, 376, 617, 329, 0, 0, 434, 355, - 0, 0, 0, 0, 0, 612, 613, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, - 259, 0, 87, 0, 0, 184, 185, 186, 681, 688, - 689, 690, 691, 692, 682, 684, 0, 0, 217, 683, - 224, 628, 630, 629, 639, 640, 641, 642, 643, 644, - 645, 626, 686, 693, 694, 0, 239, 285, 246, 238, - 453, 0, 0, 0, 0, 0, 0, 0, 209, 0, - 0, 0, 0, 0, 0, 0, 588, 602, 0, 616, - 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 599, 600, - 775, 0, 0, 0, 665, 0, 601, 0, 0, 609, - 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, - 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, - 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, - 735, 611, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 268, 0, 356, 231, 0, 664, 0, 0, 487, - 0, 0, 662, 0, 0, 0, 0, 324, 0, 293, - 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, - 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, - 392, 260, 0, 0, 410, 330, 458, 399, 468, 488, + 0, 858, 0, 0, 0, 814, 0, 833, 905, 0, + 796, 268, 808, 356, 231, 0, 909, 919, 855, 487, + 923, 853, 852, 899, 812, 915, 846, 324, 810, 293, + 188, 205, 0, 844, 366, 407, 413, 914, 829, 838, + 229, 836, 411, 380, 471, 213, 257, 404, 385, 409, + 392, 260, 878, 897, 410, 330, 458, 399, 468, 488, 489, 237, 360, 478, 447, 484, 501, 206, 234, 374, 440, 474, 431, 353, 454, 455, 292, 430, 266, 191, - 328, 494, 204, 419, 221, 211, 197, 442, 466, 218, + 328, 494, 204, 419, 221, 211, 197, 442, 1337, 218, 422, 0, 0, 503, 199, 464, 439, 349, 289, 290, 198, 0, 403, 242, 264, 232, 369, 461, 462, 230, - 504, 208, 483, 201, 0, 482, 362, 457, 465, 350, - 340, 200, 463, 348, 339, 295, 634, 635, 253, 275, + 504, 208, 483, 201, 809, 482, 362, 457, 465, 350, + 340, 200, 463, 348, 339, 295, 314, 315, 253, 275, 397, 333, 398, 276, 358, 357, 359, 194, 475, 0, - 195, 0, 436, 476, 505, 214, 215, 216, 0, 252, + 195, 0, 436, 476, 505, 214, 215, 216, 824, 252, 256, 263, 265, 271, 272, 279, 326, 373, 396, 394, - 400, 0, 452, 469, 479, 486, 492, 493, 495, 496, - 497, 498, 499, 500, 361, 278, 432, 294, 331, 0, - 0, 379, 412, 219, 473, 433, 671, 663, 621, 675, - 623, 672, 673, 618, 619, 622, 674, 506, 507, 508, + 400, 910, 452, 469, 479, 486, 492, 493, 495, 496, + 497, 498, 499, 500, 795, 789, 788, 294, 331, 902, + 941, 379, 412, 219, 473, 433, 819, 823, 817, 884, + 818, 873, 874, 820, 932, 933, 934, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 0, 666, 608, 607, 0, - 614, 615, 0, 624, 625, 627, 631, 632, 633, 636, - 637, 638, 646, 648, 649, 647, 650, 651, 652, 655, - 656, 657, 658, 653, 654, 659, 606, 187, 202, 327, - 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 519, 520, 521, 522, 523, 0, 906, 813, 0, 821, + 822, 0, 912, 921, 922, 524, 341, 424, 470, 296, + 308, 311, 301, 320, 0, 321, 297, 298, 303, 305, + 306, 307, 312, 313, 317, 323, 877, 187, 202, 327, + 937, 401, 261, 502, 481, 477, 798, 816, 236, 827, + 835, 0, 841, 849, 850, 862, 864, 865, 866, 867, + 885, 886, 888, 896, 898, 901, 903, 908, 918, 940, 189, 190, 203, 212, 222, 235, 250, 258, 269, 274, 277, 282, 283, 286, 291, 337, 343, 344, 345, 346, 363, 364, 365, 368, 371, 372, 375, 377, 378, 381, 388, 389, 390, 391, 393, 395, 402, 406, 414, 415, 416, 417, 418, 420, 421, 426, 427, 428, 429, 437, 441, 459, 460, 472, 485, 490, 270, 467, 491, 0, - 336, 0, 0, 338, 254, 273, 284, 0, 480, 438, + 336, 876, 882, 338, 254, 273, 284, 891, 480, 438, 207, 408, 262, 196, 225, 210, 233, 248, 251, 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, - 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, - 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, - 605, 0, 0, 0, 244, 610, 0, 0, 0, 325, - 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, - 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, - 376, 617, 329, 0, 0, 434, 355, 0, 0, 0, - 0, 0, 612, 613, 0, 0, 0, 0, 0, 0, - 0, 0, 287, 226, 192, 367, 435, 259, 0, 87, - 0, 0, 184, 185, 186, 681, 688, 689, 690, 691, - 692, 682, 684, 0, 0, 217, 683, 224, 628, 630, - 629, 639, 640, 641, 642, 643, 644, 645, 626, 686, - 693, 694, 0, 239, 285, 246, 238, 453, 0, 0, - 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, - 0, 0, 0, 588, 602, 0, 616, 0, 0, 0, - 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 599, 600, 0, 0, 0, - 0, 665, 0, 601, 0, 0, 609, 695, 696, 697, - 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, - 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, - 728, 729, 730, 731, 732, 733, 734, 735, 611, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, - 356, 231, 0, 664, 0, 0, 487, 0, 0, 662, - 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, - 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, - 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, - 0, 410, 330, 458, 399, 468, 488, 489, 237, 360, - 478, 447, 484, 501, 206, 234, 374, 440, 474, 431, - 353, 454, 455, 292, 430, 266, 191, 328, 494, 204, - 419, 221, 211, 197, 442, 466, 218, 422, 0, 0, - 503, 199, 464, 439, 349, 289, 290, 198, 0, 403, - 242, 264, 232, 369, 461, 462, 230, 504, 208, 483, - 201, 0, 482, 362, 457, 465, 350, 340, 200, 463, - 348, 339, 295, 634, 635, 253, 275, 397, 333, 398, - 276, 358, 357, 359, 194, 475, 0, 195, 0, 436, - 476, 505, 214, 215, 216, 0, 252, 256, 263, 265, - 271, 272, 279, 326, 373, 396, 394, 400, 0, 452, - 469, 479, 486, 492, 493, 495, 496, 497, 498, 499, - 500, 361, 278, 432, 294, 331, 0, 0, 379, 412, - 219, 473, 433, 671, 663, 621, 675, 623, 672, 673, - 618, 619, 622, 674, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 0, 666, 608, 607, 0, 614, 615, 0, - 624, 625, 627, 631, 632, 633, 636, 637, 638, 646, - 648, 649, 647, 650, 651, 652, 655, 656, 657, 658, - 653, 654, 659, 606, 187, 202, 327, 0, 401, 261, - 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, + 444, 445, 446, 448, 351, 240, 386, 872, 900, 334, + 450, 451, 280, 352, 0, 0, 926, 911, 449, 0, + 857, 929, 826, 845, 939, 848, 851, 893, 805, 871, + 370, 842, 797, 830, 800, 837, 801, 828, 859, 244, + 825, 913, 875, 928, 325, 241, 807, 831, 384, 847, + 193, 895, 425, 228, 335, 332, 456, 255, 247, 243, + 227, 281, 342, 382, 443, 376, 935, 329, 881, 0, + 434, 355, 0, 0, 0, 861, 917, 869, 907, 856, + 894, 815, 880, 930, 843, 890, 931, 287, 226, 192, + 367, 435, 259, 0, 0, 0, 0, 184, 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 189, 190, 203, - 212, 222, 235, 250, 258, 269, 274, 277, 282, 283, - 286, 291, 337, 343, 344, 345, 346, 363, 364, 365, - 368, 371, 372, 375, 377, 378, 381, 388, 389, 390, - 391, 393, 395, 402, 406, 414, 415, 416, 417, 418, - 420, 421, 426, 427, 428, 429, 437, 441, 459, 460, - 472, 485, 490, 270, 467, 491, 0, 336, 0, 0, - 338, 254, 273, 284, 0, 480, 438, 207, 408, 262, - 196, 225, 210, 233, 248, 251, 288, 347, 354, 383, - 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, - 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, + 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, + 309, 316, 322, 839, 887, 925, 840, 889, 239, 285, + 246, 238, 453, 936, 916, 804, 868, 924, 0, 0, + 943, 927, 863, 0, 892, 0, 942, 799, 883, 0, + 802, 806, 938, 920, 834, 249, 0, 0, 0, 0, + 0, 0, 0, 860, 870, 904, 854, 0, 0, 0, + 0, 0, 0, 0, 832, 0, 879, 0, 0, 0, + 811, 803, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 858, 0, 0, 0, 814, 0, 833, + 905, 0, 796, 268, 808, 356, 231, 0, 909, 919, + 855, 487, 923, 853, 852, 899, 812, 915, 846, 324, + 810, 293, 188, 205, 0, 844, 366, 407, 413, 914, + 829, 838, 229, 836, 411, 380, 471, 213, 257, 404, + 385, 409, 392, 260, 878, 897, 410, 330, 458, 399, + 468, 488, 489, 237, 360, 478, 447, 484, 501, 206, + 234, 374, 440, 474, 431, 353, 454, 455, 292, 430, + 266, 191, 328, 494, 204, 419, 221, 211, 197, 442, + 786, 218, 422, 0, 0, 503, 199, 464, 439, 349, + 289, 290, 198, 0, 403, 242, 264, 232, 369, 461, + 462, 230, 504, 208, 483, 201, 809, 482, 362, 457, + 465, 350, 340, 200, 463, 348, 339, 295, 314, 315, + 253, 275, 397, 333, 398, 276, 358, 357, 359, 194, + 475, 0, 195, 0, 436, 476, 505, 214, 215, 216, + 824, 252, 256, 263, 265, 271, 272, 279, 326, 373, + 396, 394, 400, 910, 452, 469, 479, 486, 492, 493, + 495, 496, 497, 498, 499, 500, 795, 789, 788, 294, + 331, 902, 941, 379, 412, 219, 473, 433, 819, 823, + 817, 884, 818, 873, 874, 820, 932, 933, 934, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 0, 906, 813, + 0, 821, 822, 0, 912, 921, 922, 524, 341, 424, + 470, 296, 308, 311, 301, 320, 0, 321, 297, 298, + 303, 305, 306, 307, 312, 313, 317, 323, 877, 187, + 202, 327, 937, 401, 261, 502, 481, 477, 798, 816, + 236, 827, 835, 0, 841, 849, 850, 862, 864, 865, + 866, 867, 885, 886, 888, 896, 898, 901, 903, 908, + 918, 940, 189, 190, 203, 212, 222, 235, 250, 258, + 269, 274, 277, 282, 283, 286, 291, 337, 343, 344, + 345, 346, 363, 364, 365, 368, 371, 372, 375, 377, + 378, 381, 388, 389, 390, 391, 393, 395, 402, 406, + 414, 415, 416, 417, 418, 420, 421, 426, 427, 428, + 429, 437, 441, 459, 460, 472, 485, 490, 270, 467, + 491, 0, 336, 876, 882, 338, 254, 273, 284, 891, + 480, 438, 207, 408, 262, 196, 225, 210, 233, 248, + 251, 288, 347, 354, 383, 387, 267, 245, 223, 405, + 220, 423, 444, 445, 446, 448, 351, 240, 386, 872, + 900, 334, 450, 451, 280, 352, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 370, 0, 0, 0, 0, 605, 0, 0, - 0, 244, 610, 0, 0, 0, 325, 241, 0, 0, + 0, 0, 370, 0, 0, 1729, 0, 605, 0, 0, + 0, 244, 610, 0, 0, 0, 325, 241, 0, 1730, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 617, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 612, @@ -3144,9 +2647,9 @@ var yyAct = [...]int{ 641, 642, 643, 644, 645, 626, 686, 693, 694, 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, 0, - 0, 602, 0, 616, 0, 0, 0, 249, 0, 0, + 588, 602, 0, 616, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 599, 600, 0, 0, 0, 0, 665, 0, + 0, 0, 599, 600, 775, 0, 0, 0, 665, 0, 601, 0, 0, 609, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, @@ -3191,28 +2694,28 @@ var yyAct = [...]int{ 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, - 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, + 0, 0, 0, 0, 605, 0, 0, 0, 244, 610, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, - 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, - 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 281, 342, 382, 443, 376, 617, 329, 0, 0, 434, + 355, 0, 0, 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, - 435, 259, 0, 0, 0, 0, 184, 185, 186, 0, - 688, 689, 0, 0, 0, 0, 1640, 0, 0, 217, - 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, - 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, - 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 435, 259, 0, 87, 0, 0, 184, 185, 186, 681, + 688, 689, 690, 691, 692, 682, 684, 0, 0, 217, + 683, 224, 628, 630, 629, 639, 640, 641, 642, 643, + 644, 645, 626, 686, 693, 694, 0, 239, 285, 246, + 238, 453, 0, 0, 1695, 1696, 1697, 0, 0, 209, + 0, 0, 0, 0, 0, 0, 0, 588, 602, 0, + 616, 0, 0, 0, 249, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, + 600, 0, 0, 0, 0, 665, 0, 601, 0, 0, + 609, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, - 734, 735, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 268, 0, 356, 231, 0, 0, 0, 0, - 487, 0, 0, 0, 0, 0, 0, 0, 324, 0, + 734, 735, 611, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 268, 0, 356, 231, 0, 664, 0, 0, + 487, 0, 0, 662, 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, 330, 458, 399, 468, @@ -3222,19 +2725,19 @@ var yyAct = [...]int{ 218, 422, 0, 0, 503, 199, 464, 439, 349, 289, 290, 198, 0, 403, 242, 264, 232, 369, 461, 462, 230, 504, 208, 483, 201, 0, 482, 362, 457, 465, - 350, 340, 200, 463, 348, 339, 295, 314, 315, 253, + 350, 340, 200, 463, 348, 339, 295, 634, 635, 253, 275, 397, 333, 398, 276, 358, 357, 359, 194, 475, 0, 195, 0, 436, 476, 505, 214, 215, 216, 0, 252, 256, 263, 265, 271, 272, 279, 326, 373, 396, 394, 400, 0, 452, 469, 479, 486, 492, 493, 495, 496, 497, 498, 499, 500, 361, 278, 432, 294, 331, - 0, 0, 379, 412, 219, 473, 433, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 506, 507, + 0, 0, 379, 412, 219, 473, 433, 671, 663, 621, + 675, 623, 672, 673, 618, 619, 622, 674, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 524, 341, 424, 470, - 296, 308, 311, 301, 320, 0, 321, 297, 298, 303, - 305, 306, 307, 312, 313, 317, 323, 0, 187, 202, + 518, 519, 520, 521, 522, 523, 0, 666, 608, 607, + 0, 614, 615, 0, 624, 625, 627, 631, 632, 633, + 636, 637, 638, 646, 648, 649, 647, 650, 651, 652, + 655, 656, 657, 658, 653, 654, 659, 606, 187, 202, 327, 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3250,29 +2753,29 @@ var yyAct = [...]int{ 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, - 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, + 0, 605, 0, 0, 0, 244, 610, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, - 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, - 0, 0, 0, 184, 185, 186, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, - 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, - 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, - 0, 0, 0, 0, 0, 0, 209, 0, 991, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 443, 376, 617, 329, 0, 0, 434, 355, 0, 0, + 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, + 0, 1811, 0, 287, 226, 192, 367, 435, 259, 0, + 87, 0, 0, 184, 185, 186, 681, 688, 689, 690, + 691, 692, 682, 684, 0, 0, 217, 683, 224, 628, + 630, 629, 639, 640, 641, 642, 643, 644, 645, 626, + 686, 693, 694, 1812, 239, 285, 246, 238, 453, 0, + 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, + 0, 0, 0, 0, 588, 602, 0, 616, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 599, 600, 0, 0, + 0, 0, 665, 0, 601, 0, 0, 609, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, - 0, 356, 231, 0, 0, 0, 990, 487, 0, 0, - 0, 0, 0, 987, 988, 324, 951, 293, 188, 205, - 981, 985, 366, 407, 413, 0, 0, 0, 229, 0, + 0, 356, 231, 0, 664, 0, 0, 487, 0, 0, + 662, 0, 0, 0, 0, 324, 0, 293, 188, 205, + 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, 330, 458, 399, 468, 488, 489, 237, 360, 478, 447, 484, 501, 206, 234, 374, 440, 474, @@ -3281,19 +2784,19 @@ var yyAct = [...]int{ 0, 503, 199, 464, 439, 349, 289, 290, 198, 0, 403, 242, 264, 232, 369, 461, 462, 230, 504, 208, 483, 201, 0, 482, 362, 457, 465, 350, 340, 200, - 463, 348, 339, 295, 314, 315, 253, 275, 397, 333, + 463, 348, 339, 295, 634, 635, 253, 275, 397, 333, 398, 276, 358, 357, 359, 194, 475, 0, 195, 0, 436, 476, 505, 214, 215, 216, 0, 252, 256, 263, 265, 271, 272, 279, 326, 373, 396, 394, 400, 0, 452, 469, 479, 486, 492, 493, 495, 496, 497, 498, 499, 500, 361, 278, 432, 294, 331, 0, 0, 379, - 412, 219, 473, 433, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 507, 508, 509, 510, + 412, 219, 473, 433, 671, 663, 621, 675, 623, 672, + 673, 618, 619, 622, 674, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, - 521, 522, 523, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 524, 341, 424, 470, 296, 308, 311, - 301, 320, 0, 321, 297, 298, 303, 305, 306, 307, - 312, 313, 317, 323, 0, 187, 202, 327, 0, 401, + 521, 522, 523, 0, 666, 608, 607, 0, 614, 615, + 0, 624, 625, 627, 631, 632, 633, 636, 637, 638, + 646, 648, 649, 647, 650, 651, 652, 655, 656, 657, + 658, 653, 654, 659, 606, 187, 202, 327, 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, @@ -3309,28 +2812,28 @@ var yyAct = [...]int{ 446, 448, 351, 240, 386, 0, 0, 334, 450, 451, 280, 352, 0, 0, 0, 78, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, - 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, + 0, 0, 0, 605, 0, 0, 0, 244, 610, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, - 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 342, 382, 443, 376, 617, 329, 0, 0, 434, 355, + 0, 0, 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, - 259, 0, 87, 0, 0, 184, 185, 186, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, - 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, - 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, + 259, 0, 87, 0, 0, 184, 185, 186, 681, 688, + 689, 690, 691, 692, 682, 684, 0, 0, 217, 683, + 224, 628, 630, 629, 639, 640, 641, 642, 643, 644, + 645, 626, 686, 693, 694, 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 588, 602, 0, 616, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 268, 0, 356, 231, 0, 0, 0, 0, 487, - 0, 0, 0, 0, 0, 0, 0, 324, 0, 293, + 0, 0, 0, 0, 0, 0, 0, 0, 599, 600, + 0, 0, 0, 0, 665, 0, 601, 0, 0, 609, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 611, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 268, 0, 356, 231, 0, 664, 0, 0, 487, + 0, 0, 662, 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, 330, 458, 399, 468, 488, @@ -3340,21 +2843,21 @@ var yyAct = [...]int{ 422, 0, 0, 503, 199, 464, 439, 349, 289, 290, 198, 0, 403, 242, 264, 232, 369, 461, 462, 230, 504, 208, 483, 201, 0, 482, 362, 457, 465, 350, - 340, 200, 463, 348, 339, 295, 314, 315, 253, 275, + 340, 200, 463, 348, 339, 295, 634, 635, 253, 275, 397, 333, 398, 276, 358, 357, 359, 194, 475, 0, 195, 0, 436, 476, 505, 214, 215, 216, 0, 252, 256, 263, 265, 271, 272, 279, 326, 373, 396, 394, 400, 0, 452, 469, 479, 486, 492, 493, 495, 496, 497, 498, 499, 500, 361, 278, 432, 294, 331, 0, - 0, 379, 412, 219, 473, 433, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 506, 507, 508, + 0, 379, 412, 219, 473, 433, 671, 663, 621, 675, + 623, 672, 673, 618, 619, 622, 674, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 524, 341, 424, 470, 296, - 308, 311, 301, 320, 0, 321, 297, 298, 303, 305, - 306, 307, 312, 313, 317, 323, 0, 187, 202, 327, + 519, 520, 521, 522, 523, 0, 666, 608, 607, 0, + 614, 615, 0, 624, 625, 627, 631, 632, 633, 636, + 637, 638, 646, 648, 649, 647, 650, 651, 652, 655, + 656, 657, 658, 653, 654, 659, 606, 187, 202, 327, 86, 401, 261, 502, 481, 477, 0, 0, 236, 0, - 0, 0, 0, 0, 0, 1799, 0, 0, 1798, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, 203, 212, 222, 235, 250, 258, 269, 274, 277, 282, 283, 286, 291, 337, 343, 344, 345, 346, @@ -3365,33 +2868,33 @@ var yyAct = [...]int{ 336, 0, 0, 338, 254, 273, 284, 0, 480, 438, 207, 408, 262, 196, 225, 210, 233, 248, 251, 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, - 444, 445, 446, 448, 351, 240, 386, 0, 1323, 334, + 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 370, 0, 0, 0, 1325, - 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, + 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, + 605, 0, 0, 0, 244, 610, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, - 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 287, 226, 192, 367, 435, 259, 0, 0, - 0, 0, 184, 185, 186, 0, 1327, 0, 0, 0, - 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, - 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, - 0, 0, 0, 239, 285, 246, 238, 453, 0, 0, - 0, 0, 0, 0, 0, 209, 0, 0, 0, 1156, - 0, 1157, 1158, 0, 0, 0, 0, 0, 0, 0, + 376, 617, 329, 0, 0, 434, 355, 0, 0, 0, + 0, 0, 612, 613, 0, 0, 0, 0, 0, 0, + 0, 0, 287, 226, 192, 367, 435, 259, 0, 87, + 0, 0, 184, 185, 186, 681, 688, 689, 690, 691, + 692, 682, 684, 0, 0, 217, 683, 224, 628, 630, + 629, 639, 640, 641, 642, 643, 644, 645, 626, 686, + 693, 694, 0, 239, 285, 246, 238, 453, 0, 0, + 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, + 0, 0, 0, 588, 602, 0, 616, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 599, 600, 0, 0, 0, + 0, 665, 0, 601, 0, 0, 609, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, - 356, 231, 0, 0, 0, 0, 487, 0, 0, 0, + 356, 231, 0, 664, 0, 0, 487, 0, 0, 662, 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, - 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, + 380, 471, 213, 257, 404, 385, 409, 392, 260, 2825, 0, 410, 330, 458, 399, 468, 488, 489, 237, 360, 478, 447, 484, 501, 206, 234, 374, 440, 474, 431, 353, 454, 455, 292, 430, 266, 191, 328, 494, 204, @@ -3399,19 +2902,19 @@ var yyAct = [...]int{ 503, 199, 464, 439, 349, 289, 290, 198, 0, 403, 242, 264, 232, 369, 461, 462, 230, 504, 208, 483, 201, 0, 482, 362, 457, 465, 350, 340, 200, 463, - 348, 339, 295, 314, 315, 253, 275, 397, 333, 398, + 348, 339, 295, 634, 635, 253, 275, 397, 333, 398, 276, 358, 357, 359, 194, 475, 0, 195, 0, 436, 476, 505, 214, 215, 216, 0, 252, 256, 263, 265, 271, 272, 279, 326, 373, 396, 394, 400, 0, 452, 469, 479, 486, 492, 493, 495, 496, 497, 498, 499, 500, 361, 278, 432, 294, 331, 0, 0, 379, 412, - 219, 473, 433, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 506, 507, 508, 509, 510, 511, + 219, 473, 433, 671, 663, 621, 675, 623, 672, 673, + 618, 619, 622, 674, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 524, 341, 424, 470, 296, 308, 311, 301, - 320, 0, 321, 297, 298, 303, 305, 306, 307, 312, - 313, 317, 323, 0, 187, 202, 327, 0, 401, 261, + 522, 523, 0, 666, 608, 607, 0, 614, 615, 0, + 624, 625, 627, 631, 632, 633, 636, 637, 638, 646, + 648, 649, 647, 650, 651, 652, 655, 656, 657, 658, + 653, 654, 659, 606, 187, 202, 327, 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, 203, @@ -3426,28 +2929,28 @@ var yyAct = [...]int{ 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, - 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, + 0, 0, 370, 0, 0, 0, 0, 605, 0, 0, + 0, 244, 610, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, - 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, - 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, - 226, 192, 367, 435, 259, 0, 0, 0, 0, 184, - 185, 186, 1266, 1269, 0, 0, 0, 0, 1265, 1268, - 0, 0, 217, 1264, 224, 310, 319, 318, 299, 300, - 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, + 247, 243, 227, 281, 342, 382, 443, 376, 617, 329, + 0, 0, 434, 355, 0, 0, 0, 0, 0, 612, + 613, 0, 0, 0, 0, 0, 0, 0, 0, 287, + 226, 192, 367, 435, 259, 0, 87, 0, 1304, 184, + 185, 186, 681, 688, 689, 690, 691, 692, 682, 684, + 0, 0, 217, 683, 224, 628, 630, 629, 639, 640, + 641, 642, 643, 644, 645, 626, 686, 693, 694, 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 588, 602, 0, 616, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 599, 600, 0, 0, 0, 0, 665, 0, + 601, 0, 0, 609, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 356, 231, 0, - 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, + 664, 0, 0, 487, 0, 0, 662, 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, 330, @@ -3458,19 +2961,19 @@ var yyAct = [...]int{ 439, 349, 289, 290, 198, 0, 403, 242, 264, 232, 369, 461, 462, 230, 504, 208, 483, 201, 0, 482, 362, 457, 465, 350, 340, 200, 463, 348, 339, 295, - 314, 315, 253, 275, 397, 333, 398, 276, 358, 357, + 634, 635, 253, 275, 397, 333, 398, 276, 358, 357, 359, 194, 475, 0, 195, 0, 436, 476, 505, 214, 215, 216, 0, 252, 256, 263, 265, 271, 272, 279, 326, 373, 396, 394, 400, 0, 452, 469, 479, 486, 492, 493, 495, 496, 497, 498, 499, 500, 361, 278, 432, 294, 331, 0, 0, 379, 412, 219, 473, 433, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 671, 663, 621, 675, 623, 672, 673, 618, 619, 622, + 674, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, - 341, 424, 470, 296, 308, 311, 301, 320, 0, 321, - 297, 298, 303, 305, 306, 307, 312, 313, 317, 323, - 0, 187, 202, 327, 0, 401, 261, 502, 481, 477, + 666, 608, 607, 0, 614, 615, 0, 624, 625, 627, + 631, 632, 633, 636, 637, 638, 646, 648, 649, 647, + 650, 651, 652, 655, 656, 657, 658, 653, 654, 659, + 606, 187, 202, 327, 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, 203, 212, 222, 235, @@ -3483,139 +2986,432 @@ var yyAct = [...]int{ 284, 0, 480, 438, 207, 408, 262, 196, 225, 210, 233, 248, 251, 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, - 386, 0, 0, 334, 450, 451, 280, 352, 0, 0, - 0, 78, 449, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, - 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, - 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, - 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, - 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, + 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, + 0, 0, 0, 0, 605, 0, 0, 0, 244, 610, + 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, + 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, + 281, 342, 382, 443, 376, 617, 329, 0, 0, 434, + 355, 0, 0, 0, 0, 0, 612, 613, 0, 0, + 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, + 435, 259, 0, 87, 0, 0, 184, 185, 186, 681, + 688, 689, 690, 691, 692, 682, 684, 0, 0, 217, + 683, 224, 628, 630, 629, 639, 640, 641, 642, 643, + 644, 645, 626, 686, 693, 694, 0, 239, 285, 246, + 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, + 0, 0, 0, 0, 0, 0, 0, 588, 602, 0, + 616, 0, 0, 0, 249, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, + 600, 775, 0, 0, 0, 665, 0, 601, 0, 0, + 609, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 611, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 268, 0, 356, 231, 0, 664, 0, 0, + 487, 0, 0, 662, 0, 0, 0, 0, 324, 0, + 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, + 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, + 409, 392, 260, 0, 0, 410, 330, 458, 399, 468, + 488, 489, 237, 360, 478, 447, 484, 501, 206, 234, + 374, 440, 474, 431, 353, 454, 455, 292, 430, 266, + 191, 328, 494, 204, 419, 221, 211, 197, 442, 466, + 218, 422, 0, 0, 503, 199, 464, 439, 349, 289, + 290, 198, 0, 403, 242, 264, 232, 369, 461, 462, + 230, 504, 208, 483, 201, 0, 482, 362, 457, 465, + 350, 340, 200, 463, 348, 339, 295, 634, 635, 253, + 275, 397, 333, 398, 276, 358, 357, 359, 194, 475, + 0, 195, 0, 436, 476, 505, 214, 215, 216, 0, + 252, 256, 263, 265, 271, 272, 279, 326, 373, 396, + 394, 400, 0, 452, 469, 479, 486, 492, 493, 495, + 496, 497, 498, 499, 500, 361, 278, 432, 294, 331, + 0, 0, 379, 412, 219, 473, 433, 671, 663, 621, + 675, 623, 672, 673, 618, 619, 622, 674, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 0, 666, 608, 607, + 0, 614, 615, 0, 624, 625, 627, 631, 632, 633, + 636, 637, 638, 646, 648, 649, 647, 650, 651, 652, + 655, 656, 657, 658, 653, 654, 659, 606, 187, 202, + 327, 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 287, 226, 192, 367, 435, 259, 0, 87, 0, - 1304, 184, 185, 186, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, - 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, - 0, 0, 239, 285, 246, 238, 453, 0, 0, 0, - 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 189, 190, 203, 212, 222, 235, 250, 258, 269, + 274, 277, 282, 283, 286, 291, 337, 343, 344, 345, + 346, 363, 364, 365, 368, 371, 372, 375, 377, 378, + 381, 388, 389, 390, 391, 393, 395, 402, 406, 414, + 415, 416, 417, 418, 420, 421, 426, 427, 428, 429, + 437, 441, 459, 460, 472, 485, 490, 270, 467, 491, + 0, 336, 0, 0, 338, 254, 273, 284, 0, 480, + 438, 207, 408, 262, 196, 225, 210, 233, 248, 251, + 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, + 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, + 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, + 0, 605, 0, 0, 0, 244, 610, 0, 0, 0, + 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, + 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, + 443, 376, 617, 329, 0, 0, 434, 355, 0, 0, + 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, + 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, + 87, 0, 0, 184, 185, 186, 681, 688, 689, 690, + 691, 692, 682, 684, 0, 0, 217, 683, 224, 628, + 630, 629, 639, 640, 641, 642, 643, 644, 645, 626, + 686, 693, 694, 0, 239, 285, 246, 238, 453, 0, + 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, + 0, 0, 0, 0, 588, 602, 0, 616, 0, 0, + 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 599, 600, 0, 0, + 0, 0, 665, 0, 601, 0, 0, 609, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 611, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, + 0, 356, 231, 0, 664, 0, 0, 487, 0, 0, + 662, 0, 0, 0, 0, 324, 0, 293, 188, 205, + 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, + 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, + 0, 0, 410, 330, 458, 399, 468, 488, 489, 237, + 360, 478, 447, 484, 501, 206, 234, 374, 440, 474, + 431, 353, 454, 455, 292, 430, 266, 191, 328, 494, + 204, 419, 221, 211, 197, 442, 466, 218, 422, 0, + 0, 503, 199, 464, 439, 349, 289, 290, 198, 0, + 403, 242, 264, 232, 369, 461, 462, 230, 504, 208, + 483, 201, 0, 482, 362, 457, 465, 350, 340, 200, + 463, 348, 339, 295, 634, 635, 253, 275, 397, 333, + 398, 276, 358, 357, 359, 194, 475, 0, 195, 0, + 436, 476, 505, 214, 215, 216, 0, 252, 256, 263, + 265, 271, 272, 279, 326, 373, 396, 394, 400, 0, + 452, 469, 479, 486, 492, 493, 495, 496, 497, 498, + 499, 500, 361, 278, 432, 294, 331, 0, 0, 379, + 412, 219, 473, 433, 671, 663, 621, 675, 623, 672, + 673, 618, 619, 622, 674, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 0, 666, 608, 607, 0, 614, 615, + 0, 624, 625, 627, 631, 632, 633, 636, 637, 638, + 646, 648, 649, 647, 650, 651, 652, 655, 656, 657, + 658, 653, 654, 659, 606, 187, 202, 327, 0, 401, + 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, + 203, 212, 222, 235, 250, 258, 269, 274, 277, 282, + 283, 286, 291, 337, 343, 344, 345, 346, 363, 364, + 365, 368, 371, 372, 375, 377, 378, 381, 388, 389, + 390, 391, 393, 395, 402, 406, 414, 415, 416, 417, + 418, 420, 421, 426, 427, 428, 429, 437, 441, 459, + 460, 472, 485, 490, 270, 467, 491, 0, 336, 0, + 0, 338, 254, 273, 284, 0, 480, 438, 207, 408, + 262, 196, 225, 210, 233, 248, 251, 288, 347, 354, + 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, + 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, + 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 370, 0, 0, 0, 0, 605, 0, + 0, 0, 244, 610, 0, 0, 0, 325, 241, 0, + 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, + 255, 247, 243, 227, 281, 342, 382, 443, 376, 617, + 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, + 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, + 287, 226, 192, 367, 435, 259, 0, 87, 0, 0, + 184, 185, 186, 681, 688, 689, 690, 691, 692, 682, + 684, 0, 0, 217, 683, 224, 628, 630, 629, 639, + 640, 641, 642, 643, 644, 645, 626, 686, 693, 694, + 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, + 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, + 0, 0, 602, 0, 616, 0, 0, 0, 249, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 599, 600, 0, 0, 0, 0, 665, + 0, 601, 0, 0, 609, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 611, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 268, 0, 356, 231, + 0, 664, 0, 0, 487, 0, 0, 662, 0, 0, + 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, + 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, + 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, + 330, 458, 399, 468, 488, 489, 237, 360, 478, 447, + 484, 501, 206, 234, 374, 440, 474, 431, 353, 454, + 455, 292, 430, 266, 191, 328, 494, 204, 419, 221, + 211, 197, 442, 466, 218, 422, 0, 0, 503, 199, + 464, 439, 349, 289, 290, 198, 0, 403, 242, 264, + 232, 369, 461, 462, 230, 504, 208, 483, 201, 0, + 482, 362, 457, 465, 350, 340, 200, 463, 348, 339, + 295, 634, 635, 253, 275, 397, 333, 398, 276, 358, + 357, 359, 194, 475, 0, 195, 0, 436, 476, 505, + 214, 215, 216, 0, 252, 256, 263, 265, 271, 272, + 279, 326, 373, 396, 394, 400, 0, 452, 469, 479, + 486, 492, 493, 495, 496, 497, 498, 499, 500, 361, + 278, 432, 294, 331, 0, 0, 379, 412, 219, 473, + 433, 671, 663, 621, 675, 623, 672, 673, 618, 619, + 622, 674, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 0, 666, 608, 607, 0, 614, 615, 0, 624, 625, + 627, 631, 632, 633, 636, 637, 638, 646, 648, 649, + 647, 650, 651, 652, 655, 656, 657, 658, 653, 654, + 659, 606, 187, 202, 327, 0, 401, 261, 502, 481, + 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 189, 190, 203, 212, 222, + 235, 250, 258, 269, 274, 277, 282, 283, 286, 291, + 337, 343, 344, 345, 346, 363, 364, 365, 368, 371, + 372, 375, 377, 378, 381, 388, 389, 390, 391, 393, + 395, 402, 406, 414, 415, 416, 417, 418, 420, 421, + 426, 427, 428, 429, 437, 441, 459, 460, 472, 485, + 490, 270, 467, 491, 0, 336, 0, 0, 338, 254, + 273, 284, 0, 480, 438, 207, 408, 262, 196, 225, + 210, 233, 248, 251, 288, 347, 354, 383, 387, 267, + 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, + 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 370, 0, 0, 0, 0, 0, 0, 0, 0, 244, + 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, + 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, + 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, + 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, + 367, 435, 259, 0, 0, 0, 0, 184, 185, 186, + 0, 688, 689, 0, 0, 0, 0, 1640, 0, 0, + 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, + 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, + 246, 238, 453, 0, 0, 0, 0, 0, 0, 0, + 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 268, 0, 356, 231, 0, 0, 0, + 0, 487, 0, 0, 0, 0, 0, 0, 0, 324, + 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, + 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, + 385, 409, 392, 260, 0, 0, 410, 330, 458, 399, + 468, 488, 489, 237, 360, 478, 447, 484, 501, 206, + 234, 374, 440, 474, 431, 353, 454, 455, 292, 430, + 266, 191, 328, 494, 204, 419, 221, 211, 197, 442, + 466, 218, 422, 0, 0, 503, 199, 464, 439, 349, + 289, 290, 198, 0, 403, 242, 264, 232, 369, 461, + 462, 230, 504, 208, 483, 201, 0, 482, 362, 457, + 465, 350, 340, 200, 463, 348, 339, 295, 314, 315, + 253, 275, 397, 333, 398, 276, 358, 357, 359, 194, + 475, 0, 195, 0, 436, 476, 505, 214, 215, 216, + 0, 252, 256, 263, 265, 271, 272, 279, 326, 373, + 396, 394, 400, 0, 452, 469, 479, 486, 492, 493, + 495, 496, 497, 498, 499, 500, 361, 278, 432, 294, + 331, 0, 0, 379, 412, 219, 473, 433, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 524, 341, 424, + 470, 296, 308, 311, 301, 320, 0, 321, 297, 298, + 303, 305, 306, 307, 312, 313, 317, 323, 0, 187, + 202, 327, 0, 401, 261, 502, 481, 477, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 189, 190, 203, 212, 222, 235, 250, 258, + 269, 274, 277, 282, 283, 286, 291, 337, 343, 344, + 345, 346, 363, 364, 365, 368, 371, 372, 375, 377, + 378, 381, 388, 389, 390, 391, 393, 395, 402, 406, + 414, 415, 416, 417, 418, 420, 421, 426, 427, 428, + 429, 437, 441, 459, 460, 472, 485, 490, 270, 467, + 491, 0, 336, 0, 0, 338, 254, 273, 284, 0, + 480, 438, 207, 408, 262, 196, 225, 210, 233, 248, + 251, 288, 347, 354, 383, 387, 267, 245, 223, 405, + 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, + 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, + 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, + 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, + 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, + 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, + 0, 0, 0, 0, 184, 185, 186, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, + 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, + 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, + 0, 0, 0, 0, 0, 0, 0, 209, 0, 991, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 268, 0, 356, 231, 0, 0, 0, 990, 487, 0, + 0, 0, 0, 0, 987, 988, 324, 951, 293, 188, + 205, 981, 985, 366, 407, 413, 0, 0, 0, 229, + 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, + 260, 0, 0, 410, 330, 458, 399, 468, 488, 489, + 237, 360, 478, 447, 484, 501, 206, 234, 374, 440, + 474, 431, 353, 454, 455, 292, 430, 266, 191, 328, + 494, 204, 419, 221, 211, 197, 442, 466, 218, 422, + 0, 0, 503, 199, 464, 439, 349, 289, 290, 198, + 0, 403, 242, 264, 232, 369, 461, 462, 230, 504, + 208, 483, 201, 0, 482, 362, 457, 465, 350, 340, + 200, 463, 348, 339, 295, 314, 315, 253, 275, 397, + 333, 398, 276, 358, 357, 359, 194, 475, 0, 195, + 0, 436, 476, 505, 214, 215, 216, 0, 252, 256, + 263, 265, 271, 272, 279, 326, 373, 396, 394, 400, + 0, 452, 469, 479, 486, 492, 493, 495, 496, 497, + 498, 499, 500, 361, 278, 432, 294, 331, 0, 0, + 379, 412, 219, 473, 433, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 524, 341, 424, 470, 296, 308, + 311, 301, 320, 0, 321, 297, 298, 303, 305, 306, + 307, 312, 313, 317, 323, 0, 187, 202, 327, 0, + 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, + 190, 203, 212, 222, 235, 250, 258, 269, 274, 277, + 282, 283, 286, 291, 337, 343, 344, 345, 346, 363, + 364, 365, 368, 371, 372, 375, 377, 378, 381, 388, + 389, 390, 391, 393, 395, 402, 406, 414, 415, 416, + 417, 418, 420, 421, 426, 427, 428, 429, 437, 441, + 459, 460, 472, 485, 490, 270, 467, 491, 0, 336, + 0, 0, 338, 254, 273, 284, 0, 480, 438, 207, + 408, 262, 196, 225, 210, 233, 248, 251, 288, 347, + 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, + 445, 446, 448, 351, 240, 386, 0, 0, 334, 450, + 451, 280, 352, 0, 0, 0, 78, 449, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, + 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, + 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, + 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, + 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, + 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, + 435, 259, 0, 87, 0, 0, 184, 185, 186, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, + 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, + 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, + 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 268, 0, 356, - 231, 0, 0, 0, 0, 487, 0, 0, 0, 0, - 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, - 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, - 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, - 410, 330, 458, 399, 468, 488, 489, 237, 360, 478, - 447, 484, 501, 206, 234, 374, 440, 474, 431, 353, - 454, 455, 292, 430, 266, 191, 328, 494, 204, 419, - 221, 211, 197, 442, 466, 218, 422, 0, 0, 503, - 199, 464, 439, 349, 289, 290, 198, 0, 403, 242, - 264, 232, 369, 461, 462, 230, 504, 208, 483, 201, - 0, 482, 362, 457, 465, 350, 340, 200, 463, 348, - 339, 295, 314, 315, 253, 275, 397, 333, 398, 276, - 358, 357, 359, 194, 475, 0, 195, 0, 436, 476, - 505, 214, 215, 216, 0, 252, 256, 263, 265, 271, - 272, 279, 326, 373, 396, 394, 400, 0, 452, 469, - 479, 486, 492, 493, 495, 496, 497, 498, 499, 500, - 361, 278, 432, 294, 331, 0, 0, 379, 412, 219, - 473, 433, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 524, 341, 424, 470, 296, 308, 311, 301, 320, - 0, 321, 297, 298, 303, 305, 306, 307, 312, 313, - 317, 323, 0, 187, 202, 327, 86, 401, 261, 502, - 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 189, 190, 203, 212, - 222, 235, 250, 258, 269, 274, 277, 282, 283, 286, - 291, 337, 343, 344, 345, 346, 363, 364, 365, 368, - 371, 372, 375, 377, 378, 381, 388, 389, 390, 391, - 393, 395, 402, 406, 414, 415, 416, 417, 418, 420, - 421, 426, 427, 428, 429, 437, 441, 459, 460, 472, - 485, 490, 270, 467, 491, 0, 336, 0, 0, 338, - 254, 273, 284, 0, 480, 438, 207, 408, 262, 196, - 225, 210, 233, 248, 251, 288, 347, 354, 383, 387, - 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, - 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, - 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, - 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, - 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, - 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, - 192, 367, 435, 259, 0, 87, 0, 0, 184, 185, - 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, - 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, - 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, - 0, 209, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, + 0, 0, 268, 0, 356, 231, 0, 0, 0, 0, + 487, 0, 0, 0, 0, 0, 0, 0, 324, 0, + 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, + 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, + 409, 392, 260, 0, 0, 410, 330, 458, 399, 468, + 488, 489, 237, 360, 478, 447, 484, 501, 206, 234, + 374, 440, 474, 431, 353, 454, 455, 292, 430, 266, + 191, 328, 494, 204, 419, 221, 211, 197, 442, 466, + 218, 422, 0, 0, 503, 199, 464, 439, 349, 289, + 290, 198, 0, 403, 242, 264, 232, 369, 461, 462, + 230, 504, 208, 483, 201, 0, 482, 362, 457, 465, + 350, 340, 200, 463, 348, 339, 295, 314, 315, 253, + 275, 397, 333, 398, 276, 358, 357, 359, 194, 475, + 0, 195, 0, 436, 476, 505, 214, 215, 216, 0, + 252, 256, 263, 265, 271, 272, 279, 326, 373, 396, + 394, 400, 0, 452, 469, 479, 486, 492, 493, 495, + 496, 497, 498, 499, 500, 361, 278, 432, 294, 331, + 0, 0, 379, 412, 219, 473, 433, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 524, 341, 424, 470, + 296, 308, 311, 301, 320, 0, 321, 297, 298, 303, + 305, 306, 307, 312, 313, 317, 323, 0, 187, 202, + 327, 86, 401, 261, 502, 481, 477, 0, 0, 236, + 0, 0, 0, 0, 0, 0, 1799, 0, 0, 1798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 189, 190, 203, 212, 222, 235, 250, 258, 269, + 274, 277, 282, 283, 286, 291, 337, 343, 344, 345, + 346, 363, 364, 365, 368, 371, 372, 375, 377, 378, + 381, 388, 389, 390, 391, 393, 395, 402, 406, 414, + 415, 416, 417, 418, 420, 421, 426, 427, 428, 429, + 437, 441, 459, 460, 472, 485, 490, 270, 467, 491, + 0, 336, 0, 0, 338, 254, 273, 284, 0, 480, + 438, 207, 408, 262, 196, 225, 210, 233, 248, 251, + 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, + 423, 444, 445, 446, 448, 351, 240, 386, 0, 1323, + 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, + 1325, 0, 0, 0, 0, 244, 0, 0, 0, 0, + 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, + 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, + 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, + 0, 0, 0, 184, 185, 186, 0, 1327, 0, 0, + 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, + 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, + 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, + 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, + 1156, 0, 1157, 1158, 0, 0, 0, 0, 0, 0, + 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 268, 0, 356, 231, 0, 0, - 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, - 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, - 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, - 404, 385, 409, 392, 260, 0, 0, 410, 330, 458, - 399, 468, 488, 489, 237, 360, 478, 447, 484, 501, - 206, 234, 374, 440, 474, 431, 353, 454, 455, 292, - 430, 266, 191, 328, 494, 204, 419, 221, 211, 197, - 442, 466, 218, 422, 0, 0, 503, 199, 464, 439, - 349, 289, 290, 198, 0, 403, 242, 264, 232, 369, - 461, 462, 230, 504, 208, 483, 201, 0, 482, 362, - 457, 465, 350, 340, 200, 463, 348, 339, 295, 314, - 315, 253, 275, 397, 333, 398, 276, 358, 357, 359, - 194, 475, 0, 195, 0, 436, 476, 505, 214, 215, - 216, 0, 252, 256, 263, 265, 271, 272, 279, 326, - 373, 396, 394, 400, 0, 452, 469, 479, 486, 492, - 493, 495, 496, 497, 498, 499, 500, 361, 278, 432, - 294, 331, 0, 0, 379, 412, 219, 473, 433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, - 516, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 524, 341, - 424, 470, 296, 308, 311, 301, 320, 0, 321, 297, - 298, 303, 305, 306, 307, 312, 313, 317, 323, 0, - 187, 202, 327, 0, 401, 261, 502, 481, 477, 0, - 0, 236, 0, 0, 0, 0, 0, 0, 1799, 0, - 0, 1798, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 189, 190, 203, 212, 222, 235, 250, - 258, 269, 274, 277, 282, 283, 286, 291, 337, 343, - 344, 345, 346, 363, 364, 365, 368, 371, 372, 375, - 377, 378, 381, 388, 389, 390, 391, 393, 395, 402, - 406, 414, 415, 416, 417, 418, 420, 421, 426, 427, - 428, 429, 437, 441, 459, 460, 472, 485, 490, 270, - 467, 491, 0, 336, 0, 0, 338, 254, 273, 284, - 0, 480, 438, 207, 408, 262, 196, 225, 210, 233, - 248, 251, 288, 347, 354, 383, 387, 267, 245, 223, - 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, - 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, - 0, 0, 1751, 0, 0, 0, 0, 244, 0, 0, - 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, - 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, - 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, + 0, 356, 231, 0, 0, 0, 0, 487, 0, 0, + 0, 0, 0, 0, 0, 324, 0, 293, 188, 205, + 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, + 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, + 0, 0, 410, 330, 458, 399, 468, 488, 489, 237, + 360, 478, 447, 484, 501, 206, 234, 374, 440, 474, + 431, 353, 454, 455, 292, 430, 266, 191, 328, 494, + 204, 419, 221, 211, 197, 442, 466, 218, 422, 0, + 0, 503, 199, 464, 439, 349, 289, 290, 198, 0, + 403, 242, 264, 232, 369, 461, 462, 230, 504, 208, + 483, 201, 0, 482, 362, 457, 465, 350, 340, 200, + 463, 348, 339, 295, 314, 315, 253, 275, 397, 333, + 398, 276, 358, 357, 359, 194, 475, 0, 195, 0, + 436, 476, 505, 214, 215, 216, 0, 252, 256, 263, + 265, 271, 272, 279, 326, 373, 396, 394, 400, 0, + 452, 469, 479, 486, 492, 493, 495, 496, 497, 498, + 499, 500, 361, 278, 432, 294, 331, 0, 0, 379, + 412, 219, 473, 433, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 524, 341, 424, 470, 296, 308, 311, + 301, 320, 0, 321, 297, 298, 303, 305, 306, 307, + 312, 313, 317, 323, 0, 187, 202, 327, 0, 401, + 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, - 259, 0, 0, 0, 0, 184, 185, 186, 0, 1497, - 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, - 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, - 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, - 453, 0, 0, 0, 0, 0, 0, 0, 209, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, + 203, 212, 222, 235, 250, 258, 269, 274, 277, 282, + 283, 286, 291, 337, 343, 344, 345, 346, 363, 364, + 365, 368, 371, 372, 375, 377, 378, 381, 388, 389, + 390, 391, 393, 395, 402, 406, 414, 415, 416, 417, + 418, 420, 421, 426, 427, 428, 429, 437, 441, 459, + 460, 472, 485, 490, 270, 467, 491, 0, 336, 0, + 0, 338, 254, 273, 284, 0, 480, 438, 207, 408, + 262, 196, 225, 210, 233, 248, 251, 288, 347, 354, + 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, + 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, + 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, + 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, + 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, + 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, + 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, + 287, 226, 192, 367, 435, 259, 0, 0, 0, 0, + 184, 185, 186, 1266, 1269, 0, 0, 0, 0, 1265, + 1268, 0, 0, 217, 1264, 224, 310, 319, 318, 299, + 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, + 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, + 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3623,58 +3419,59 @@ 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, 268, 0, 356, 231, 0, 0, 0, 0, 487, - 0, 0, 0, 0, 0, 0, 0, 324, 0, 293, - 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, - 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, - 392, 260, 0, 1749, 410, 330, 458, 399, 468, 488, - 489, 237, 360, 478, 447, 484, 501, 206, 234, 374, - 440, 474, 431, 353, 454, 455, 292, 430, 266, 191, - 328, 494, 204, 419, 221, 211, 197, 442, 466, 218, - 422, 0, 0, 503, 199, 464, 439, 349, 289, 290, - 198, 0, 403, 242, 264, 232, 369, 461, 462, 230, - 504, 208, 483, 201, 0, 482, 362, 457, 465, 350, - 340, 200, 463, 348, 339, 295, 314, 315, 253, 275, - 397, 333, 398, 276, 358, 357, 359, 194, 475, 0, - 195, 0, 436, 476, 505, 214, 215, 216, 0, 252, - 256, 263, 265, 271, 272, 279, 326, 373, 396, 394, - 400, 0, 452, 469, 479, 486, 492, 493, 495, 496, - 497, 498, 499, 500, 361, 278, 432, 294, 331, 0, - 0, 379, 412, 219, 473, 433, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 506, 507, 508, - 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 524, 341, 424, 470, 296, - 308, 311, 301, 320, 0, 321, 297, 298, 303, 305, - 306, 307, 312, 313, 317, 323, 0, 187, 202, 327, - 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, + 0, 0, 0, 0, 0, 0, 268, 0, 356, 231, + 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, + 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, + 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, + 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, + 330, 458, 399, 468, 488, 489, 237, 360, 478, 447, + 484, 501, 206, 234, 374, 440, 474, 431, 353, 454, + 455, 292, 430, 266, 191, 328, 494, 204, 419, 221, + 211, 197, 442, 466, 218, 422, 0, 0, 503, 199, + 464, 439, 349, 289, 290, 198, 0, 403, 242, 264, + 232, 369, 461, 462, 230, 504, 208, 483, 201, 0, + 482, 362, 457, 465, 350, 340, 200, 463, 348, 339, + 295, 314, 315, 253, 275, 397, 333, 398, 276, 358, + 357, 359, 194, 475, 0, 195, 0, 436, 476, 505, + 214, 215, 216, 0, 252, 256, 263, 265, 271, 272, + 279, 326, 373, 396, 394, 400, 0, 452, 469, 479, + 486, 492, 493, 495, 496, 497, 498, 499, 500, 361, + 278, 432, 294, 331, 0, 0, 379, 412, 219, 473, + 433, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 524, 341, 424, 470, 296, 308, 311, 301, 320, 0, + 321, 297, 298, 303, 305, 306, 307, 312, 313, 317, + 323, 0, 187, 202, 327, 0, 401, 261, 502, 481, + 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 189, 190, 203, 212, 222, 235, 250, 258, 269, 274, - 277, 282, 283, 286, 291, 337, 343, 344, 345, 346, - 363, 364, 365, 368, 371, 372, 375, 377, 378, 381, - 388, 389, 390, 391, 393, 395, 402, 406, 414, 415, - 416, 417, 418, 420, 421, 426, 427, 428, 429, 437, - 441, 459, 460, 472, 485, 490, 270, 467, 491, 0, - 336, 0, 0, 338, 254, 273, 284, 0, 480, 438, - 207, 408, 262, 196, 225, 210, 233, 248, 251, 288, - 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, - 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, - 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 189, 190, 203, 212, 222, + 235, 250, 258, 269, 274, 277, 282, 283, 286, 291, + 337, 343, 344, 345, 346, 363, 364, 365, 368, 371, + 372, 375, 377, 378, 381, 388, 389, 390, 391, 393, + 395, 402, 406, 414, 415, 416, 417, 418, 420, 421, + 426, 427, 428, 429, 437, 441, 459, 460, 472, 485, + 490, 270, 467, 491, 0, 336, 0, 0, 338, 254, + 273, 284, 0, 480, 438, 207, 408, 262, 196, 225, + 210, 233, 248, 251, 288, 347, 354, 383, 387, 267, + 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, + 240, 386, 0, 0, 334, 450, 451, 280, 352, 0, + 0, 0, 78, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 287, 226, 192, 367, 435, 259, 0, 0, - 0, 0, 184, 185, 186, 0, 0, 0, 0, 0, + 0, 0, 287, 226, 192, 367, 435, 259, 0, 87, + 0, 1304, 184, 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 249, 0, 0, 0, 0, 0, 0, 0, 0, 945, + 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3683,7 +3480,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 356, 231, 0, 0, 0, 0, 487, 0, 0, 0, - 0, 0, 0, 0, 324, 951, 293, 188, 205, 949, + 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, 330, 458, 399, 468, 488, 489, 237, 360, @@ -3705,7 +3502,7 @@ var yyAct = [...]int{ 522, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, 341, 424, 470, 296, 308, 311, 301, 320, 0, 321, 297, 298, 303, 305, 306, 307, 312, - 313, 317, 323, 0, 187, 202, 327, 0, 401, 261, + 313, 317, 323, 0, 187, 202, 327, 86, 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, 203, @@ -3720,14 +3517,14 @@ var yyAct = [...]int{ 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 370, 0, 0, 0, 1751, 0, 0, 0, + 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, - 226, 192, 367, 435, 259, 0, 0, 0, 0, 184, - 185, 186, 0, 1497, 0, 0, 0, 0, 0, 0, + 226, 192, 367, 435, 259, 0, 87, 0, 0, 184, + 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, @@ -3765,8 +3562,8 @@ var yyAct = [...]int{ 341, 424, 470, 296, 308, 311, 301, 320, 0, 321, 297, 298, 303, 305, 306, 307, 312, 313, 317, 323, 0, 187, 202, 327, 0, 401, 261, 502, 481, 477, - 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 236, 0, 0, 0, 0, 0, 0, 1799, + 0, 0, 1798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, 203, 212, 222, 235, 250, 258, 269, 274, 277, 282, 283, 286, 291, 337, 343, 344, 345, 346, 363, 364, 365, 368, 371, 372, @@ -3779,14 +3576,14 @@ var yyAct = [...]int{ 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, - 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, + 0, 0, 0, 1751, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, - 435, 259, 0, 0, 0, 1304, 184, 185, 186, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, + 435, 259, 0, 0, 0, 0, 184, 185, 186, 0, + 1497, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, @@ -3800,10 +3597,10 @@ 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, 268, 0, 356, 231, 0, 0, 0, 0, - 487, 0, 0, 0, 2733, 0, 0, 0, 324, 0, + 487, 0, 0, 0, 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, - 409, 392, 260, 0, 0, 410, 330, 458, 399, 468, + 409, 392, 260, 0, 1749, 410, 330, 458, 399, 468, 488, 489, 237, 360, 478, 447, 484, 501, 206, 234, 374, 440, 474, 431, 353, 454, 455, 292, 430, 266, 191, 328, 494, 204, 419, 221, 211, 197, 442, 466, @@ -3844,23 +3641,23 @@ var yyAct = [...]int{ 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, - 0, 0, 0, 184, 185, 186, 0, 2076, 0, 0, + 0, 0, 0, 184, 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, + 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2077, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 356, 231, 0, 0, 0, 0, 487, 0, 0, - 0, 0, 0, 0, 0, 324, 0, 293, 188, 205, - 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, + 0, 0, 0, 0, 0, 324, 951, 293, 188, 205, + 949, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, 330, 458, 399, 468, 488, 489, 237, 360, 478, 447, 484, 501, 206, 234, 374, 440, 474, @@ -3896,15 +3693,15 @@ var yyAct = [...]int{ 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 370, 0, 0, 0, 1751, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, 0, 0, 0, - 184, 185, 186, 0, 0, 0, 2061, 0, 0, 0, - 2062, 0, 0, 217, 0, 224, 310, 319, 318, 299, + 184, 185, 186, 0, 1497, 0, 0, 0, 0, 0, + 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, @@ -3956,13 +3753,13 @@ var yyAct = [...]int{ 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 244, - 1348, 0, 0, 0, 325, 241, 0, 0, 384, 0, + 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, - 367, 435, 259, 0, 0, 0, 0, 184, 185, 186, - 0, 1347, 0, 0, 0, 0, 0, 0, 0, 0, + 367, 435, 259, 0, 0, 0, 1304, 184, 185, 186, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, 0, @@ -3976,7 +3773,7 @@ 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, 268, 0, 356, 231, 0, 0, 0, - 0, 487, 0, 0, 0, 0, 0, 0, 0, 324, + 0, 487, 0, 0, 0, 2759, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, 330, 458, 399, @@ -4020,7 +3817,7 @@ var yyAct = [...]int{ 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, - 0, 0, 0, 0, 184, 185, 186, 0, 0, 0, + 0, 0, 0, 0, 184, 185, 186, 0, 2076, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, @@ -4028,14 +3825,14 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2077, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 356, 231, 0, 0, 0, 0, 487, 0, - 0, 0, 2807, 0, 0, 0, 324, 0, 293, 188, + 0, 0, 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, 330, 458, 399, 468, 488, 489, @@ -4079,8 +3876,8 @@ var yyAct = [...]int{ 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, 0, 0, - 0, 184, 185, 186, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, + 0, 184, 185, 186, 0, 0, 0, 2061, 0, 0, + 0, 2062, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, @@ -4093,7 +3890,7 @@ 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, 268, 0, 356, - 231, 0, 0, 0, 0, 487, 0, 0, 0, 2733, + 231, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, @@ -4132,13 +3929,13 @@ var yyAct = [...]int{ 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, - 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, + 244, 1348, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, 0, 0, 0, 184, 185, - 186, 0, 1497, 0, 0, 0, 0, 0, 0, 0, + 186, 0, 1347, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, 0, @@ -4189,7 +3986,7 @@ var yyAct = [...]int{ 248, 251, 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, - 0, 1800, 0, 0, 0, 0, 0, 0, 370, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, @@ -4211,7 +4008,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 356, 231, 0, 0, 0, 0, 487, - 0, 0, 0, 0, 0, 0, 0, 324, 0, 293, + 0, 0, 0, 2839, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, 330, 458, 399, 468, 488, @@ -4255,7 +4052,7 @@ var yyAct = [...]int{ 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, 0, - 0, 0, 184, 185, 186, 0, 1327, 0, 0, 0, + 0, 0, 184, 185, 186, 0, 1497, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, 0, @@ -4322,13 +4119,13 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1187, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 356, 231, 0, - 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 487, 0, 0, 0, 2759, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, 0, 0, 410, 330, @@ -4365,7 +4162,7 @@ var yyAct = [...]int{ 233, 248, 251, 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, + 0, 0, 1800, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, @@ -4410,7 +4207,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 524, 341, 424, 470, 296, 308, 311, 301, 320, 0, 321, 297, 298, 303, 305, 306, 307, 312, 313, 317, 323, 0, 187, 202, - 327, 1591, 401, 261, 502, 481, 477, 0, 0, 236, + 327, 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, 203, 212, 222, 235, 250, 258, 269, @@ -4424,14 +4221,14 @@ var yyAct = [...]int{ 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 370, 0, 1469, 0, + 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, - 0, 0, 0, 184, 185, 186, 0, 0, 0, 0, + 0, 0, 0, 184, 185, 186, 0, 1327, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, @@ -4483,7 +4280,7 @@ var yyAct = [...]int{ 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 370, 0, 1467, 0, 0, 0, 0, + 0, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, @@ -4498,7 +4295,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4542,7 +4339,7 @@ var yyAct = [...]int{ 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 370, 0, 1465, 0, 0, 0, 0, 0, 0, 244, + 370, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, @@ -4586,7 +4383,7 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 524, 341, 424, 470, 296, 308, 311, 301, 320, 0, 321, 297, 298, 303, 305, 306, 307, 312, 313, 317, 323, 0, 187, - 202, 327, 0, 401, 261, 502, 481, 477, 0, 0, + 202, 327, 1591, 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, 203, 212, 222, 235, 250, 258, @@ -4600,7 +4397,7 @@ var yyAct = [...]int{ 251, 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 370, 0, 1463, + 0, 0, 0, 0, 0, 0, 0, 370, 0, 1469, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, @@ -4659,7 +4456,7 @@ var yyAct = [...]int{ 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 370, 0, 1461, 0, 0, 0, + 0, 0, 0, 0, 370, 0, 1467, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, @@ -4718,7 +4515,7 @@ var yyAct = [...]int{ 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 370, 0, 1457, 0, 0, 0, 0, 0, 0, + 0, 370, 0, 1465, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, @@ -4777,7 +4574,7 @@ var yyAct = [...]int{ 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, - 1455, 0, 0, 0, 0, 0, 0, 244, 0, 0, + 1463, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, @@ -4835,7 +4632,7 @@ var yyAct = [...]int{ 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 370, 0, 1453, 0, 0, + 0, 0, 0, 0, 0, 370, 0, 1461, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, @@ -4894,13 +4691,13 @@ var yyAct = [...]int{ 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 370, 0, 1457, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, - 226, 192, 367, 435, 259, 0, 1430, 0, 0, 184, + 226, 192, 367, 435, 259, 0, 0, 0, 0, 184, 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, @@ -4953,7 +4750,7 @@ var yyAct = [...]int{ 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, - 0, 0, 0, 0, 0, 0, 0, 1332, 244, 0, + 0, 1455, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, @@ -5011,14 +4808,14 @@ var yyAct = [...]int{ 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 370, 0, 1453, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, - 0, 0, 0, 184, 185, 186, 0, 1133, 0, 0, + 0, 0, 0, 184, 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, @@ -5076,7 +4873,7 @@ var yyAct = [...]int{ 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 226, 192, 367, 435, 259, 0, 0, 0, 0, + 287, 226, 192, 367, 435, 259, 0, 1430, 0, 0, 184, 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, @@ -5117,7 +4914,7 @@ var yyAct = [...]int{ 323, 0, 187, 202, 327, 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 757, 0, 0, 0, 189, 190, 203, 212, 222, + 0, 0, 0, 0, 0, 189, 190, 203, 212, 222, 235, 250, 258, 269, 274, 277, 282, 283, 286, 291, 337, 343, 344, 345, 346, 363, 364, 365, 368, 371, 372, 375, 377, 378, 381, 388, 389, 390, 391, 393, @@ -5129,7 +4926,7 @@ var yyAct = [...]int{ 245, 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 370, 0, 0, 0, 0, 0, 0, 0, 0, 244, + 370, 0, 0, 0, 0, 0, 0, 0, 1332, 244, 0, 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, 0, 0, @@ -5149,7 +4946,7 @@ 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, 580, 0, 268, 0, 356, 231, 0, 0, 0, + 0, 0, 0, 268, 0, 356, 231, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, @@ -5181,7 +4978,7 @@ var yyAct = [...]int{ 345, 346, 363, 364, 365, 368, 371, 372, 375, 377, 378, 381, 388, 389, 390, 391, 393, 395, 402, 406, 414, 415, 416, 417, 418, 420, 421, 426, 427, 428, - 429, 437, 441, 459, 460, 472, 485, 490, 579, 467, + 429, 437, 441, 459, 460, 472, 485, 490, 270, 467, 491, 0, 336, 0, 0, 338, 254, 273, 284, 0, 480, 438, 207, 408, 262, 196, 225, 210, 233, 248, 251, 288, 347, 354, 383, 387, 267, 245, 223, 405, @@ -5194,7 +4991,7 @@ var yyAct = [...]int{ 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, - 0, 0, 0, 0, 184, 185, 186, 0, 0, 0, + 0, 0, 0, 0, 184, 185, 186, 0, 1133, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, @@ -5208,7 +5005,7 @@ 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, - 268, 0, 356, 231, 0, 0, 527, 0, 487, 0, + 268, 0, 356, 231, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, 392, @@ -5293,9 +5090,9 @@ var yyAct = [...]int{ 317, 323, 0, 187, 202, 327, 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 189, 190, 203, 212, + 0, 0, 757, 0, 0, 0, 189, 190, 203, 212, 222, 235, 250, 258, 269, 274, 277, 282, 283, 286, - 291, 337, 343, 344, 345, 346, 2812, 364, 365, 368, + 291, 337, 343, 344, 345, 346, 363, 364, 365, 368, 371, 372, 375, 377, 378, 381, 388, 389, 390, 391, 393, 395, 402, 406, 414, 415, 416, 417, 418, 420, 421, 426, 427, 428, 429, 437, 441, 459, 460, 472, @@ -5325,7 +5122,7 @@ 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, 268, 0, 356, 231, 0, 0, + 0, 0, 580, 0, 268, 0, 356, 231, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, @@ -5357,7 +5154,7 @@ var yyAct = [...]int{ 344, 345, 346, 363, 364, 365, 368, 371, 372, 375, 377, 378, 381, 388, 389, 390, 391, 393, 395, 402, 406, 414, 415, 416, 417, 418, 420, 421, 426, 427, - 428, 429, 437, 441, 459, 460, 472, 485, 490, 270, + 428, 429, 437, 441, 459, 460, 472, 485, 490, 579, 467, 491, 0, 336, 0, 0, 338, 254, 273, 284, 0, 480, 438, 207, 408, 262, 196, 225, 210, 233, 248, 251, 288, 347, 354, 383, 387, 267, 245, 223, @@ -5370,7 +5167,7 @@ var yyAct = [...]int{ 342, 382, 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, - 259, 0, 0, 0, 0, 184, 2498, 186, 0, 0, + 259, 0, 0, 0, 0, 184, 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, @@ -5384,7 +5181,7 @@ 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, 268, 0, 356, 231, 0, 0, 0, 0, 487, + 0, 268, 0, 356, 231, 0, 0, 527, 0, 487, 0, 0, 0, 0, 0, 0, 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, 409, @@ -5429,7 +5226,7 @@ var yyAct = [...]int{ 376, 0, 329, 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, 0, - 0, 0, 184, 2057, 186, 0, 0, 0, 0, 0, + 0, 0, 184, 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, 0, @@ -5469,39 +5266,216 @@ var yyAct = [...]int{ 313, 317, 323, 0, 187, 202, 327, 0, 401, 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 189, 190, 203, - 212, 222, 235, 250, 258, 269, 274, 277, 282, 283, - 286, 291, 337, 343, 344, 345, 346, 363, 364, 365, - 368, 371, 372, 375, 377, 378, 381, 388, 389, 390, - 391, 393, 395, 402, 406, 414, 415, 416, 417, 418, - 420, 421, 426, 427, 428, 429, 437, 441, 459, 460, - 472, 485, 490, 270, 467, 491, 0, 336, 0, 0, - 338, 254, 273, 284, 0, 480, 438, 207, 408, 262, - 196, 225, 210, 233, 248, 251, 288, 347, 354, 383, - 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, - 448, 351, 240, 386, 0, 0, 334, 450, 451, 280, + 0, 0, 0, 0, 0, 0, 0, 189, 190, 203, + 212, 222, 235, 250, 258, 269, 274, 277, 282, 283, + 286, 291, 337, 343, 344, 345, 346, 2844, 364, 365, + 368, 371, 372, 375, 377, 378, 381, 388, 389, 390, + 391, 393, 395, 402, 406, 414, 415, 416, 417, 418, + 420, 421, 426, 427, 428, 429, 437, 441, 459, 460, + 472, 485, 490, 270, 467, 491, 0, 336, 0, 0, + 338, 254, 273, 284, 0, 480, 438, 207, 408, 262, + 196, 225, 210, 233, 248, 251, 288, 347, 354, 383, + 387, 267, 245, 223, 405, 220, 423, 444, 445, 446, + 448, 351, 240, 386, 0, 352, 334, 450, 451, 280, + 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, + 0, 244, 0, 0, 0, 0, 325, 241, 0, 0, + 384, 0, 193, 0, 425, 228, 335, 332, 456, 255, + 247, 243, 227, 281, 342, 382, 443, 376, 0, 329, + 0, 0, 434, 355, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, + 226, 192, 367, 435, 259, 0, 0, 0, 0, 184, + 185, 186, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 217, 0, 224, 310, 319, 318, 299, 300, + 302, 304, 309, 316, 322, 0, 0, 0, 0, 0, + 239, 285, 246, 238, 453, 0, 0, 0, 0, 0, + 0, 0, 209, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 268, 0, 356, 231, 0, + 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, + 0, 324, 0, 293, 188, 205, 0, 0, 366, 407, + 413, 0, 0, 0, 229, 0, 411, 380, 471, 213, + 257, 404, 385, 409, 392, 260, 0, 0, 410, 330, + 458, 399, 468, 488, 489, 237, 360, 478, 447, 484, + 501, 206, 234, 374, 440, 474, 431, 353, 454, 455, + 292, 430, 266, 191, 328, 494, 204, 419, 221, 211, + 197, 442, 466, 218, 422, 0, 0, 503, 199, 464, + 439, 349, 289, 290, 198, 0, 403, 242, 264, 232, + 369, 461, 462, 230, 504, 208, 483, 201, 0, 482, + 362, 457, 465, 350, 340, 200, 463, 348, 339, 295, + 314, 315, 253, 275, 397, 333, 398, 276, 358, 357, + 359, 194, 475, 0, 195, 0, 436, 476, 505, 214, + 215, 216, 0, 252, 256, 263, 265, 271, 272, 279, + 326, 373, 396, 394, 400, 0, 452, 469, 479, 486, + 492, 493, 495, 496, 497, 498, 499, 500, 361, 278, + 432, 294, 331, 0, 0, 379, 412, 219, 473, 433, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, + 341, 424, 470, 296, 308, 311, 301, 320, 0, 321, + 297, 298, 303, 305, 306, 307, 312, 313, 317, 323, + 0, 187, 202, 327, 0, 401, 261, 502, 481, 477, + 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 189, 190, 203, 212, 222, 235, + 250, 258, 269, 274, 277, 282, 283, 286, 291, 337, + 343, 344, 345, 346, 363, 364, 365, 368, 371, 372, + 375, 377, 378, 381, 388, 389, 390, 391, 393, 395, + 402, 406, 414, 415, 416, 417, 418, 420, 421, 426, + 427, 428, 429, 437, 441, 459, 460, 472, 485, 490, + 270, 467, 491, 0, 336, 0, 0, 338, 254, 273, + 284, 0, 480, 438, 207, 408, 262, 196, 225, 210, + 233, 248, 251, 288, 347, 354, 383, 387, 267, 245, + 223, 405, 220, 423, 444, 445, 446, 448, 351, 240, + 386, 0, 352, 334, 450, 451, 280, 449, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, + 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, + 0, 0, 0, 325, 241, 0, 0, 384, 0, 193, + 0, 425, 228, 335, 332, 456, 255, 247, 243, 227, + 281, 342, 382, 443, 376, 0, 329, 0, 0, 434, + 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 287, 226, 192, 367, + 435, 259, 0, 0, 0, 0, 184, 2512, 186, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, + 0, 224, 310, 319, 318, 299, 300, 302, 304, 309, + 316, 322, 0, 0, 0, 0, 0, 239, 285, 246, + 238, 453, 0, 0, 0, 0, 0, 0, 0, 209, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 268, 0, 356, 231, 0, 0, 0, 0, + 487, 0, 0, 0, 0, 0, 0, 0, 324, 0, + 293, 188, 205, 0, 0, 366, 407, 413, 0, 0, + 0, 229, 0, 411, 380, 471, 213, 257, 404, 385, + 409, 392, 260, 0, 0, 410, 330, 458, 399, 468, + 488, 489, 237, 360, 478, 447, 484, 501, 206, 234, + 374, 440, 474, 431, 353, 454, 455, 292, 430, 266, + 191, 328, 494, 204, 419, 221, 211, 197, 442, 466, + 218, 422, 0, 0, 503, 199, 464, 439, 349, 289, + 290, 198, 0, 403, 242, 264, 232, 369, 461, 462, + 230, 504, 208, 483, 201, 0, 482, 362, 457, 465, + 350, 340, 200, 463, 348, 339, 295, 314, 315, 253, + 275, 397, 333, 398, 276, 358, 357, 359, 194, 475, + 0, 195, 0, 436, 476, 505, 214, 215, 216, 0, + 252, 256, 263, 265, 271, 272, 279, 326, 373, 396, + 394, 400, 0, 452, 469, 479, 486, 492, 493, 495, + 496, 497, 498, 499, 500, 361, 278, 432, 294, 331, + 0, 0, 379, 412, 219, 473, 433, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 524, 341, 424, 470, + 296, 308, 311, 301, 320, 0, 321, 297, 298, 303, + 305, 306, 307, 312, 313, 317, 323, 0, 187, 202, + 327, 0, 401, 261, 502, 481, 477, 0, 0, 236, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 189, 190, 203, 212, 222, 235, 250, 258, 269, + 274, 277, 282, 283, 286, 291, 337, 343, 344, 345, + 346, 363, 364, 365, 368, 371, 372, 375, 377, 378, + 381, 388, 389, 390, 391, 393, 395, 402, 406, 414, + 415, 416, 417, 418, 420, 421, 426, 427, 428, 429, + 437, 441, 459, 460, 472, 485, 490, 270, 467, 491, + 0, 336, 0, 0, 338, 254, 273, 284, 0, 480, + 438, 207, 408, 262, 196, 225, 210, 233, 248, 251, + 288, 347, 354, 383, 387, 267, 245, 223, 405, 220, + 423, 444, 445, 446, 448, 351, 240, 386, 0, 352, + 334, 450, 451, 280, 449, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, + 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, + 325, 241, 0, 0, 384, 0, 193, 0, 425, 228, + 335, 332, 456, 255, 247, 243, 227, 281, 342, 382, + 443, 376, 0, 329, 0, 0, 434, 355, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 287, 226, 192, 367, 435, 259, 0, + 0, 0, 0, 184, 2057, 186, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 217, 0, 224, 310, + 319, 318, 299, 300, 302, 304, 309, 316, 322, 0, + 0, 0, 0, 0, 239, 285, 246, 238, 453, 0, + 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, + 0, 356, 231, 0, 0, 0, 0, 487, 0, 0, + 0, 0, 0, 0, 0, 324, 0, 293, 188, 205, + 0, 0, 366, 407, 413, 0, 0, 0, 229, 0, + 411, 380, 471, 213, 257, 404, 385, 409, 392, 260, + 0, 0, 410, 330, 458, 399, 468, 488, 489, 237, + 360, 478, 447, 484, 501, 206, 234, 374, 440, 474, + 431, 353, 454, 455, 292, 430, 266, 191, 328, 494, + 204, 419, 221, 211, 197, 442, 466, 218, 422, 0, + 0, 503, 199, 464, 439, 349, 289, 290, 198, 0, + 403, 242, 264, 232, 369, 461, 462, 230, 504, 208, + 483, 201, 0, 482, 362, 457, 465, 350, 340, 200, + 463, 348, 339, 295, 314, 315, 253, 275, 397, 333, + 398, 276, 358, 357, 359, 194, 475, 0, 195, 0, + 436, 476, 505, 214, 215, 216, 0, 252, 256, 263, + 265, 271, 272, 279, 326, 373, 396, 394, 400, 0, + 452, 469, 479, 486, 492, 493, 495, 496, 497, 498, + 499, 500, 361, 278, 432, 294, 331, 0, 0, 379, + 412, 219, 473, 433, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 524, 341, 424, 470, 296, 308, 311, + 301, 320, 0, 321, 297, 298, 303, 305, 306, 307, + 312, 313, 317, 323, 0, 187, 202, 327, 0, 401, + 261, 502, 481, 477, 0, 0, 236, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, + 203, 212, 222, 235, 250, 258, 269, 274, 277, 282, + 283, 286, 291, 337, 343, 344, 345, 346, 363, 364, + 365, 368, 371, 372, 375, 377, 378, 381, 388, 389, + 390, 391, 393, 395, 402, 406, 414, 415, 416, 417, + 418, 420, 421, 426, 427, 428, 429, 437, 441, 459, + 460, 472, 485, 490, 270, 467, 491, 0, 336, 0, + 0, 338, 254, 273, 284, 0, 480, 438, 207, 408, + 262, 196, 225, 210, 233, 248, 251, 288, 347, 354, + 383, 387, 267, 245, 223, 405, 220, 423, 444, 445, + 446, 448, 351, 240, 386, 0, 0, 334, 450, 451, + 280, } var yyPact = [...]int{ - 5567, -1000, -414, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 4871, -1000, -407, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1955, 1989, -1000, -1000, - -1000, -1000, 2064, -1000, 649, 1617, -1000, 1903, 324, -1000, - 39030, 415, -1000, 37856, 400, 4593, 39030, -1000, 122, -1000, - 112, 39030, 116, 37269, -1000, -1000, -322, 16714, 1843, -27, - -33, 39030, -1000, -1000, -1000, -1000, 2020, 1586, -1000, 259, - -1000, -1000, -1000, -1000, -1000, -1000, 36682, -1000, -1000, -1000, - 1910, 1885, 2072, 569, 1835, -1000, 1963, 1586, -1000, 16714, - 2009, 1976, 16127, -1000, 16127, 341, -1000, -1000, 12008, -1000, - -1000, 22594, 39030, 39030, 224, -1000, 1903, -1000, -1000, 323, - -1000, 253, 1509, -1000, 1506, -1000, 603, 462, 268, 391, - 386, 267, 266, 264, 263, 261, 257, 255, 254, 277, - -1000, 614, 614, -209, -212, 935, 322, 322, 322, 360, - 1867, 1862, -1000, 563, -1000, 614, 614, 281, 614, 614, - 614, 614, 227, 225, 614, 614, 614, 614, 614, 614, - 614, 614, 614, 614, 614, 614, 614, 614, 614, 258, - 1903, 217, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1913, 2057, -1000, -1000, + -1000, -1000, 2041, -1000, 667, 1587, -1000, 1863, 401, -1000, + 38731, 417, -1000, 37557, 395, 3473, 38731, -1000, 128, -1000, + 119, 38731, 123, 36970, -1000, -1000, -312, 16415, 1780, 14, + 12, 38731, -1000, -1000, -1000, -1000, 2007, 1563, -1000, 296, + -1000, -1000, -1000, -1000, -1000, -1000, 36383, -1000, -1000, -1000, + 1874, 1846, 2036, 577, 1775, -1000, 1916, 1563, -1000, 16415, + 1988, 1914, 15828, -1000, 15828, 349, -1000, -1000, 11709, -1000, + -1000, 22295, 38731, 38731, 211, -1000, 1863, -1000, -1000, 316, + -1000, 270, 1462, -1000, 1459, -1000, 407, 439, 283, 420, + 406, 282, 281, 280, 279, 278, 276, 275, 273, 294, + -1000, 609, 609, -188, -195, 3049, 342, 342, 342, 364, + 1817, 1807, -1000, 639, -1000, 609, 609, 306, 609, 609, + 609, 609, 239, 237, 609, 609, 609, 609, 609, 609, + 609, 609, 609, 609, 609, 609, 609, 609, 609, 308, + 1863, 224, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -5535,35 +5509,35 @@ 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, 39030, 135, 39030, -1000, 490, - 39030, 725, 725, -15, 725, 725, 725, 725, 126, 536, - -36, -1000, 125, 213, 118, 208, 703, 139, -1000, -1000, - 182, 703, 1049, 572, 74, -1000, 725, 725, -1000, 9640, - 120, 9640, 9640, -1000, 1879, -1000, -1000, -1000, -1000, 1055, - -1000, 359, -1000, -1000, -1000, -1000, 39030, 36095, 278, 621, - -1000, -1000, -1000, 58, -1000, -1000, 1180, 884, 16714, 864, - -1000, 1556, 542, -1000, -1000, -1000, -1000, -1000, 474, 17301, - 17301, 17301, 17301, -1000, -1000, 1514, 1514, 1514, 1514, 17301, - 1514, 17301, 1514, 1514, 1514, 1514, 16714, 1514, 1514, 1514, - -1000, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, - 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, - 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, - 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, - 1514, 489, 1514, 1514, 1514, 1514, 1514, -1000, -1000, -1000, - -1000, 1514, 1514, 1514, 1514, 1514, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 20241, -1000, 14366, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 38731, 109, 38731, -1000, 495, + 38731, 750, 750, 41, 750, 750, 750, 750, 133, 531, + 9, -1000, 126, 175, 121, 206, 727, 115, -1000, -1000, + 202, 727, 1092, 582, 110, -1000, 750, 750, -1000, 9341, + 139, 9341, 9341, -1000, 1826, -1000, -1000, -1000, -1000, 1098, + -1000, 363, -1000, -1000, -1000, -1000, 38731, 35796, 290, 631, + -1000, -1000, -1000, 30, -1000, -1000, 1225, 919, 16415, 804, + -1000, 1352, 542, -1000, -1000, -1000, -1000, -1000, 438, 17002, + 17002, 17002, 17002, -1000, -1000, 1465, 1465, 1465, 1465, 17002, + 1465, 17002, 1465, 1465, 1465, 1465, 16415, 1465, 1465, 1465, + -1000, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, + 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, + 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, + 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, + 1465, 494, 1465, 1465, 1465, 1465, 1465, -1000, -1000, -1000, + -1000, 1465, 1465, 1465, 1465, 1465, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 19942, -1000, 14067, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 39030, -1000, 1514, - 127, 39030, 39030, 262, 1963, 1586, -1000, 2020, 1994, 259, - -1000, 2264, 1678, 1301, 989, 1586, 1460, 39030, -1000, 1518, - -1000, -1000, -1000, 1775, 1038, 1044, -1000, -1000, -1000, -1000, - 1321, 16714, -1000, -1000, 2054, -1000, 19654, 488, 756, 2046, - 35508, -1000, 341, 341, 1496, 11416, -66, -1000, -1000, -1000, - 618, 25529, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1879, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 38731, -1000, 1465, + 136, 38731, 38731, 287, 1916, 1563, -1000, 2007, 1954, 296, + -1000, 2213, 1546, 1186, 963, 1563, 1439, 38731, -1000, 1488, + -1000, -1000, -1000, 1698, 1029, 1089, -1000, -1000, -1000, -1000, + 1481, 16415, -1000, -1000, 2025, -1000, 19355, 478, 763, 2021, + 35209, -1000, 349, 349, 1457, 11117, -14, -1000, -1000, -1000, + 622, 25230, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1826, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -5577,243 +5551,247 @@ 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, 1446, 39030, -1000, -1000, 5149, 1239, - -1000, 1615, -1000, 1428, -1000, 1538, 1619, 398, 1239, 370, - 366, 365, -1000, -118, -1000, -1000, -1000, -1000, -1000, 614, - 614, -1000, 275, 2007, 324, 3221, -1000, -1000, -1000, 34921, - 1597, 1239, -1000, 1595, -1000, 691, 442, 479, 479, 1239, - -1000, -1000, 39030, 1239, 687, 686, 39030, 39030, -1000, 34334, - -1000, 33747, 33160, 940, 39030, 32573, 31986, 31399, 30812, 30225, - -1000, 1741, -1000, 1695, -1000, -1000, -1000, 39030, 39030, 39030, - 284, -1000, -1000, 39030, 1239, -1000, -1000, 937, 936, 614, - 614, 910, 1043, 1040, 1039, 614, 614, 907, 1034, 27290, - 204, 905, 893, 892, 1035, 1028, 167, 1029, 952, 890, - 39030, 1594, 39030, -1000, 177, 577, 336, 616, 1903, 1830, - 1488, 357, 383, 1239, 337, 337, 39030, -1000, 10232, -1000, - -1000, 1026, 16714, -1000, 709, 703, 703, -1000, -1000, -1000, - -1000, -1000, -1000, 725, 39030, 709, -1000, -1000, -1000, 703, - 725, 39030, 725, 725, 725, 725, 703, 703, 703, 725, - 39030, 39030, 39030, 39030, 39030, 39030, 39030, 39030, 39030, 9640, - 572, 725, -329, -1000, 1021, -1000, 1736, -1000, -1000, -1000, - -1000, -1000, -1000, 9640, 9640, -1000, -1000, -1000, -1000, 115, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -110, - 1486, 29638, -1000, -332, -333, -334, -335, -1000, -1000, -1000, - -336, -340, -1000, -1000, -1000, 16714, 16714, 16714, 16714, -240, - -1000, 839, 17301, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 845, 596, 17301, 17301, 17301, 17301, 17301, 17301, 17301, 17301, - 17301, 17301, 17301, 17301, 17301, 17301, 17301, 785, 6441, 6441, - 542, 542, 542, 542, -1000, 16127, 16714, 16714, 542, -1000, - 1239, 29051, 16127, 16127, 16714, 1866, 646, 884, 39030, -1000, - 989, -1000, -1000, -1000, 939, -1000, 39030, 39030, 54, 16714, - 16714, 16714, 16714, 16714, 16714, 13187, 16714, 16714, 16714, 16714, - 16714, 16714, 16714, 16714, 16714, 16714, 16714, 16714, 16714, 16714, - 16714, 16714, 16714, 16714, 16714, 16714, 16714, 16714, 16714, 16714, - 16714, 16714, 12600, 10232, 16127, 16127, 16127, 16127, 16127, -1000, + -1000, -1000, -1000, -1000, 1412, 38731, -1000, -1000, 5168, 1055, + -1000, 1579, -1000, 1403, -1000, 1543, 1611, 389, 1055, 383, + 382, 379, -1000, -92, -1000, -1000, -1000, -1000, -1000, 609, + 609, -1000, 293, 1986, 401, 3328, -1000, -1000, -1000, 34622, + 1577, 1055, -1000, 1576, -1000, 693, 452, 472, 472, 1055, + -1000, -1000, 38731, 1055, 692, 683, 38731, 38731, -1000, 34035, + -1000, 33448, 32861, 971, 38731, 32274, 31687, 31100, 30513, 29926, + -1000, 1802, -1000, 1746, -1000, -1000, -1000, 38731, 38731, 38731, + 291, -1000, -1000, 38731, 1055, -1000, -1000, 967, 953, 609, + 609, 951, 1082, 1081, 1069, 609, 609, 947, 1068, 26404, + 197, 945, 944, 920, 961, 1067, 169, 958, 948, 907, + 38731, 1574, 38731, -1000, 170, 630, 339, 620, 1863, 1779, + 1450, 362, 387, 1055, 341, 341, 38731, -1000, 9933, -1000, + -1000, 1066, 16415, -1000, 730, 727, 727, -1000, -1000, -1000, + -1000, -1000, -1000, 750, 38731, 730, -1000, -1000, -1000, 727, + 750, 38731, 750, 750, 750, 750, 727, 727, 727, 750, + 38731, 38731, 38731, 38731, 38731, 38731, 38731, 38731, 38731, 9341, + 582, 750, -316, -1000, 1065, -1000, 1705, -1000, -1000, -1000, + -1000, -1000, -1000, 9341, 9341, -1000, -1000, -1000, -1000, 117, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -96, + 1441, 29339, -1000, -320, -321, -322, -323, -1000, -1000, -1000, + -324, -331, -1000, -1000, -1000, 16415, 16415, 16415, 16415, -218, + -1000, 822, 17002, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 769, 658, 17002, 17002, 17002, 17002, 17002, 17002, 17002, 17002, + 17002, 17002, 17002, 17002, 17002, 17002, 17002, 638, 5685, 5685, + 542, 542, 542, 542, -1000, 15828, 16415, 16415, 542, -1000, + 1055, 28752, 15828, 15828, 16415, 1825, 644, 919, 38731, -1000, + 963, -1000, -1000, -1000, 972, -1000, 38731, 38731, 47, 16415, + 16415, 16415, 16415, 16415, 16415, 12888, 16415, 16415, 16415, 16415, + 16415, 16415, 16415, 16415, 16415, 16415, 16415, 16415, 16415, 16415, + 16415, 16415, 16415, 16415, 16415, 16415, 16415, 16415, 16415, 16415, + 16415, 16415, 12301, 9933, 15828, 15828, 15828, 15828, 15828, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 467, 1614, 1135, 1317, -1000, 1472, -1000, -178, 22007, - 16714, 1019, 2044, 1670, 39030, -1000, -1000, -1000, 1963, -1000, - 1963, 1614, 2234, 1762, 16127, -1000, -1000, 2234, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1129, -1000, 39030, 1460, - 1947, 39030, 1767, 1008, 298, -1000, 16714, 16714, 1458, -1000, - 858, 39030, -1000, -240, -1000, 28464, -1000, -1000, 9048, -1000, - 39030, 247, 39030, -1000, 21420, 27877, 10824, -66, -1000, 10824, - 1305, -1000, -59, -57, 13774, 535, -1000, -1000, -1000, 935, - 18475, 1119, 535, 45, -1000, -1000, -1000, 1538, -1000, 1538, - 1538, 1538, 1538, 298, 298, 298, 298, -1000, -1000, -1000, - -1000, -1000, 1583, 1581, -1000, 1538, 1538, 1538, 1538, -1000, + -1000, 477, 1196, 1234, 1259, -1000, 1440, -1000, -162, 21708, + 16415, 1062, 2018, 1616, 38731, -1000, -1000, -1000, 1916, -1000, + 1916, 1196, 2204, 1672, 15828, -1000, -1000, 2204, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1229, -1000, 38731, 1439, + 1909, 38731, 1693, 1060, 289, -1000, 16415, 16415, 1419, -1000, + 960, 38731, -1000, -218, -1000, 28165, -1000, -1000, 8749, -1000, + 38731, 267, 38731, -1000, 21121, 27578, 10525, -14, -1000, 10525, + 1350, -1000, -9, -20, 13475, 496, -1000, -1000, -1000, 3049, + 18176, 1217, 496, 63, -1000, -1000, -1000, 1543, -1000, 1543, + 1543, 1543, 1543, 289, 289, 289, 289, -1000, -1000, -1000, + -1000, -1000, 1572, 1568, -1000, 1543, 1543, 1543, 1543, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1578, 1578, 1578, 1541, - 1541, 300, -1000, 16714, 216, 39030, 1924, 870, 177, 338, - 1664, 1239, 1239, 1239, 338, -1000, 1201, 1084, -1000, -404, - 1444, -1000, -1000, 2004, -1000, -1000, 626, 715, 714, 435, - 39030, 133, 246, -1000, 307, -1000, 39030, 1239, 683, 479, - 1239, -1000, 1239, -1000, -1000, -1000, -1000, -1000, 1239, 1438, - -1000, 1426, 760, 705, 745, 702, 1438, -1000, -1000, -161, - 1438, -1000, 1438, -1000, 1438, -1000, 1438, -1000, 1438, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 554, 39030, 133, - 785, -1000, 356, -1000, -1000, 785, 785, -1000, -1000, -1000, - -1000, 1003, 998, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1564, 1564, 1564, 1545, + 1545, 334, -1000, 16415, 254, 38731, 1889, 905, 170, 347, + 1604, 1055, 1055, 1055, 347, -1000, 998, 991, -1000, -399, + 1415, -1000, -1000, 1985, -1000, -1000, 606, 716, 711, 581, + 38731, 145, 264, -1000, 328, -1000, 38731, 1055, 672, 472, + 1055, -1000, 1055, -1000, -1000, -1000, -1000, -1000, 1055, 1414, + -1000, 1515, 779, 710, 760, 707, 1414, -1000, -1000, -164, + 1414, -1000, 1414, -1000, 1414, -1000, 1414, -1000, 1414, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 580, 38731, 145, + 638, -1000, 360, -1000, -1000, 638, 638, -1000, -1000, -1000, + -1000, 1059, 1054, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -394, 39030, -1000, 149, 615, 236, 270, 220, 39030, 140, - 1950, 173, 218, 39030, 39030, 337, 1716, 39030, 1923, 39030, - -1000, -1000, -1000, -1000, -1000, 884, 39030, -1000, -1000, 725, - 725, -1000, -1000, 39030, 725, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 725, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 39030, - -1000, -1000, -1000, -1000, 39030, -1000, -1000, -1000, -1000, -1000, - 76, -62, 293, -1000, -1000, -1000, -1000, -1000, 1982, -1000, - 884, 668, 669, -1000, 1514, -1000, -1000, 806, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 845, 17301, 17301, 17301, 1403, - 385, 1481, 809, 1261, 773, 773, 750, 750, 547, 547, - 547, 547, 547, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 997, -1000, 1364, -1000, 1339, 977, 989, -1000, 1364, - 1364, 949, 16127, -1000, -1000, 640, -1000, 16714, 989, -1000, - -1000, 989, 989, 1385, 1371, 2043, -1000, -1000, -1000, -1000, + -388, 38731, -1000, 158, 614, 246, 286, 249, 38731, 210, + 1928, 209, 236, 38731, 38731, 341, 1650, 38731, 1885, 38731, + -1000, -1000, -1000, -1000, -1000, 919, 38731, -1000, -1000, 750, + 750, -1000, -1000, 38731, 750, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 750, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 38731, + -1000, -1000, -1000, -1000, 38731, -1000, -1000, -1000, -1000, -1000, + 140, -12, 266, -1000, -1000, -1000, -1000, -1000, 1940, -1000, + 919, 686, 660, -1000, 1465, -1000, -1000, 773, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 769, 17002, 17002, 17002, 1206, + 397, 868, 1297, 1432, 712, 712, 749, 749, 550, 550, + 550, 550, 550, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1038, -1000, 1324, -1000, 1999, 1257, 963, -1000, 1324, + 1324, 1168, 15828, -1000, -1000, 650, -1000, 16415, 963, -1000, + -1000, 963, 963, 1397, 1386, 2012, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 854, 1388, 1388, - 1388, 1388, 1388, 16714, 1074, -1000, -1000, -1000, 2141, 1961, - 989, 1180, 989, 1350, -1000, 1944, 1388, 1852, 1833, 1829, - 961, 1807, 1795, 1724, 1388, 1388, 1388, 1134, 1689, 1680, - 1668, 1653, 1646, 1624, 1618, 1608, 1600, 1388, 989, 16127, - 16127, 1319, 1514, 460, -1000, 1364, 989, 989, 1364, 1364, - 10232, 989, -1000, 39030, -1000, -318, -1000, -79, 495, 1514, - -1000, 27290, 989, -1000, 5770, -1000, 40204, -1000, -1000, -1000, - -1000, -1000, 24942, 1569, 2234, -1000, -1000, 1514, 1397, -1000, - -1000, 298, 5, 24355, -1000, -1000, 884, 884, 16714, -1000, - -1000, -1000, -1000, -1000, -1000, 458, 2033, 297, 1514, -1000, - 1505, 1925, -1000, -1000, -1000, 1938, 19067, -1000, 1514, 1514, - 39030, 1507, 1310, -1000, 455, -1000, 1305, -66, -73, -1000, - -1000, -1000, -1000, 884, -1000, 1060, 252, 801, -1000, 313, - -1000, -1000, -1000, -1000, 1848, 40, -1000, -1000, -1000, 298, - 298, -1000, -1000, -1000, -1000, -1000, -1000, 991, 991, -1000, - -1000, -1000, -1000, -1000, 867, -1000, -1000, -1000, 849, -1000, - -1000, 1596, 1718, 216, -1000, -1000, 614, 990, 1850, 39030, - -1000, -1000, 1107, 149, 39030, 664, 1713, -1000, 1664, 1664, - 1664, 39030, -1000, -1000, -1000, -1000, -396, 48, 296, -1000, - -1000, -1000, 2915, 39030, 1383, -1000, 124, -1000, 1104, 1797, - 39030, -1000, 1380, 1552, 1239, 1239, -1000, -1000, -1000, 39030, - 1514, -1000, -1000, -1000, -1000, 373, 1897, 1882, 133, 124, - 535, 1239, -1000, -1000, -1000, -1000, -1000, -397, 1367, 362, - 141, 235, 39030, 39030, 39030, 39030, 39030, 431, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 223, 352, -1000, 39030, - 39030, 481, -1000, -1000, -1000, 703, -1000, -1000, 703, -1000, - -1000, -1000, -1000, -1000, 1877, 39030, -64, -369, -1000, -361, - 16714, -1000, -1000, -1000, -1000, 1140, 369, 1481, 17301, 17301, - 16127, -154, 345, 345, 785, -1000, -1000, -1000, 16714, 16714, - 1206, 623, -1000, 16714, 814, -1000, -1000, -1000, 16714, 16714, - 16714, 989, 242, -1000, -1000, -1000, -1000, -1000, 2040, -1000, - 16714, 16714, 16714, -1000, -1000, 16714, 16714, -1000, 16714, 16714, - 17888, 989, 17888, 16714, 16714, 17888, -1000, -1000, -1000, -1000, - 17888, 16714, 16714, 16714, 16714, 16714, 16714, 16714, 16714, 16714, - -1000, -1000, 1364, 1364, 16127, 10232, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 495, -1000, 479, 479, - 479, 39030, -1000, -1000, -1000, -1000, -1000, -1000, 1255, 1964, - -1000, 1794, 1783, 2039, 2033, -1000, 21420, 2234, -1000, -1000, - 39030, -313, -1000, 1832, 1791, -1000, -1000, -1000, -1000, 8456, - 1963, 16714, 1710, 39030, 1514, -1000, 20833, 39030, 39030, 21420, - 21420, 21420, 21420, 21420, -1000, 1748, 1747, -1000, 1759, 1738, - 1766, 39030, -1000, 1353, 989, 1994, 19067, 259, 16714, 23181, - 1133, 21420, -1000, -1000, 21420, 39030, 7864, -1000, -1000, -72, - -84, -1000, -1000, -1000, -1000, 935, -1000, -1000, 579, 1937, - 1838, -1000, -1000, -1000, -1000, 1346, -1000, 1329, 1233, 1324, - 110, -1000, 1601, 1875, 614, 614, -1000, 833, -1000, 1239, - -1000, -1000, 355, -1000, 1920, 39030, 1709, 1706, 1704, -1000, - -409, 832, 1551, 1528, 16714, 1550, 2003, 1193, 39030, -1000, - -1000, 39030, -1000, -1000, 353, -1000, 216, 39030, -1000, -1000, - -1000, 246, 39030, -1000, 6225, 124, -1000, -1000, -1000, -1000, - -1000, -1000, 39030, 145, -1000, 1546, 955, -1000, -1000, 1659, - -1000, -1000, -1000, -1000, 136, 232, -1000, 39030, 465, 1718, - 39030, -1000, -1000, -1000, 725, 725, -1000, -1000, 1873, -1000, - 1239, 1388, 17301, 17301, -1000, 542, -1000, 1514, 989, 1538, - 1538, -1000, 1538, 1541, -1000, 1538, 101, 1538, 99, 1538, - -1000, -1000, 989, 989, 984, 1058, -125, -1000, 884, 16714, - 1592, 1539, 1388, -1000, 1531, 1530, 16714, 1388, 1388, 1388, - -1000, 884, 961, 1532, 1267, -1000, -1000, -1000, -1000, 1231, - 1388, 1527, 989, 989, 1322, 1322, 1322, 1322, 1322, 1317, - 1317, 1317, 1317, -1000, -1000, 989, -1000, -1000, 1954, 1954, - 1954, 1295, 39617, 39030, -1000, -1000, -1000, -1000, 2033, 2028, - 1227, -1000, -1000, 5, 354, -1000, 1828, 1791, -1000, 2002, - 1824, 2001, -1000, -1000, -1000, 884, -1000, 1906, 1409, -1000, - 610, 1152, -1000, -1000, 15540, 1307, 1771, 453, 1295, 1271, - 1925, 1632, 1693, 1776, -1000, -1000, -1000, -1000, 1727, -1000, - 1705, -1000, -1000, 1518, -1000, -1000, 1135, 989, 1264, 247, - 21420, 1246, 1246, -1000, 449, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 740, 5930, 2071, -1000, 987, -1000, 967, -1000, - 681, 678, -1000, 39030, 1529, -1000, 298, 983, 298, 825, - -1000, 817, -1000, -1000, -255, -1000, -1000, 1570, 1717, -1000, - -1000, 39030, -1000, -1000, 39030, 39030, 39030, 1526, 2000, -1000, - 16714, 1524, 588, 1523, 39030, 39030, -1000, -1000, 234, 1514, - -1000, 1293, 1279, -1000, -210, -1000, 16714, -1000, -1000, -1000, - 933, 933, -1000, 1518, -1000, -1000, -1000, 1102, -1000, -1000, - -163, 39030, 39030, 39030, 39030, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 542, 17301, -1000, -1000, 298, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 16714, - -1000, 16714, -1000, 1963, 976, 884, 16714, 16714, -1000, 790, - 788, 1388, -1000, -1000, -1000, 989, 17888, -1000, 17888, -1000, - 16714, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 1514, 1784, 1514, 1514, 23181, -1000, -1000, - 2028, 2016, 1997, 1810, 1816, 1816, 1828, -1000, 1996, 1992, - -1000, 973, 1991, 969, 677, -1000, 39030, 16714, 1514, -1000, - 276, 39030, 1514, 39030, -1000, 2014, -1000, -1000, 16714, 1521, - -1000, 16714, -1000, -1000, -1000, -1000, -1000, -1000, 6441, 2033, - 1246, -1000, -1000, 558, -1000, 16714, -1000, -1000, -1000, 4198, - -1000, -1000, -1000, -1000, -1000, 1520, 16714, -1000, -1000, -1000, - 1099, 1093, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 1518, -1000, -1000, -1000, -1000, 246, -401, 1492, 39030, 784, - -1000, 1269, 1193, 437, -1000, 16714, 289, -1000, 246, -1000, - -217, -220, 1388, -1000, -1000, 1936, -1000, -1000, 10232, -1000, - -1000, 1517, 1663, -1000, 226, -1000, 1388, 1388, 989, -1000, - 1388, 1388, 1080, 1064, -1000, -1000, 1267, -1000, 956, 23768, - -1000, 1987, 1986, 26703, 26703, 495, 2016, -1000, 16714, 16714, - 1804, 783, -1000, -1000, -1000, -1000, 960, 953, -1000, 947, - -1000, 2066, -1000, 884, -1000, 1514, -1000, 444, 1152, -1000, - 1963, 884, 39030, 884, 20, 2014, -1000, 1388, -1000, 1514, - 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, - 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, - 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, - 1514, 39030, 1260, -1000, -1000, 1929, 1262, 47, -1000, 1259, - -1000, -1000, -1000, -1000, 14953, -1000, -1000, -1000, -1000, -1000, - -1000, 259, 1189, -1000, 584, 39030, 39030, 989, 231, -172, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 16714, - 1252, -1000, -1000, -1000, -1000, -1000, 1252, 1252, -1000, -1000, - 884, 1180, -1000, 771, -1000, -1000, -1000, -1000, -1000, 39030, - 1152, 39030, -1000, 1224, 989, 1514, 1963, -1000, 1197, -1000, - 259, -1000, 1404, 1528, -1000, 989, -162, 10232, 7272, 1112, - -1000, -1000, 1760, -159, -204, 961, 26116, -1000, -1000, -1000, - -1000, -1000, 1085, -1000, -1000, 23181, 38443, -1000, 1692, 697, - -162, 16714, 1141, -1000, -1000, -46, -1000, -1000, -1000, -1000, - -1000, 1659, -1000, 1745, -1000, 989, -1000, -1000, -1000, 1097, - -1000, 5106, -281, 1691, -1000, 2037, -1000, -1000, -1000, 728, - 811, -1000, -1000, -1000, -1000, 1183, 39030, 283, -1000, -1000, - -163, -165, -1000, -1000, 38443, -277, 535, 6441, -1000, -1000, - 2057, 544, 544, -1000, -1000, -411, 1091, 157, -1000, -174, - -1000, -1000, 1917, 20, -1000, -1000, -1000, 314, 795, -1000, - -1000, 776, -411, -1000, -208, -283, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 6441, 176, 176, -1000, 1684, -1000, - -1000, 6441, -1000, 1682, -260, -1000, -345, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1665, 1528, 1528, + 1528, 1528, 1528, 16415, 1393, -1000, -1000, -1000, 1853, 1828, + 963, 1225, 963, 1361, -1000, 1822, 1528, 1815, 1783, 1736, + 1471, 1729, 1724, 1718, 1528, 1528, 1528, 1144, 1709, 1700, + 1676, 1670, 1656, 1641, 1635, 1623, 1613, 1528, 963, 15828, + 15828, 1359, 1465, 475, -1000, 1324, 963, 963, 1324, 1324, + 9933, 963, -1000, 38731, -1000, -300, -1000, -54, 506, 1465, + -1000, 26404, 963, -1000, 5457, -1000, 39905, -1000, -1000, -1000, + -1000, -1000, 24643, 1615, 2204, -1000, -1000, 1465, 1391, -1000, + -1000, 289, 35, 24056, -1000, -1000, 919, 919, 16415, -1000, + -1000, -1000, -1000, -1000, -1000, 459, 1996, 322, 1465, -1000, + 1353, 1927, -1000, -1000, -1000, 1905, 18768, -1000, 1465, 1465, + 38731, 1525, 1420, -1000, 456, -1000, 1350, -14, -1, -1000, + -1000, -1000, -1000, 919, -1000, 986, 269, 325, -1000, 326, + -1000, -1000, -1000, -1000, 1796, 56, -1000, -1000, -1000, 289, + 289, -1000, -1000, -1000, -1000, -1000, -1000, 1036, 1036, -1000, + -1000, -1000, -1000, -1000, 897, -1000, -1000, -1000, 872, -1000, + -1000, 1580, 1609, 254, -1000, -1000, 609, 1031, 1800, 38731, + -1000, -1000, 1205, 158, 38731, 655, 1649, -1000, 1604, 1604, + 1604, 38731, -1000, -1000, -1000, -1000, -390, 55, 324, -1000, + -1000, -1000, 2954, 38731, 1346, -1000, 141, -1000, 1182, -1000, + 38731, -1000, 1340, 1562, 1055, 1055, -1000, -1000, -1000, 38731, + 1465, -1000, -1000, -1000, -1000, 385, 1859, 1855, 145, 141, + 496, 1055, -1000, -1000, -1000, -1000, -1000, -391, 1329, 367, + 149, 256, 38731, 38731, 38731, 38731, 38731, 446, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 226, 352, -1000, 38731, + 38731, 487, -1000, -1000, -1000, 727, -1000, -1000, 727, -1000, + -1000, -1000, -1000, -1000, 1854, 38731, -21, -358, -1000, -353, + 16415, -1000, -1000, -1000, -1000, 1032, 381, 868, 17002, 17002, + 15828, -157, 1064, 1064, 638, -1000, -1000, -1000, 16415, 16415, + 1335, 633, -1000, 16415, 878, -1000, -1000, -1000, 16415, 16415, + 16415, 963, 240, -1000, -1000, -1000, -1000, -1000, 2003, -1000, + 16415, 16415, 16415, -1000, -1000, 16415, 16415, -1000, 16415, 16415, + 17589, 963, 17589, 16415, 16415, 17589, -1000, -1000, -1000, -1000, + 17589, 16415, 16415, 16415, 16415, 16415, 16415, 16415, 16415, 16415, + -1000, -1000, 1324, 1324, 15828, 9933, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 506, -1000, 472, 472, + 472, 38731, -1000, -1000, -1000, -1000, -1000, -1000, 1344, 1933, + -1000, 1710, 1708, 2002, 1996, -1000, 21121, 2204, -1000, -1000, + 38731, -295, -1000, 1774, 1857, -1000, -1000, -1000, -1000, 8157, + 1916, 16415, 1648, 38731, 1465, -1000, 20534, 38731, 38731, 21121, + 21121, 21121, 21121, 21121, -1000, 1681, 1677, -1000, 1719, 1675, + 1782, 38731, -1000, 1322, 963, 1954, 18768, 296, 16415, 22882, + 1246, 21121, -1000, -1000, 21121, 38731, 7565, -1000, -1000, -39, + -46, -1000, -1000, -1000, -1000, 3049, -1000, -1000, 810, 1904, + 1793, -1000, -1000, -1000, -1000, 1312, -1000, 1303, 1342, 1291, + 131, -1000, 1608, 1849, 609, 609, -1000, 871, -1000, 1055, + -1000, -1000, 366, -1000, 1883, 38731, 1647, 1644, 1640, -1000, + -398, 854, 1561, 1530, 16415, 1556, 1983, 1264, 38731, -1000, + -1000, 38731, -1000, 159, -1000, 254, 38731, -1000, -1000, -1000, + 264, 38731, -1000, 5990, 141, -1000, -1000, -1000, -1000, -1000, + -1000, 38731, 157, -1000, 1547, 815, -1000, -1000, 1536, -1000, + -1000, -1000, -1000, 143, 242, -1000, 38731, 471, 1609, 38731, + -1000, -1000, -1000, 750, 750, -1000, -1000, 1837, -1000, 1055, + 1528, 17002, 17002, -1000, 542, -1000, 1465, 963, 1543, 1543, + -1000, 1543, 1545, -1000, 1543, 112, 1543, 111, 1543, -1000, + -1000, 963, 963, 1040, 956, -101, -1000, 919, 16415, 1601, + 1570, 1528, -1000, 1539, 1529, 16415, 1528, 1528, 1528, -1000, + 919, 1471, 1565, 1212, -1000, -1000, -1000, -1000, 1319, 1528, + 1557, 963, 963, 1272, 1272, 1272, 1272, 1272, 1259, 1259, + 1259, 1259, -1000, -1000, 963, -1000, -1000, 1932, 1932, 1932, + 1243, 39318, 38731, -1000, -1000, -1000, -1000, 1996, 1994, 1305, + -1000, -1000, 35, 353, -1000, 1741, 1857, -1000, 1982, 1769, + 1967, -1000, -1000, -1000, 919, -1000, 1869, 1447, -1000, 613, + 1221, -1000, -1000, 15241, 1252, 1566, 450, 1243, 1269, 1927, + 1634, 1638, 1961, -1000, -1000, -1000, -1000, 1669, -1000, 1663, + -1000, -1000, 1488, -1000, -1000, 1234, 963, 1548, 267, 21121, + 1261, 1261, -1000, 422, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 734, 5843, 2032, -1000, 1030, -1000, 929, -1000, 671, + 669, -1000, 38731, 1527, -1000, 289, 1026, 289, 853, -1000, + 846, -1000, -1000, -233, -1000, -1000, 1555, 1600, -1000, -1000, + 38731, -1000, -1000, 38731, 38731, 38731, 1522, 1965, -1000, 16415, + 1518, 610, 1538, 38731, 38731, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 368, 609, -370, 229, 212, + 609, 609, 609, -1000, -1000, 1241, 1227, -1000, -189, -1000, + 16415, -1000, -1000, -1000, 824, 824, -1000, 1488, -1000, -1000, + -1000, 1179, -1000, -1000, -170, 38731, 38731, 38731, 38731, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 542, + 17002, -1000, -1000, 289, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 16415, -1000, 16415, -1000, 1916, 1024, 919, + 16415, 16415, -1000, 839, 828, 1528, -1000, -1000, -1000, 963, + 17589, -1000, 17589, -1000, 16415, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1465, 1827, 1465, + 1465, 22882, -1000, -1000, 1994, 1992, 1963, 1753, 1747, 1747, + 1741, -1000, 1962, 1957, -1000, 1023, 1952, 1022, 663, -1000, + 38731, 16415, 1465, -1000, 292, 38731, 1465, 38731, -1000, 1955, + -1000, -1000, 16415, 1504, -1000, 16415, -1000, -1000, -1000, -1000, + -1000, -1000, 5685, 1996, 1261, -1000, -1000, 560, -1000, 16415, + -1000, -1000, -1000, 5002, -1000, -1000, -1000, -1000, -1000, 1491, + 16415, -1000, -1000, -1000, 1175, 1150, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 1488, -1000, -1000, -1000, -1000, 264, + -396, 1533, 38731, 812, -1000, 1215, 1264, 250, 1465, 1020, + 609, 609, 609, 775, 772, 26404, 305, -1000, 264, -1000, + -196, -198, 1528, -1000, -1000, 1903, -1000, -1000, 9933, -1000, + -1000, 1478, 1573, -1000, 200, -1000, 1528, 1528, 963, -1000, + 1528, 1528, 1148, 1102, -1000, -1000, 1212, -1000, 925, 23469, + -1000, 1951, 1948, 26991, 26991, 506, 1992, -1000, 16415, 16415, + 1728, 809, -1000, -1000, -1000, -1000, 1019, 1004, -1000, 997, + -1000, 2030, -1000, 919, -1000, 1465, -1000, 416, 1221, -1000, + 1916, 919, 38731, 919, 33, 1955, -1000, 1528, -1000, 1465, + 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, + 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, + 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, + 1465, 38731, 1517, -1000, -1000, 1897, 1210, 54, -1000, 1208, + -1000, -1000, 442, -1000, 16415, -1000, 26404, 992, 985, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 296, 1239, -1000, + 604, 38731, 38731, 963, 260, -174, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 16415, 1204, -1000, -1000, -1000, + -1000, -1000, 1204, 1204, -1000, -1000, 919, 1225, -1000, 743, + -1000, -1000, -1000, -1000, -1000, 38731, 1221, 38731, -1000, 1202, + 963, 1465, 1916, -1000, 1178, -1000, 296, -1000, 1464, 1530, + -1000, -1000, -1000, 14654, -1000, -1000, -1000, -1000, -169, 9933, + 6973, 1141, -1000, -1000, 1691, -160, -179, 1471, 25817, -1000, + -1000, -1000, -1000, -1000, 1070, -1000, -1000, 22882, 38144, -1000, + 1636, 696, -169, 16415, 1298, 963, -1000, -36, -1000, -1000, + -1000, -1000, -1000, 1536, -1000, 1687, -1000, 963, -1000, -1000, + -1000, 1135, -1000, 3779, -261, 1630, -1000, 2000, -1000, -1000, + -1000, 725, 979, -1000, -1000, -1000, -1000, 858, 38731, -1000, + 318, -1000, -1000, -170, -172, -1000, -1000, 38144, -257, 496, + 5685, -1000, -1000, 2028, 519, 519, -1000, -1000, -404, 1118, + 161, -1000, -175, -1000, -1000, 1881, 33, -1000, -1000, -1000, + 327, 811, -1000, -1000, 766, -404, -1000, -180, -262, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 5685, 214, 214, + -1000, 1622, -1000, -1000, 5685, -1000, 1620, -222, -1000, -344, + -1000, -1000, } var yyPgo = [...]int{ - 0, 2451, 2449, 19, 3, 2448, 67, 83, 173, 20, - 185, 89, 2445, 2444, 2441, 2439, 2438, 2436, 2431, 205, - 203, 200, 2430, 2429, 2428, 2427, 2426, 2423, 2421, 2420, - 2417, 2415, 194, 156, 162, 2414, 2412, 2409, 96, 168, - 79, 81, 172, 2407, 2402, 76, 2400, 2399, 2394, 201, - 199, 724, 2391, 170, 108, 29, 2390, 2389, 2388, 2387, - 2385, 2384, 2383, 2382, 2381, 2380, 2378, 2377, 2376, 2373, - 2372, 2371, 299, 2370, 2368, 12, 2366, 74, 2365, 2364, - 2362, 2361, 118, 2360, 2359, 2358, 2355, 2354, 2353, 134, - 2352, 2350, 2349, 2348, 177, 2347, 2344, 294, 105, 101, - 2343, 2342, 92, 159, 2341, 110, 2340, 2339, 2338, 146, - 2337, 4490, 2336, 47, 61, 2335, 70, 85, 58, 50, - 24, 15, 2334, 2333, 46, 73, 2332, 91, 65, 2326, - 106, 93, 2325, 2323, 10, 4, 2321, 2, 2319, 1, - 52, 2318, 2316, 116, 2312, 2311, 2310, 88, 2308, 2307, - 4748, 2306, 82, 123, 95, 66, 2304, 39, 94, 2303, - 2300, 2295, 2292, 2291, 41, 2290, 2289, 2282, 133, 34, - 153, 26, 59, 42, 126, 2281, 30, 75, 2275, 131, - 129, 2274, 44, 28, 32, 2273, 27, 122, 144, 25, - 86, 128, 2271, 2269, 45, 63, 2268, 2267, 2265, 2264, - 2263, 2262, 55, 2260, 43, 2259, 174, 2256, 37, 2251, - 31, 35, 2250, 48, 225, 60, 22, 2247, 176, 2245, - 38, 143, 121, 150, 2244, 2242, 2241, 2240, 164, 238, - 2239, 2228, 69, 154, 137, 141, 2226, 239, 2225, 2222, - 90, 1128, 1841, 23, 152, 2219, 2214, 2832, 135, 130, - 13, 2212, 197, 2210, 2209, 2205, 175, 157, 100, 876, - 99, 2204, 7, 2203, 2201, 2200, 2194, 2188, 2186, 84, - 178, 127, 5, 161, 71, 2182, 2173, 2172, 120, 97, - 2171, 149, 148, 117, 167, 2167, 158, 138, 107, 2166, - 103, 2158, 2157, 2153, 2151, 80, 2149, 2147, 2141, 2139, - 151, 136, 115, 77, 2129, 78, 111, 142, 140, 33, - 2127, 40, 2124, 2122, 171, 21, 2121, 6, 49, 53, - 17, 98, 139, 2120, 0, 2118, 11, 155, 237, 160, - 2113, 2109, 9, 2105, 8, 2101, 125, 2100, 2097, 2095, - 16, 36, 14, 18, 2089, 2086, 3577, 2788, 119, 2085, - 179, + 0, 2440, 2439, 22, 1, 2438, 2437, 2435, 24, 88, + 180, 21, 185, 97, 2433, 2432, 2431, 2430, 2429, 2428, + 2427, 224, 222, 212, 2425, 2421, 2420, 2417, 2415, 2414, + 2412, 2410, 2402, 2401, 204, 164, 176, 2399, 2398, 2397, + 106, 172, 80, 82, 175, 2393, 2392, 74, 2390, 2389, + 2388, 170, 167, 722, 2387, 161, 110, 33, 2386, 2385, + 2383, 2382, 2380, 2378, 2377, 2376, 2374, 2371, 2370, 2369, + 2367, 2366, 2365, 2364, 2363, 173, 2362, 2361, 12, 2358, + 76, 2357, 2356, 2355, 2354, 126, 2352, 2351, 2349, 2347, + 2346, 2345, 2344, 139, 2343, 2342, 2341, 2340, 182, 2339, + 2338, 145, 105, 103, 2337, 2336, 89, 178, 2335, 116, + 2334, 2333, 2332, 150, 2328, 3824, 2326, 63, 50, 2324, + 65, 79, 48, 52, 85, 20, 2323, 2321, 59, 96, + 2317, 91, 66, 2305, 86, 107, 2304, 2303, 9, 2, + 2301, 8, 2300, 7, 67, 2299, 2297, 118, 2296, 2290, + 2289, 84, 2288, 2287, 4206, 2282, 81, 133, 94, 70, + 2281, 35, 55, 2274, 2272, 2270, 2266, 2265, 39, 2264, + 2263, 2261, 138, 95, 165, 31, 42, 41, 129, 2258, + 30, 75, 2256, 136, 137, 2255, 45, 32, 27, 2252, + 40, 123, 151, 19, 83, 128, 2250, 2249, 49, 69, + 2248, 2247, 2245, 2244, 2243, 2241, 68, 2240, 44, 2239, + 181, 2238, 14, 2235, 38, 26, 2233, 60, 131, 61, + 29, 2231, 155, 2229, 46, 159, 124, 156, 2223, 2222, + 2221, 2205, 179, 256, 2200, 2194, 71, 160, 141, 147, + 2193, 257, 2190, 2188, 100, 1206, 1906, 23, 158, 2187, + 2180, 2403, 142, 28, 18, 2174, 135, 2173, 2172, 2171, + 184, 162, 101, 928, 99, 2170, 10, 2168, 2167, 2166, + 2165, 2164, 2163, 90, 2159, 2158, 2154, 183, 58, 4, + 157, 73, 2153, 2151, 2149, 119, 93, 2148, 153, 152, + 125, 111, 2147, 169, 143, 127, 2139, 149, 2138, 2135, + 2130, 2129, 2126, 92, 2121, 2113, 2109, 2108, 154, 140, + 115, 77, 2105, 78, 108, 146, 144, 36, 2099, 37, + 2097, 2095, 2089, 174, 13, 2085, 5, 47, 53, 17, + 98, 120, 2083, 0, 2082, 11, 171, 255, 148, 2079, + 2078, 3, 2072, 6, 2070, 134, 2069, 2062, 2061, 16, + 43, 15, 34, 2060, 2057, 4196, 2938, 130, 2056, 186, } -//line sql.y:6630 +//line sql.y:6729 type yySymType struct { union any empty struct{} @@ -6187,6 +6165,16 @@ func (st *yySymType) partitionByTypeUnion() PartitionByType { return v } +func (st *yySymType) partitionDefinitionOptionsUnion() *PartitionDefinitionOptions { + v, _ := st.union.(*PartitionDefinitionOptions) + return v +} + +func (st *yySymType) partitionEngineUnion() *PartitionEngine { + v, _ := st.union.(*PartitionEngine) + return v +} + func (st *yySymType) partitionOptionUnion() *PartitionOption { v, _ := st.union.(*PartitionOption) return v @@ -6358,178 +6346,180 @@ func (st *yySymType) withUnion() *With { } var yyR1 = [...]int{ - 0, 344, 345, 345, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 324, 324, - 324, 327, 327, 30, 67, 32, 32, 31, 31, 34, - 34, 33, 6, 6, 6, 7, 7, 7, 7, 7, - 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 11, 11, 11, 11, 11, 17, 18, 10, - 10, 19, 19, 80, 80, 20, 21, 21, 21, 21, - 348, 348, 145, 145, 143, 143, 144, 144, 213, 213, - 22, 23, 23, 223, 223, 222, 222, 222, 224, 224, - 224, 224, 259, 259, 24, 24, 24, 24, 24, 95, - 95, 326, 326, 325, 317, 317, 316, 316, 315, 323, - 323, 322, 322, 321, 36, 37, 46, 46, 46, 46, - 47, 48, 328, 328, 291, 52, 52, 51, 51, 51, - 51, 53, 53, 50, 50, 49, 49, 293, 293, 280, - 280, 292, 292, 292, 292, 292, 292, 292, 279, 279, - 106, 106, 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 192, 339, 339, 193, 193, 193, 193, 193, - 193, 115, 115, 124, 124, 124, 124, 124, 113, 113, - 114, 112, 112, 112, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, - 343, 343, 343, 343, 343, 343, 343, 123, 123, 119, - 119, 119, 120, 120, 120, 121, 121, 340, 340, 340, - 340, 262, 262, 262, 262, 265, 265, 263, 263, 263, - 263, 263, 263, 263, 263, 263, 264, 264, 264, 264, - 264, 266, 266, 266, 266, 266, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 268, 268, 268, 268, 268, 268, 268, 268, 278, - 278, 269, 269, 273, 273, 274, 274, 274, 275, 275, - 275, 276, 276, 271, 271, 271, 271, 271, 271, 272, - 272, 272, 281, 305, 305, 304, 304, 302, 302, 302, - 302, 290, 290, 299, 299, 299, 299, 299, 289, 289, - 285, 285, 285, 286, 286, 287, 287, 284, 284, 288, - 288, 301, 301, 300, 282, 282, 283, 283, 307, 341, - 341, 341, 341, 342, 342, 308, 333, 334, 332, 332, - 332, 332, 332, 77, 77, 77, 236, 236, 236, 297, - 297, 296, 296, 296, 298, 298, 295, 295, 295, 295, - 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, - 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, - 295, 295, 295, 295, 231, 231, 231, 331, 331, 331, - 331, 331, 331, 330, 330, 330, 294, 294, 294, 329, - 329, 54, 54, 177, 177, 43, 43, 43, 43, 43, - 43, 42, 42, 42, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 44, 44, 39, - 39, 39, 39, 39, 39, 39, 39, 39, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 82, 82, - 83, 83, 83, 83, 84, 84, 84, 310, 310, 55, - 55, 3, 3, 133, 135, 136, 136, 134, 134, 134, - 134, 134, 134, 57, 57, 56, 56, 138, 137, 139, - 139, 139, 1, 1, 2, 2, 4, 4, 314, 314, - 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, - 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, - 277, 277, 277, 309, 309, 311, 313, 313, 313, 313, - 312, 91, 91, 26, 35, 35, 27, 27, 27, 27, - 28, 28, 58, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 230, 230, 238, 238, 229, 229, 252, - 252, 252, 232, 232, 232, 233, 233, 338, 338, 338, - 226, 226, 60, 60, 60, 62, 62, 63, 64, 64, - 254, 254, 255, 255, 65, 66, 78, 78, 78, 78, - 78, 78, 81, 81, 81, 13, 13, 13, 13, 74, - 74, 74, 12, 12, 61, 61, 68, 335, 335, 336, - 337, 337, 337, 337, 69, 71, 29, 29, 29, 29, - 29, 29, 101, 101, 89, 89, 89, 89, 89, 89, - 89, 89, 89, 89, 89, 89, 96, 96, 96, 90, - 90, 349, 72, 73, 73, 94, 94, 94, 87, 87, - 87, 93, 93, 93, 14, 14, 15, 212, 212, 16, - 16, 98, 98, 100, 100, 100, 100, 100, 102, 102, - 102, 102, 102, 102, 102, 97, 97, 99, 99, 99, - 99, 245, 245, 245, 244, 244, 127, 127, 129, 128, - 128, 130, 130, 131, 131, 131, 131, 175, 175, 153, - 153, 210, 210, 208, 208, 209, 209, 211, 211, 211, - 211, 214, 214, 132, 132, 132, 132, 140, 140, 141, - 141, 142, 142, 253, 253, 250, 250, 250, 249, 249, - 146, 146, 146, 148, 147, 147, 147, 147, 149, 149, - 151, 151, 150, 150, 152, 157, 157, 156, 156, 154, - 154, 154, 154, 155, 155, 155, 155, 158, 158, 111, - 111, 111, 111, 111, 111, 111, 122, 122, 122, 122, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 79, 79, 79, - 227, 227, 159, 159, 167, 167, 167, 167, 160, 160, - 160, 160, 160, 160, 160, 168, 168, 168, 174, 169, - 169, 165, 165, 165, 165, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 163, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 320, 320, 319, 319, 318, 318, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 350, 350, 270, - 270, 270, 270, 166, 166, 166, 166, 166, 92, 92, - 92, 92, 92, 258, 258, 258, 261, 261, 261, 260, - 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, - 260, 260, 260, 260, 180, 180, 88, 88, 178, 178, - 179, 181, 181, 176, 176, 176, 162, 162, 162, 182, - 182, 183, 183, 184, 184, 186, 185, 185, 187, 188, - 188, 188, 189, 189, 190, 190, 190, 45, 45, 45, - 45, 45, 40, 40, 40, 40, 41, 41, 41, 103, - 103, 103, 103, 105, 105, 104, 104, 75, 75, 76, - 76, 76, 109, 109, 110, 110, 110, 107, 107, 108, - 108, 206, 206, 191, 191, 191, 198, 198, 198, 194, - 194, 196, 196, 196, 197, 197, 197, 195, 203, 203, - 205, 205, 204, 204, 200, 200, 201, 201, 202, 202, - 202, 199, 199, 161, 161, 161, 161, 161, 207, 207, - 207, 207, 215, 215, 171, 171, 173, 173, 172, 126, - 216, 216, 220, 217, 217, 221, 221, 221, 221, 221, - 218, 218, 219, 219, 246, 246, 246, 225, 225, 237, - 237, 234, 234, 235, 235, 228, 228, 239, 239, 239, - 70, 170, 170, 306, 306, 303, 242, 242, 243, 243, - 247, 247, 251, 251, 248, 248, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 346, 347, 256, 257, 257, 257, + 0, 353, 354, 354, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 333, 333, + 333, 336, 336, 32, 70, 34, 34, 33, 33, 36, + 36, 35, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, + 11, 11, 13, 13, 13, 13, 13, 19, 20, 12, + 12, 21, 21, 83, 83, 22, 23, 23, 23, 23, + 357, 357, 149, 149, 147, 147, 148, 148, 217, 217, + 24, 25, 25, 227, 227, 226, 226, 226, 228, 228, + 228, 228, 263, 263, 26, 26, 26, 26, 26, 99, + 99, 335, 335, 334, 326, 326, 325, 325, 324, 332, + 332, 331, 331, 330, 38, 39, 48, 48, 48, 48, + 49, 50, 337, 337, 299, 54, 54, 53, 53, 53, + 53, 55, 55, 52, 52, 51, 51, 301, 301, 287, + 287, 300, 300, 300, 300, 300, 300, 300, 286, 286, + 110, 110, 196, 196, 196, 196, 196, 196, 196, 196, + 196, 196, 196, 348, 348, 197, 197, 197, 197, 197, + 197, 119, 119, 128, 128, 128, 128, 128, 117, 117, + 118, 116, 116, 116, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 352, 127, 127, 123, + 123, 123, 124, 124, 124, 125, 125, 349, 349, 349, + 349, 266, 266, 266, 266, 269, 269, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 268, 268, 268, 268, + 268, 270, 270, 270, 270, 270, 271, 271, 271, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, + 271, 272, 272, 272, 272, 272, 272, 272, 272, 285, + 285, 273, 273, 280, 280, 281, 281, 281, 282, 282, + 282, 283, 283, 278, 278, 278, 278, 278, 278, 279, + 279, 279, 288, 313, 313, 312, 312, 310, 310, 310, + 310, 297, 297, 307, 307, 307, 307, 307, 296, 296, + 292, 292, 292, 293, 293, 294, 294, 291, 291, 295, + 295, 309, 309, 308, 289, 289, 290, 290, 315, 350, + 350, 350, 350, 351, 351, 316, 342, 343, 341, 341, + 341, 341, 341, 80, 80, 80, 240, 240, 240, 305, + 305, 304, 304, 304, 306, 306, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, + 303, 303, 303, 303, 235, 235, 235, 340, 340, 340, + 340, 340, 340, 339, 339, 339, 302, 302, 302, 338, + 338, 56, 56, 181, 181, 45, 45, 45, 45, 45, + 45, 44, 44, 44, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 46, 46, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 85, 85, + 86, 86, 86, 86, 88, 88, 88, 318, 318, 57, + 57, 3, 3, 137, 139, 140, 140, 138, 138, 138, + 138, 138, 138, 59, 59, 58, 58, 142, 141, 143, + 143, 143, 1, 1, 2, 2, 4, 4, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 284, 284, 284, 317, 317, 319, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 321, 321, 321, 60, 60, + 322, 274, 275, 276, 5, 6, 298, 320, 95, 95, + 28, 37, 37, 29, 29, 29, 29, 30, 30, 61, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 234, 234, 242, 242, 233, 233, 256, 256, 256, 236, + 236, 236, 237, 237, 347, 347, 347, 230, 230, 63, + 63, 63, 65, 65, 66, 67, 67, 258, 258, 259, + 259, 68, 69, 81, 81, 81, 81, 81, 81, 84, + 84, 84, 15, 15, 15, 15, 77, 77, 77, 14, + 14, 64, 64, 71, 344, 344, 345, 346, 346, 346, + 346, 72, 74, 31, 31, 31, 31, 31, 31, 105, + 105, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 100, 100, 100, 94, 94, 358, 75, + 76, 76, 98, 98, 98, 91, 91, 91, 97, 97, + 97, 16, 16, 17, 216, 216, 18, 18, 102, 102, + 104, 104, 104, 104, 104, 106, 106, 106, 106, 106, + 106, 106, 101, 101, 103, 103, 103, 103, 249, 249, + 249, 248, 248, 131, 131, 133, 132, 132, 134, 134, + 135, 135, 135, 135, 179, 179, 157, 157, 214, 214, + 212, 212, 213, 213, 215, 215, 215, 215, 218, 218, + 136, 136, 136, 136, 144, 144, 145, 145, 146, 146, + 257, 257, 254, 254, 254, 253, 253, 150, 150, 150, + 152, 151, 151, 151, 151, 153, 153, 155, 155, 154, + 154, 156, 161, 161, 160, 160, 158, 158, 158, 158, + 159, 159, 159, 159, 162, 162, 115, 115, 115, 115, + 115, 115, 115, 126, 126, 126, 126, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 82, 82, 82, 231, 231, 163, + 163, 171, 171, 171, 171, 164, 164, 164, 164, 164, + 164, 164, 172, 172, 172, 178, 173, 173, 169, 169, + 169, 169, 167, 167, 167, 167, 167, 167, 167, 167, + 167, 167, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 329, 329, 328, + 328, 327, 327, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 359, 359, 277, 277, 277, 277, + 170, 170, 170, 170, 170, 96, 96, 96, 96, 96, + 262, 262, 262, 265, 265, 265, 264, 264, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, + 264, 184, 184, 92, 92, 182, 182, 183, 185, 185, + 180, 180, 180, 166, 166, 166, 186, 186, 187, 187, + 188, 188, 190, 189, 189, 191, 192, 192, 192, 193, + 193, 194, 194, 194, 47, 47, 47, 47, 47, 42, + 42, 42, 42, 43, 43, 43, 107, 107, 107, 107, + 109, 109, 108, 108, 78, 78, 79, 79, 79, 113, + 113, 114, 114, 114, 111, 111, 112, 112, 210, 210, + 195, 195, 195, 202, 202, 202, 198, 198, 200, 200, + 200, 201, 201, 201, 199, 207, 207, 209, 209, 208, + 208, 204, 204, 205, 205, 206, 206, 206, 203, 203, + 165, 165, 165, 165, 165, 211, 211, 211, 211, 219, + 219, 175, 175, 177, 177, 176, 130, 220, 220, 224, + 221, 221, 225, 225, 225, 225, 225, 222, 222, 223, + 223, 250, 250, 250, 229, 229, 241, 241, 238, 238, + 239, 239, 232, 232, 243, 243, 243, 73, 174, 174, + 314, 314, 311, 246, 246, 247, 247, 251, 251, 255, + 255, 252, 252, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 355, 356, + 260, 261, 261, 261, } var yyR2 = [...]int{ @@ -6591,71 +6581,73 @@ var yyR2 = [...]int{ 1, 2, 1, 1, 0, 2, 0, 2, 5, 3, 7, 4, 4, 4, 4, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, - 0, 2, 2, 1, 3, 2, 0, 4, 4, 3, - 2, 1, 3, 3, 3, 5, 7, 7, 6, 5, - 3, 2, 3, 3, 3, 7, 3, 3, 3, 3, - 4, 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, 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, 2, 1, 1, 5, - 0, 1, 0, 1, 2, 3, 0, 3, 3, 3, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 3, 3, 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, 3, 4, 3, - 7, 0, 3, 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, 6, 3, 4, 3, 1, - 3, 4, 5, 6, 3, 4, 5, 6, 3, 4, - 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 1, 1, 1, 1, 1, 3, 1, - 1, 2, 2, 2, 2, 1, 1, 2, 9, 6, - 6, 6, 2, 2, 3, 3, 3, 1, 1, 1, - 0, 3, 1, 1, 1, 2, 1, 2, 1, 1, + 0, 2, 2, 1, 3, 2, 0, 2, 2, 2, + 2, 2, 2, 2, 2, 4, 4, 3, 0, 1, + 4, 3, 4, 4, 3, 3, 3, 2, 1, 3, + 3, 3, 5, 7, 7, 6, 5, 3, 2, 3, + 3, 3, 7, 3, 3, 3, 3, 4, 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, 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, 2, 1, 1, 5, 0, 1, 0, + 1, 2, 3, 0, 3, 3, 3, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 3, + 3, 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, 3, 4, 3, 7, 0, 3, + 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, 6, 3, 4, 3, 1, 3, 4, 5, + 6, 3, 4, 5, 6, 3, 4, 1, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 3, 1, 1, 2, 2, + 2, 2, 1, 1, 2, 9, 6, 6, 6, 2, + 2, 3, 3, 3, 1, 1, 1, 0, 3, 1, + 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 4, 5, + 5, 6, 4, 4, 8, 6, 8, 6, 8, 5, + 4, 2, 2, 1, 2, 2, 2, 8, 8, 6, + 5, 4, 4, 4, 4, 4, 7, 4, 6, 6, + 6, 4, 4, 4, 7, 8, 6, 5, 6, 8, + 11, 6, 4, 4, 4, 4, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 4, 0, 2, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 4, 5, 5, 6, 4, 4, 8, 6, 8, - 6, 8, 5, 4, 2, 2, 1, 2, 2, 2, - 8, 8, 6, 5, 4, 4, 4, 4, 4, 7, - 4, 6, 6, 6, 4, 4, 4, 7, 8, 6, - 5, 6, 8, 11, 6, 4, 4, 4, 4, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, - 0, 2, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 2, 0, 2, 3, 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, 2, 1, 2, 4, 0, 2, + 1, 3, 5, 1, 2, 2, 0, 3, 0, 2, + 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, 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, 1, 1, 3, 3, + 1, 3, 3, 3, 3, 3, 2, 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, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, - 2, 3, 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, 2, 1, 2, - 4, 0, 2, 1, 3, 5, 1, 2, 2, 0, - 3, 0, 2, 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, 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, 1, - 1, 3, 3, 1, 3, 3, 3, 3, 3, 2, - 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, 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, @@ -6704,29 +6696,29 @@ 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, 0, 0, 1, 1, + 0, 0, 1, 1, } var yyChk = [...]int{ - -1000, -344, -5, -9, -17, -18, -19, -20, -21, -22, - -23, -24, -25, -26, -27, -28, -58, -59, -60, -62, - -63, -64, -65, -66, -12, -61, -29, -30, -67, -68, - -69, -70, -71, -14, -15, -16, -7, -6, -11, 9, - 10, -80, -31, 32, -36, -46, 218, -47, -37, 219, - -48, 221, 220, 257, 222, 250, 74, 299, 300, 302, - 303, 304, 305, -81, 255, 256, 224, 36, 45, 33, - 34, 37, 228, 263, 264, 227, -8, -32, 8, -346, - 11, 429, 252, 251, 28, -10, 463, 85, -345, 596, - -206, -191, 22, 33, 29, -190, -186, -94, -191, 20, - 18, 7, -72, -349, -72, -72, 12, 13, -72, -291, - -293, 85, 155, 85, -72, -52, -51, -50, -49, -53, - 31, -43, -44, -314, -42, -39, 223, 220, 267, 119, + -1000, -353, -7, -11, -19, -20, -21, -22, -23, -24, + -25, -26, -27, -28, -29, -30, -61, -62, -63, -65, + -66, -67, -68, -69, -14, -64, -31, -32, -70, -71, + -72, -73, -74, -16, -17, -18, -9, -8, -13, 9, + 10, -83, -33, 32, -38, -48, 218, -49, -39, 219, + -50, 221, 220, 257, 222, 250, 74, 299, 300, 302, + 303, 304, 305, -84, 255, 256, 224, 36, 45, 33, + 34, 37, 228, 263, 264, 227, -10, -34, 8, -355, + 11, 429, 252, 251, 28, -12, 463, 85, -354, 596, + -210, -195, 22, 33, 29, -194, -190, -98, -195, 20, + 18, 7, -75, -358, -75, -75, 12, 13, -75, -299, + -301, 85, 155, 85, -75, -54, -53, -52, -51, -55, + 31, -45, -46, -323, -44, -41, 223, 220, 267, 119, 120, 257, 258, 259, 222, 241, 256, 260, 255, 276, - -38, 80, 33, 463, 466, -298, 219, 225, 226, 430, - 122, 121, 75, 221, -295, 353, 566, -53, 568, 101, + -40, 80, 33, 463, 466, -306, 219, 225, 226, 430, + 122, 121, 75, 221, -303, 353, 566, -55, 568, 101, 103, 567, 44, 231, 569, 570, 571, 572, 240, 573, - 574, 575, 576, 582, 583, 584, 585, 123, 7, -72, - -251, -247, -324, -241, 88, 89, 90, 460, 243, 493, + 574, 575, 576, 582, 583, 584, 585, 123, 7, -75, + -255, -251, -333, -245, 88, 89, 90, 460, 243, 493, 494, 292, 80, 41, 350, 353, 566, 299, 313, 307, 334, 326, 461, 495, 295, 244, 280, 563, 324, 131, 568, 298, 496, 258, 358, 359, 360, 101, 302, 396, @@ -6760,34 +6752,34 @@ var yyChk = [...]int{ 548, 551, 379, 380, 294, 381, 382, 383, 384, 385, 386, 279, 466, 306, 323, 357, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 426, 427, 438, 230, -72, 230, -150, -247, - 230, -218, 359, -238, 361, 374, 369, 379, 367, -230, - 370, 372, 270, -338, 388, 230, 376, 218, 362, 371, - 380, 381, 294, 382, 386, 279, 383, 384, 385, -324, - 172, 571, 586, 131, 327, 366, 364, 389, 553, -247, - 301, -254, 306, -242, -324, -241, 304, -150, -78, 549, - 222, -256, -256, -96, 553, 555, -169, -111, 139, -122, - -125, -116, -117, -163, -164, -165, -166, -123, -176, 161, - 162, 169, 140, -174, -126, 26, 459, 431, 430, 172, + 424, 425, 426, 427, 438, 230, -75, 230, -154, -251, + 230, -222, 359, -242, 361, 374, 369, 379, 367, -234, + 370, 372, 270, -347, 388, 230, 376, 218, 362, 371, + 380, 381, 294, 382, 386, 279, 383, 384, 385, -333, + 172, 571, 586, 131, 327, 366, 364, 389, 553, -251, + 301, -258, 306, -246, -333, -245, 304, -154, -81, 549, + 222, -260, -260, -100, 553, 555, -173, -115, 139, -126, + -129, -120, -121, -167, -168, -169, -170, -127, -180, 161, + 162, 169, 140, -178, -130, 26, 459, 431, 430, 172, 31, 214, 68, 69, 433, 434, 142, 57, 406, 407, - -124, 401, 408, 403, 436, 437, 114, 438, 104, 106, + -128, 401, 408, 403, 436, 437, 114, 438, 104, 106, 105, 439, 440, 441, 339, 340, 442, 443, 444, 107, 108, 109, 110, 111, 112, 113, 445, 448, 446, 447, 449, 450, 451, 456, 457, 452, 453, 454, 455, 458, - -242, -247, 235, 400, 229, 167, 429, -118, -114, -6, - -172, 399, 404, 405, 409, 402, -324, -241, -120, -119, - -159, 91, 97, 102, 98, -343, 115, -346, 92, 93, + -246, -251, 235, 400, 229, 167, 429, -122, -118, -8, + -176, 399, 404, 405, 409, 402, -333, -245, -124, -123, + -163, 91, 97, 102, 98, -352, 115, -355, 92, 93, 94, 95, 96, 116, 117, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 44, 375, 375, -150, - -72, -72, -72, -72, -184, -94, -186, -8, -6, -346, - 8, -72, -6, -7, -11, -32, -34, 489, -33, -247, - -191, -206, 12, 157, 42, 50, -189, -190, -10, -6, - -111, 19, 23, 24, -99, 163, -111, -247, -73, -99, - -228, 234, -72, -72, -217, -259, 301, -221, 389, 388, - -243, -219, -242, -240, -218, 387, 223, 23, 469, 138, + 208, 209, 210, 211, 212, 213, 44, 375, 375, -154, + -75, -75, -75, -75, -188, -98, -190, -10, -8, -355, + 8, -75, -8, -9, -13, -34, -36, 489, -35, -251, + -195, -210, 12, 157, 42, 50, -193, -194, -12, -8, + -115, 19, 23, 24, -103, 163, -115, -251, -76, -103, + -232, 234, -75, -75, -221, -263, 301, -225, 389, 388, + -247, -223, -246, -244, -222, 387, 223, 23, 469, 138, 25, 27, 141, 172, 126, 19, 142, 37, 225, 327, 241, 171, 237, 430, 218, 72, 470, 401, 403, 399, 406, 432, 433, 400, 361, 31, 13, 472, 28, 251, @@ -6802,493 +6794,501 @@ var yyChk = [...]int{ 374, 8, 435, 32, 250, 238, 125, 67, 491, 230, 144, 436, 437, 233, 128, 116, 7, 132, 34, 12, 74, 77, 407, 408, 409, 57, 124, 463, 143, 15, - 492, 393, 137, 131, -292, 155, -279, -283, -242, 245, - -308, 241, -150, -301, -300, -242, -95, -237, 231, 239, - 238, 132, -328, 135, 287, 400, 229, -49, -50, -218, - 171, -82, 262, 266, 86, 86, -283, -282, -281, -329, - 266, 245, -307, -299, 237, 246, -289, 238, 239, -284, - 231, 133, -329, -284, 236, 246, 266, 266, 123, 266, + 492, 393, 137, 131, -300, 155, -286, -290, -246, 245, + -316, 241, -154, -309, -308, -246, -99, -241, 231, 239, + 238, 132, -337, 135, 287, 400, 229, -51, -52, -222, + 171, -85, 262, 266, 86, 86, -290, -289, -288, -338, + 266, 245, -315, -307, 237, 246, -296, 238, 239, -291, + 231, 133, -338, -291, 236, 246, 266, 266, 123, 266, 123, 266, 266, 266, 266, 266, 266, 266, 266, 266, - 261, -290, 147, -290, 467, 467, -295, -329, -329, -329, - 233, 35, 35, -239, -284, 233, 25, -290, -290, -218, - 171, -290, -290, -290, -290, 274, 274, -290, -290, -290, - -290, -290, -290, -290, -290, -290, -290, -290, -290, -290, - -290, -290, 230, -328, -103, 386, 294, 80, -51, 276, - -35, -150, -237, 231, 232, -328, 263, -150, 215, -150, - -232, 155, 15, -232, -229, 375, 373, 360, 365, -232, - -232, -232, -232, 277, 358, -285, 231, 35, 242, 375, - 277, 358, 277, 278, 277, 278, 368, 378, 277, -252, + 261, -297, 147, -297, 467, 467, -303, -338, -338, -338, + 233, 35, 35, -243, -291, 233, 25, -297, -297, -222, + 171, -297, -297, -297, -297, 274, 274, -297, -297, -297, + -297, -297, -297, -297, -297, -297, -297, -297, -297, -297, + -297, -297, 230, -337, -107, 386, 294, 80, -53, 276, + -37, -154, -241, 231, 232, -337, 263, -154, 215, -154, + -236, 155, 15, -236, -233, 375, 373, 360, 365, -236, + -236, -236, -236, 277, 358, -292, 231, 35, 242, 375, + 277, 358, 277, 278, 277, 278, 368, 378, 277, -256, 14, 157, 400, 363, 367, 270, 230, 271, 232, 377, - 278, -252, 92, -233, 155, 375, 273, -232, -232, -257, - -346, -243, 327, -324, 556, -257, -257, 32, 89, 233, - -242, -74, -242, 92, -13, -9, -20, -19, -21, 147, - -101, 375, -89, 172, 571, 557, 558, 559, 556, 372, + 278, -256, 92, -237, 155, 375, 273, -236, -236, -261, + -355, -247, 327, -333, 556, -261, -261, 32, 89, 233, + -246, -77, -246, 92, -15, -11, -22, -21, -23, 147, + -105, 375, -93, 172, 571, 557, 558, 559, 556, 372, 564, 562, 560, 277, 561, 86, 135, 137, 138, 4, - -111, 154, -160, 147, 148, 149, 150, 151, 152, 153, + -115, 154, -164, 147, 148, 149, 150, 151, 152, 153, 157, 139, 141, 155, 156, 136, 158, 159, 160, 161, 162, 163, 164, 166, 165, 167, 168, 171, 216, 217, - -117, -117, -117, -117, -174, -346, -346, -346, -117, -227, - -346, -117, -346, -346, -346, -346, -180, -111, -346, -350, - -346, -350, -350, -270, -346, -270, -346, -346, -346, -346, - -346, -346, -346, -346, -346, -346, -346, -346, -346, -346, - -346, -346, -346, -346, -346, -346, -346, -346, -346, -346, - -346, -346, -346, -346, -346, -346, -346, -346, -346, -346, - -346, -346, -346, 215, -346, -346, -346, -346, -346, -270, - -270, -270, -270, -270, 102, 97, 91, -176, 98, 92, - -242, -247, -6, -7, -169, -256, -335, -336, -153, -150, - -346, 294, -242, -242, 263, -189, -10, -6, -184, -190, - -186, -6, -72, -87, -100, 63, 64, -102, 24, 38, - 67, 65, 23, -347, 87, -347, -206, -347, 86, -34, - -210, 85, 61, 43, 92, 92, 86, 21, -185, -187, - -111, 14, -245, 4, -244, 25, -242, 92, 215, 100, - 14, -151, 29, -150, -228, -228, 86, 301, -221, -259, - -223, -222, 390, 392, 147, -246, -242, 92, 31, 87, - 86, -150, -262, -265, -267, -266, -268, -263, -264, 324, + -121, -121, -121, -121, -178, -355, -355, -355, -121, -231, + -355, -121, -355, -355, -355, -355, -184, -115, -355, -359, + -355, -359, -359, -277, -355, -277, -355, -355, -355, -355, + -355, -355, -355, -355, -355, -355, -355, -355, -355, -355, + -355, -355, -355, -355, -355, -355, -355, -355, -355, -355, + -355, -355, -355, -355, -355, -355, -355, -355, -355, -355, + -355, -355, -355, 215, -355, -355, -355, -355, -355, -277, + -277, -277, -277, -277, 102, 97, 91, -180, 98, 92, + -246, -251, -8, -9, -173, -260, -344, -345, -157, -154, + -355, 294, -246, -246, 263, -193, -12, -8, -188, -194, + -190, -8, -75, -91, -104, 63, 64, -106, 24, 38, + 67, 65, 23, -356, 87, -356, -210, -356, 86, -36, + -214, 85, 61, 43, 92, 92, 86, 21, -189, -191, + -115, 14, -249, 4, -248, 25, -246, 92, 215, 100, + 14, -155, 29, -154, -232, -232, 86, 301, -225, -263, + -227, -226, 390, 392, 147, -250, -246, 92, 31, 87, + 86, -154, -266, -269, -271, -270, -272, -267, -268, 324, 325, 172, 328, 330, 331, 332, 333, 334, 335, 336, 337, 338, 341, 32, 253, 320, 321, 322, 323, 342, 343, 344, 345, 346, 347, 348, 349, 307, 326, 461, 308, 309, 310, 311, 312, 313, 315, 316, 317, 318, - 319, -327, -324, 85, 87, 86, -269, 85, -103, 230, - -324, 231, 231, 231, -72, 429, -290, -290, 261, 19, - -42, -39, -314, 18, -38, -39, 223, 119, 120, 220, - 85, -279, 85, -288, -327, -324, 85, 133, 236, 132, - -287, -284, -287, -288, -324, -176, -324, 133, 133, -214, - -242, -214, -214, 23, -214, 23, -214, 23, 94, -242, - -214, 23, -214, 23, -214, 23, -214, 23, -214, 23, - 31, 78, 79, 31, 81, 82, 83, -176, -176, -279, - -218, -150, -324, 94, 94, -290, -290, 94, 92, 92, - 92, -290, -290, 94, 92, -249, -247, 92, -330, 247, - 291, 293, 94, 94, 94, 94, 31, 92, -331, 31, + 319, -336, -333, 85, 87, 86, -273, 85, -107, 230, + -333, 231, 231, 231, -75, 429, -297, -297, 261, 19, + -44, -41, -323, 18, -40, -41, 223, 119, 120, 220, + 85, -286, 85, -295, -336, -333, 85, 133, 236, 132, + -294, -291, -294, -295, -333, -180, -333, 133, 133, -218, + -246, -218, -218, 23, -218, 23, -218, 23, 94, -246, + -218, 23, -218, 23, -218, 23, -218, 23, -218, 23, + 31, 78, 79, 31, 81, 82, 83, -180, -180, -286, + -222, -154, -333, 94, 94, -297, -297, 94, 92, 92, + 92, -297, -297, 94, 92, -253, -251, 92, -339, 247, + 291, 293, 94, 94, 94, 94, 31, 92, -340, 31, 578, 577, 579, 580, 581, 94, 31, 94, 31, 94, - -242, 85, -150, -109, 281, 218, 220, 223, 76, 92, - 295, 147, 44, 86, 233, 230, -324, -234, 235, -234, - -242, -248, -247, -240, 92, -111, -286, 14, 157, -252, - -252, -232, -150, -286, -252, -232, -150, -232, -232, -232, - -232, -252, -252, -252, -232, -247, -247, -150, -150, -150, - -150, -150, -150, -150, -257, -233, -232, 556, 92, -226, - 14, 76, -257, -257, -255, 304, 338, 550, 551, 552, - 86, 463, -143, -150, 556, 556, 556, 556, 556, 556, - -111, -111, -111, -111, 485, -167, 115, 139, 116, 117, - -125, -168, -172, -174, 99, 157, 141, 155, 156, -116, - -117, -116, -116, -116, -116, -116, -116, -116, -116, -116, - -116, -116, -116, -116, -258, -324, 92, 172, -121, -120, - 98, -343, -121, -97, -99, -111, -111, -324, -242, -97, - -97, -111, -93, 24, 38, -178, -179, 143, -176, -347, - -347, 94, 98, -242, -242, -86, -85, 411, 412, 413, + -246, 85, -154, -113, 281, 218, 220, 223, 76, 92, + 295, 147, 44, 86, 233, 230, -333, -238, 235, -238, + -246, -252, -251, -244, 92, -115, -293, 14, 157, -256, + -256, -236, -154, -293, -256, -236, -154, -236, -236, -236, + -236, -256, -256, -256, -236, -251, -251, -154, -154, -154, + -154, -154, -154, -154, -261, -237, -236, 556, 92, -230, + 14, 76, -261, -261, -259, 304, 338, 550, 551, 552, + 86, 463, -147, -154, 556, 556, 556, 556, 556, 556, + -115, -115, -115, -115, 485, -171, 115, 139, 116, 117, + -129, -172, -176, -178, 99, 157, 141, 155, 156, -120, + -121, -120, -120, -120, -120, -120, -120, -120, -120, -120, + -120, -120, -120, -120, -262, -333, 92, 172, -125, -124, + 98, -352, -125, -101, -103, -115, -115, -333, -246, -101, + -101, -115, -97, 24, 38, -182, -183, 143, -180, -356, + -356, 94, 98, -246, -246, -90, -89, 411, 412, 413, 414, 416, 417, 418, 421, 422, 426, 427, 410, 428, - 415, 420, 423, 424, 425, 419, 323, -111, -111, -111, - -111, -111, -111, -79, -111, 126, 127, 128, -111, -111, - -170, -169, -323, -322, -321, -111, -111, -111, -111, -111, - -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, - -111, -111, -111, -111, -111, -111, -111, -111, -98, 24, - 38, -97, -243, -248, -240, -97, -98, -98, -97, -97, - 215, -206, -347, 86, -337, 392, 393, 554, -250, 266, - -249, 25, -170, 92, 14, -212, 77, -242, -189, -189, - 63, 64, 59, -97, -102, -347, -33, 25, -208, -242, - 62, 92, -271, -218, 350, 351, -111, -111, 86, -188, - 27, 28, -150, -244, 163, -248, -150, -213, 266, -150, - -128, -130, -131, -132, -153, -175, -346, -133, 481, 478, - 14, -143, -144, -152, -247, -221, -223, 86, 391, 393, - 394, 76, 118, -111, -272, 171, -297, -296, -295, -279, - -281, -282, -283, 87, -272, -275, 356, 355, -269, -269, - -269, -269, -269, -271, -271, -271, -271, 85, 85, -269, - -269, -269, -269, -273, 85, -273, -273, -274, 85, -274, - -308, -111, -305, -304, -302, -303, 240, 101, 463, 77, - -300, -188, 94, -109, -235, 235, -306, -303, -324, -324, - -324, -235, -324, 92, -324, 92, -83, -55, -1, 590, - 591, 592, 86, 19, -280, -279, -54, 291, -311, -312, - 266, -307, -301, -288, 133, -287, -288, -288, -324, 86, - 29, 123, 123, 123, 123, 463, 220, 32, -279, -54, - -258, 233, -258, -258, 92, 92, -231, 586, -143, -105, - 283, 147, 272, 272, 230, 230, 285, -150, 296, 298, - 297, 295, 23, 284, 286, 288, 274, -150, -150, -234, - 76, -145, -150, 26, -247, -150, -232, -232, -150, -232, - -232, -150, -242, -89, 392, 86, 463, 22, -90, 22, - -346, 115, 116, 117, -168, -116, -117, -116, 138, 254, - 86, -347, 25, 86, 77, -347, -347, -347, 86, 14, - -97, -181, -179, 145, -111, -347, -347, -347, 86, 86, - 14, -261, 25, -347, -347, -347, -347, -347, -180, -347, - 14, 86, 86, -347, -347, 86, 86, -347, 86, 86, - 86, -320, 86, 86, 86, 86, -347, -347, -347, -347, + 415, 420, 423, 424, 425, 419, 323, -115, -115, -115, + -115, -115, -115, -82, -115, 126, 127, 128, -115, -115, + -174, -173, -332, -331, -330, -115, -115, -115, -115, -115, + -115, -115, -115, -115, -115, -115, -115, -115, -115, -115, + -115, -115, -115, -115, -115, -115, -115, -115, -102, 24, + 38, -101, -247, -252, -244, -101, -102, -102, -101, -101, + 215, -210, -356, 86, -346, 392, 393, 554, -254, 266, + -253, 25, -174, 92, 14, -216, 77, -246, -193, -193, + 63, 64, 59, -101, -106, -356, -35, 25, -212, -246, + 62, 92, -278, -222, 350, 351, -115, -115, 86, -192, + 27, 28, -154, -248, 163, -252, -154, -217, 266, -154, + -132, -134, -135, -136, -157, -179, -355, -137, 481, 478, + 14, -147, -148, -156, -251, -225, -227, 86, 391, 393, + 394, 76, 118, -115, -279, 171, -305, -304, -303, -286, + -288, -289, -290, 87, -279, -282, 356, 355, -273, -273, + -273, -273, -273, -278, -278, -278, -278, 85, 85, -273, + -273, -273, -273, -280, 85, -280, -280, -281, 85, -281, + -316, -115, -313, -312, -310, -311, 240, 101, 463, 77, + -308, -192, 94, -113, -239, 235, -314, -311, -333, -333, + -333, -239, -333, 92, -333, 92, -86, -57, -1, 590, + 591, 592, 86, 19, -287, -286, -56, 291, -319, -320, + 266, -315, -309, -295, 133, -294, -295, -295, -333, 86, + 29, 123, 123, 123, 123, 463, 220, 32, -286, -56, + -262, 233, -262, -262, 92, 92, -235, 586, -147, -109, + 283, 147, 272, 272, 230, 230, 285, -154, 296, 298, + 297, 295, 23, 284, 286, 288, 274, -154, -154, -238, + 76, -149, -154, 26, -251, -154, -236, -236, -154, -236, + -236, -154, -246, -93, 392, 86, 463, 22, -94, 22, + -355, 115, 116, 117, -172, -120, -121, -120, 138, 254, + 86, -356, 25, 86, 77, -356, -356, -356, 86, 14, + -101, -185, -183, 145, -115, -356, -356, -356, 86, 86, + 14, -265, 25, -356, -356, -356, -356, -356, -184, -356, + 14, 86, 86, -356, -356, 86, 86, -356, 86, 86, + 86, -329, 86, 86, 86, 86, -356, -356, -356, -356, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - -347, -347, -97, -97, -346, 215, -347, -347, -347, -347, - -347, -243, -336, 553, 393, -157, -156, -154, 74, 234, - 75, -346, -249, -347, -121, 89, -209, 89, -208, -162, - -242, 94, 98, -191, -127, -129, 14, -102, -174, 87, - 86, -271, -195, -200, -229, -242, 92, 172, -187, 215, - -158, 15, -161, 32, 57, -9, -346, -346, 32, 86, - -146, -148, -147, -149, 66, 70, 72, 67, 68, 69, - 73, -253, 25, -128, -7, -6, -346, -346, -346, -150, - -143, -348, 14, 77, -348, 86, 215, -222, -224, 395, - 392, 398, -324, 92, -82, 86, -295, -283, -192, -106, - 40, -276, 357, -271, -271, -278, 92, -278, 94, 94, - 87, -45, -40, -41, 33, 80, -302, -290, 92, 39, - -242, 87, -105, -150, 139, 76, -306, -306, -306, -247, - -2, 589, 595, 133, 85, 360, 18, -208, 86, 87, - -177, 292, 87, -313, 57, -242, 87, 85, -288, -288, - -242, -346, 230, 31, 31, -54, -177, -272, -324, 588, - 587, 87, 232, 290, -110, 406, -107, 92, 88, -150, - -150, -150, -150, -150, 223, 220, 275, 233, -143, -150, - 86, -77, 249, 244, -252, -252, 33, -150, 392, 565, - 563, -111, 138, 254, -125, -117, -99, 460, -260, 172, - 324, 253, 322, 318, 338, 329, 355, 320, 356, 317, - 316, 315, -260, -258, -111, -111, -184, 146, -111, 144, - -111, -111, -111, -347, 172, 324, 14, -111, -111, -111, - -321, -111, -111, -111, -319, -318, -121, -176, -347, -319, - -111, -111, -318, -318, -322, -322, -322, -322, -322, -169, - -169, -169, -169, -347, -347, -98, -243, -154, -284, -284, - -284, -214, 86, -225, 22, 14, 57, 57, -127, -158, - -128, -102, -242, -198, 549, -203, 46, -201, -202, 47, - -199, 48, 56, 163, -189, -111, -215, 76, -216, -220, - -176, -171, -173, -172, -346, -207, -347, -242, -214, -216, - -130, -131, -131, -130, -131, 66, 66, 66, 71, 66, - 71, 66, -147, -247, -347, -347, -7, -7, -111, -250, - 77, -128, -128, -152, -247, 163, 392, 396, 397, -295, - -342, 115, 139, 31, 76, 353, 101, -340, 171, -341, - 236, 132, 133, 248, 25, 41, 87, 86, 87, 86, - 87, 86, -236, 499, 139, -41, -40, -290, -290, 94, - -324, 232, 26, -150, 76, 76, 76, -84, 593, 94, - 85, -3, 80, -111, 85, 19, -279, -176, 268, 157, - -305, -208, -309, -311, -150, -113, -346, -112, -114, -118, - 161, 162, -177, -150, -104, 281, 289, 85, -108, 89, - -326, 77, 272, 353, 272, -150, -77, -45, -150, -232, - -232, 33, -324, -347, -125, -117, -346, -347, -269, -269, - -269, -274, -269, 312, -269, 312, -269, -347, -347, 86, - -347, 22, -347, -88, 435, -111, 86, 86, -347, 85, - 85, -111, -347, -347, -347, -320, 86, -347, 86, -347, - 86, -347, -347, -347, -347, -347, -347, -347, -347, -347, - -347, -347, -347, -155, 22, -155, -155, -347, 89, -150, - -158, -182, 16, -195, 51, 330, -205, -204, 55, 47, - -202, 19, 49, 19, 30, -215, 86, 147, 86, -347, - -347, 86, 57, 215, -347, -158, -141, -140, 76, 77, - -142, 76, -140, 66, 66, -210, -347, -347, 86, -213, - -128, -158, -158, 215, 115, -346, -115, -124, -113, 12, - 92, 92, -324, 133, 133, -150, 85, -271, 92, -271, - 94, 94, 499, 31, 81, 82, 83, 31, 78, 79, - -150, -150, -150, -150, -310, 85, 19, -111, 85, 147, - 87, -208, -208, 269, -172, -346, 87, -347, 86, -277, - 463, 466, -111, -119, -119, -210, 87, -317, 463, -325, - -242, -242, -242, -242, -116, -271, -111, -111, -189, 92, - -111, -111, 94, 94, -347, -347, -319, -318, -111, -346, - 66, 18, 16, -346, -346, -250, -182, -183, 17, 19, - -196, 53, -194, 52, -194, -204, 19, 19, 92, 19, - 92, 133, -220, -111, -173, 57, -9, -242, -171, -242, - -184, -111, 85, -111, -121, -158, -158, -111, -164, 438, + -356, -356, -101, -101, -355, 215, -356, -356, -356, -356, + -356, -247, -345, 553, 393, -161, -160, -158, 74, 234, + 75, -355, -253, -356, -125, 89, -213, 89, -212, -166, + -246, 94, 98, -195, -131, -133, 14, -106, -178, 87, + 86, -278, -199, -204, -233, -246, 92, 172, -191, 215, + -162, 15, -165, 32, 57, -11, -355, -355, 32, 86, + -150, -152, -151, -153, 66, 70, 72, 67, 68, 69, + 73, -257, 25, -132, -9, -8, -355, -355, -355, -154, + -147, -357, 14, 77, -357, 86, 215, -226, -228, 395, + 392, 398, -333, 92, -85, 86, -303, -290, -196, -110, + 40, -283, 357, -278, -278, -285, 92, -285, 94, 94, + 87, -47, -42, -43, 33, 80, -310, -297, 92, 39, + -246, 87, -109, -154, 139, 76, -314, -314, -314, -251, + -2, 589, 595, 133, 85, 360, 18, -212, 86, 87, + -181, 292, 87, -87, -246, 87, 85, -295, -295, -246, + -355, 230, 31, 31, -56, -181, -279, -333, 588, 587, + 87, 232, 290, -114, 406, -111, 92, 88, -154, -154, + -154, -154, -154, 223, 220, 275, 233, -147, -154, 86, + -80, 249, 244, -256, -256, 33, -154, 392, 565, 563, + -115, 138, 254, -129, -121, -103, 460, -264, 172, 324, + 253, 322, 318, 338, 329, 355, 320, 356, 317, 316, + 315, -264, -262, -115, -115, -188, 146, -115, 144, -115, + -115, -115, -356, 172, 324, 14, -115, -115, -115, -330, + -115, -115, -115, -328, -327, -125, -180, -356, -328, -115, + -115, -327, -327, -331, -331, -331, -331, -331, -173, -173, + -173, -173, -356, -356, -102, -247, -158, -291, -291, -291, + -218, 86, -229, 22, 14, 57, 57, -131, -162, -132, + -106, -246, -202, 549, -207, 46, -205, -206, 47, -203, + 48, 56, 163, -193, -115, -219, 76, -220, -224, -180, + -175, -177, -176, -355, -211, -356, -246, -218, -220, -134, + -135, -135, -134, -135, 66, 66, 66, 71, 66, 71, + 66, -151, -251, -356, -356, -9, -9, -115, -254, 77, + -132, -132, -156, -251, 163, 392, 396, 397, -303, -351, + 115, 139, 31, 76, 353, 101, -349, 171, -350, 236, + 132, 133, 248, 25, 41, 87, 86, 87, 86, 87, + 86, -240, 499, 139, -43, -42, -297, -297, 94, -333, + 232, 26, -154, 76, 76, 76, -88, 593, 94, 85, + -3, 80, -115, 85, 19, -286, -180, -321, -274, -322, + -275, -276, -5, -6, -298, 57, 101, -60, 44, 231, + 573, 574, 123, 586, -313, -212, -317, -319, -154, -117, + -355, -116, -118, -122, 161, 162, -181, -154, -108, 281, + 289, 85, -112, 89, -335, 77, 272, 353, 272, -154, + -80, -47, -154, -236, -236, 33, -333, -356, -129, -121, + -355, -356, -273, -273, -273, -281, -273, 312, -273, 312, + -273, -356, -356, 86, -356, 22, -356, -92, 435, -115, + 86, 86, -356, 85, 85, -115, -356, -356, -356, -329, + 86, -356, 86, -356, 86, -356, -356, -356, -356, -356, + -356, -356, -356, -356, -356, -356, -356, -159, 22, -159, + -159, -356, 89, -154, -162, -186, 16, -199, 51, 330, + -209, -208, 55, 47, -206, 19, 49, 19, 30, -219, + 86, 147, 86, -356, -356, 86, 57, 215, -356, -162, + -145, -144, 76, 77, -146, 76, -144, 66, 66, -214, + -356, -356, 86, -217, -132, -162, -162, 215, 115, -355, + -119, -128, -117, 12, 92, 92, -333, 133, 133, -154, + 85, -278, 92, -278, 94, 94, 499, 31, 81, 82, + 83, 31, 78, 79, -154, -154, -154, -154, -318, 85, + 19, -115, 85, 147, 87, -212, -212, 268, 157, -297, + 571, 274, 274, -297, -297, -297, 87, -356, 86, -284, + 463, 466, -115, -123, -123, -214, 87, -326, 463, -334, + -246, -246, -246, -246, -120, -278, -115, -115, -193, 92, + -115, -115, 94, 94, -356, -356, -328, -327, -115, -355, + 66, 18, 16, -355, -355, -254, -186, -187, 17, 19, + -200, 53, -198, 52, -198, -208, 19, 19, 92, 19, + 92, 133, -224, -115, -177, 57, -11, -246, -175, -246, + -188, -115, 85, -115, -125, -162, -162, -115, -168, 438, 104, 106, 105, 439, 440, 441, 339, 340, 442, 443, 444, 107, 108, 109, 110, 111, 112, 113, 445, 448, 446, 449, 450, 451, 456, 457, 452, 453, 454, 455, - 458, 85, -111, 87, 87, -210, -309, -55, 87, -208, - 94, 87, -172, -91, -346, 265, -341, -311, 467, 467, - -347, 25, -316, -315, -243, 85, 77, -92, 157, 463, - -347, -347, -347, -347, -347, 87, 87, -347, -347, 86, - -211, -347, -242, 236, 19, 19, -211, -211, -157, -183, - -111, -169, -197, 54, 76, 118, 92, 92, 92, 12, - -171, 215, -189, -208, -135, 360, -184, -347, -208, 87, - 25, 87, 595, 133, 87, 265, -9, 86, 147, -208, - -150, -347, 461, 73, 464, -111, 86, -347, -347, -347, - 76, 118, -216, -242, 87, -347, -346, -189, 87, -193, - -9, 85, -3, -347, -75, 463, -315, -294, -243, 92, - 94, 87, 62, 462, 465, -320, -242, 236, -250, -136, - -134, -242, 513, -333, -334, 76, -342, -339, 115, 139, - 101, -340, 124, 125, -75, -111, 85, -76, 280, 553, - -326, 62, -347, -347, 86, 22, -262, -57, 523, -334, - 76, 13, 12, 115, 92, 87, -208, 241, -317, 463, - -134, 520, -272, -121, -332, 249, 244, 247, 32, -332, - -4, 594, 87, 282, 464, -56, 26, -135, 243, 31, - 115, 94, -4, 465, 523, -121, -138, -137, -139, 557, - 115, 31, -137, -139, 76, -121, 76, 473, 557, + 458, 85, -115, 87, 87, -214, -317, -57, 87, -212, + 94, 87, 269, -176, -355, 92, -297, -297, -297, 94, + 94, -253, -350, -319, 467, 467, -356, 25, -325, -324, + -247, 85, 77, -96, 157, 463, -356, -356, -356, -356, + -356, 87, 87, -356, -356, 86, -215, -356, -246, 236, + 19, 19, -215, -215, -161, -187, -115, -173, -201, 54, + 76, 118, 92, 92, 92, 12, -175, 215, -193, -212, + -139, 360, -188, -356, -212, 87, 25, 87, 595, 133, + 87, -176, -95, -355, 265, -253, 92, 92, -11, 86, + 147, -212, -154, -356, 461, 73, 464, -115, 86, -356, + -356, -356, 76, 118, -220, -246, 87, -356, -355, -193, + 87, -197, -11, 85, -3, 265, -78, 463, -324, -302, + -247, 92, 94, 87, 62, 462, 465, -329, -246, 236, + -254, -140, -138, -246, 513, -342, -343, 76, -351, -348, + 115, 139, 101, -349, 124, 125, -78, -115, 85, -356, + -79, 280, 553, -335, 62, -356, -356, 86, 22, -266, + -59, 523, -343, 76, 13, 12, 115, 92, 87, -212, + 241, -326, 463, -138, 520, -279, -125, -341, 249, 244, + 247, 32, -341, -4, 594, 87, 282, 464, -58, 26, + -139, 243, 31, 115, 94, -4, 465, 523, -125, -142, + -141, -143, 557, 115, 31, -141, -143, 76, -125, 76, + 473, 557, } var yyDef = [...]int{ -2, -2, 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, 68, 70, 71, 741, - 741, 741, 0, 741, 0, 0, 741, -2, -2, 741, - 1222, 0, 741, 0, 0, -2, 673, 675, 0, 677, - -2, 0, 0, 686, 1713, 1713, 736, 0, 0, 0, - 0, 0, 741, 741, 741, 741, 1083, 48, 741, 0, - 83, 84, 692, 693, 694, 63, 0, 1711, 1, 3, - 69, 73, 0, 0, 0, 56, 1092, 0, 76, 0, - 0, 745, 0, 743, 0, 1205, 741, 741, 0, 114, + 31, 32, 33, 34, 35, 36, 68, 70, 71, 758, + 758, 758, 0, 758, 0, 0, 758, -2, -2, 758, + 1239, 0, 758, 0, 0, -2, 690, 692, 0, 694, + -2, 0, 0, 703, 1730, 1730, 753, 0, 0, 0, + 0, 0, 758, 758, 758, 758, 1100, 48, 758, 0, + 83, 84, 709, 710, 711, 63, 0, 1728, 1, 3, + 69, 73, 0, 0, 0, 56, 1109, 0, 76, 0, + 0, 762, 0, 760, 0, 1222, 758, 758, 0, 114, 115, 0, 0, 0, -2, 118, -2, 147, 148, 0, 152, 518, 458, 501, 456, 487, -2, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 461, 351, 351, 0, 0, -2, 449, 449, 449, 0, - 0, 0, 484, 1207, 404, 351, 351, 0, 351, 351, + 0, 0, 484, 1224, 404, 351, 351, 0, 351, 351, 351, 351, 0, 0, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 1109, - 151, 1223, 1220, 1221, 38, 39, 40, 1373, 1374, 1375, - 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, - 1386, 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, - 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, - 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, - 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, - 1426, 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, - 1436, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, - 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, - 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, - 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, - 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, - 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, - 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, - 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, - 1516, 1517, 1518, 1519, 1520, 1521, 1522, 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, 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, 0, 1199, 0, 601, 842, - 0, 662, 662, 0, 662, 662, 662, 662, 0, 0, - 0, 613, 0, 0, 0, 0, 659, 0, 629, 630, - 0, 659, 0, 665, 0, 640, 662, 662, 643, 1714, - 0, 1714, 1714, 1190, 0, 656, 654, 668, 669, 672, - 676, 0, 681, 684, 1216, 1217, 0, 699, 47, 1456, - 691, 704, 705, 0, 737, 738, 43, 939, 0, 864, - 869, 880, 893, 894, 895, 896, 897, 899, 900, 0, - 0, 0, 0, 905, 906, 0, 0, 0, 0, 0, - 920, 0, 0, 0, 0, 0, 1064, 0, 1027, 1027, - 956, 1027, 1029, 1029, 0, 0, 0, 1710, 1496, 1504, - 1505, 1527, 1610, 1656, 1500, 1501, 1482, 1494, 1497, 1485, - 1486, 1488, 1490, 1495, 1502, 1508, 1487, 1507, 1506, 0, - 1483, 1484, 1489, 1499, 1503, 1491, 1492, 1493, 1498, 1509, - 1073, 0, 0, 0, 0, 0, 0, 257, 258, 938, - 1179, 1029, 1029, 1029, 1029, 1029, -2, -2, 204, 205, + 351, 351, 351, 351, 351, 351, 351, 351, 351, 1126, + 151, 1240, 1237, 1238, 38, 39, 40, 1390, 1391, 1392, + 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, + 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, + 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1422, + 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 1432, + 1433, 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, + 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, + 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, + 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, + 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, + 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, 1492, + 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, + 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, + 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, + 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, 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, 0, 1216, 0, 618, 859, + 0, 679, 679, 0, 679, 679, 679, 679, 0, 0, + 0, 630, 0, 0, 0, 0, 676, 0, 646, 647, + 0, 676, 0, 682, 0, 657, 679, 679, 660, 1731, + 0, 1731, 1731, 1207, 0, 673, 671, 685, 686, 689, + 693, 0, 698, 701, 1233, 1234, 0, 716, 47, 1473, + 708, 721, 722, 0, 754, 755, 43, 956, 0, 881, + 886, 897, 910, 911, 912, 913, 914, 916, 917, 0, + 0, 0, 0, 922, 923, 0, 0, 0, 0, 0, + 937, 0, 0, 0, 0, 0, 1081, 0, 1044, 1044, + 973, 1044, 1046, 1046, 0, 0, 0, 1727, 1513, 1521, + 1522, 1544, 1627, 1673, 1517, 1518, 1499, 1511, 1514, 1502, + 1503, 1505, 1507, 1512, 1519, 1525, 1504, 1524, 1523, 0, + 1500, 1501, 1506, 1516, 1520, 1508, 1509, 1510, 1515, 1526, + 1090, 0, 0, 0, 0, 0, 0, 257, 258, 955, + 1196, 1046, 1046, 1046, 1046, 1046, -2, -2, 204, 205, 206, 207, 208, 209, 210, 0, 200, 0, 262, 263, - 259, 260, 261, 922, 923, 216, 217, 218, 219, 220, + 259, 260, 261, 939, 940, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 1713, 0, 714, 0, - 0, 0, 0, 0, 1092, 0, 1084, 1083, 61, 0, - 741, -2, 0, 0, 0, 0, 45, 0, 50, 801, - 75, 74, 1131, 0, 0, 0, 57, 1093, 65, 67, - 1094, 0, 746, 747, 0, 777, 781, 0, 742, 0, - 0, 1206, 1205, 1205, 100, 0, 1652, 1183, -2, -2, - 0, 0, 1218, 1219, 1192, -2, 1226, 1227, 1228, 1229, - 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, - 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, - 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, - 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, - 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, - 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, - 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, - 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, - 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, - 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, - 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, - 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, - 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, - 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, - 1370, 1371, 1372, -2, 0, 0, 161, 162, 0, 41, - 377, 0, 157, 0, 371, 321, 1109, 0, 0, 0, - 0, 0, 741, 0, 1200, 142, 143, 149, 150, 351, + 251, 252, 253, 254, 255, 256, 1730, 0, 731, 0, + 0, 0, 0, 0, 1109, 0, 1101, 1100, 61, 0, + 758, -2, 0, 0, 0, 0, 45, 0, 50, 818, + 75, 74, 1148, 0, 0, 0, 57, 1110, 65, 67, + 1111, 0, 763, 764, 0, 794, 798, 0, 759, 0, + 0, 1223, 1222, 1222, 100, 0, 1669, 1200, -2, -2, + 0, 0, 1235, 1236, 1209, -2, 1243, 1244, 1245, 1246, + 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, + 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, + 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, + 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, + 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 1296, + 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, + 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, + 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, + 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, + 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, + 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, + 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, + 1367, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 1376, + 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, + 1387, 1388, 1389, -2, 0, 0, 161, 162, 0, 41, + 377, 0, 157, 0, 371, 321, 1126, 0, 0, 0, + 0, 0, 758, 0, 1217, 142, 143, 149, 150, 351, 351, 498, 0, 0, 151, 151, 465, 466, 467, 0, 0, -2, 375, 0, 450, 0, 0, 365, 365, 369, 367, 368, 0, 0, 0, 0, 0, 0, 478, 0, 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 579, 0, 352, 0, 496, 497, 405, 0, 0, 0, - 0, 476, 477, 0, 0, 1208, 1209, 0, 0, 351, + 0, 476, 477, 0, 0, 1225, 1226, 0, 0, 351, 351, 0, 0, 0, 0, 351, 351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 141, 1122, 0, 0, 0, -2, 0, - 593, 0, 0, 0, 1201, 1201, 0, 600, 0, 602, - 603, 0, 0, 604, 0, 659, 659, 657, 658, 606, - 607, 608, 609, 662, 0, 0, 360, 361, 362, 659, - 662, 0, 662, 662, 662, 662, 659, 659, 659, 662, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1714, - 665, 662, 0, 636, 0, 637, 638, 641, 642, 644, - 1715, 1716, 1239, 1714, 1714, 648, 652, 1191, 674, 682, - 685, 702, 700, 701, 703, 695, 696, 697, 698, 0, - 716, 717, 722, 0, 0, 0, 0, 728, 729, 730, - 0, 0, 733, 734, 735, 0, 0, 0, 0, 0, - 862, 0, 0, 928, 929, 930, 931, 932, 933, 934, + 0, 0, 0, 141, 1139, 0, 0, 0, -2, 0, + 610, 0, 0, 0, 1218, 1218, 0, 617, 0, 619, + 620, 0, 0, 621, 0, 676, 676, 674, 675, 623, + 624, 625, 626, 679, 0, 0, 360, 361, 362, 676, + 679, 0, 679, 679, 679, 679, 676, 676, 676, 679, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1731, + 682, 679, 0, 653, 0, 654, 655, 658, 659, 661, + 1732, 1733, 1256, 1731, 1731, 665, 669, 1208, 691, 699, + 702, 719, 717, 718, 720, 712, 713, 714, 715, 0, + 733, 734, 739, 0, 0, 0, 0, 745, 746, 747, + 0, 0, 750, 751, 752, 0, 0, 0, 0, 0, + 879, 0, 0, 945, 946, 947, 948, 949, 950, 951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 901, 902, 903, 904, 907, 0, 0, 0, 912, 913, - 0, 0, 0, 0, 0, 751, 0, 1065, 0, 954, - 0, 955, 957, 958, 0, 959, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1211, 129, + 918, 919, 920, 921, 924, 0, 0, 0, 929, 930, + 0, 0, 0, 0, 0, 768, 0, 1082, 0, 971, + 0, 972, 974, 975, 0, 976, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1228, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 761, 0, 0, 761, 761, 0, 0, 193, + 0, 0, 778, 0, 0, 778, 778, 0, 0, 193, 194, 195, 196, 197, 211, 212, 213, 214, 215, 264, - 1073, 0, 938, 0, 0, 44, 706, 707, 0, 825, - 1211, 0, 0, 757, 0, 55, 64, 66, 1092, 59, - 1092, 0, 763, 0, 0, -2, -2, 764, 770, 771, - 772, 773, 774, 52, 1712, 53, 0, 72, 0, 46, - 0, 0, 0, 0, 333, 1134, 0, 0, 1085, 1086, - 1089, 0, 778, 1538, 782, 0, 784, 785, 0, 744, - 0, 98, 0, 841, 0, 0, 0, 1652, 1189, 0, - 102, 103, 0, 0, 0, 339, 1194, 1195, 1196, -2, + 1090, 0, 955, 0, 0, 44, 723, 724, 0, 842, + 1228, 0, 0, 774, 0, 55, 64, 66, 1109, 59, + 1109, 0, 780, 0, 0, -2, -2, 781, 787, 788, + 789, 790, 791, 52, 1729, 53, 0, 72, 0, 46, + 0, 0, 0, 0, 333, 1151, 0, 0, 1102, 1103, + 1106, 0, 795, 1555, 799, 0, 801, 802, 0, 761, + 0, 98, 0, 858, 0, 0, 0, 1669, 1206, 0, + 102, 103, 0, 0, 0, 339, 1211, 1212, 1213, -2, 358, 0, 339, 328, 272, 273, 274, 321, 276, 321, 321, 321, 321, 333, 333, 333, 333, 304, 305, 306, 307, 308, 0, 0, 291, 321, 321, 321, 321, 311, 312, 313, 314, 315, 316, 317, 318, 277, 278, 279, 280, 281, 282, 283, 284, 285, 323, 323, 323, 325, - 325, 0, 42, 0, 343, 0, 1089, 0, 1122, 1203, - 1213, 0, 0, 0, 1203, 120, 0, 0, 499, 529, + 325, 0, 42, 0, 343, 0, 1106, 0, 1139, 1220, + 1230, 0, 0, 0, 1220, 120, 0, 0, 499, 529, 459, 488, 500, 0, 462, 463, -2, 0, 0, 449, 0, 451, 0, 359, 0, -2, 0, 369, 0, 365, 369, 366, 369, 357, 370, 480, 481, 482, 0, 559, - 811, 0, 0, 0, 0, 0, 565, 566, 567, 0, + 828, 0, 0, 0, 0, 0, 565, 566, 567, 0, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 489, 490, 491, 492, 493, 494, 495, 0, 0, 451, 0, 485, 0, 406, 407, 0, 0, 410, 411, 412, - 413, 0, 0, 416, 417, 418, 828, 829, 419, 443, + 413, 0, 0, 416, 417, 418, 845, 846, 419, 443, 444, 445, 420, 421, 422, 423, 424, 425, 426, 437, 438, 439, 440, 441, 442, 427, 428, 429, 430, 431, - 434, 0, 135, 1113, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1201, 0, 0, 0, 0, - 760, 843, 1224, 1225, 663, 664, 0, 363, 364, 662, - 662, 610, 649, 0, 662, 614, 650, 615, 617, 616, - 618, 631, 632, 662, 621, 660, 661, 622, 623, 624, - 625, 626, 627, 628, 645, 633, 634, 635, 666, 0, - 670, 671, 646, 647, 0, 683, 687, 688, 689, 690, - 0, 0, 719, 94, 724, 725, 726, 727, 739, 732, - 940, 859, 860, 861, 0, 863, 866, 0, 924, 926, - 868, 870, 935, 936, 937, 0, 0, 0, 0, 0, - 874, 878, 881, 882, 883, 884, 885, 886, 887, 888, - 889, 890, 891, 892, 898, 1043, 1044, 1045, 915, 265, - 266, 0, 916, 0, 775, 0, 0, 0, 914, 0, - 0, 0, 0, 752, 753, 1071, 1068, 0, 0, 1028, - 1030, 0, 0, 0, 0, 0, 1006, 1007, 1008, 1009, - 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, - 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1046, 0, 0, - 0, 0, 0, 1064, 0, 917, 918, 919, 0, 0, - 0, 1212, 0, 130, 131, 0, 0, 0, 0, 0, - 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 762, 1074, 0, -2, 0, 0, 0, 0, 0, - 0, 0, 1178, 0, 709, 710, 712, 0, 845, 0, - 826, 0, 0, 715, 0, 756, 0, 759, 58, 60, - 768, 769, 0, 786, 765, 54, 49, 0, 0, 803, - 1132, 333, 1154, 0, 337, 338, 1095, 1096, 0, 1088, - 1090, 1091, 77, 783, 779, 0, 857, 0, 0, 840, - 0, 789, 791, 792, 793, 823, 0, 796, 0, 0, - 0, 0, 0, 96, 842, 1184, 101, 0, 0, 106, - 107, 1185, 1186, 1187, 1188, 0, 518, -2, 401, 163, + 434, 0, 135, 1130, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1218, 0, 0, 0, 0, + 777, 860, 1241, 1242, 680, 681, 0, 363, 364, 679, + 679, 627, 666, 0, 679, 631, 667, 632, 634, 633, + 635, 648, 649, 679, 638, 677, 678, 639, 640, 641, + 642, 643, 644, 645, 662, 650, 651, 652, 683, 0, + 687, 688, 663, 664, 0, 700, 704, 705, 706, 707, + 0, 0, 736, 94, 741, 742, 743, 744, 756, 749, + 957, 876, 877, 878, 0, 880, 883, 0, 941, 943, + 885, 887, 952, 953, 954, 0, 0, 0, 0, 0, + 891, 895, 898, 899, 900, 901, 902, 903, 904, 905, + 906, 907, 908, 909, 915, 1060, 1061, 1062, 932, 265, + 266, 0, 933, 0, 792, 0, 0, 0, 931, 0, + 0, 0, 0, 769, 770, 1088, 1085, 0, 0, 1045, + 1047, 0, 0, 0, 0, 0, 1023, 1024, 1025, 1026, + 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, + 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1063, 0, 0, + 0, 0, 0, 1081, 0, 934, 935, 936, 0, 0, + 0, 1229, 0, 130, 131, 0, 0, 0, 0, 0, + 1017, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 779, 1091, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 1195, 0, 726, 727, 729, 0, 862, 0, + 843, 0, 0, 732, 0, 773, 0, 776, 58, 60, + 785, 786, 0, 803, 782, 54, 49, 0, 0, 820, + 1149, 333, 1171, 0, 337, 338, 1112, 1113, 0, 1105, + 1107, 1108, 77, 800, 796, 0, 874, 0, 0, 857, + 0, 806, 808, 809, 810, 840, 0, 813, 0, 0, + 0, 0, 0, 96, 859, 1201, 101, 0, 0, 106, + 107, 1202, 1203, 1204, 1205, 0, 518, -2, 401, 163, 165, 166, 167, 158, -2, 331, 329, 330, 275, 333, 333, 298, 299, 300, 301, 302, 303, 0, 0, 292, 293, 294, 295, 286, 0, 287, 288, 289, 0, 290, - 376, 0, 1097, 344, 345, 347, 351, 0, 0, 0, - 372, 373, 0, 1113, 0, 0, 0, 1214, 1213, 1213, - 1213, 0, 153, 154, 155, 156, 554, 0, 0, 530, + 376, 0, 1114, 344, 345, 347, 351, 0, 0, 0, + 372, 373, 0, 1130, 0, 0, 0, 1231, 1230, 1230, + 1230, 0, 153, 154, 155, 156, 554, 0, 0, 530, 552, 553, 151, 0, 0, 159, 453, 452, 0, 586, 0, 374, 0, 0, 369, 369, 354, 355, 483, 0, 0, 561, 562, 563, 564, 0, 0, 0, 451, 453, 339, 0, 408, 409, 414, 415, 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, 514, - 515, 516, 517, 1110, 1111, 1112, 0, 0, 594, 0, - 0, 393, 92, 1202, 599, 659, 620, 651, 659, 612, - 619, 639, 679, 723, 0, 0, 0, 0, 731, 0, - 0, 867, 925, 927, 871, 0, 875, 879, 0, 0, - 0, 0, 0, 0, 0, 921, 945, 946, 0, 0, - 1083, 0, 1069, 0, 0, 953, 1031, 1032, 0, 0, - 0, 0, 0, 964, 965, 966, 967, 968, 0, 970, - 0, 0, 0, 974, 975, 0, 0, 976, 0, 0, - 0, 0, 0, 0, 0, 0, 985, 986, 987, 988, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 999, 941, 0, 0, 761, 0, 1033, 1034, 1035, 1036, - 1037, 1074, 708, 711, 713, 799, 846, 847, 0, 0, - 0, 0, 827, 1210, 754, 755, 758, -2, 0, 0, - 1076, 0, 0, 786, 857, 787, 0, 766, 51, 802, - 0, 1136, 1135, 1148, 1161, 334, 335, 336, 1087, 0, - 1092, 0, 1172, 0, 0, 1164, 0, 0, 0, 0, - 0, 0, 0, 0, 830, 0, 0, 833, 0, 0, - 0, 0, 824, 0, 0, 0, 0, 0, 0, -2, + 515, 516, 517, 1127, 1128, 1129, 0, 0, 611, 0, + 0, 393, 92, 1219, 616, 676, 637, 668, 676, 629, + 636, 656, 696, 740, 0, 0, 0, 0, 748, 0, + 0, 884, 942, 944, 888, 0, 892, 896, 0, 0, + 0, 0, 0, 0, 0, 938, 962, 963, 0, 0, + 1100, 0, 1086, 0, 0, 970, 1048, 1049, 0, 0, + 0, 0, 0, 981, 982, 983, 984, 985, 0, 987, + 0, 0, 0, 991, 992, 0, 0, 993, 0, 0, + 0, 0, 0, 0, 0, 0, 1002, 1003, 1004, 1005, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1016, 958, 0, 0, 778, 0, 1050, 1051, 1052, 1053, + 1054, 1091, 725, 728, 730, 816, 863, 864, 0, 0, + 0, 0, 844, 1227, 771, 772, 775, -2, 0, 0, + 1093, 0, 0, 803, 874, 804, 0, 783, 51, 819, + 0, 1153, 1152, 1165, 1178, 334, 335, 336, 1104, 0, + 1109, 0, 1189, 0, 0, 1181, 0, 0, 0, 0, + 0, 0, 0, 0, 847, 0, 0, 850, 0, 0, + 0, 0, 841, 0, 0, 0, 0, 0, 0, -2, 0, 0, 90, 91, 0, 0, 0, 104, 105, 0, 0, 111, 340, 341, 144, 151, 403, 164, 383, 0, 0, 271, 332, 296, 297, 0, 319, 0, 0, 0, - 396, 116, 1101, 1100, 351, 351, 346, 0, 349, 0, - 1215, 322, 0, 134, 0, 0, 0, 0, 0, 140, + 396, 116, 1118, 1117, 351, 351, 346, 0, 349, 0, + 1232, 322, 0, 134, 0, 0, 0, 0, 0, 140, 524, 0, 0, 531, 0, 0, 0, 457, 0, 468, - 469, 0, 558, 585, 0, 590, 343, 0, 353, 356, - 812, 0, 0, 470, 0, 453, 474, 475, 486, 435, - 436, 433, 0, 0, 1123, 1124, 1129, 1127, 1128, 121, - 506, 508, 507, 511, 0, 0, 504, 0, 393, 1097, - 0, 598, 394, 395, 662, 662, 718, 95, 0, 721, - 0, 0, 0, 0, 872, 876, 776, 0, 0, 321, - 321, 1051, 321, 325, 1054, 321, 1056, 321, 1059, 321, - 1062, 1063, 0, 0, 0, 0, 1066, 952, 1072, 0, - 0, 0, 0, 963, 0, 0, 0, 0, 0, 0, - 132, 133, 1000, 0, 0, 1002, 1004, 1005, 980, 1001, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 942, 943, 0, 1075, 848, 853, 853, - 853, 0, 0, 0, 1197, 1198, 1077, 1078, 857, 1079, - 788, 767, 804, 1154, 0, 1147, 0, -2, 1156, 0, - 0, 0, 1162, 780, 78, 858, 81, 0, 1172, 1180, - 0, 1163, 1174, 1176, 0, 0, 0, 1168, 0, 857, - 790, 819, 821, 0, 816, 831, 832, 834, 0, 836, - 0, 838, 839, 801, 795, 797, 0, 0, 0, 98, - 0, 857, 857, 97, 0, 844, 108, 109, 110, 402, - 168, 173, 0, 0, 0, 178, 0, 180, 0, 384, - 0, 268, 270, 0, 0, 171, 333, 0, 333, 0, - 326, 0, 385, 397, 0, 1098, 1099, 0, 0, 348, - 350, 0, 1204, 136, 0, 0, 0, 527, 0, 555, - 0, 0, 0, 0, 0, 0, 160, 454, 0, 0, - 342, 0, 0, 583, 580, 471, 0, 198, 199, 201, - 0, 0, 473, 801, 1114, 1115, 1116, 0, 1126, 1130, - 124, 0, 0, 0, 0, 595, 596, 597, 93, 605, - 611, 720, 740, 865, 873, 877, 0, 909, 1049, 333, - 1052, 1053, 1055, 1057, 1058, 1060, 1061, 910, 911, 0, - 948, 0, 950, 1092, 0, 1070, 0, 0, 962, 0, - 0, 0, 971, 972, 973, 0, 0, 979, 0, 981, - 0, 984, 989, 990, 991, 992, 993, 994, 995, 996, - 997, 998, 944, 0, 0, 0, 0, 825, -2, 62, - 1079, 1081, 0, 1141, 1139, 1139, 1149, 1150, 0, 0, - 1157, 0, 0, 0, 0, 82, 0, 0, 0, 1177, - 0, 0, 0, 0, 99, 1083, 813, 820, 0, 0, - 814, 0, 815, 835, 837, 794, -2, 798, 0, 857, - 857, 88, 89, 0, 174, 0, 176, 191, 192, 0, - 179, 181, 182, 267, 269, 0, 0, 309, 320, 310, - 0, 0, 398, 1102, 1103, 1104, 1105, 1106, 1107, 1108, - 801, 137, 138, 139, 519, 0, 529, 0, 0, 0, - 522, 0, 460, 0, 589, 0, 0, 560, 0, 568, - 0, 0, 0, 202, 203, 0, 1125, 505, 0, 122, - 123, 0, 0, 510, 1038, 1050, 0, 0, 0, 1067, - 0, 0, 0, 0, 969, 977, 0, 1003, 0, 0, - 854, 0, 0, 0, 0, 845, 1081, 80, 0, 0, - 1144, 0, 1137, 1140, 1138, 1151, 0, 0, 1158, 0, - 1160, 0, 1181, 1182, 1175, 0, 1167, 1170, 1166, 1169, - 1092, 817, 0, 822, 0, 1083, 87, 0, 177, 0, + 469, 0, 558, -2, 607, 343, 0, 353, 356, 829, + 0, 0, 470, 0, 453, 474, 475, 486, 435, 436, + 433, 0, 0, 1140, 1141, 1146, 1144, 1145, 121, 506, + 508, 507, 511, 0, 0, 504, 0, 393, 1114, 0, + 615, 394, 395, 679, 679, 735, 95, 0, 738, 0, + 0, 0, 0, 889, 893, 793, 0, 0, 321, 321, + 1068, 321, 325, 1071, 321, 1073, 321, 1076, 321, 1079, + 1080, 0, 0, 0, 0, 1083, 969, 1089, 0, 0, + 0, 0, 980, 0, 0, 0, 0, 0, 0, 132, + 133, 1017, 0, 0, 1019, 1021, 1022, 997, 1018, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 959, 960, 0, 1092, 865, 870, 870, 870, + 0, 0, 0, 1214, 1215, 1094, 1095, 874, 1096, 805, + 784, 821, 1171, 0, 1164, 0, -2, 1173, 0, 0, + 0, 1179, 797, 78, 875, 81, 0, 1189, 1197, 0, + 1180, 1191, 1193, 0, 0, 0, 1185, 0, 874, 807, + 836, 838, 0, 833, 848, 849, 851, 0, 853, 0, + 855, 856, 818, 812, 814, 0, 0, 0, 98, 0, + 874, 874, 97, 0, 861, 108, 109, 110, 402, 168, + 173, 0, 0, 0, 178, 0, 180, 0, 384, 0, + 268, 270, 0, 0, 171, 333, 0, 333, 0, 326, + 0, 385, 397, 0, 1115, 1116, 0, 0, 348, 350, + 0, 1221, 136, 0, 0, 0, 527, 0, 555, 0, + 0, 0, 0, 0, 0, 160, 454, 587, 588, 589, + 590, 591, 592, 593, 594, 0, 351, 0, 0, 0, + 351, 351, 351, 599, 342, 0, 0, 583, 580, 471, + 0, 198, 199, 201, 0, 0, 473, 818, 1131, 1132, + 1133, 0, 1143, 1147, 124, 0, 0, 0, 0, 612, + 613, 614, 93, 622, 628, 737, 757, 882, 890, 894, + 0, 926, 1066, 333, 1069, 1070, 1072, 1074, 1075, 1077, + 1078, 927, 928, 0, 965, 0, 967, 1109, 0, 1087, + 0, 0, 979, 0, 0, 0, 988, 989, 990, 0, + 0, 996, 0, 998, 0, 1001, 1006, 1007, 1008, 1009, + 1010, 1011, 1012, 1013, 1014, 1015, 961, 0, 0, 0, + 0, 842, -2, 62, 1096, 1098, 0, 1158, 1156, 1156, + 1166, 1167, 0, 0, 1174, 0, 0, 0, 0, 82, + 0, 0, 0, 1194, 0, 0, 0, 0, 99, 1100, + 830, 837, 0, 0, 831, 0, 832, 852, 854, 811, + -2, 815, 0, 874, 874, 88, 89, 0, 174, 0, + 176, 191, 192, 0, 179, 181, 182, 267, 269, 0, + 0, 309, 320, 310, 0, 0, 398, 1119, 1120, 1121, + 1122, 1123, 1124, 1125, 818, 137, 138, 139, 519, 0, + 529, 0, 0, 0, 522, 0, 460, 0, 0, 0, + 351, 351, 351, 0, 0, 0, 0, 560, 0, 568, + 0, 0, 0, 202, 203, 0, 1142, 505, 0, 122, + 123, 0, 0, 510, 1055, 1067, 0, 0, 0, 1084, + 0, 0, 0, 0, 986, 994, 0, 1020, 0, 0, + 871, 0, 0, 0, 0, 862, 1098, 80, 0, 0, + 1161, 0, 1154, 1157, 1155, 1168, 0, 0, 1175, 0, + 1177, 0, 1198, 1199, 1192, 0, 1184, 1187, 1183, 1186, + 1109, 834, 0, 839, 0, 1100, 87, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, 327, 0, 0, 0, 520, 0, - 532, 523, 587, 588, 0, 591, 378, 584, 581, 582, - 472, 0, 125, 126, 0, 0, 0, 0, 0, 0, - 947, 949, 951, 960, 961, 1047, 1048, 978, 982, 0, - 0, 850, 807, 808, 855, 856, 0, 0, 800, 79, - 1082, 1080, 1133, 0, 1142, 1143, 1152, 1153, 1159, 0, - 1165, 0, 85, 0, 0, 0, 1092, 175, 0, 185, - 0, 528, 0, 531, 521, 0, 1117, 0, 0, 0, - 512, 908, 0, 0, 0, 1000, 0, 849, 851, 852, - 1145, 1146, 1173, 1171, 818, 825, 0, 86, 379, 383, - 1117, 0, 0, 592, 502, 1119, 127, 128, 446, 447, - 448, 121, 1039, 0, 1042, 0, 809, 810, 533, 0, - 535, 0, -2, 380, 381, 0, 169, 186, 187, 0, - 0, 190, 183, 184, 117, 0, 0, 0, 1120, 1121, - 124, 1040, 983, 534, 0, 0, 339, 0, 544, 382, - 0, 0, 0, 188, 189, 556, 0, 0, 509, 0, - 536, 537, 545, 0, 386, 388, 389, 0, 0, 387, - 525, 0, 556, 1118, 0, 0, 546, 542, 390, 391, - 392, 557, 526, 1041, 0, 538, 539, 540, 0, 549, - 550, 0, 541, 0, 0, 551, 0, 547, 548, + 532, 523, 0, 597, 0, 601, 0, 0, 0, 604, + 605, 606, 378, 584, 581, 582, 472, 0, 125, 126, + 0, 0, 0, 0, 0, 0, 964, 966, 968, 977, + 978, 1064, 1065, 995, 999, 0, 0, 867, 824, 825, + 872, 873, 0, 0, 817, 79, 1099, 1097, 1150, 0, + 1159, 1160, 1169, 1170, 1176, 0, 1182, 0, 85, 0, + 0, 0, 1109, 175, 0, 185, 0, 528, 0, 531, + 521, 595, 596, 0, 608, 600, 602, 603, 1134, 0, + 0, 0, 512, 925, 0, 0, 0, 1017, 0, 866, + 868, 869, 1162, 1163, 1190, 1188, 835, 842, 0, 86, + 379, 383, 1134, 0, 0, 0, 502, 1136, 127, 128, + 446, 447, 448, 121, 1056, 0, 1059, 0, 826, 827, + 533, 0, 535, 0, -2, 380, 381, 0, 169, 186, + 187, 0, 0, 190, 183, 184, 117, 0, 0, 609, + 0, 1137, 1138, 124, 1057, 1000, 534, 0, 0, 339, + 0, 544, 382, 0, 0, 0, 188, 189, 556, 0, + 0, 509, 0, 536, 537, 545, 0, 386, 388, 389, + 0, 0, 387, 525, 0, 556, 1135, 0, 0, 546, + 542, 390, 391, 392, 557, 526, 1058, 0, 538, 539, + 540, 0, 549, 550, 0, 541, 0, 0, 551, 0, + 547, 548, } var yyTok1 = [...]int{ @@ -7751,68 +7751,68 @@ yydefault: case 1: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:513 +//line sql.y:517 { setParseTree(yylex, yyDollar[1].statementUnion()) } case 2: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:518 +//line sql.y:522 { } case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:519 +//line sql.y:523 { } case 4: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:523 +//line sql.y:527 { yyLOCAL = yyDollar[1].selStmtUnion() } yyVAL.union = yyLOCAL case 37: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:559 +//line sql.y:563 { setParseTree(yylex, nil) } case 38: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:565 +//line sql.y:569 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].str), NoAt) } case 39: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:569 +//line sql.y:573 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].str), SingleAt) } case 40: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:573 +//line sql.y:577 { yyVAL.colIdent = NewColIdentWithAt(string(yyDollar[1].str), DoubleAt) } case 41: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:578 +//line sql.y:582 { yyVAL.colIdent = NewColIdentWithAt("", NoAt) } case 42: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:582 +//line sql.y:586 { yyVAL.colIdent = yyDollar[1].colIdent } case 43: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:588 +//line sql.y:592 { yyLOCAL = &OtherAdmin{} } @@ -7820,7 +7820,7 @@ yydefault: case 44: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:594 +//line sql.y:598 { yyLOCAL = &Load{} } @@ -7828,7 +7828,7 @@ yydefault: case 45: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *With -//line sql.y:600 +//line sql.y:604 { yyLOCAL = &With{ctes: yyDollar[2].ctesUnion(), Recursive: false} } @@ -7836,7 +7836,7 @@ yydefault: case 46: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *With -//line sql.y:604 +//line sql.y:608 { yyLOCAL = &With{ctes: yyDollar[3].ctesUnion(), Recursive: true} } @@ -7844,7 +7844,7 @@ yydefault: case 47: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *With -//line sql.y:609 +//line sql.y:613 { yyLOCAL = nil } @@ -7852,14 +7852,14 @@ yydefault: case 48: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *With -//line sql.y:613 +//line sql.y:617 { yyLOCAL = yyDollar[1].withUnion() } yyVAL.union = yyLOCAL case 49: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:619 +//line sql.y:623 { yySLICE := (*[]*CommonTableExpr)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].cteUnion()) @@ -7867,7 +7867,7 @@ yydefault: case 50: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*CommonTableExpr -//line sql.y:623 +//line sql.y:627 { yyLOCAL = []*CommonTableExpr{yyDollar[1].cteUnion()} } @@ -7875,7 +7875,7 @@ yydefault: case 51: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *CommonTableExpr -//line sql.y:629 +//line sql.y:633 { yyLOCAL = &CommonTableExpr{TableID: yyDollar[1].tableIdent, Columns: yyDollar[2].columnsUnion(), Subquery: yyDollar[4].subqueryUnion()} } @@ -7883,7 +7883,7 @@ yydefault: case 52: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:635 +//line sql.y:639 { yyLOCAL = yyDollar[2].selStmtUnion() } @@ -7891,7 +7891,7 @@ yydefault: case 53: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:639 +//line sql.y:643 { yyLOCAL = yyDollar[2].selStmtUnion() } @@ -7899,7 +7899,7 @@ yydefault: case 54: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:643 +//line sql.y:647 { setLockInSelect(yyDollar[2].selStmtUnion(), yyDollar[3].lockUnion()) yyLOCAL = yyDollar[2].selStmtUnion() @@ -7908,7 +7908,7 @@ yydefault: case 55: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:666 +//line sql.y:670 { yyDollar[1].selStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) yyDollar[1].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -7918,7 +7918,7 @@ yydefault: case 56: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:672 +//line sql.y:676 { yyDollar[1].selStmtUnion().SetLimit(yyDollar[2].limitUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -7927,7 +7927,7 @@ yydefault: case 57: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:677 +//line sql.y:681 { yyDollar[1].selStmtUnion().SetOrderBy(yyDollar[2].orderByUnion()) yyDollar[1].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -7937,7 +7937,7 @@ yydefault: case 58: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:683 +//line sql.y:687 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].selStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) @@ -7948,7 +7948,7 @@ yydefault: case 59: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:690 +//line sql.y:694 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].selStmtUnion().SetLimit(yyDollar[3].limitUnion()) @@ -7958,7 +7958,7 @@ yydefault: case 60: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:696 +//line sql.y:700 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) yyDollar[2].selStmtUnion().SetOrderBy(yyDollar[3].orderByUnion()) @@ -7968,14 +7968,14 @@ yydefault: yyVAL.union = yyLOCAL case 61: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:703 +//line sql.y:707 { yyDollar[2].selStmtUnion().SetWith(yyDollar[1].withUnion()) } case 62: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:707 +//line sql.y:711 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), SelectExprs{&Nextval{Expr: yyDollar[5].exprUnion()}}, []string{yyDollar[3].str} /*options*/, nil, TableExprs{&AliasedTableExpr{Expr: yyDollar[7].tableName}}, nil /*where*/, nil /*groupBy*/, nil /*having*/) } @@ -7983,7 +7983,7 @@ yydefault: case 63: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:713 +//line sql.y:717 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -7991,7 +7991,7 @@ yydefault: case 64: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:717 +//line sql.y:721 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -7999,7 +7999,7 @@ yydefault: case 65: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:721 +//line sql.y:725 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -8007,7 +8007,7 @@ yydefault: case 66: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:725 +//line sql.y:729 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -8015,7 +8015,7 @@ yydefault: case 67: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:729 +//line sql.y:733 { yyLOCAL = &Union{Left: yyDollar[1].selStmtUnion(), Distinct: yyDollar[2].booleanUnion(), Right: yyDollar[3].selStmtUnion()} } @@ -8023,7 +8023,7 @@ yydefault: case 68: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:735 +//line sql.y:739 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -8031,7 +8031,7 @@ yydefault: case 69: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:739 +//line sql.y:743 { setLockInSelect(yyDollar[1].selStmtUnion(), yyDollar[2].lockUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -8040,7 +8040,7 @@ yydefault: case 70: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:744 +//line sql.y:748 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -8048,7 +8048,7 @@ yydefault: case 71: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:748 +//line sql.y:752 { yyLOCAL = yyDollar[1].selStmtUnion() } @@ -8056,7 +8056,7 @@ yydefault: case 72: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:754 +//line sql.y:758 { yyLOCAL = yyDollar[2].selStmtUnion() } @@ -8064,7 +8064,7 @@ yydefault: case 73: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:758 +//line sql.y:762 { yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -8073,7 +8073,7 @@ yydefault: case 74: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:763 +//line sql.y:767 { yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) yyDollar[1].selStmtUnion().SetLock(yyDollar[3].lockUnion()) @@ -8083,7 +8083,7 @@ yydefault: case 75: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:769 +//line sql.y:773 { yyDollar[1].selStmtUnion().SetInto(yyDollar[3].selectIntoUnion()) yyDollar[1].selStmtUnion().SetLock(yyDollar[2].lockUnion()) @@ -8093,7 +8093,7 @@ yydefault: case 76: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:775 +//line sql.y:779 { yyDollar[1].selStmtUnion().SetInto(yyDollar[2].selectIntoUnion()) yyLOCAL = yyDollar[1].selStmtUnion() @@ -8102,7 +8102,7 @@ yydefault: case 77: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:782 +//line sql.y:786 { yyLOCAL = &Stream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName} } @@ -8110,7 +8110,7 @@ yydefault: case 78: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:788 +//line sql.y:792 { yyLOCAL = &VStream{Comments: Comments(yyDollar[2].strs).Parsed(), SelectExpr: yyDollar[3].selectExprUnion(), Table: yyDollar[5].tableName, Where: NewWhere(WhereClause, yyDollar[6].exprUnion()), Limit: yyDollar[7].limitUnion()} } @@ -8118,7 +8118,7 @@ yydefault: case 79: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:796 +//line sql.y:800 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, yyDollar[5].selectIntoUnion() /*into*/, yyDollar[6].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[7].exprUnion()), GroupBy(yyDollar[8].exprsUnion()), NewWhere(HavingClause, yyDollar[9].exprUnion())) } @@ -8126,7 +8126,7 @@ yydefault: case 80: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL SelectStatement -//line sql.y:800 +//line sql.y:804 { yyLOCAL = NewSelect(Comments(yyDollar[2].strs), yyDollar[4].selectExprsUnion() /*SelectExprs*/, yyDollar[3].strs /*options*/, nil, yyDollar[5].tableExprsUnion() /*from*/, NewWhere(WhereClause, yyDollar[6].exprUnion()), GroupBy(yyDollar[7].exprsUnion()), NewWhere(HavingClause, yyDollar[8].exprUnion())) } @@ -8134,7 +8134,7 @@ yydefault: case 81: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:808 +//line sql.y:812 { // insert_data returns a *Insert pre-filled with Columns & Values ins := yyDollar[6].insUnion() @@ -8150,7 +8150,7 @@ yydefault: case 82: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:820 +//line sql.y:824 { cols := make(Columns, 0, len(yyDollar[7].updateExprsUnion())) vals := make(ValTuple, 0, len(yyDollar[8].updateExprsUnion())) @@ -8164,7 +8164,7 @@ yydefault: case 83: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:832 +//line sql.y:836 { yyLOCAL = InsertAct } @@ -8172,7 +8172,7 @@ yydefault: case 84: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL InsertAction -//line sql.y:836 +//line sql.y:840 { yyLOCAL = ReplaceAct } @@ -8180,7 +8180,7 @@ yydefault: case 85: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:842 +//line sql.y:846 { yyLOCAL = &Update{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: yyDollar[5].tableExprsUnion(), Exprs: yyDollar[7].updateExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion()), OrderBy: yyDollar[9].orderByUnion(), Limit: yyDollar[10].limitUnion()} } @@ -8188,7 +8188,7 @@ yydefault: case 86: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:848 +//line sql.y:852 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), TableExprs: TableExprs{&AliasedTableExpr{Expr: yyDollar[6].tableName, As: yyDollar[7].tableIdent}}, Partitions: yyDollar[8].partitionsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion()), OrderBy: yyDollar[10].orderByUnion(), Limit: yyDollar[11].limitUnion()} } @@ -8196,7 +8196,7 @@ yydefault: case 87: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Statement -//line sql.y:852 +//line sql.y:856 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[6].tableNamesUnion(), TableExprs: yyDollar[8].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[9].exprUnion())} } @@ -8204,7 +8204,7 @@ yydefault: case 88: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:856 +//line sql.y:860 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } @@ -8212,32 +8212,32 @@ yydefault: case 89: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:860 +//line sql.y:864 { yyLOCAL = &Delete{With: yyDollar[1].withUnion(), Comments: Comments(yyDollar[3].strs).Parsed(), Ignore: yyDollar[4].ignoreUnion(), Targets: yyDollar[5].tableNamesUnion(), TableExprs: yyDollar[7].tableExprsUnion(), Where: NewWhere(WhereClause, yyDollar[8].exprUnion())} } yyVAL.union = yyLOCAL case 90: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:865 +//line sql.y:869 { } case 91: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:866 +//line sql.y:870 { } case 92: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:870 +//line sql.y:874 { yyLOCAL = TableNames{yyDollar[1].tableName.ToViewName()} } yyVAL.union = yyLOCAL case 93: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:874 +//line sql.y:878 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName.ToViewName()) @@ -8245,14 +8245,14 @@ yydefault: case 94: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:880 +//line sql.y:884 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL case 95: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:884 +//line sql.y:888 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) @@ -8260,14 +8260,14 @@ yydefault: case 96: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableNames -//line sql.y:890 +//line sql.y:894 { yyLOCAL = TableNames{yyDollar[1].tableName} } yyVAL.union = yyLOCAL case 97: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:894 +//line sql.y:898 { yySLICE := (*TableNames)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableName) @@ -8275,7 +8275,7 @@ yydefault: case 98: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Partitions -//line sql.y:899 +//line sql.y:903 { yyLOCAL = nil } @@ -8283,7 +8283,7 @@ yydefault: case 99: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Partitions -//line sql.y:903 +//line sql.y:907 { yyLOCAL = yyDollar[3].partitionsUnion() } @@ -8291,7 +8291,7 @@ yydefault: case 100: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:909 +//line sql.y:913 { yyLOCAL = &Set{Comments: Comments(yyDollar[2].strs).Parsed(), Exprs: yyDollar[3].setExprsUnion()} } @@ -8299,7 +8299,7 @@ yydefault: case 101: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:915 +//line sql.y:919 { yyLOCAL = &SetTransaction{Comments: Comments(yyDollar[2].strs).Parsed(), Scope: yyDollar[3].scopeUnion(), Characteristics: yyDollar[5].characteristicsUnion()} } @@ -8307,7 +8307,7 @@ yydefault: case 102: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:919 +//line sql.y:923 { yyLOCAL = &SetTransaction{Comments: Comments(yyDollar[2].strs).Parsed(), Characteristics: yyDollar[4].characteristicsUnion(), Scope: ImplicitScope} } @@ -8315,14 +8315,14 @@ yydefault: case 103: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []Characteristic -//line sql.y:925 +//line sql.y:929 { yyLOCAL = []Characteristic{yyDollar[1].characteristicUnion()} } yyVAL.union = yyLOCAL case 104: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:929 +//line sql.y:933 { yySLICE := (*[]Characteristic)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].characteristicUnion()) @@ -8330,7 +8330,7 @@ yydefault: case 105: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Characteristic -//line sql.y:935 +//line sql.y:939 { yyLOCAL = yyDollar[3].isolationLevelUnion() } @@ -8338,7 +8338,7 @@ yydefault: case 106: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Characteristic -//line sql.y:939 +//line sql.y:943 { yyLOCAL = ReadWrite } @@ -8346,7 +8346,7 @@ yydefault: case 107: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Characteristic -//line sql.y:943 +//line sql.y:947 { yyLOCAL = ReadOnly } @@ -8354,7 +8354,7 @@ yydefault: case 108: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsolationLevel -//line sql.y:949 +//line sql.y:953 { yyLOCAL = RepeatableRead } @@ -8362,7 +8362,7 @@ yydefault: case 109: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsolationLevel -//line sql.y:953 +//line sql.y:957 { yyLOCAL = ReadCommitted } @@ -8370,7 +8370,7 @@ yydefault: case 110: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsolationLevel -//line sql.y:957 +//line sql.y:961 { yyLOCAL = ReadUncommitted } @@ -8378,7 +8378,7 @@ yydefault: case 111: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsolationLevel -//line sql.y:961 +//line sql.y:965 { yyLOCAL = Serializable } @@ -8386,7 +8386,7 @@ yydefault: case 112: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:967 +//line sql.y:971 { yyLOCAL = SessionScope } @@ -8394,7 +8394,7 @@ yydefault: case 113: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Scope -//line sql.y:971 +//line sql.y:975 { yyLOCAL = GlobalScope } @@ -8402,7 +8402,7 @@ yydefault: case 114: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:977 +//line sql.y:981 { yyDollar[1].createTableUnion().TableSpec = yyDollar[2].tableSpecUnion() yyDollar[1].createTableUnion().FullyParsed = true @@ -8412,7 +8412,7 @@ yydefault: case 115: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:983 +//line sql.y:987 { // Create table [name] like [name] yyDollar[1].createTableUnion().OptLike = yyDollar[2].optLikeUnion() @@ -8423,7 +8423,7 @@ yydefault: case 116: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:990 +//line sql.y:994 { indexDef := yyDollar[1].alterTableUnion().AlterOptions[0].(*AddIndexDefinition).IndexDefinition indexDef.Columns = yyDollar[3].indexColumnsUnion() @@ -8436,7 +8436,7 @@ yydefault: case 117: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL Statement -//line sql.y:999 +//line sql.y:1003 { yyLOCAL = &CreateView{ViewName: yyDollar[8].tableName.ToViewName(), Comments: Comments(yyDollar[2].strs).Parsed(), IsReplace: yyDollar[3].booleanUnion(), Algorithm: yyDollar[4].str, Definer: yyDollar[5].definerUnion(), Security: yyDollar[6].str, Columns: yyDollar[9].columnsUnion(), Select: yyDollar[11].selStmtUnion(), CheckOption: yyDollar[12].str} } @@ -8444,7 +8444,7 @@ yydefault: case 118: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:1003 +//line sql.y:1007 { yyDollar[1].createDatabaseUnion().FullyParsed = true yyDollar[1].createDatabaseUnion().CreateOptions = yyDollar[2].collateAndCharsetsUnion() @@ -8454,7 +8454,7 @@ yydefault: case 119: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1010 +//line sql.y:1014 { yyLOCAL = false } @@ -8462,33 +8462,33 @@ yydefault: case 120: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:1014 +//line sql.y:1018 { yyLOCAL = true } yyVAL.union = yyLOCAL case 121: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1019 +//line sql.y:1023 { yyVAL.colIdent = NewColIdent("") } case 122: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1023 +//line sql.y:1027 { yyVAL.colIdent = yyDollar[2].colIdent } case 123: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1029 +//line sql.y:1033 { yyVAL.colIdent = yyDollar[1].colIdent } case 124: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1034 +//line sql.y:1038 { var v []VindexParam yyLOCAL = v @@ -8497,7 +8497,7 @@ yydefault: case 125: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1039 +//line sql.y:1043 { yyLOCAL = yyDollar[2].vindexParamsUnion() } @@ -8505,7 +8505,7 @@ yydefault: case 126: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []VindexParam -//line sql.y:1045 +//line sql.y:1049 { yyLOCAL = make([]VindexParam, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].vindexParam) @@ -8513,21 +8513,21 @@ yydefault: yyVAL.union = yyLOCAL case 127: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1050 +//line sql.y:1054 { yySLICE := (*[]VindexParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].vindexParam) } case 128: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1056 +//line sql.y:1060 { yyVAL.vindexParam = VindexParam{Key: yyDollar[1].colIdent, Val: yyDollar[3].str} } case 129: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1061 +//line sql.y:1065 { yyLOCAL = nil } @@ -8535,7 +8535,7 @@ yydefault: case 130: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1065 +//line sql.y:1069 { yyLOCAL = yyDollar[1].jsonObjectParamsUnion() } @@ -8543,28 +8543,28 @@ yydefault: case 131: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JSONObjectParam -//line sql.y:1071 +//line sql.y:1075 { yyLOCAL = []*JSONObjectParam{yyDollar[1].jsonObjectParam} } yyVAL.union = yyLOCAL case 132: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1075 +//line sql.y:1079 { yySLICE := (*[]*JSONObjectParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jsonObjectParam) } case 133: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1081 +//line sql.y:1085 { yyVAL.jsonObjectParam = &JSONObjectParam{Key: yyDollar[1].exprUnion(), Value: yyDollar[3].exprUnion()} } case 134: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *CreateTable -//line sql.y:1087 +//line sql.y:1091 { yyLOCAL = &CreateTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[6].tableName, IfNotExists: yyDollar[5].booleanUnion(), Temp: yyDollar[3].booleanUnion()} setDDL(yylex, yyLOCAL) @@ -8573,7 +8573,7 @@ yydefault: case 135: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1094 +//line sql.y:1098 { yyLOCAL = &AlterTable{Comments: Comments(yyDollar[2].strs).Parsed(), Table: yyDollar[4].tableName} setDDL(yylex, yyLOCAL) @@ -8582,7 +8582,7 @@ yydefault: case 136: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1101 +//line sql.y:1105 { yyLOCAL = &AlterTable{Table: yyDollar[7].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[4].colIdent, Type: string(yyDollar[3].str)}, Options: yyDollar[5].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -8591,7 +8591,7 @@ yydefault: case 137: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1106 +//line sql.y:1110 { yyLOCAL = &AlterTable{Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].colIdent, Type: string(yyDollar[3].str) + " " + string(yyDollar[4].str), Fulltext: true}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -8600,7 +8600,7 @@ yydefault: case 138: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1111 +//line sql.y:1115 { yyLOCAL = &AlterTable{Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].colIdent, Type: string(yyDollar[3].str) + " " + string(yyDollar[4].str), Spatial: true}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -8609,7 +8609,7 @@ yydefault: case 139: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *AlterTable -//line sql.y:1116 +//line sql.y:1120 { yyLOCAL = &AlterTable{Table: yyDollar[8].tableName, AlterOptions: []AlterOption{&AddIndexDefinition{IndexDefinition: &IndexDefinition{Info: &IndexInfo{Name: yyDollar[5].colIdent, Type: string(yyDollar[3].str) + " " + string(yyDollar[4].str), Unique: true}, Options: yyDollar[6].indexOptionsUnion()}}}} setDDL(yylex, yyLOCAL) @@ -8618,7 +8618,7 @@ yydefault: case 140: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *CreateDatabase -//line sql.y:1123 +//line sql.y:1127 { yyLOCAL = &CreateDatabase{Comments: Comments(yyDollar[4].strs).Parsed(), DBName: yyDollar[6].tableIdent, IfNotExists: yyDollar[5].booleanUnion()} setDDL(yylex, yyLOCAL) @@ -8627,7 +8627,7 @@ yydefault: case 141: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AlterDatabase -//line sql.y:1130 +//line sql.y:1134 { yyLOCAL = &AlterDatabase{} setDDL(yylex, yyLOCAL) @@ -8636,7 +8636,7 @@ yydefault: case 144: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1141 +//line sql.y:1145 { yyLOCAL = yyDollar[2].tableSpecUnion() yyLOCAL.Options = yyDollar[4].tableOptionsUnion() @@ -8646,7 +8646,7 @@ yydefault: case 145: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []CollateAndCharset -//line sql.y:1148 +//line sql.y:1152 { yyLOCAL = nil } @@ -8654,7 +8654,7 @@ yydefault: case 146: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []CollateAndCharset -//line sql.y:1152 +//line sql.y:1156 { yyLOCAL = yyDollar[1].collateAndCharsetsUnion() } @@ -8662,7 +8662,7 @@ yydefault: case 147: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []CollateAndCharset -//line sql.y:1158 +//line sql.y:1162 { yyLOCAL = []CollateAndCharset{yyDollar[1].collateAndCharset} } @@ -8670,21 +8670,21 @@ yydefault: case 148: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []CollateAndCharset -//line sql.y:1162 +//line sql.y:1166 { yyLOCAL = []CollateAndCharset{yyDollar[1].collateAndCharset} } yyVAL.union = yyLOCAL case 149: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1166 +//line sql.y:1170 { yySLICE := (*[]CollateAndCharset)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].collateAndCharset) } case 150: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1170 +//line sql.y:1174 { yySLICE := (*[]CollateAndCharset)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].collateAndCharset) @@ -8692,7 +8692,7 @@ yydefault: case 151: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1176 +//line sql.y:1180 { yyLOCAL = false } @@ -8700,39 +8700,39 @@ yydefault: case 152: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:1180 +//line sql.y:1184 { yyLOCAL = true } yyVAL.union = yyLOCAL case 153: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1186 +//line sql.y:1190 { yyVAL.collateAndCharset = CollateAndCharset{Type: CharacterSetType, Value: (yyDollar[4].colIdent.String()), IsDefault: yyDollar[1].booleanUnion()} } case 154: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1190 +//line sql.y:1194 { yyVAL.collateAndCharset = CollateAndCharset{Type: CharacterSetType, Value: (encodeSQLString(yyDollar[4].str)), IsDefault: yyDollar[1].booleanUnion()} } case 155: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1196 +//line sql.y:1200 { yyVAL.collateAndCharset = CollateAndCharset{Type: CollateType, Value: (yyDollar[4].colIdent.String()), IsDefault: yyDollar[1].booleanUnion()} } case 156: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1200 +//line sql.y:1204 { yyVAL.collateAndCharset = CollateAndCharset{Type: CollateType, Value: (encodeSQLString(yyDollar[4].str)), IsDefault: yyDollar[1].booleanUnion()} } case 157: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1207 +//line sql.y:1211 { yyLOCAL = &OptLike{LikeTable: yyDollar[2].tableName} } @@ -8740,7 +8740,7 @@ yydefault: case 158: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *OptLike -//line sql.y:1211 +//line sql.y:1215 { yyLOCAL = &OptLike{LikeTable: yyDollar[3].tableName} } @@ -8748,14 +8748,14 @@ yydefault: case 159: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*ColumnDefinition -//line sql.y:1217 +//line sql.y:1221 { yyLOCAL = []*ColumnDefinition{yyDollar[1].columnDefinitionUnion()} } yyVAL.union = yyLOCAL case 160: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1221 +//line sql.y:1225 { yySLICE := (*[]*ColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].columnDefinitionUnion()) @@ -8763,7 +8763,7 @@ yydefault: case 161: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1227 +//line sql.y:1231 { yyLOCAL = &TableSpec{} yyLOCAL.AddColumn(yyDollar[1].columnDefinitionUnion()) @@ -8772,7 +8772,7 @@ yydefault: case 162: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *TableSpec -//line sql.y:1232 +//line sql.y:1236 { yyLOCAL = &TableSpec{} yyLOCAL.AddConstraint(yyDollar[1].constraintDefinitionUnion()) @@ -8780,39 +8780,39 @@ yydefault: yyVAL.union = yyLOCAL case 163: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1237 +//line sql.y:1241 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) } case 164: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:1241 +//line sql.y:1245 { yyVAL.tableSpecUnion().AddColumn(yyDollar[3].columnDefinitionUnion()) yyVAL.tableSpecUnion().AddConstraint(yyDollar[4].constraintDefinitionUnion()) } case 165: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1246 +//line sql.y:1250 { yyVAL.tableSpecUnion().AddIndex(yyDollar[3].indexDefinitionUnion()) } case 166: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1250 +//line sql.y:1254 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } case 167: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1254 +//line sql.y:1258 { yyVAL.tableSpecUnion().AddConstraint(yyDollar[3].constraintDefinitionUnion()) } case 168: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1265 +//line sql.y:1269 { yyDollar[2].columnType.Options = yyDollar[4].columnTypeOptionsUnion() if yyDollar[2].columnType.Options.Collate == "" { @@ -8825,7 +8825,7 @@ yydefault: case 169: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *ColumnDefinition -//line sql.y:1274 +//line sql.y:1278 { yyDollar[2].columnType.Options = yyDollar[9].columnTypeOptionsUnion() yyDollar[2].columnType.Options.As = yyDollar[7].exprUnion() @@ -8836,20 +8836,20 @@ yydefault: yyVAL.union = yyLOCAL case 170: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1283 +//line sql.y:1287 { yyVAL.str = "" } case 171: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1287 +//line sql.y:1291 { yyVAL.str = "" } case 172: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1296 +//line sql.y:1300 { yyLOCAL = &ColumnTypeOptions{Null: nil, Default: nil, OnUpdate: nil, Autoincrement: false, KeyOpt: colKeyNone, Comment: nil, As: nil} } @@ -8857,7 +8857,7 @@ yydefault: case 173: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1300 +//line sql.y:1304 { val := true yyDollar[1].columnTypeOptionsUnion().Null = &val @@ -8867,7 +8867,7 @@ yydefault: case 174: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1306 +//line sql.y:1310 { val := false yyDollar[1].columnTypeOptionsUnion().Null = &val @@ -8877,7 +8877,7 @@ yydefault: case 175: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1312 +//line sql.y:1316 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -8886,7 +8886,7 @@ yydefault: case 176: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1317 +//line sql.y:1321 { yyDollar[1].columnTypeOptionsUnion().Default = yyDollar[3].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -8895,7 +8895,7 @@ yydefault: case 177: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1322 +//line sql.y:1326 { yyDollar[1].columnTypeOptionsUnion().OnUpdate = yyDollar[4].exprUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -8904,7 +8904,7 @@ yydefault: case 178: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1327 +//line sql.y:1331 { yyDollar[1].columnTypeOptionsUnion().Autoincrement = true yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -8913,7 +8913,7 @@ yydefault: case 179: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1332 +//line sql.y:1336 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -8922,7 +8922,7 @@ yydefault: case 180: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1337 +//line sql.y:1341 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -8930,14 +8930,14 @@ yydefault: yyVAL.union = yyLOCAL case 181: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1342 +//line sql.y:1346 { yyDollar[1].columnTypeOptionsUnion().Collate = encodeSQLString(yyDollar[3].str) } case 182: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1346 +//line sql.y:1350 { yyDollar[1].columnTypeOptionsUnion().Collate = string(yyDollar[3].colIdent.String()) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -8946,7 +8946,7 @@ yydefault: case 183: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1353 +//line sql.y:1357 { yyLOCAL = VirtualStorage } @@ -8954,7 +8954,7 @@ yydefault: case 184: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnStorage -//line sql.y:1357 +//line sql.y:1361 { yyLOCAL = StoredStorage } @@ -8962,7 +8962,7 @@ yydefault: case 185: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1362 +//line sql.y:1366 { yyLOCAL = &ColumnTypeOptions{} } @@ -8970,7 +8970,7 @@ yydefault: case 186: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1366 +//line sql.y:1370 { yyDollar[1].columnTypeOptionsUnion().Storage = yyDollar[2].columnStorageUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -8979,7 +8979,7 @@ yydefault: case 187: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1371 +//line sql.y:1375 { val := true yyDollar[1].columnTypeOptionsUnion().Null = &val @@ -8989,7 +8989,7 @@ yydefault: case 188: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1377 +//line sql.y:1381 { val := false yyDollar[1].columnTypeOptionsUnion().Null = &val @@ -8999,7 +8999,7 @@ yydefault: case 189: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1383 +//line sql.y:1387 { yyDollar[1].columnTypeOptionsUnion().Comment = NewStrLiteral(yyDollar[3].str) yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -9008,7 +9008,7 @@ yydefault: case 190: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColumnTypeOptions -//line sql.y:1388 +//line sql.y:1392 { yyDollar[1].columnTypeOptionsUnion().KeyOpt = yyDollar[2].colKeyOptUnion() yyLOCAL = yyDollar[1].columnTypeOptionsUnion() @@ -9017,7 +9017,7 @@ yydefault: case 191: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1395 +//line sql.y:1399 { yyLOCAL = yyDollar[1].exprUnion() } @@ -9025,7 +9025,7 @@ yydefault: case 193: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1402 +//line sql.y:1406 { yyLOCAL = &CurTimeFuncExpr{Name: NewColIdent("current_timestamp"), Fsp: yyDollar[2].exprUnion()} } @@ -9033,7 +9033,7 @@ yydefault: case 194: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1406 +//line sql.y:1410 { yyLOCAL = &CurTimeFuncExpr{Name: NewColIdent("localtime"), Fsp: yyDollar[2].exprUnion()} } @@ -9041,7 +9041,7 @@ yydefault: case 195: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1410 +//line sql.y:1414 { yyLOCAL = &CurTimeFuncExpr{Name: NewColIdent("localtimestamp"), Fsp: yyDollar[2].exprUnion()} } @@ -9049,7 +9049,7 @@ yydefault: case 196: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1414 +//line sql.y:1418 { yyLOCAL = &CurTimeFuncExpr{Name: NewColIdent("utc_timestamp"), Fsp: yyDollar[2].exprUnion()} } @@ -9057,7 +9057,7 @@ yydefault: case 197: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1418 +//line sql.y:1422 { yyLOCAL = &CurTimeFuncExpr{Name: NewColIdent("now"), Fsp: yyDollar[2].exprUnion()} } @@ -9065,7 +9065,7 @@ yydefault: case 200: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1429 +//line sql.y:1433 { yyLOCAL = &NullVal{} } @@ -9073,7 +9073,7 @@ yydefault: case 202: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1436 +//line sql.y:1440 { yyLOCAL = yyDollar[2].exprUnion() } @@ -9081,7 +9081,7 @@ yydefault: case 203: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1440 +//line sql.y:1444 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } @@ -9089,7 +9089,7 @@ yydefault: case 204: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1446 +//line sql.y:1450 { yyLOCAL = yyDollar[1].exprUnion() } @@ -9097,7 +9097,7 @@ yydefault: case 205: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1450 +//line sql.y:1454 { yyLOCAL = yyDollar[1].exprUnion() } @@ -9105,7 +9105,7 @@ yydefault: case 206: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1454 +//line sql.y:1458 { yyLOCAL = yyDollar[1].boolValUnion() } @@ -9113,7 +9113,7 @@ yydefault: case 207: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1458 +//line sql.y:1462 { yyLOCAL = NewHexLiteral(yyDollar[1].str) } @@ -9121,7 +9121,7 @@ yydefault: case 208: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1462 +//line sql.y:1466 { yyLOCAL = NewHexNumLiteral(yyDollar[1].str) } @@ -9129,7 +9129,7 @@ yydefault: case 209: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1466 +//line sql.y:1470 { yyLOCAL = NewBitLiteral(yyDollar[1].str) } @@ -9137,7 +9137,7 @@ yydefault: case 210: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1470 +//line sql.y:1474 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) @@ -9146,7 +9146,7 @@ yydefault: case 211: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1475 +//line sql.y:1479 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewBitLiteral(yyDollar[2].str)} } @@ -9154,7 +9154,7 @@ yydefault: case 212: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1479 +//line sql.y:1483 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexNumLiteral(yyDollar[2].str)} } @@ -9162,7 +9162,7 @@ yydefault: case 213: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1483 +//line sql.y:1487 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewHexLiteral(yyDollar[2].str)} } @@ -9170,7 +9170,7 @@ yydefault: case 214: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1487 +//line sql.y:1491 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: yyDollar[2].colNameUnion()} } @@ -9178,7 +9178,7 @@ yydefault: case 215: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1491 +//line sql.y:1495 { bindVariable(yylex, yyDollar[2].str[1:]) yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewArgument(yyDollar[2].str[1:])} @@ -9186,254 +9186,254 @@ yydefault: yyVAL.union = yyLOCAL case 216: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1498 +//line sql.y:1502 { yyVAL.str = Armscii8Str } case 217: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1502 +//line sql.y:1506 { yyVAL.str = ASCIIStr } case 218: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1506 +//line sql.y:1510 { yyVAL.str = Big5Str } case 219: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1510 +//line sql.y:1514 { yyVAL.str = UBinaryStr } case 220: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1514 +//line sql.y:1518 { yyVAL.str = Cp1250Str } case 221: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1518 +//line sql.y:1522 { yyVAL.str = Cp1251Str } case 222: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1522 +//line sql.y:1526 { yyVAL.str = Cp1256Str } case 223: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1526 +//line sql.y:1530 { yyVAL.str = Cp1257Str } case 224: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1530 +//line sql.y:1534 { yyVAL.str = Cp850Str } case 225: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1534 +//line sql.y:1538 { yyVAL.str = Cp852Str } case 226: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1538 +//line sql.y:1542 { yyVAL.str = Cp866Str } case 227: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1542 +//line sql.y:1546 { yyVAL.str = Cp932Str } case 228: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1546 +//line sql.y:1550 { yyVAL.str = Dec8Str } case 229: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1550 +//line sql.y:1554 { yyVAL.str = EucjpmsStr } case 230: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1554 +//line sql.y:1558 { yyVAL.str = EuckrStr } case 231: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1558 +//line sql.y:1562 { yyVAL.str = Gb18030Str } case 232: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1562 +//line sql.y:1566 { yyVAL.str = Gb2312Str } case 233: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1566 +//line sql.y:1570 { yyVAL.str = GbkStr } case 234: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1570 +//line sql.y:1574 { yyVAL.str = Geostd8Str } case 235: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1574 +//line sql.y:1578 { yyVAL.str = GreekStr } case 236: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1578 +//line sql.y:1582 { yyVAL.str = HebrewStr } case 237: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1582 +//line sql.y:1586 { yyVAL.str = Hp8Str } case 238: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1586 +//line sql.y:1590 { yyVAL.str = Keybcs2Str } case 239: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1590 +//line sql.y:1594 { yyVAL.str = Koi8rStr } case 240: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1594 +//line sql.y:1598 { yyVAL.str = Koi8uStr } case 241: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1598 +//line sql.y:1602 { yyVAL.str = Latin1Str } case 242: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1602 +//line sql.y:1606 { yyVAL.str = Latin2Str } case 243: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1606 +//line sql.y:1610 { yyVAL.str = Latin5Str } case 244: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1610 +//line sql.y:1614 { yyVAL.str = Latin7Str } case 245: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1614 +//line sql.y:1618 { yyVAL.str = MacceStr } case 246: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1618 +//line sql.y:1622 { yyVAL.str = MacromanStr } case 247: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1622 +//line sql.y:1626 { yyVAL.str = SjisStr } case 248: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1626 +//line sql.y:1630 { yyVAL.str = Swe7Str } case 249: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1630 +//line sql.y:1634 { yyVAL.str = Tis620Str } case 250: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1634 +//line sql.y:1638 { yyVAL.str = Ucs2Str } case 251: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1638 +//line sql.y:1642 { yyVAL.str = UjisStr } case 252: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1642 +//line sql.y:1646 { yyVAL.str = Utf16Str } case 253: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1646 +//line sql.y:1650 { yyVAL.str = Utf16leStr } case 254: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1650 +//line sql.y:1654 { yyVAL.str = Utf32Str } case 255: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1654 +//line sql.y:1658 { yyVAL.str = Utf8Str } case 256: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1658 +//line sql.y:1662 { yyVAL.str = Utf8mb4Str } case 259: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1668 +//line sql.y:1672 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } @@ -9441,7 +9441,7 @@ yydefault: case 260: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1672 +//line sql.y:1676 { yyLOCAL = NewFloatLiteral(yyDollar[1].str) } @@ -9449,7 +9449,7 @@ yydefault: case 261: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1676 +//line sql.y:1680 { yyLOCAL = NewDecimalLiteral(yyDollar[1].str) } @@ -9457,7 +9457,7 @@ yydefault: case 262: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1682 +//line sql.y:1686 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } @@ -9465,7 +9465,7 @@ yydefault: case 263: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1686 +//line sql.y:1690 { yyLOCAL = &UnaryExpr{Operator: NStringOp, Expr: NewStrLiteral(yyDollar[1].str)} } @@ -9473,7 +9473,7 @@ yydefault: case 264: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:1690 +//line sql.y:1694 { yyLOCAL = &IntroducerExpr{CharacterSet: yyDollar[1].str, Expr: NewStrLiteral(yyDollar[2].str)} } @@ -9481,7 +9481,7 @@ yydefault: case 265: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1696 +//line sql.y:1700 { yyLOCAL = yyDollar[1].exprUnion() } @@ -9489,7 +9489,7 @@ yydefault: case 266: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:1700 +//line sql.y:1704 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) @@ -9498,7 +9498,7 @@ yydefault: case 267: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1707 +//line sql.y:1711 { yyLOCAL = colKeyPrimary } @@ -9506,7 +9506,7 @@ yydefault: case 268: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1711 +//line sql.y:1715 { yyLOCAL = colKeyUnique } @@ -9514,7 +9514,7 @@ yydefault: case 269: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1715 +//line sql.y:1719 { yyLOCAL = colKeyUniqueKey } @@ -9522,14 +9522,14 @@ yydefault: case 270: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColumnKeyOption -//line sql.y:1719 +//line sql.y:1723 { yyLOCAL = colKey } yyVAL.union = yyLOCAL case 271: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1725 +//line sql.y:1729 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Unsigned = yyDollar[2].booleanUnion() @@ -9537,74 +9537,74 @@ yydefault: } case 275: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1736 +//line sql.y:1740 { yyVAL.columnType = yyDollar[1].columnType yyVAL.columnType.Length = yyDollar[2].literalUnion() } case 276: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1741 +//line sql.y:1745 { yyVAL.columnType = yyDollar[1].columnType } case 277: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1747 +//line sql.y:1751 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 278: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1751 +//line sql.y:1755 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 279: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1755 +//line sql.y:1759 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 280: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1759 +//line sql.y:1763 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 281: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1763 +//line sql.y:1767 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 282: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1767 +//line sql.y:1771 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 283: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1771 +//line sql.y:1775 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 284: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1775 +//line sql.y:1779 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 285: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1779 +//line sql.y:1783 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 286: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1785 +//line sql.y:1789 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -9612,7 +9612,7 @@ yydefault: } case 287: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1791 +//line sql.y:1795 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -9620,7 +9620,7 @@ yydefault: } case 288: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1797 +//line sql.y:1801 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -9628,7 +9628,7 @@ yydefault: } case 289: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1803 +//line sql.y:1807 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -9636,7 +9636,7 @@ yydefault: } case 290: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1809 +//line sql.y:1813 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} yyVAL.columnType.Length = yyDollar[2].LengthScaleOption.Length @@ -9644,189 +9644,189 @@ yydefault: } case 291: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1817 +//line sql.y:1821 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 292: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1821 +//line sql.y:1825 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 293: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1825 +//line sql.y:1829 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 294: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1829 +//line sql.y:1833 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 295: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1833 +//line sql.y:1837 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 296: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1839 +//line sql.y:1843 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].str} } case 297: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1843 +//line sql.y:1847 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].str} } case 298: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1847 +//line sql.y:1851 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 299: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1851 +//line sql.y:1855 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } case 300: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1855 +//line sql.y:1859 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].str} } case 301: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1859 +//line sql.y:1863 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].str} } case 302: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1863 +//line sql.y:1867 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].str} } case 303: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:1867 +//line sql.y:1871 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), Charset: yyDollar[2].str} } case 304: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1871 +//line sql.y:1875 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 305: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1875 +//line sql.y:1879 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 306: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1879 +//line sql.y:1883 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 307: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1883 +//line sql.y:1887 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 308: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1887 +//line sql.y:1891 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 309: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1891 +//line sql.y:1895 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str} } case 310: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1896 +//line sql.y:1900 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str), EnumValues: yyDollar[3].strs, Charset: yyDollar[5].str} } case 311: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1902 +//line sql.y:1906 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 312: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1906 +//line sql.y:1910 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 313: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1910 +//line sql.y:1914 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 314: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1914 +//line sql.y:1918 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 315: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1918 +//line sql.y:1922 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 316: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1922 +//line sql.y:1926 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 317: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1926 +//line sql.y:1930 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 318: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1930 +//line sql.y:1934 { yyVAL.columnType = ColumnType{Type: string(yyDollar[1].str)} } case 319: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:1936 +//line sql.y:1940 { yyVAL.strs = make([]string, 0, 4) yyVAL.strs = append(yyVAL.strs, encodeSQLString(yyDollar[1].str)) } case 320: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1941 +//line sql.y:1945 { yyVAL.strs = append(yyDollar[1].strs, encodeSQLString(yyDollar[3].str)) } case 321: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Literal -//line sql.y:1946 +//line sql.y:1950 { yyLOCAL = nil } @@ -9834,20 +9834,20 @@ yydefault: case 322: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Literal -//line sql.y:1950 +//line sql.y:1954 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL case 323: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1955 +//line sql.y:1959 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 324: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1959 +//line sql.y:1963 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].str), @@ -9856,13 +9856,13 @@ yydefault: } case 325: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:1967 +//line sql.y:1971 { yyVAL.LengthScaleOption = LengthScaleOption{} } case 326: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:1971 +//line sql.y:1975 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].str), @@ -9870,7 +9870,7 @@ yydefault: } case 327: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:1977 +//line sql.y:1981 { yyVAL.LengthScaleOption = LengthScaleOption{ Length: NewIntLiteral(yyDollar[2].str), @@ -9880,7 +9880,7 @@ yydefault: case 328: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1985 +//line sql.y:1989 { yyLOCAL = false } @@ -9888,7 +9888,7 @@ yydefault: case 329: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:1989 +//line sql.y:1993 { yyLOCAL = true } @@ -9896,7 +9896,7 @@ yydefault: case 330: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:1993 +//line sql.y:1997 { yyLOCAL = false } @@ -9904,7 +9904,7 @@ yydefault: case 331: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:1998 +//line sql.y:2002 { yyLOCAL = false } @@ -9912,71 +9912,71 @@ yydefault: case 332: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2002 +//line sql.y:2006 { yyLOCAL = true } yyVAL.union = yyLOCAL case 333: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2007 +//line sql.y:2011 { yyVAL.str = "" } case 334: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2011 +//line sql.y:2015 { yyVAL.str = string(yyDollar[2].colIdent.String()) } case 335: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2015 +//line sql.y:2019 { yyVAL.str = encodeSQLString(yyDollar[2].str) } case 336: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2019 +//line sql.y:2023 { yyVAL.str = string(yyDollar[2].str) } case 337: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2023 +//line sql.y:2027 { // ASCII: Shorthand for CHARACTER SET latin1. yyVAL.str = "latin1" } case 338: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2028 +//line sql.y:2032 { // UNICODE: Shorthand for CHARACTER SET ucs2. yyVAL.str = "ucs2" } case 339: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2034 +//line sql.y:2038 { yyVAL.str = "" } case 340: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2038 +//line sql.y:2042 { yyVAL.str = string(yyDollar[2].colIdent.String()) } case 341: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2042 +//line sql.y:2046 { yyVAL.str = encodeSQLString(yyDollar[2].str) } case 342: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexDefinition -//line sql.y:2049 +//line sql.y:2053 { yyLOCAL = &IndexDefinition{Info: yyDollar[1].indexInfoUnion(), Columns: yyDollar[3].indexColumnsUnion(), Options: yyDollar[5].indexOptionsUnion()} } @@ -9984,7 +9984,7 @@ yydefault: case 343: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2054 +//line sql.y:2058 { yyLOCAL = nil } @@ -9992,7 +9992,7 @@ yydefault: case 344: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2058 +//line sql.y:2062 { yyLOCAL = yyDollar[1].indexOptionsUnion() } @@ -10000,14 +10000,14 @@ yydefault: case 345: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:2064 +//line sql.y:2068 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL case 346: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2068 +//line sql.y:2072 { yySLICE := (*[]*IndexOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexOptionUnion()) @@ -10015,7 +10015,7 @@ yydefault: case 347: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2074 +//line sql.y:2078 { yyLOCAL = yyDollar[1].indexOptionUnion() } @@ -10023,7 +10023,7 @@ yydefault: case 348: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2078 +//line sql.y:2082 { // should not be string yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} @@ -10032,7 +10032,7 @@ yydefault: case 349: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2083 +//line sql.y:2087 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[2].str)} } @@ -10040,27 +10040,27 @@ yydefault: case 350: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:2087 +//line sql.y:2091 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str) + " " + string(yyDollar[2].str), String: yyDollar[3].colIdent.String()} } yyVAL.union = yyLOCAL case 351: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2093 +//line sql.y:2097 { yyVAL.str = "" } case 352: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2097 +//line sql.y:2101 { yyVAL.str = string(yyDollar[1].str) } case 353: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2103 +//line sql.y:2107 { yyLOCAL = &IndexInfo{Type: string(yyDollar[2].str) + " " + string(yyDollar[3].str), ConstraintName: NewColIdent(yyDollar[1].str), Name: NewColIdent("PRIMARY"), Primary: true, Unique: true} } @@ -10068,7 +10068,7 @@ yydefault: case 354: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2107 +//line sql.y:2111 { yyLOCAL = &IndexInfo{Type: string(yyDollar[1].str) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Spatial: true, Unique: false} } @@ -10076,7 +10076,7 @@ yydefault: case 355: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2111 +//line sql.y:2115 { yyLOCAL = &IndexInfo{Type: string(yyDollar[1].str) + " " + string(yyDollar[2].str), Name: NewColIdent(yyDollar[3].str), Fulltext: true, Unique: false} } @@ -10084,7 +10084,7 @@ yydefault: case 356: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2115 +//line sql.y:2119 { yyLOCAL = &IndexInfo{Type: string(yyDollar[2].str) + " " + string(yyDollar[3].str), ConstraintName: NewColIdent(yyDollar[1].str), Name: NewColIdent(yyDollar[4].str), Unique: true} } @@ -10092,100 +10092,100 @@ yydefault: case 357: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexInfo -//line sql.y:2119 +//line sql.y:2123 { yyLOCAL = &IndexInfo{Type: string(yyDollar[1].str), Name: NewColIdent(yyDollar[2].str), Unique: false} } yyVAL.union = yyLOCAL case 358: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2124 +//line sql.y:2128 { yyVAL.str = "" } case 359: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2128 +//line sql.y:2132 { yyVAL.str = yyDollar[2].str } case 360: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2134 +//line sql.y:2138 { yyVAL.str = string(yyDollar[1].str) } case 361: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2138 +//line sql.y:2142 { yyVAL.str = string(yyDollar[1].str) } case 362: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2142 +//line sql.y:2146 { yyVAL.str = string(yyDollar[1].str) } case 363: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2149 +//line sql.y:2153 { yyVAL.str = string(yyDollar[1].str) } case 364: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2153 +//line sql.y:2157 { yyVAL.str = string(yyDollar[1].str) } case 365: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2158 +//line sql.y:2162 { yyVAL.str = "key" } case 366: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2162 +//line sql.y:2166 { yyVAL.str = yyDollar[1].str } case 367: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2168 +//line sql.y:2172 { yyVAL.str = string(yyDollar[1].str) } case 368: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2172 +//line sql.y:2176 { yyVAL.str = string(yyDollar[1].str) } case 369: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2177 +//line sql.y:2181 { yyVAL.str = "" } case 370: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2181 +//line sql.y:2185 { yyVAL.str = string(yyDollar[1].colIdent.String()) } case 371: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexColumn -//line sql.y:2187 +//line sql.y:2191 { yyLOCAL = []*IndexColumn{yyDollar[1].indexColumnUnion()} } yyVAL.union = yyLOCAL case 372: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2191 +//line sql.y:2195 { yySLICE := (*[]*IndexColumn)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].indexColumnUnion()) @@ -10193,7 +10193,7 @@ yydefault: case 373: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *IndexColumn -//line sql.y:2197 +//line sql.y:2201 { yyLOCAL = &IndexColumn{Column: yyDollar[1].colIdent, Length: yyDollar[2].literalUnion(), Direction: yyDollar[3].orderDirectionUnion()} } @@ -10201,7 +10201,7 @@ yydefault: case 374: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2203 +//line sql.y:2207 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].colIdent, Details: yyDollar[3].constraintInfoUnion()} } @@ -10209,7 +10209,7 @@ yydefault: case 375: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2207 +//line sql.y:2211 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } @@ -10217,7 +10217,7 @@ yydefault: case 376: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2213 +//line sql.y:2217 { yyLOCAL = &ConstraintDefinition{Name: yyDollar[2].colIdent, Details: yyDollar[3].constraintInfoUnion()} } @@ -10225,7 +10225,7 @@ yydefault: case 377: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConstraintDefinition -//line sql.y:2217 +//line sql.y:2221 { yyLOCAL = &ConstraintDefinition{Details: yyDollar[1].constraintInfoUnion()} } @@ -10233,7 +10233,7 @@ yydefault: case 378: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2223 +//line sql.y:2227 { yyLOCAL = &ForeignKeyDefinition{IndexName: NewColIdent(yyDollar[3].str), Source: yyDollar[5].columnsUnion(), ReferenceDefinition: yyDollar[7].referenceDefinitionUnion()} } @@ -10241,7 +10241,7 @@ yydefault: case 379: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2229 +//line sql.y:2233 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion()} } @@ -10249,7 +10249,7 @@ yydefault: case 380: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2233 +//line sql.y:2237 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), OnDelete: yyDollar[6].ReferenceActionUnion()} } @@ -10257,7 +10257,7 @@ yydefault: case 381: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2237 +//line sql.y:2241 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), OnUpdate: yyDollar[6].ReferenceActionUnion()} } @@ -10265,7 +10265,7 @@ yydefault: case 382: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2241 +//line sql.y:2245 { yyLOCAL = &ReferenceDefinition{ReferencedTable: yyDollar[2].tableName, ReferencedColumns: yyDollar[4].columnsUnion(), OnDelete: yyDollar[6].ReferenceActionUnion(), OnUpdate: yyDollar[7].ReferenceActionUnion()} } @@ -10273,7 +10273,7 @@ yydefault: case 383: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2246 +//line sql.y:2250 { yyLOCAL = nil } @@ -10281,7 +10281,7 @@ yydefault: case 384: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ReferenceDefinition -//line sql.y:2250 +//line sql.y:2254 { yyLOCAL = yyDollar[1].referenceDefinitionUnion() } @@ -10289,7 +10289,7 @@ yydefault: case 385: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL ConstraintInfo -//line sql.y:2256 +//line sql.y:2260 { yyLOCAL = &CheckConstraintDefinition{Expr: yyDollar[3].exprUnion(), Enforced: yyDollar[5].booleanUnion()} } @@ -10297,7 +10297,7 @@ yydefault: case 386: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2262 +//line sql.y:2266 { yyLOCAL = yyDollar[3].ReferenceActionUnion() } @@ -10305,7 +10305,7 @@ yydefault: case 387: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2268 +//line sql.y:2272 { yyLOCAL = yyDollar[3].ReferenceActionUnion() } @@ -10313,7 +10313,7 @@ yydefault: case 388: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2274 +//line sql.y:2278 { yyLOCAL = Restrict } @@ -10321,7 +10321,7 @@ yydefault: case 389: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2278 +//line sql.y:2282 { yyLOCAL = Cascade } @@ -10329,7 +10329,7 @@ yydefault: case 390: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2282 +//line sql.y:2286 { yyLOCAL = NoAction } @@ -10337,7 +10337,7 @@ yydefault: case 391: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2286 +//line sql.y:2290 { yyLOCAL = SetDefault } @@ -10345,33 +10345,33 @@ yydefault: case 392: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ReferenceAction -//line sql.y:2290 +//line sql.y:2294 { yyLOCAL = SetNull } yyVAL.union = yyLOCAL case 393: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2295 +//line sql.y:2299 { yyVAL.str = "" } case 394: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2299 +//line sql.y:2303 { yyVAL.str = string(yyDollar[1].str) } case 395: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2303 +//line sql.y:2307 { yyVAL.str = string(yyDollar[1].str) } case 396: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2308 +//line sql.y:2312 { yyLOCAL = true } @@ -10379,7 +10379,7 @@ yydefault: case 397: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2312 +//line sql.y:2316 { yyLOCAL = true } @@ -10387,7 +10387,7 @@ yydefault: case 398: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:2316 +//line sql.y:2320 { yyLOCAL = false } @@ -10395,7 +10395,7 @@ yydefault: case 399: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2321 +//line sql.y:2325 { yyLOCAL = nil } @@ -10403,7 +10403,7 @@ yydefault: case 400: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2325 +//line sql.y:2329 { yyLOCAL = yyDollar[1].tableOptionsUnion() } @@ -10411,21 +10411,21 @@ yydefault: case 401: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2331 +//line sql.y:2335 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL case 402: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2335 +//line sql.y:2339 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableOptionUnion()) } case 403: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2339 +//line sql.y:2343 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) @@ -10433,14 +10433,14 @@ yydefault: case 404: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableOptions -//line sql.y:2345 +//line sql.y:2349 { yyLOCAL = TableOptions{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL case 405: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2349 +//line sql.y:2353 { yySLICE := (*TableOptions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].tableOptionUnion()) @@ -10448,7 +10448,7 @@ yydefault: case 406: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2355 +//line sql.y:2359 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -10456,7 +10456,7 @@ yydefault: case 407: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2359 +//line sql.y:2363 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -10464,7 +10464,7 @@ yydefault: case 408: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2363 +//line sql.y:2367 { yyLOCAL = &TableOption{Name: (string(yyDollar[2].str)), String: yyDollar[4].str, CaseSensitive: true} } @@ -10472,7 +10472,7 @@ yydefault: case 409: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2367 +//line sql.y:2371 { yyLOCAL = &TableOption{Name: string(yyDollar[2].str), String: yyDollar[4].str, CaseSensitive: true} } @@ -10480,7 +10480,7 @@ yydefault: case 410: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2371 +//line sql.y:2375 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -10488,7 +10488,7 @@ yydefault: case 411: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2375 +//line sql.y:2379 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -10496,7 +10496,7 @@ yydefault: case 412: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2379 +//line sql.y:2383 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -10504,7 +10504,7 @@ yydefault: case 413: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2383 +//line sql.y:2387 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -10512,7 +10512,7 @@ yydefault: case 414: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2387 +//line sql.y:2391 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } @@ -10520,7 +10520,7 @@ yydefault: case 415: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2391 +//line sql.y:2395 { yyLOCAL = &TableOption{Name: (string(yyDollar[1].str) + " " + string(yyDollar[2].str)), Value: NewStrLiteral(yyDollar[4].str)} } @@ -10528,7 +10528,7 @@ yydefault: case 416: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2395 +//line sql.y:2399 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -10536,7 +10536,7 @@ yydefault: case 417: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2399 +//line sql.y:2403 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -10544,7 +10544,7 @@ yydefault: case 418: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2403 +//line sql.y:2407 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: yyDollar[3].tableIdent.String()} } @@ -10552,7 +10552,7 @@ yydefault: case 419: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2407 +//line sql.y:2411 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -10560,7 +10560,7 @@ yydefault: case 420: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2411 +//line sql.y:2415 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -10568,7 +10568,7 @@ yydefault: case 421: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2415 +//line sql.y:2419 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -10576,7 +10576,7 @@ yydefault: case 422: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2419 +//line sql.y:2423 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -10584,7 +10584,7 @@ yydefault: case 423: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2423 +//line sql.y:2427 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -10592,7 +10592,7 @@ yydefault: case 424: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2427 +//line sql.y:2431 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -10600,7 +10600,7 @@ yydefault: case 425: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2431 +//line sql.y:2435 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewStrLiteral(yyDollar[3].str)} } @@ -10608,7 +10608,7 @@ yydefault: case 426: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2435 +//line sql.y:2439 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -10616,7 +10616,7 @@ yydefault: case 427: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2439 +//line sql.y:2443 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -10624,7 +10624,7 @@ yydefault: case 428: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2443 +//line sql.y:2447 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -10632,7 +10632,7 @@ yydefault: case 429: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2447 +//line sql.y:2451 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -10640,7 +10640,7 @@ yydefault: case 430: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2451 +//line sql.y:2455 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: string(yyDollar[3].str)} } @@ -10648,7 +10648,7 @@ yydefault: case 431: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2455 +//line sql.y:2459 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Value: NewIntLiteral(yyDollar[3].str)} } @@ -10656,7 +10656,7 @@ yydefault: case 432: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2459 +//line sql.y:2463 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), String: (yyDollar[3].colIdent.String() + yyDollar[4].str)} } @@ -10664,57 +10664,57 @@ yydefault: case 433: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *TableOption -//line sql.y:2463 +//line sql.y:2467 { yyLOCAL = &TableOption{Name: string(yyDollar[1].str), Tables: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL case 434: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2468 +//line sql.y:2472 { yyVAL.str = "" } case 435: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2472 +//line sql.y:2476 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 436: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2476 +//line sql.y:2480 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) } case 446: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2495 +//line sql.y:2499 { yyVAL.str = yyDollar[1].colIdent.String() } case 447: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2499 +//line sql.y:2503 { yyVAL.str = encodeSQLString(yyDollar[1].str) } case 448: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2503 +//line sql.y:2507 { yyVAL.str = string(yyDollar[1].str) } case 449: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2508 +//line sql.y:2512 { yyVAL.str = "" } case 451: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2514 +//line sql.y:2518 { yyLOCAL = false } @@ -10722,7 +10722,7 @@ yydefault: case 452: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2518 +//line sql.y:2522 { yyLOCAL = true } @@ -10730,7 +10730,7 @@ yydefault: case 453: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ColName -//line sql.y:2523 +//line sql.y:2527 { yyLOCAL = nil } @@ -10738,7 +10738,7 @@ yydefault: case 454: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ColName -//line sql.y:2527 +//line sql.y:2531 { yyLOCAL = yyDollar[2].colNameUnion() } @@ -10746,7 +10746,7 @@ yydefault: case 455: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2532 +//line sql.y:2536 { yyLOCAL = nil } @@ -10754,14 +10754,14 @@ yydefault: case 456: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2536 +//line sql.y:2540 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL case 457: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2540 +//line sql.y:2544 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &OrderByOption{Cols: yyDollar[5].columnsUnion()}) @@ -10769,14 +10769,14 @@ yydefault: case 458: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2544 +//line sql.y:2548 { yyLOCAL = yyDollar[1].alterOptionsUnion() } yyVAL.union = yyLOCAL case 459: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2548 +//line sql.y:2552 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionsUnion()...) @@ -10784,7 +10784,7 @@ yydefault: case 460: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2552 +//line sql.y:2556 { yyLOCAL = append(append(yyDollar[1].alterOptionsUnion(), yyDollar[3].alterOptionsUnion()...), &OrderByOption{Cols: yyDollar[7].columnsUnion()}) } @@ -10792,21 +10792,21 @@ yydefault: case 461: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2558 +//line sql.y:2562 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 462: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2562 +//line sql.y:2566 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) } case 463: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2566 +//line sql.y:2570 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) @@ -10814,7 +10814,7 @@ yydefault: case 464: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2572 +//line sql.y:2576 { yyLOCAL = yyDollar[1].tableOptionsUnion() } @@ -10822,7 +10822,7 @@ yydefault: case 465: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2576 +//line sql.y:2580 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } @@ -10830,7 +10830,7 @@ yydefault: case 466: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2580 +//line sql.y:2584 { yyLOCAL = &AddConstraintDefinition{ConstraintDefinition: yyDollar[2].constraintDefinitionUnion()} } @@ -10838,7 +10838,7 @@ yydefault: case 467: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2584 +//line sql.y:2588 { yyLOCAL = &AddIndexDefinition{IndexDefinition: yyDollar[2].indexDefinitionUnion()} } @@ -10846,7 +10846,7 @@ yydefault: case 468: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2588 +//line sql.y:2592 { yyLOCAL = &AddColumns{Columns: yyDollar[4].columnDefinitionsUnion()} } @@ -10854,7 +10854,7 @@ yydefault: case 469: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2592 +//line sql.y:2596 { yyLOCAL = &AddColumns{Columns: []*ColumnDefinition{yyDollar[3].columnDefinitionUnion()}, First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } @@ -10862,7 +10862,7 @@ yydefault: case 470: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2596 +//line sql.y:2600 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: true} } @@ -10870,7 +10870,7 @@ yydefault: case 471: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2600 +//line sql.y:2604 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[6].exprUnion()} } @@ -10878,7 +10878,7 @@ yydefault: case 472: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2604 +//line sql.y:2608 { yyLOCAL = &AlterColumn{Column: yyDollar[3].colNameUnion(), DropDefault: false, DefaultVal: yyDollar[7].exprUnion()} } @@ -10886,7 +10886,7 @@ yydefault: case 473: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2608 +//line sql.y:2612 { yyLOCAL = &ChangeColumn{OldColumn: yyDollar[3].colNameUnion(), NewColDefinition: yyDollar[4].columnDefinitionUnion(), First: yyDollar[5].booleanUnion(), After: yyDollar[6].colNameUnion()} } @@ -10894,7 +10894,7 @@ yydefault: case 474: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2612 +//line sql.y:2616 { yyLOCAL = &ModifyColumn{NewColDefinition: yyDollar[3].columnDefinitionUnion(), First: yyDollar[4].booleanUnion(), After: yyDollar[5].colNameUnion()} } @@ -10902,7 +10902,7 @@ yydefault: case 475: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2616 +//line sql.y:2620 { yyLOCAL = &AlterCharset{CharacterSet: yyDollar[4].str, Collate: yyDollar[5].str} } @@ -10910,7 +10910,7 @@ yydefault: case 476: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2620 +//line sql.y:2624 { yyLOCAL = &KeyState{Enable: false} } @@ -10918,7 +10918,7 @@ yydefault: case 477: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2624 +//line sql.y:2628 { yyLOCAL = &KeyState{Enable: true} } @@ -10926,7 +10926,7 @@ yydefault: case 478: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2628 +//line sql.y:2632 { yyLOCAL = &TablespaceOperation{Import: false} } @@ -10934,7 +10934,7 @@ yydefault: case 479: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2632 +//line sql.y:2636 { yyLOCAL = &TablespaceOperation{Import: true} } @@ -10942,7 +10942,7 @@ yydefault: case 480: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2636 +//line sql.y:2640 { yyLOCAL = &DropColumn{Name: yyDollar[3].colNameUnion()} } @@ -10950,7 +10950,7 @@ yydefault: case 481: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2640 +//line sql.y:2644 { yyLOCAL = &DropKey{Type: NormalKeyType, Name: yyDollar[3].colIdent} } @@ -10958,7 +10958,7 @@ yydefault: case 482: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2644 +//line sql.y:2648 { yyLOCAL = &DropKey{Type: PrimaryKeyType} } @@ -10966,7 +10966,7 @@ yydefault: case 483: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2648 +//line sql.y:2652 { yyLOCAL = &DropKey{Type: ForeignKeyType, Name: yyDollar[4].colIdent} } @@ -10974,7 +10974,7 @@ yydefault: case 484: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2652 +//line sql.y:2656 { yyLOCAL = &Force{} } @@ -10982,7 +10982,7 @@ yydefault: case 485: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2656 +//line sql.y:2660 { yyLOCAL = &RenameTableName{Table: yyDollar[3].tableName} } @@ -10990,7 +10990,7 @@ yydefault: case 486: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2660 +//line sql.y:2664 { yyLOCAL = &RenameIndex{OldName: yyDollar[3].colIdent, NewName: yyDollar[5].colIdent} } @@ -10998,14 +10998,14 @@ yydefault: case 487: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:2666 +//line sql.y:2670 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL case 488: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2670 +//line sql.y:2674 { yySLICE := (*[]AlterOption)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].alterOptionUnion()) @@ -11013,7 +11013,7 @@ yydefault: case 489: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2676 +//line sql.y:2680 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -11021,7 +11021,7 @@ yydefault: case 490: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2680 +//line sql.y:2684 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -11029,7 +11029,7 @@ yydefault: case 491: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2684 +//line sql.y:2688 { yyLOCAL = AlgorithmValue(string(yyDollar[3].str)) } @@ -11037,7 +11037,7 @@ yydefault: case 492: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2688 +//line sql.y:2692 { yyLOCAL = &LockOption{Type: DefaultType} } @@ -11045,7 +11045,7 @@ yydefault: case 493: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2692 +//line sql.y:2696 { yyLOCAL = &LockOption{Type: NoneType} } @@ -11053,7 +11053,7 @@ yydefault: case 494: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2696 +//line sql.y:2700 { yyLOCAL = &LockOption{Type: SharedType} } @@ -11061,7 +11061,7 @@ yydefault: case 495: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2700 +//line sql.y:2704 { yyLOCAL = &LockOption{Type: ExclusiveType} } @@ -11069,7 +11069,7 @@ yydefault: case 496: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2704 +//line sql.y:2708 { yyLOCAL = &Validation{With: true} } @@ -11077,7 +11077,7 @@ yydefault: case 497: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL AlterOption -//line sql.y:2708 +//line sql.y:2712 { yyLOCAL = &Validation{With: false} } @@ -11085,7 +11085,7 @@ yydefault: case 498: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:2714 +//line sql.y:2718 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -11096,7 +11096,7 @@ yydefault: case 499: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:2721 +//line sql.y:2725 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -11107,7 +11107,7 @@ yydefault: case 500: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:2728 +//line sql.y:2732 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().AlterOptions = yyDollar[2].alterOptionsUnion() @@ -11118,7 +11118,7 @@ yydefault: case 501: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:2735 +//line sql.y:2739 { yyDollar[1].alterTableUnion().FullyParsed = true yyDollar[1].alterTableUnion().PartitionSpec = yyDollar[2].partSpecUnion() @@ -11128,7 +11128,7 @@ yydefault: case 502: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Statement -//line sql.y:2741 +//line sql.y:2745 { yyLOCAL = &AlterView{ViewName: yyDollar[7].tableName.ToViewName(), Comments: Comments(yyDollar[2].strs).Parsed(), Algorithm: yyDollar[3].str, Definer: yyDollar[4].definerUnion(), Security: yyDollar[5].str, Columns: yyDollar[8].columnsUnion(), Select: yyDollar[10].selStmtUnion(), CheckOption: yyDollar[11].str} } @@ -11136,7 +11136,7 @@ yydefault: case 503: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:2745 +//line sql.y:2749 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].tableIdent @@ -11147,7 +11147,7 @@ yydefault: case 504: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:2752 +//line sql.y:2756 { yyDollar[1].alterDatabaseUnion().FullyParsed = true yyDollar[1].alterDatabaseUnion().DBName = yyDollar[2].tableIdent @@ -11158,7 +11158,7 @@ yydefault: case 505: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:2759 +//line sql.y:2763 { yyLOCAL = &AlterVschema{ Action: CreateVindexDDLAction, @@ -11174,7 +11174,7 @@ yydefault: case 506: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:2771 +//line sql.y:2775 { yyLOCAL = &AlterVschema{ Action: DropVindexDDLAction, @@ -11188,7 +11188,7 @@ yydefault: case 507: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:2781 +//line sql.y:2785 { yyLOCAL = &AlterVschema{Action: AddVschemaTableDDLAction, Table: yyDollar[6].tableName} } @@ -11196,7 +11196,7 @@ yydefault: case 508: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:2785 +//line sql.y:2789 { yyLOCAL = &AlterVschema{Action: DropVschemaTableDDLAction, Table: yyDollar[6].tableName} } @@ -11204,7 +11204,7 @@ yydefault: case 509: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL Statement -//line sql.y:2789 +//line sql.y:2793 { yyLOCAL = &AlterVschema{ Action: AddColVindexDDLAction, @@ -11221,7 +11221,7 @@ yydefault: case 510: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Statement -//line sql.y:2802 +//line sql.y:2806 { yyLOCAL = &AlterVschema{ Action: DropColVindexDDLAction, @@ -11235,7 +11235,7 @@ yydefault: case 511: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:2812 +//line sql.y:2816 { yyLOCAL = &AlterVschema{Action: AddSequenceDDLAction, Table: yyDollar[6].tableName} } @@ -11243,7 +11243,7 @@ yydefault: case 512: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL Statement -//line sql.y:2816 +//line sql.y:2820 { yyLOCAL = &AlterVschema{ Action: AddAutoIncDDLAction, @@ -11258,7 +11258,7 @@ yydefault: case 513: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:2827 +//line sql.y:2831 { yyLOCAL = &AlterMigration{ Type: RetryMigrationType, @@ -11269,7 +11269,7 @@ yydefault: case 514: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:2834 +//line sql.y:2838 { yyLOCAL = &AlterMigration{ Type: CleanupMigrationType, @@ -11280,7 +11280,7 @@ yydefault: case 515: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:2841 +//line sql.y:2845 { yyLOCAL = &AlterMigration{ Type: CompleteMigrationType, @@ -11291,7 +11291,7 @@ yydefault: case 516: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:2848 +//line sql.y:2852 { yyLOCAL = &AlterMigration{ Type: CancelMigrationType, @@ -11302,7 +11302,7 @@ yydefault: case 517: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:2855 +//line sql.y:2859 { yyLOCAL = &AlterMigration{ Type: CancelAllMigrationType, @@ -11312,7 +11312,7 @@ yydefault: case 518: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:2862 +//line sql.y:2866 { yyLOCAL = nil } @@ -11320,7 +11320,7 @@ yydefault: case 519: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:2866 +//line sql.y:2870 { yyDollar[3].partitionOptionUnion().Partitions = yyDollar[4].integerUnion() yyDollar[3].partitionOptionUnion().SubPartition = yyDollar[5].subPartitionUnion() @@ -11331,7 +11331,7 @@ yydefault: case 520: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:2875 +//line sql.y:2879 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -11343,7 +11343,7 @@ yydefault: case 521: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:2883 +//line sql.y:2887 { yyLOCAL = &PartitionOption{ IsLinear: yyDollar[1].booleanUnion(), @@ -11356,7 +11356,7 @@ yydefault: case 522: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:2892 +//line sql.y:2896 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -11367,7 +11367,7 @@ yydefault: case 523: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionOption -//line sql.y:2899 +//line sql.y:2903 { yyLOCAL = &PartitionOption{ Type: yyDollar[1].partitionByTypeUnion(), @@ -11378,7 +11378,7 @@ yydefault: case 524: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:2907 +//line sql.y:2911 { yyLOCAL = nil } @@ -11386,7 +11386,7 @@ yydefault: case 525: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:2911 +//line sql.y:2915 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -11399,7 +11399,7 @@ yydefault: case 526: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SubPartition -//line sql.y:2920 +//line sql.y:2924 { yyLOCAL = &SubPartition{ IsLinear: yyDollar[3].booleanUnion(), @@ -11413,7 +11413,7 @@ yydefault: case 527: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:2931 +//line sql.y:2935 { yyLOCAL = nil } @@ -11421,7 +11421,7 @@ yydefault: case 528: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:2935 +//line sql.y:2939 { yyLOCAL = yyDollar[2].partDefsUnion() } @@ -11429,7 +11429,7 @@ yydefault: case 529: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:2940 +//line sql.y:2944 { yyLOCAL = false } @@ -11437,7 +11437,7 @@ yydefault: case 530: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:2944 +//line sql.y:2948 { yyLOCAL = true } @@ -11445,7 +11445,7 @@ yydefault: case 531: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:2949 +//line sql.y:2953 { yyLOCAL = 0 } @@ -11453,7 +11453,7 @@ yydefault: case 532: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int -//line sql.y:2953 +//line sql.y:2957 { yyLOCAL = convertStringToInt(yyDollar[3].str) } @@ -11461,7 +11461,7 @@ yydefault: case 533: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL TableExpr -//line sql.y:2959 +//line sql.y:2963 { yyLOCAL = &JSONTableExpr{Expr: yyDollar[3].exprUnion(), Filter: yyDollar[5].exprUnion(), Columns: yyDollar[6].jtColumnListUnion(), Alias: yyDollar[8].tableIdent} } @@ -11469,7 +11469,7 @@ yydefault: case 534: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:2965 +//line sql.y:2969 { yyLOCAL = yyDollar[3].jtColumnListUnion() } @@ -11477,14 +11477,14 @@ yydefault: case 535: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*JtColumnDefinition -//line sql.y:2971 +//line sql.y:2975 { yyLOCAL = []*JtColumnDefinition{yyDollar[1].jtColumnDefinitionUnion()} } yyVAL.union = yyLOCAL case 536: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2975 +//line sql.y:2979 { yySLICE := (*[]*JtColumnDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jtColumnDefinitionUnion()) @@ -11492,7 +11492,7 @@ yydefault: case 537: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:2981 +//line sql.y:2985 { yyLOCAL = &JtColumnDefinition{JtOrdinal: &JtOrdinalColDef{Name: yyDollar[1].colIdent}} } @@ -11500,7 +11500,7 @@ yydefault: case 538: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:2985 +//line sql.y:2989 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].colIdent, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion()} @@ -11510,7 +11510,7 @@ yydefault: case 539: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:2991 +//line sql.y:2995 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].colIdent, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion()} @@ -11520,7 +11520,7 @@ yydefault: case 540: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:2997 +//line sql.y:3001 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].colIdent, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), ErrorOnResponse: yyDollar[7].jtOnResponseUnion()} @@ -11530,7 +11530,7 @@ yydefault: case 541: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3003 +//line sql.y:3007 { yyDollar[2].columnType.Options = &ColumnTypeOptions{Collate: yyDollar[3].str} jtPath := &JtPathColDef{Name: yyDollar[1].colIdent, Type: yyDollar[2].columnType, JtColExists: yyDollar[4].booleanUnion(), Path: yyDollar[6].exprUnion(), EmptyOnResponse: yyDollar[7].jtOnResponseUnion(), ErrorOnResponse: yyDollar[8].jtOnResponseUnion()} @@ -11540,7 +11540,7 @@ yydefault: case 542: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *JtColumnDefinition -//line sql.y:3009 +//line sql.y:3013 { jtNestedPath := &JtNestedPathColDef{Path: yyDollar[3].exprUnion(), Columns: yyDollar[4].jtColumnListUnion()} yyLOCAL = &JtColumnDefinition{JtNestedPath: jtNestedPath} @@ -11549,7 +11549,7 @@ yydefault: case 543: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3015 +//line sql.y:3019 { yyLOCAL = false } @@ -11557,7 +11557,7 @@ yydefault: case 544: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3019 +//line sql.y:3023 { yyLOCAL = true } @@ -11565,7 +11565,7 @@ yydefault: case 545: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3023 +//line sql.y:3027 { yyLOCAL = false } @@ -11573,7 +11573,7 @@ yydefault: case 546: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3027 +//line sql.y:3031 { yyLOCAL = true } @@ -11581,7 +11581,7 @@ yydefault: case 547: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3033 +//line sql.y:3037 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } @@ -11589,7 +11589,7 @@ yydefault: case 548: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3039 +//line sql.y:3043 { yyLOCAL = yyDollar[1].jtOnResponseUnion() } @@ -11597,7 +11597,7 @@ yydefault: case 549: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3045 +//line sql.y:3049 { yyLOCAL = &JtOnResponse{ResponseType: ErrorJSONType} } @@ -11605,7 +11605,7 @@ yydefault: case 550: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3049 +//line sql.y:3053 { yyLOCAL = &JtOnResponse{ResponseType: NullJSONType} } @@ -11613,7 +11613,7 @@ yydefault: case 551: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *JtOnResponse -//line sql.y:3053 +//line sql.y:3057 { yyLOCAL = &JtOnResponse{ResponseType: DefaultJSONType, Expr: yyDollar[2].exprUnion()} } @@ -11621,7 +11621,7 @@ yydefault: case 552: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3059 +//line sql.y:3063 { yyLOCAL = RangeType } @@ -11629,7 +11629,7 @@ yydefault: case 553: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL PartitionByType -//line sql.y:3063 +//line sql.y:3067 { yyLOCAL = ListType } @@ -11637,7 +11637,7 @@ yydefault: case 554: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3068 +//line sql.y:3072 { yyLOCAL = -1 } @@ -11645,7 +11645,7 @@ yydefault: case 555: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3072 +//line sql.y:3076 { yyLOCAL = convertStringToInt(yyDollar[2].str) } @@ -11653,7 +11653,7 @@ yydefault: case 556: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int -//line sql.y:3077 +//line sql.y:3081 { yyLOCAL = -1 } @@ -11661,7 +11661,7 @@ yydefault: case 557: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int -//line sql.y:3081 +//line sql.y:3085 { yyLOCAL = convertStringToInt(yyDollar[2].str) } @@ -11669,7 +11669,7 @@ yydefault: case 558: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3087 +//line sql.y:3091 { yyLOCAL = &PartitionSpec{Action: AddAction, Definitions: []*PartitionDefinition{yyDollar[4].partDefUnion()}} } @@ -11677,7 +11677,7 @@ yydefault: case 559: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3091 +//line sql.y:3095 { yyLOCAL = &PartitionSpec{Action: DropAction, Names: yyDollar[3].partitionsUnion()} } @@ -11685,7 +11685,7 @@ yydefault: case 560: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3095 +//line sql.y:3099 { yyLOCAL = &PartitionSpec{Action: ReorganizeAction, Names: yyDollar[3].partitionsUnion(), Definitions: yyDollar[6].partDefsUnion()} } @@ -11693,7 +11693,7 @@ yydefault: case 561: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3099 +//line sql.y:3103 { yyLOCAL = &PartitionSpec{Action: DiscardAction, Names: yyDollar[3].partitionsUnion()} } @@ -11701,7 +11701,7 @@ yydefault: case 562: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3103 +//line sql.y:3107 { yyLOCAL = &PartitionSpec{Action: DiscardAction, IsAll: true} } @@ -11709,7 +11709,7 @@ yydefault: case 563: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3107 +//line sql.y:3111 { yyLOCAL = &PartitionSpec{Action: ImportAction, Names: yyDollar[3].partitionsUnion()} } @@ -11717,7 +11717,7 @@ yydefault: case 564: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3111 +//line sql.y:3115 { yyLOCAL = &PartitionSpec{Action: ImportAction, IsAll: true} } @@ -11725,7 +11725,7 @@ yydefault: case 565: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3115 +//line sql.y:3119 { yyLOCAL = &PartitionSpec{Action: TruncateAction, Names: yyDollar[3].partitionsUnion()} } @@ -11733,7 +11733,7 @@ yydefault: case 566: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3119 +//line sql.y:3123 { yyLOCAL = &PartitionSpec{Action: TruncateAction, IsAll: true} } @@ -11741,7 +11741,7 @@ yydefault: case 567: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3123 +//line sql.y:3127 { yyLOCAL = &PartitionSpec{Action: CoalesceAction, Number: NewIntLiteral(yyDollar[3].str)} } @@ -11749,7 +11749,7 @@ yydefault: case 568: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3127 +//line sql.y:3131 { yyLOCAL = &PartitionSpec{Action: ExchangeAction, Names: Partitions{yyDollar[3].colIdent}, TableName: yyDollar[6].tableName, WithoutValidation: yyDollar[7].booleanUnion()} } @@ -11757,7 +11757,7 @@ yydefault: case 569: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3131 +//line sql.y:3135 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, Names: yyDollar[3].partitionsUnion()} } @@ -11765,7 +11765,7 @@ yydefault: case 570: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3135 +//line sql.y:3139 { yyLOCAL = &PartitionSpec{Action: AnalyzeAction, IsAll: true} } @@ -11773,7 +11773,7 @@ yydefault: case 571: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3139 +//line sql.y:3143 { yyLOCAL = &PartitionSpec{Action: CheckAction, Names: yyDollar[3].partitionsUnion()} } @@ -11781,7 +11781,7 @@ yydefault: case 572: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3143 +//line sql.y:3147 { yyLOCAL = &PartitionSpec{Action: CheckAction, IsAll: true} } @@ -11789,7 +11789,7 @@ yydefault: case 573: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3147 +//line sql.y:3151 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, Names: yyDollar[3].partitionsUnion()} } @@ -11797,7 +11797,7 @@ yydefault: case 574: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3151 +//line sql.y:3155 { yyLOCAL = &PartitionSpec{Action: OptimizeAction, IsAll: true} } @@ -11805,7 +11805,7 @@ yydefault: case 575: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3155 +//line sql.y:3159 { yyLOCAL = &PartitionSpec{Action: RebuildAction, Names: yyDollar[3].partitionsUnion()} } @@ -11813,7 +11813,7 @@ yydefault: case 576: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3159 +//line sql.y:3163 { yyLOCAL = &PartitionSpec{Action: RebuildAction, IsAll: true} } @@ -11821,7 +11821,7 @@ yydefault: case 577: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3163 +//line sql.y:3167 { yyLOCAL = &PartitionSpec{Action: RepairAction, Names: yyDollar[3].partitionsUnion()} } @@ -11829,7 +11829,7 @@ yydefault: case 578: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3167 +//line sql.y:3171 { yyLOCAL = &PartitionSpec{Action: RepairAction, IsAll: true} } @@ -11837,7 +11837,7 @@ yydefault: case 579: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionSpec -//line sql.y:3171 +//line sql.y:3175 { yyLOCAL = &PartitionSpec{Action: UpgradeAction} } @@ -11845,7 +11845,7 @@ yydefault: case 580: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3176 +//line sql.y:3180 { yyLOCAL = false } @@ -11853,7 +11853,7 @@ yydefault: case 581: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3180 +//line sql.y:3184 { yyLOCAL = false } @@ -11861,7 +11861,7 @@ yydefault: case 582: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3184 +//line sql.y:3188 { yyLOCAL = true } @@ -11869,36 +11869,110 @@ yydefault: case 583: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*PartitionDefinition -//line sql.y:3191 +//line sql.y:3195 { yyLOCAL = []*PartitionDefinition{yyDollar[1].partDefUnion()} } yyVAL.union = yyLOCAL case 584: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3195 +//line sql.y:3199 { yySLICE := (*[]*PartitionDefinition)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].partDefUnion()) } case 585: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3201 +//line sql.y:3205 { - yyVAL.partDefUnion().ValueRange = yyDollar[2].partitionValueRangeUnion() + yyVAL.partDefUnion().Options = yyDollar[2].partitionDefinitionOptionsUnion() } case 586: yyDollar = yyS[yypt-0 : yypt+1] - var yyLOCAL *PartitionValueRange -//line sql.y:3206 + var yyLOCAL *PartitionDefinitionOptions +//line sql.y:3210 { - yyLOCAL = nil + yyLOCAL = &PartitionDefinitionOptions{} } yyVAL.union = yyLOCAL case 587: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *PartitionDefinitionOptions +//line sql.y:3214 + { + yyDollar[1].partitionDefinitionOptionsUnion().ValueRange = yyDollar[2].partitionValueRangeUnion() + yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() + } + yyVAL.union = yyLOCAL + case 588: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *PartitionDefinitionOptions +//line sql.y:3219 + { + yyDollar[1].partitionDefinitionOptionsUnion().Comment = yyDollar[2].literalUnion() + yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() + } + yyVAL.union = yyLOCAL + case 589: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *PartitionDefinitionOptions +//line sql.y:3224 + { + yyDollar[1].partitionDefinitionOptionsUnion().Engine = yyDollar[2].partitionEngineUnion() + yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() + } + yyVAL.union = yyLOCAL + case 590: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *PartitionDefinitionOptions +//line sql.y:3229 + { + yyDollar[1].partitionDefinitionOptionsUnion().DataDirectory = yyDollar[2].literalUnion() + yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() + } + yyVAL.union = yyLOCAL + case 591: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *PartitionDefinitionOptions +//line sql.y:3234 + { + yyDollar[1].partitionDefinitionOptionsUnion().IndexDirectory = yyDollar[2].literalUnion() + yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() + } + yyVAL.union = yyLOCAL + case 592: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *PartitionDefinitionOptions +//line sql.y:3239 + { + val := yyDollar[2].integerUnion() + yyDollar[1].partitionDefinitionOptionsUnion().MaxRows = &val + yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() + } + yyVAL.union = yyLOCAL + case 593: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *PartitionDefinitionOptions +//line sql.y:3245 + { + val := yyDollar[2].integerUnion() + yyDollar[1].partitionDefinitionOptionsUnion().MinRows = &val + yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() + } + yyVAL.union = yyLOCAL + case 594: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL *PartitionDefinitionOptions +//line sql.y:3251 + { + yyDollar[1].partitionDefinitionOptionsUnion().TableSpace = yyDollar[2].str + yyLOCAL = yyDollar[1].partitionDefinitionOptionsUnion() + } + yyVAL.union = yyLOCAL + case 595: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *PartitionValueRange -//line sql.y:3210 +//line sql.y:3258 { yyLOCAL = &PartitionValueRange{ Type: LessThanType, @@ -11906,83 +11980,153 @@ yydefault: } } yyVAL.union = yyLOCAL - case 588: - yyDollar = yyS[yypt-4 : yypt+1] - var yyLOCAL *PartitionValueRange -//line sql.y:3217 + case 596: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL *PartitionValueRange +//line sql.y:3265 + { + yyLOCAL = &PartitionValueRange{ + Type: LessThanType, + Maxvalue: true, + } + } + yyVAL.union = yyLOCAL + case 597: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL *PartitionValueRange +//line sql.y:3272 + { + yyLOCAL = &PartitionValueRange{ + Type: InType, + Range: yyDollar[3].valTupleUnion(), + } + } + yyVAL.union = yyLOCAL + case 598: + yyDollar = yyS[yypt-0 : yypt+1] + var yyLOCAL bool +//line sql.y:3280 + { + yyLOCAL = false + } + yyVAL.union = yyLOCAL + case 599: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL bool +//line sql.y:3284 + { + yyLOCAL = true + } + yyVAL.union = yyLOCAL + case 600: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL *PartitionEngine +//line sql.y:3290 + { + yyLOCAL = &PartitionEngine{Storage: yyDollar[1].booleanUnion(), Name: yyDollar[4].tableIdent.String()} + } + yyVAL.union = yyLOCAL + case 601: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL *Literal +//line sql.y:3296 + { + yyLOCAL = NewStrLiteral(yyDollar[3].str) + } + yyVAL.union = yyLOCAL + case 602: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL *Literal +//line sql.y:3302 + { + yyLOCAL = NewStrLiteral(yyDollar[4].str) + } + yyVAL.union = yyLOCAL + case 603: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL *Literal +//line sql.y:3308 + { + yyLOCAL = NewStrLiteral(yyDollar[4].str) + } + yyVAL.union = yyLOCAL + case 604: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL int +//line sql.y:3314 + { + yyLOCAL = convertStringToInt(yyDollar[3].str) + } + yyVAL.union = yyLOCAL + case 605: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL int +//line sql.y:3320 { - yyLOCAL = &PartitionValueRange{ - Type: LessThanType, - Maxvalue: true, - } + yyLOCAL = convertStringToInt(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 589: + case 606: yyDollar = yyS[yypt-3 : yypt+1] - var yyLOCAL *PartitionValueRange -//line sql.y:3224 +//line sql.y:3326 { - yyLOCAL = &PartitionValueRange{ - Type: InType, - Range: yyDollar[3].valTupleUnion(), - } + yyVAL.str = yyDollar[3].tableIdent.String() } - yyVAL.union = yyLOCAL - case 590: + case 607: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *PartitionDefinition -//line sql.y:3233 +//line sql.y:3332 { yyLOCAL = &PartitionDefinition{Name: yyDollar[2].colIdent} } yyVAL.union = yyLOCAL - case 591: + case 608: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3239 +//line sql.y:3338 { yyVAL.str = "" } - case 592: + case 609: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3243 +//line sql.y:3342 { yyVAL.str = "" } - case 593: + case 610: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3249 +//line sql.y:3348 { yyLOCAL = &RenameTable{TablePairs: yyDollar[3].renameTablePairsUnion()} } yyVAL.union = yyLOCAL - case 594: + case 611: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*RenameTablePair -//line sql.y:3255 +//line sql.y:3354 { yyLOCAL = []*RenameTablePair{{FromTable: yyDollar[1].tableName, ToTable: yyDollar[3].tableName}} } yyVAL.union = yyLOCAL - case 595: + case 612: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3259 +//line sql.y:3358 { yySLICE := (*[]*RenameTablePair)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, &RenameTablePair{FromTable: yyDollar[3].tableName, ToTable: yyDollar[5].tableName}) } - case 596: + case 613: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3265 +//line sql.y:3364 { yyLOCAL = &DropTable{FromTables: yyDollar[6].tableNamesUnion(), IfExists: yyDollar[5].booleanUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), Temp: yyDollar[3].booleanUnion()} } yyVAL.union = yyLOCAL - case 597: + case 614: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3269 +//line sql.y:3368 { // Change this to an alter statement if yyDollar[4].colIdent.Lowered() == "primary" { @@ -11992,1176 +12136,1176 @@ yydefault: } } yyVAL.union = yyLOCAL - case 598: + case 615: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3278 +//line sql.y:3377 { yyLOCAL = &DropView{FromTables: yyDollar[5].tableNamesUnion(), Comments: Comments(yyDollar[2].strs).Parsed(), IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 599: + case 616: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3282 +//line sql.y:3381 { yyLOCAL = &DropDatabase{Comments: Comments(yyDollar[2].strs).Parsed(), DBName: yyDollar[5].tableIdent, IfExists: yyDollar[4].booleanUnion()} } yyVAL.union = yyLOCAL - case 600: + case 617: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3288 +//line sql.y:3387 { yyLOCAL = &TruncateTable{Table: yyDollar[3].tableName} } yyVAL.union = yyLOCAL - case 601: + case 618: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3292 +//line sql.y:3391 { yyLOCAL = &TruncateTable{Table: yyDollar[2].tableName} } yyVAL.union = yyLOCAL - case 602: + case 619: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3297 +//line sql.y:3396 { yyLOCAL = &OtherRead{} } yyVAL.union = yyLOCAL - case 603: + case 620: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3303 +//line sql.y:3402 { yyLOCAL = &Show{&ShowBasic{Command: Charset, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 604: + case 621: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3307 +//line sql.y:3406 { yyLOCAL = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 605: + case 622: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3311 +//line sql.y:3410 { yyLOCAL = &Show{&ShowBasic{Full: yyDollar[2].booleanUnion(), Command: Column, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].tableIdent, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 606: + case 623: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3315 +//line sql.y:3414 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 607: + case 624: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3319 +//line sql.y:3418 { yyLOCAL = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 608: + case 625: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3323 +//line sql.y:3422 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 609: + case 626: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3327 +//line sql.y:3426 { yyLOCAL = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 610: + case 627: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3331 +//line sql.y:3430 { yyLOCAL = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 611: + case 628: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3335 +//line sql.y:3434 { yyLOCAL = &Show{&ShowBasic{Command: Index, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].tableIdent, Filter: yyDollar[7].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 612: + case 629: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3339 +//line sql.y:3438 { yyLOCAL = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].tableIdent, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 613: + case 630: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3343 +//line sql.y:3442 { yyLOCAL = &Show{&ShowBasic{Command: Privilege}} } yyVAL.union = yyLOCAL - case 614: + case 631: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3347 +//line sql.y:3446 { yyLOCAL = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 615: + case 632: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3351 +//line sql.y:3450 { yyLOCAL = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 616: + case 633: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3355 +//line sql.y:3454 { yyLOCAL = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 617: + case 634: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3359 +//line sql.y:3458 { yyLOCAL = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 618: + case 635: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3363 +//line sql.y:3462 { yyLOCAL = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 619: + case 636: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3367 +//line sql.y:3466 { yyLOCAL = &Show{&ShowBasic{Command: TableStatus, DbName: yyDollar[4].tableIdent, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 620: + case 637: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3371 +//line sql.y:3470 { yyLOCAL = &Show{&ShowBasic{Command: Table, Full: yyDollar[2].booleanUnion(), DbName: yyDollar[4].tableIdent, Filter: yyDollar[5].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 621: + case 638: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3375 +//line sql.y:3474 { yyLOCAL = &Show{&ShowBasic{Command: Trigger, DbName: yyDollar[3].tableIdent, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 622: + case 639: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3379 +//line sql.y:3478 { yyLOCAL = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 623: + case 640: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3383 +//line sql.y:3482 { yyLOCAL = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 624: + case 641: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3387 +//line sql.y:3486 { yyLOCAL = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 625: + case 642: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3391 +//line sql.y:3490 { yyLOCAL = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 626: + case 643: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3395 +//line sql.y:3494 { yyLOCAL = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 627: + case 644: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3399 +//line sql.y:3498 { yyLOCAL = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 628: + case 645: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3403 +//line sql.y:3502 { yyLOCAL = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} } yyVAL.union = yyLOCAL - case 629: + case 646: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3407 +//line sql.y:3506 { yyLOCAL = &Show{&ShowBasic{Command: Engines}} } yyVAL.union = yyLOCAL - case 630: + case 647: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3411 +//line sql.y:3510 { yyLOCAL = &Show{&ShowBasic{Command: Plugins}} } yyVAL.union = yyLOCAL - case 631: + case 648: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3415 +//line sql.y:3514 { yyLOCAL = &Show{&ShowBasic{Command: GtidExecGlobal, DbName: yyDollar[4].tableIdent}} } yyVAL.union = yyLOCAL - case 632: + case 649: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3419 +//line sql.y:3518 { yyLOCAL = &Show{&ShowBasic{Command: VGtidExecGlobal, DbName: yyDollar[4].tableIdent}} } yyVAL.union = yyLOCAL - case 633: + case 650: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3423 +//line sql.y:3522 { yyLOCAL = &Show{&ShowBasic{Command: VitessVariables, Filter: yyDollar[4].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 634: + case 651: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3427 +//line sql.y:3526 { yyLOCAL = &Show{&ShowBasic{Command: VitessMigrations, Filter: yyDollar[4].showFilterUnion(), DbName: yyDollar[3].tableIdent}} } yyVAL.union = yyLOCAL - case 635: + case 652: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3431 +//line sql.y:3530 { yyLOCAL = &ShowMigrationLogs{UUID: string(yyDollar[3].str)} } yyVAL.union = yyLOCAL - case 636: + case 653: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3435 +//line sql.y:3534 { yyLOCAL = &Show{&ShowBasic{Command: VitessReplicationStatus, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 637: + case 654: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3439 +//line sql.y:3538 { yyLOCAL = &Show{&ShowBasic{Command: VschemaTables}} } yyVAL.union = yyLOCAL - case 638: + case 655: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3443 +//line sql.y:3542 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes}} } yyVAL.union = yyLOCAL - case 639: + case 656: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3447 +//line sql.y:3546 { yyLOCAL = &Show{&ShowBasic{Command: VschemaVindexes, Tbl: yyDollar[5].tableName}} } yyVAL.union = yyLOCAL - case 640: + case 657: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3451 +//line sql.y:3550 { yyLOCAL = &Show{&ShowBasic{Command: Warnings}} } yyVAL.union = yyLOCAL - case 641: + case 658: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3455 +//line sql.y:3554 { yyLOCAL = &Show{&ShowBasic{Command: VitessShards, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 642: + case 659: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3459 +//line sql.y:3558 { yyLOCAL = &Show{&ShowBasic{Command: VitessTablets, Filter: yyDollar[3].showFilterUnion()}} } yyVAL.union = yyLOCAL - case 643: + case 660: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3463 +//line sql.y:3562 { yyLOCAL = &Show{&ShowBasic{Command: VitessTarget}} } yyVAL.union = yyLOCAL - case 644: + case 661: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3470 +//line sql.y:3569 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].colIdent.String())}} } yyVAL.union = yyLOCAL - case 645: + case 662: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3474 +//line sql.y:3573 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 646: + case 663: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3478 +//line sql.y:3577 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + yyDollar[3].colIdent.String()}} } yyVAL.union = yyLOCAL - case 647: + case 664: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3482 +//line sql.y:3581 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 648: + case 665: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3486 +//line sql.y:3585 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } yyVAL.union = yyLOCAL - case 649: + case 666: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3490 +//line sql.y:3589 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } yyVAL.union = yyLOCAL - case 650: + case 667: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3494 +//line sql.y:3593 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str) + " " + string(yyDollar[3].str) + " " + String(yyDollar[4].tableName)}} } yyVAL.union = yyLOCAL - case 651: + case 668: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3498 +//line sql.y:3597 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[3].str)}} } yyVAL.union = yyLOCAL - case 652: + case 669: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3502 +//line sql.y:3601 { yyLOCAL = &Show{&ShowOther{Command: string(yyDollar[2].str)}} } yyVAL.union = yyLOCAL - case 653: + case 670: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3508 +//line sql.y:3607 { yyVAL.str = "" } - case 654: + case 671: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3512 +//line sql.y:3611 { yyVAL.str = "extended " } - case 655: + case 672: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3518 +//line sql.y:3617 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 656: + case 673: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3522 +//line sql.y:3621 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 657: + case 674: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3528 +//line sql.y:3627 { yyVAL.str = string(yyDollar[1].str) } - case 658: + case 675: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3532 +//line sql.y:3631 { yyVAL.str = string(yyDollar[1].str) } - case 659: + case 676: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3538 +//line sql.y:3637 { yyVAL.tableIdent = NewTableIdent("") } - case 660: + case 677: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3542 +//line sql.y:3641 { yyVAL.tableIdent = yyDollar[2].tableIdent } - case 661: + case 678: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3546 +//line sql.y:3645 { yyVAL.tableIdent = yyDollar[2].tableIdent } - case 662: + case 679: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:3552 +//line sql.y:3651 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 663: + case 680: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:3556 +//line sql.y:3655 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 664: + case 681: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:3560 +//line sql.y:3659 { yyLOCAL = &ShowFilter{Filter: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 665: + case 682: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:3566 +//line sql.y:3665 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 666: + case 683: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ShowFilter -//line sql.y:3570 +//line sql.y:3669 { yyLOCAL = &ShowFilter{Like: string(yyDollar[2].str)} } yyVAL.union = yyLOCAL - case 667: + case 684: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3576 +//line sql.y:3675 { yyVAL.empty = struct{}{} } - case 668: + case 685: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3580 +//line sql.y:3679 { yyVAL.empty = struct{}{} } - case 669: + case 686: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3584 +//line sql.y:3683 { yyVAL.empty = struct{}{} } - case 670: + case 687: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3590 +//line sql.y:3689 { yyVAL.str = string(yyDollar[1].str) } - case 671: + case 688: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3594 +//line sql.y:3693 { yyVAL.str = string(yyDollar[1].str) } - case 672: + case 689: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3600 +//line sql.y:3699 { yyLOCAL = &Use{DBName: yyDollar[2].tableIdent} } yyVAL.union = yyLOCAL - case 673: + case 690: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:3604 +//line sql.y:3703 { yyLOCAL = &Use{DBName: TableIdent{v: ""}} } yyVAL.union = yyLOCAL - case 674: + case 691: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3608 +//line sql.y:3707 { yyLOCAL = &Use{DBName: NewTableIdent(yyDollar[2].tableIdent.String() + "@" + string(yyDollar[3].str))} } yyVAL.union = yyLOCAL - case 675: + case 692: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:3614 +//line sql.y:3713 { yyLOCAL = &Begin{} } yyVAL.union = yyLOCAL - case 676: + case 693: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3618 +//line sql.y:3717 { yyLOCAL = &Begin{} } yyVAL.union = yyLOCAL - case 677: + case 694: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:3624 +//line sql.y:3723 { yyLOCAL = &Commit{} } yyVAL.union = yyLOCAL - case 678: + case 695: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:3630 +//line sql.y:3729 { yyLOCAL = &Rollback{} } yyVAL.union = yyLOCAL - case 679: + case 696: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3634 +//line sql.y:3733 { yyLOCAL = &SRollback{Name: yyDollar[5].colIdent} } yyVAL.union = yyLOCAL - case 680: + case 697: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3639 +//line sql.y:3738 { yyVAL.empty = struct{}{} } - case 681: + case 698: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3641 +//line sql.y:3740 { yyVAL.empty = struct{}{} } - case 682: + case 699: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3644 +//line sql.y:3743 { yyVAL.empty = struct{}{} } - case 683: + case 700: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3646 +//line sql.y:3745 { yyVAL.empty = struct{}{} } - case 684: + case 701: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3651 +//line sql.y:3750 { yyLOCAL = &Savepoint{Name: yyDollar[2].colIdent} } yyVAL.union = yyLOCAL - case 685: + case 702: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3657 +//line sql.y:3756 { yyLOCAL = &Release{Name: yyDollar[3].colIdent} } yyVAL.union = yyLOCAL - case 686: + case 703: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL ExplainType -//line sql.y:3662 +//line sql.y:3761 { yyLOCAL = EmptyType } yyVAL.union = yyLOCAL - case 687: + case 704: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:3666 +//line sql.y:3765 { yyLOCAL = JSONType } yyVAL.union = yyLOCAL - case 688: + case 705: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:3670 +//line sql.y:3769 { yyLOCAL = TreeType } yyVAL.union = yyLOCAL - case 689: + case 706: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:3674 +//line sql.y:3773 { yyLOCAL = VitessType } yyVAL.union = yyLOCAL - case 690: + case 707: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ExplainType -//line sql.y:3678 +//line sql.y:3777 { yyLOCAL = TraditionalType } yyVAL.union = yyLOCAL - case 691: + case 708: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ExplainType -//line sql.y:3682 +//line sql.y:3781 { yyLOCAL = AnalyzeType } yyVAL.union = yyLOCAL - case 692: + case 709: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3688 +//line sql.y:3787 { yyVAL.str = yyDollar[1].str } - case 693: + case 710: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3692 +//line sql.y:3791 { yyVAL.str = yyDollar[1].str } - case 694: + case 711: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3696 +//line sql.y:3795 { yyVAL.str = yyDollar[1].str } - case 695: + case 712: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:3702 +//line sql.y:3801 { yyLOCAL = yyDollar[1].selStmtUnion() } yyVAL.union = yyLOCAL - case 696: + case 713: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:3706 +//line sql.y:3805 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 697: + case 714: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:3710 +//line sql.y:3809 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 698: + case 715: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Statement -//line sql.y:3714 +//line sql.y:3813 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 699: + case 716: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3719 +//line sql.y:3818 { yyVAL.str = "" } - case 700: + case 717: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3723 +//line sql.y:3822 { yyVAL.str = yyDollar[1].colIdent.val } - case 701: + case 718: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3727 +//line sql.y:3826 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 702: + case 719: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3733 +//line sql.y:3832 { yyLOCAL = &ExplainTab{Table: yyDollar[2].tableName, Wild: yyDollar[3].str} } yyVAL.union = yyLOCAL - case 703: + case 720: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3737 +//line sql.y:3836 { yyLOCAL = &ExplainStmt{Type: yyDollar[2].explainTypeUnion(), Statement: yyDollar[3].statementUnion()} } yyVAL.union = yyLOCAL - case 704: + case 721: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3743 +//line sql.y:3842 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 705: + case 722: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3747 +//line sql.y:3846 { yyLOCAL = &OtherAdmin{} } yyVAL.union = yyLOCAL - case 706: + case 723: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3753 +//line sql.y:3852 { yyLOCAL = &LockTables{Tables: yyDollar[3].tableAndLockTypesUnion()} } yyVAL.union = yyLOCAL - case 707: + case 724: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableAndLockTypes -//line sql.y:3759 +//line sql.y:3858 { yyLOCAL = TableAndLockTypes{yyDollar[1].tableAndLockTypeUnion()} } yyVAL.union = yyLOCAL - case 708: + case 725: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3763 +//line sql.y:3862 { yySLICE := (*TableAndLockTypes)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableAndLockTypeUnion()) } - case 709: + case 726: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *TableAndLockType -//line sql.y:3769 +//line sql.y:3868 { yyLOCAL = &TableAndLockType{Table: yyDollar[1].aliasedTableNameUnion(), Lock: yyDollar[2].lockTypeUnion()} } yyVAL.union = yyLOCAL - case 710: + case 727: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:3775 +//line sql.y:3874 { yyLOCAL = Read } yyVAL.union = yyLOCAL - case 711: + case 728: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:3779 +//line sql.y:3878 { yyLOCAL = ReadLocal } yyVAL.union = yyLOCAL - case 712: + case 729: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL LockType -//line sql.y:3783 +//line sql.y:3882 { yyLOCAL = Write } yyVAL.union = yyLOCAL - case 713: + case 730: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL LockType -//line sql.y:3787 +//line sql.y:3886 { yyLOCAL = LowPriorityWrite } yyVAL.union = yyLOCAL - case 714: + case 731: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Statement -//line sql.y:3793 +//line sql.y:3892 { yyLOCAL = &UnlockTables{} } yyVAL.union = yyLOCAL - case 715: + case 732: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3799 +//line sql.y:3898 { yyLOCAL = &RevertMigration{Comments: Comments(yyDollar[2].strs).Parsed(), UUID: string(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 716: + case 733: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3805 +//line sql.y:3904 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), FlushOptions: yyDollar[3].strs} } yyVAL.union = yyLOCAL - case 717: + case 734: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Statement -//line sql.y:3809 +//line sql.y:3908 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion()} } yyVAL.union = yyLOCAL - case 718: + case 735: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3813 +//line sql.y:3912 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 719: + case 736: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3817 +//line sql.y:3916 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion()} } yyVAL.union = yyLOCAL - case 720: + case 737: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Statement -//line sql.y:3821 +//line sql.y:3920 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), WithLock: true} } yyVAL.union = yyLOCAL - case 721: + case 738: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Statement -//line sql.y:3825 +//line sql.y:3924 { yyLOCAL = &Flush{IsLocal: yyDollar[2].booleanUnion(), TableNames: yyDollar[4].tableNamesUnion(), ForExport: true} } yyVAL.union = yyLOCAL - case 722: + case 739: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3831 +//line sql.y:3930 { yyVAL.strs = []string{yyDollar[1].str} } - case 723: + case 740: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3835 +//line sql.y:3934 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[3].str) } - case 724: + case 741: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3841 +//line sql.y:3940 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 725: + case 742: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3845 +//line sql.y:3944 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 726: + case 743: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3849 +//line sql.y:3948 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 727: + case 744: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3853 +//line sql.y:3952 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 728: + case 745: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3857 +//line sql.y:3956 { yyVAL.str = string(yyDollar[1].str) } - case 729: + case 746: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3861 +//line sql.y:3960 { yyVAL.str = string(yyDollar[1].str) } - case 730: + case 747: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3865 +//line sql.y:3964 { yyVAL.str = string(yyDollar[1].str) } - case 731: + case 748: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3869 +//line sql.y:3968 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) + yyDollar[3].str } - case 732: + case 749: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3873 +//line sql.y:3972 { yyVAL.str = string(yyDollar[1].str) + " " + string(yyDollar[2].str) } - case 733: + case 750: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3877 +//line sql.y:3976 { yyVAL.str = string(yyDollar[1].str) } - case 734: + case 751: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3881 +//line sql.y:3980 { yyVAL.str = string(yyDollar[1].str) } - case 735: + case 752: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3885 +//line sql.y:3984 { yyVAL.str = string(yyDollar[1].str) } - case 736: + case 753: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3890 +//line sql.y:3989 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 737: + case 754: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3894 +//line sql.y:3993 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 738: + case 755: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3898 +//line sql.y:3997 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 739: + case 756: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3903 +//line sql.y:4002 { yyVAL.str = "" } - case 740: + case 757: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3907 +//line sql.y:4006 { yyVAL.str = " " + string(yyDollar[1].str) + " " + string(yyDollar[2].str) + " " + yyDollar[3].colIdent.String() } - case 741: + case 758: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3912 +//line sql.y:4011 { setAllowComments(yylex, true) } - case 742: + case 759: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3916 +//line sql.y:4015 { yyVAL.strs = yyDollar[2].strs setAllowComments(yylex, false) } - case 743: + case 760: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3922 +//line sql.y:4021 { yyVAL.strs = nil } - case 744: + case 761: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3926 +//line sql.y:4025 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[2].str) } - case 745: + case 762: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3932 +//line sql.y:4031 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 746: + case 763: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3936 +//line sql.y:4035 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 747: + case 764: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:3940 +//line sql.y:4039 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 748: + case 765: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3945 +//line sql.y:4044 { yyVAL.str = "" } - case 749: + case 766: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3949 +//line sql.y:4048 { yyVAL.str = SQLNoCacheStr } - case 750: + case 767: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3953 +//line sql.y:4052 { yyVAL.str = SQLCacheStr } - case 751: + case 768: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:3958 +//line sql.y:4057 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 752: + case 769: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3962 +//line sql.y:4061 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 753: + case 770: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:3966 +//line sql.y:4065 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 754: + case 771: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3972 +//line sql.y:4071 { yyLOCAL = &PrepareStmt{Name: yyDollar[3].colIdent, Comments: Comments(yyDollar[2].strs).Parsed(), Statement: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 755: + case 772: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:3976 +//line sql.y:4075 { yyLOCAL = &PrepareStmt{ Name: yyDollar[3].colIdent, @@ -13172,579 +13316,579 @@ yydefault: } } yyVAL.union = yyLOCAL - case 756: + case 773: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:3988 +//line sql.y:4087 { yyLOCAL = &ExecuteStmt{Name: yyDollar[3].colIdent, Comments: Comments(yyDollar[2].strs).Parsed(), Arguments: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 757: + case 774: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:3993 +//line sql.y:4092 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 758: + case 775: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Columns -//line sql.y:3997 +//line sql.y:4096 { yyLOCAL = yyDollar[2].columnsUnion() } yyVAL.union = yyLOCAL - case 759: + case 776: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4003 +//line sql.y:4102 { yyLOCAL = &DeallocateStmt{Type: DeallocateType, Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].colIdent} } yyVAL.union = yyLOCAL - case 760: + case 777: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Statement -//line sql.y:4007 +//line sql.y:4106 { yyLOCAL = &DeallocateStmt{Type: DropType, Comments: Comments(yyDollar[2].strs).Parsed(), Name: yyDollar[4].colIdent} } yyVAL.union = yyLOCAL - case 761: + case 778: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4012 +//line sql.y:4111 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 762: + case 779: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4016 +//line sql.y:4115 { yyLOCAL = yyDollar[1].selectExprsUnion() } yyVAL.union = yyLOCAL - case 763: + case 780: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4021 +//line sql.y:4120 { yyVAL.strs = nil } - case 764: + case 781: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4025 +//line sql.y:4124 { yyVAL.strs = []string{yyDollar[1].str} } - case 765: + case 782: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4029 +//line sql.y:4128 { // 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 766: + case 783: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4033 +//line sql.y:4132 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } - case 767: + case 784: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4037 +//line sql.y:4136 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } - case 768: + case 785: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4043 +//line sql.y:4142 { yyVAL.str = SQLNoCacheStr } - case 769: + case 786: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4047 +//line sql.y:4146 { yyVAL.str = SQLCacheStr } - case 770: + case 787: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4051 +//line sql.y:4150 { yyVAL.str = DistinctStr } - case 771: + case 788: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4055 +//line sql.y:4154 { yyVAL.str = DistinctStr } - case 772: + case 789: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4059 +//line sql.y:4158 { yyVAL.str = StraightJoinHint } - case 773: + case 790: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4063 +//line sql.y:4162 { yyVAL.str = SQLCalcFoundRowsStr } - case 774: + case 791: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4067 +//line sql.y:4166 { 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 775: + case 792: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExprs -//line sql.y:4073 +//line sql.y:4172 { yyLOCAL = SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL - case 776: + case 793: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4077 +//line sql.y:4176 { yySLICE := (*SelectExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].selectExprUnion()) } - case 777: + case 794: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4083 +//line sql.y:4182 { yyLOCAL = &StarExpr{} } yyVAL.union = yyLOCAL - case 778: + case 795: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4087 +//line sql.y:4186 { yyLOCAL = &AliasedExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].colIdent} } yyVAL.union = yyLOCAL - case 779: + case 796: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4091 +//line sql.y:4190 { yyLOCAL = &StarExpr{TableName: TableName{Name: yyDollar[1].tableIdent}} } yyVAL.union = yyLOCAL - case 780: + case 797: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL SelectExpr -//line sql.y:4095 +//line sql.y:4194 { yyLOCAL = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}} } yyVAL.union = yyLOCAL - case 781: + case 798: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4100 +//line sql.y:4199 { yyVAL.colIdent = ColIdent{} } - case 782: + case 799: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4104 +//line sql.y:4203 { yyVAL.colIdent = yyDollar[1].colIdent } - case 783: + case 800: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4108 +//line sql.y:4207 { yyVAL.colIdent = yyDollar[2].colIdent } - case 785: + case 802: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4115 +//line sql.y:4214 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].str)) } - case 786: + case 803: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4120 +//line sql.y:4219 { yyLOCAL = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewTableIdent("dual")}}} } yyVAL.union = yyLOCAL - case 787: + case 804: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4124 +//line sql.y:4223 { yyLOCAL = yyDollar[1].tableExprsUnion() } yyVAL.union = yyLOCAL - case 788: + case 805: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4130 +//line sql.y:4229 { yyLOCAL = yyDollar[2].tableExprsUnion() } yyVAL.union = yyLOCAL - case 789: + case 806: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExprs -//line sql.y:4136 +//line sql.y:4235 { yyLOCAL = TableExprs{yyDollar[1].tableExprUnion()} } yyVAL.union = yyLOCAL - case 790: + case 807: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4140 +//line sql.y:4239 { yySLICE := (*TableExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].tableExprUnion()) } - case 793: + case 810: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4150 +//line sql.y:4249 { yyLOCAL = yyDollar[1].aliasedTableNameUnion() } yyVAL.union = yyLOCAL - case 794: + case 811: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4154 +//line sql.y:4253 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].derivedTableUnion(), As: yyDollar[3].tableIdent, Columns: yyDollar[4].columnsUnion()} } yyVAL.union = yyLOCAL - case 795: + case 812: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4158 +//line sql.y:4257 { yyLOCAL = &ParenTableExpr{Exprs: yyDollar[2].tableExprsUnion()} } yyVAL.union = yyLOCAL - case 796: + case 813: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4162 +//line sql.y:4261 { yyLOCAL = yyDollar[1].tableExprUnion() } yyVAL.union = yyLOCAL - case 797: + case 814: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4168 +//line sql.y:4267 { yyLOCAL = &DerivedTable{Lateral: false, Select: yyDollar[2].selStmtUnion()} } yyVAL.union = yyLOCAL - case 798: + case 815: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *DerivedTable -//line sql.y:4172 +//line sql.y:4271 { yyLOCAL = &DerivedTable{Lateral: true, Select: yyDollar[3].selStmtUnion()} } yyVAL.union = yyLOCAL - case 799: + case 816: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4178 +//line sql.y:4277 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent, Hints: yyDollar[3].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 800: + case 817: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *AliasedTableExpr -//line sql.y:4182 +//line sql.y:4281 { yyLOCAL = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitionsUnion(), As: yyDollar[6].tableIdent, Hints: yyDollar[7].indexHintsUnion()} } yyVAL.union = yyLOCAL - case 801: + case 818: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Columns -//line sql.y:4187 +//line sql.y:4286 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 802: + case 819: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:4191 +//line sql.y:4290 { yyLOCAL = yyDollar[2].columnsUnion() } yyVAL.union = yyLOCAL - case 803: + case 820: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4197 +//line sql.y:4296 { yyLOCAL = Columns{yyDollar[1].colIdent} } yyVAL.union = yyLOCAL - case 804: + case 821: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4201 +//line sql.y:4300 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colIdent) } - case 805: + case 822: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4207 +//line sql.y:4306 { yyLOCAL = Columns{NewColIdentWithAt(string(yyDollar[1].str), SingleAt)} } yyVAL.union = yyLOCAL - case 806: + case 823: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4211 +//line sql.y:4310 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, NewColIdentWithAt(string(yyDollar[3].str), SingleAt)) } - case 807: + case 824: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4217 +//line sql.y:4316 { yyLOCAL = Columns{yyDollar[1].colIdent} } yyVAL.union = yyLOCAL - case 808: + case 825: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:4221 +//line sql.y:4320 { yyLOCAL = Columns{NewColIdent(string(yyDollar[1].str))} } yyVAL.union = yyLOCAL - case 809: + case 826: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4225 +//line sql.y:4324 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colIdent) } - case 810: + case 827: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4229 +//line sql.y:4328 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, NewColIdent(string(yyDollar[3].str))) } - case 811: + case 828: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Partitions -//line sql.y:4235 +//line sql.y:4334 { yyLOCAL = Partitions{yyDollar[1].colIdent} } yyVAL.union = yyLOCAL - case 812: + case 829: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4239 +//line sql.y:4338 { yySLICE := (*Partitions)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colIdent) } - case 813: + case 830: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4252 +//line sql.y:4351 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 814: + case 831: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4256 +//line sql.y:4355 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 815: + case 832: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4260 +//line sql.y:4359 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion(), Condition: yyDollar[4].joinCondition} } yyVAL.union = yyLOCAL - case 816: + case 833: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL TableExpr -//line sql.y:4264 +//line sql.y:4363 { yyLOCAL = &JoinTableExpr{LeftExpr: yyDollar[1].tableExprUnion(), Join: yyDollar[2].joinTypeUnion(), RightExpr: yyDollar[3].tableExprUnion()} } yyVAL.union = yyLOCAL - case 817: + case 834: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4270 +//line sql.y:4369 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 818: + case 835: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4272 +//line sql.y:4371 { yyVAL.joinCondition = &JoinCondition{Using: yyDollar[3].columnsUnion()} } - case 819: + case 836: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4276 +//line sql.y:4375 { yyVAL.joinCondition = &JoinCondition{} } - case 820: + case 837: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4278 +//line sql.y:4377 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 821: + case 838: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4282 +//line sql.y:4381 { yyVAL.joinCondition = &JoinCondition{} } - case 822: + case 839: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4284 +//line sql.y:4383 { yyVAL.joinCondition = &JoinCondition{On: yyDollar[2].exprUnion()} } - case 823: + case 840: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4287 +//line sql.y:4386 { yyVAL.empty = struct{}{} } - case 824: + case 841: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4289 +//line sql.y:4388 { yyVAL.empty = struct{}{} } - case 825: + case 842: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4292 +//line sql.y:4391 { yyVAL.tableIdent = NewTableIdent("") } - case 826: + case 843: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4296 +//line sql.y:4395 { yyVAL.tableIdent = yyDollar[1].tableIdent } - case 827: + case 844: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4300 +//line sql.y:4399 { yyVAL.tableIdent = yyDollar[2].tableIdent } - case 829: + case 846: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4307 +//line sql.y:4406 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].str)) } - case 830: + case 847: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:4313 +//line sql.y:4412 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 831: + case 848: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4317 +//line sql.y:4416 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 832: + case 849: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4321 +//line sql.y:4420 { yyLOCAL = NormalJoinType } yyVAL.union = yyLOCAL - case 833: + case 850: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL JoinType -//line sql.y:4327 +//line sql.y:4426 { yyLOCAL = StraightJoinType } yyVAL.union = yyLOCAL - case 834: + case 851: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4333 +//line sql.y:4432 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 835: + case 852: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:4337 +//line sql.y:4436 { yyLOCAL = LeftJoinType } yyVAL.union = yyLOCAL - case 836: + case 853: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4341 +//line sql.y:4440 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 837: + case 854: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL JoinType -//line sql.y:4345 +//line sql.y:4444 { yyLOCAL = RightJoinType } yyVAL.union = yyLOCAL - case 838: + case 855: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4351 +//line sql.y:4450 { yyLOCAL = NaturalJoinType } yyVAL.union = yyLOCAL - case 839: + case 856: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL JoinType -//line sql.y:4355 +//line sql.y:4454 { if yyDollar[2].joinTypeUnion() == LeftJoinType { yyLOCAL = NaturalLeftJoinType @@ -13753,575 +13897,575 @@ yydefault: } } yyVAL.union = yyLOCAL - case 840: + case 857: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4365 +//line sql.y:4464 { yyVAL.tableName = yyDollar[2].tableName } - case 841: + case 858: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4369 +//line sql.y:4468 { yyVAL.tableName = yyDollar[1].tableName } - case 842: + case 859: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4375 +//line sql.y:4474 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } - case 843: + case 860: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4379 +//line sql.y:4478 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent} } - case 844: + case 861: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4385 +//line sql.y:4484 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } - case 845: + case 862: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHints -//line sql.y:4390 +//line sql.y:4489 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 846: + case 863: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:4394 +//line sql.y:4493 { yyLOCAL = yyDollar[1].indexHintsUnion() } yyVAL.union = yyLOCAL - case 847: + case 864: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IndexHints -//line sql.y:4400 +//line sql.y:4499 { yyLOCAL = IndexHints{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL - case 848: + case 865: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4404 +//line sql.y:4503 { yySLICE := (*IndexHints)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].indexHintUnion()) } - case 849: + case 866: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:4410 +//line sql.y:4509 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 850: + case 867: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:4414 +//line sql.y:4513 { yyLOCAL = &IndexHint{Type: UseOp, ForType: yyDollar[3].indexHintForTypeUnion()} } yyVAL.union = yyLOCAL - case 851: + case 868: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:4418 +//line sql.y:4517 { yyLOCAL = &IndexHint{Type: IgnoreOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 852: + case 869: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *IndexHint -//line sql.y:4422 +//line sql.y:4521 { yyLOCAL = &IndexHint{Type: ForceOp, ForType: yyDollar[3].indexHintForTypeUnion(), Indexes: yyDollar[5].columnsUnion()} } yyVAL.union = yyLOCAL - case 853: + case 870: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:4427 +//line sql.y:4526 { yyLOCAL = NoForType } yyVAL.union = yyLOCAL - case 854: + case 871: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:4431 +//line sql.y:4530 { yyLOCAL = JoinForType } yyVAL.union = yyLOCAL - case 855: + case 872: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:4435 +//line sql.y:4534 { yyLOCAL = OrderByForType } yyVAL.union = yyLOCAL - case 856: + case 873: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL IndexHintForType -//line sql.y:4439 +//line sql.y:4538 { yyLOCAL = GroupByForType } yyVAL.union = yyLOCAL - case 857: + case 874: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:4445 +//line sql.y:4544 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 858: + case 875: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4449 +//line sql.y:4548 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 859: + case 876: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4456 +//line sql.y:4555 { yyLOCAL = &OrExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 860: + case 877: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4460 +//line sql.y:4559 { yyLOCAL = &XorExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 861: + case 878: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4464 +//line sql.y:4563 { yyLOCAL = &AndExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 862: + case 879: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4468 +//line sql.y:4567 { yyLOCAL = &NotExpr{Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 863: + case 880: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4472 +//line sql.y:4571 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: yyDollar[3].isExprOperatorUnion()} } yyVAL.union = yyLOCAL - case 864: + case 881: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4476 +//line sql.y:4575 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 865: + case 882: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4480 +//line sql.y:4579 { yyLOCAL = &MemberOfExpr{Value: yyDollar[1].exprUnion(), JSONArr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 866: + case 883: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4487 +//line sql.y:4586 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNullOp} } yyVAL.union = yyLOCAL - case 867: + case 884: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4491 +//line sql.y:4590 { yyLOCAL = &IsExpr{Left: yyDollar[1].exprUnion(), Right: IsNotNullOp} } yyVAL.union = yyLOCAL - case 868: + case 885: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4495 +//line sql.y:4594 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: yyDollar[2].comparisonExprOperatorUnion(), Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 869: + case 886: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4499 +//line sql.y:4598 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 870: + case 887: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4505 +//line sql.y:4604 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: InOp, Right: yyDollar[3].colTupleUnion()} } yyVAL.union = yyLOCAL - case 871: + case 888: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4509 +//line sql.y:4608 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotInOp, Right: yyDollar[4].colTupleUnion()} } yyVAL.union = yyLOCAL - case 872: + case 889: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:4513 +//line sql.y:4612 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: true, From: yyDollar[3].exprUnion(), To: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 873: + case 890: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4517 +//line sql.y:4616 { yyLOCAL = &BetweenExpr{Left: yyDollar[1].exprUnion(), IsBetween: false, From: yyDollar[4].exprUnion(), To: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 874: + case 891: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4521 +//line sql.y:4620 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 875: + case 892: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4525 +//line sql.y:4624 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 876: + case 893: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:4529 +//line sql.y:4628 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: LikeOp, Right: yyDollar[3].exprUnion(), Escape: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 877: + case 894: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4533 +//line sql.y:4632 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotLikeOp, Right: yyDollar[4].exprUnion(), Escape: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 878: + case 895: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4537 +//line sql.y:4636 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: RegexpOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 879: + case 896: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4541 +//line sql.y:4640 { yyLOCAL = &ComparisonExpr{Left: yyDollar[1].exprUnion(), Operator: NotRegexpOp, Right: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 880: + case 897: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4545 +//line sql.y:4644 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 881: + case 898: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4551 +//line sql.y:4650 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitOrOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 882: + case 899: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4555 +//line sql.y:4654 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitAndOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 883: + case 900: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4559 +//line sql.y:4658 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftLeftOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 884: + case 901: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4563 +//line sql.y:4662 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ShiftRightOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 885: + case 902: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4567 +//line sql.y:4666 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: PlusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 886: + case 903: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4571 +//line sql.y:4670 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MinusOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 887: + case 904: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4575 +//line sql.y:4674 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: MultOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 888: + case 905: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4579 +//line sql.y:4678 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: DivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 889: + case 906: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4583 +//line sql.y:4682 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 890: + case 907: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4587 +//line sql.y:4686 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: IntDivOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 891: + case 908: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4591 +//line sql.y:4690 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: ModOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 892: + case 909: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4595 +//line sql.y:4694 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].exprUnion(), Operator: BitXorOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 893: + case 910: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4599 +//line sql.y:4698 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 894: + case 911: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4605 +//line sql.y:4704 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 895: + case 912: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4609 +//line sql.y:4708 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 896: + case 913: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4613 +//line sql.y:4712 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 897: + case 914: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4617 +//line sql.y:4716 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 898: + case 915: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4621 +//line sql.y:4720 { yyLOCAL = &CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } yyVAL.union = yyLOCAL - case 899: + case 916: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4625 +//line sql.y:4724 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 900: + case 917: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4629 +//line sql.y:4728 { yyLOCAL = yyDollar[1].colNameUnion() } yyVAL.union = yyLOCAL - case 901: + case 918: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4633 +//line sql.y:4732 { yyLOCAL = yyDollar[2].exprUnion() // TODO: do we really want to ignore unary '+' before any kind of literals? } yyVAL.union = yyLOCAL - case 902: + case 919: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4637 +//line sql.y:4736 { yyLOCAL = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 903: + case 920: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4641 +//line sql.y:4740 { yyLOCAL = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 904: + case 921: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4645 +//line sql.y:4744 { yyLOCAL = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 905: + case 922: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4649 +//line sql.y:4748 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 906: + case 923: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4653 +//line sql.y:4752 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 907: + case 924: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4657 +//line sql.y:4756 { yyLOCAL = &ExistsExpr{Subquery: yyDollar[2].subqueryUnion()} } yyVAL.union = yyLOCAL - case 908: + case 925: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL Expr -//line sql.y:4661 +//line sql.y:4760 { yyLOCAL = &MatchExpr{Columns: yyDollar[3].selectExprsUnion(), Expr: yyDollar[7].exprUnion(), Option: yyDollar[8].matchExprOptionUnion()} } yyVAL.union = yyLOCAL - case 909: + case 926: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4665 +//line sql.y:4764 { yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 910: + case 927: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4669 +//line sql.y:4768 { yyLOCAL = &ConvertExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 911: + case 928: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4673 +//line sql.y:4772 { yyLOCAL = &ConvertUsingExpr{Expr: yyDollar[3].exprUnion(), Type: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 912: + case 929: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4677 +//line sql.y:4776 { // 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: @@ -14330,18 +14474,18 @@ yydefault: yyLOCAL = &ConvertExpr{Expr: yyDollar[2].exprUnion(), Type: &ConvertType{Type: yyDollar[1].str}} } yyVAL.union = yyLOCAL - case 913: + case 930: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4685 +//line sql.y:4784 { yyLOCAL = &Default{ColName: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 914: + case 931: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4689 +//line sql.y:4788 { // This rule prevents the usage of INTERVAL // as a function. If support is needed for that, @@ -14350,1262 +14494,1262 @@ yydefault: yyLOCAL = &IntervalExpr{Expr: yyDollar[2].exprUnion(), Unit: yyDollar[3].colIdent.String()} } yyVAL.union = yyLOCAL - case 915: + case 932: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4697 +//line sql.y:4796 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].colNameUnion(), Operator: JSONExtractOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 916: + case 933: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:4701 +//line sql.y:4800 { yyLOCAL = &BinaryExpr{Left: yyDollar[1].colNameUnion(), Operator: JSONUnquoteExtractOp, Right: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 917: + case 934: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:4707 +//line sql.y:4806 { yyLOCAL = BothTrimType } yyVAL.union = yyLOCAL - case 918: + case 935: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:4711 +//line sql.y:4810 { yyLOCAL = LeadingTrimType } yyVAL.union = yyLOCAL - case 919: + case 936: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL TrimType -//line sql.y:4715 +//line sql.y:4814 { yyLOCAL = TrailingTrimType } yyVAL.union = yyLOCAL - case 920: + case 937: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4721 +//line sql.y:4820 { yyVAL.str = "" } - case 921: + case 938: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4725 +//line sql.y:4824 { yyVAL.str = string(yyDollar[2].colIdent.String()) } - case 922: + case 939: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:4731 +//line sql.y:4830 { yyLOCAL = BoolVal(true) } yyVAL.union = yyLOCAL - case 923: + case 940: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL BoolVal -//line sql.y:4735 +//line sql.y:4834 { yyLOCAL = BoolVal(false) } yyVAL.union = yyLOCAL - case 924: + case 941: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:4742 +//line sql.y:4841 { yyLOCAL = IsTrueOp } yyVAL.union = yyLOCAL - case 925: + case 942: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:4746 +//line sql.y:4845 { yyLOCAL = IsNotTrueOp } yyVAL.union = yyLOCAL - case 926: + case 943: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:4750 +//line sql.y:4849 { yyLOCAL = IsFalseOp } yyVAL.union = yyLOCAL - case 927: + case 944: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL IsExprOperator -//line sql.y:4754 +//line sql.y:4853 { yyLOCAL = IsNotFalseOp } yyVAL.union = yyLOCAL - case 928: + case 945: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:4760 +//line sql.y:4859 { yyLOCAL = EqualOp } yyVAL.union = yyLOCAL - case 929: + case 946: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:4764 +//line sql.y:4863 { yyLOCAL = LessThanOp } yyVAL.union = yyLOCAL - case 930: + case 947: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:4768 +//line sql.y:4867 { yyLOCAL = GreaterThanOp } yyVAL.union = yyLOCAL - case 931: + case 948: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:4772 +//line sql.y:4871 { yyLOCAL = LessEqualOp } yyVAL.union = yyLOCAL - case 932: + case 949: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:4776 +//line sql.y:4875 { yyLOCAL = GreaterEqualOp } yyVAL.union = yyLOCAL - case 933: + case 950: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:4780 +//line sql.y:4879 { yyLOCAL = NotEqualOp } yyVAL.union = yyLOCAL - case 934: + case 951: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ComparisonExprOperator -//line sql.y:4784 +//line sql.y:4883 { yyLOCAL = NullSafeEqualOp } yyVAL.union = yyLOCAL - case 935: + case 952: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:4790 +//line sql.y:4889 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 936: + case 953: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:4794 +//line sql.y:4893 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 937: + case 954: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ColTuple -//line sql.y:4798 +//line sql.y:4897 { yyLOCAL = ListArg(yyDollar[1].str[2:]) bindVariable(yylex, yyDollar[1].str[2:]) } yyVAL.union = yyLOCAL - case 938: + case 955: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Subquery -//line sql.y:4805 +//line sql.y:4904 { yyLOCAL = &Subquery{yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 939: + case 956: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:4811 +//line sql.y:4910 { yyLOCAL = Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 940: + case 957: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4815 +//line sql.y:4914 { yySLICE := (*Exprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].exprUnion()) } - case 941: + case 958: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4825 +//line sql.y:4924 { yyLOCAL = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 942: + case 959: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:4829 +//line sql.y:4928 { yyLOCAL = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 943: + case 960: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:4833 +//line sql.y:4932 { yyLOCAL = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 944: + case 961: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4837 +//line sql.y:4936 { yyLOCAL = &FuncExpr{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].colIdent, Exprs: yyDollar[5].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 945: + case 962: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4847 +//line sql.y:4946 { yyLOCAL = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 946: + case 963: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4851 +//line sql.y:4950 { yyLOCAL = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 947: + case 964: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:4855 +//line sql.y:4954 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 948: + case 965: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4859 +//line sql.y:4958 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 949: + case 966: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:4863 +//line sql.y:4962 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion(), To: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 950: + case 967: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4867 +//line sql.y:4966 { yyLOCAL = &SubstrExpr{Name: yyDollar[3].exprUnion(), From: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 951: + case 968: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:4871 +//line sql.y:4970 { yyLOCAL = &GroupConcatExpr{Distinct: yyDollar[3].booleanUnion(), Exprs: yyDollar[4].selectExprsUnion(), OrderBy: yyDollar[5].orderByUnion(), Separator: yyDollar[6].str, Limit: yyDollar[7].limitUnion()} } yyVAL.union = yyLOCAL - case 952: + case 969: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:4875 +//line sql.y:4974 { yyLOCAL = &CaseExpr{Expr: yyDollar[2].exprUnion(), Whens: yyDollar[3].whensUnion(), Else: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 953: + case 970: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4879 +//line sql.y:4978 { yyLOCAL = &ValuesFuncExpr{Name: yyDollar[3].colNameUnion()} } yyVAL.union = yyLOCAL - case 954: + case 971: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4883 +//line sql.y:4982 { yyLOCAL = &FuncExpr{Name: NewColIdent(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 955: + case 972: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4894 +//line sql.y:4993 { yyLOCAL = &FuncExpr{Name: NewColIdent("utc_date")} } yyVAL.union = yyLOCAL - case 956: + case 973: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:4898 +//line sql.y:4997 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 957: + case 974: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4904 +//line sql.y:5003 { yyLOCAL = &FuncExpr{Name: NewColIdent("current_date")} } yyVAL.union = yyLOCAL - case 958: + case 975: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4908 +//line sql.y:5007 { yyLOCAL = &CurTimeFuncExpr{Name: NewColIdent("utc_time"), Fsp: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 959: + case 976: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:4913 +//line sql.y:5012 { yyLOCAL = &CurTimeFuncExpr{Name: NewColIdent("current_time"), Fsp: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 960: + case 977: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:4917 +//line sql.y:5016 { yyLOCAL = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 961: + case 978: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:4921 +//line sql.y:5020 { yyLOCAL = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].exprUnion(), Expr2: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 962: + case 979: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4925 +//line sql.y:5024 { yyLOCAL = &ExtractFuncExpr{IntervalTypes: yyDollar[3].intervalTypeUnion(), Expr: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 963: + case 980: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:4929 +//line sql.y:5028 { yyLOCAL = &WeightStringFuncExpr{Expr: yyDollar[3].exprUnion(), As: yyDollar[4].convertTypeUnion()} } yyVAL.union = yyLOCAL - case 964: + case 981: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4933 +//line sql.y:5032 { yyLOCAL = &JSONPrettyExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 965: + case 982: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4937 +//line sql.y:5036 { yyLOCAL = &JSONStorageFreeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 966: + case 983: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4941 +//line sql.y:5040 { yyLOCAL = &JSONStorageSizeExpr{JSONVal: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 967: + case 984: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4945 +//line sql.y:5044 { yyLOCAL = &TrimFuncExpr{TrimFuncType: LTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 968: + case 985: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4949 +//line sql.y:5048 { yyLOCAL = &TrimFuncExpr{TrimFuncType: RTrimType, StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 969: + case 986: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:4953 +//line sql.y:5052 { yyLOCAL = &TrimFuncExpr{Type: yyDollar[3].trimTypeUnion(), TrimArg: yyDollar[4].exprUnion(), StringArg: yyDollar[6].exprUnion()} } yyVAL.union = yyLOCAL - case 970: + case 987: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4957 +//line sql.y:5056 { yyLOCAL = &TrimFuncExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 971: + case 988: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4961 +//line sql.y:5060 { yyLOCAL = &TrimFuncExpr{TrimArg: yyDollar[3].exprUnion(), StringArg: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 972: + case 989: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4965 +//line sql.y:5064 { yyLOCAL = &JSONSchemaValidFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 973: + case 990: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4969 +//line sql.y:5068 { yyLOCAL = &JSONSchemaValidationReportFuncExpr{Schema: yyDollar[3].exprUnion(), Document: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 974: + case 991: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4973 +//line sql.y:5072 { yyLOCAL = &JSONArrayExpr{Params: yyDollar[3].exprsUnion()} } yyVAL.union = yyLOCAL - case 975: + case 992: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4977 +//line sql.y:5076 { yyLOCAL = &JSONObjectExpr{Params: yyDollar[3].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 976: + case 993: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:4981 +//line sql.y:5080 { yyLOCAL = &JSONQuoteExpr{StringArg: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 977: + case 994: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL Expr -//line sql.y:4985 +//line sql.y:5084 { yyLOCAL = &JSONContainsExpr{Target: yyDollar[3].exprUnion(), Candidate: yyDollar[5].exprUnion(), PathList: yyDollar[6].jsonPathParamsUnion()} } yyVAL.union = yyLOCAL - case 978: + case 995: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:4989 +//line sql.y:5088 { yyLOCAL = &JSONContainsPathExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), PathList: yyDollar[7].jsonPathParamsUnion()} } yyVAL.union = yyLOCAL - case 979: + case 996: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:4993 +//line sql.y:5092 { yyLOCAL = &JSONExtractExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].jsonPathParamsUnion()} } yyVAL.union = yyLOCAL - case 980: + case 997: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Expr -//line sql.y:4997 +//line sql.y:5096 { yyLOCAL = &JSONKeysExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[4].jsonPathParamsUnion()} } yyVAL.union = yyLOCAL - case 981: + case 998: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5001 +//line sql.y:5100 { yyLOCAL = &JSONOverlapsExpr{JSONDoc1: yyDollar[3].exprUnion(), JSONDoc2: yyDollar[5].exprUnion()} } yyVAL.union = yyLOCAL - case 982: + case 999: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL Expr -//line sql.y:5005 +//line sql.y:5104 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion()} } yyVAL.union = yyLOCAL - case 983: + case 1000: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL Expr -//line sql.y:5009 +//line sql.y:5108 { yyLOCAL = &JSONSearchExpr{JSONDoc: yyDollar[3].exprUnion(), OneOrAll: yyDollar[5].exprUnion(), SearchStr: yyDollar[7].exprUnion(), EscapeChar: yyDollar[9].exprUnion(), PathList: yyDollar[10].jsonPathParamsUnion()} } yyVAL.union = yyLOCAL - case 984: + case 1001: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5013 +//line sql.y:5112 { yyLOCAL = &JSONValueExpr{JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].jsonPathParam} } yyVAL.union = yyLOCAL - case 985: + case 1002: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5017 +//line sql.y:5116 { yyLOCAL = &JSONAttributesExpr{Type: DepthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 986: + case 1003: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5021 +//line sql.y:5120 { yyLOCAL = &JSONAttributesExpr{Type: ValidAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 987: + case 1004: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5025 +//line sql.y:5124 { yyLOCAL = &JSONAttributesExpr{Type: TypeAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 988: + case 1005: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5029 +//line sql.y:5128 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 989: + case 1006: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5033 +//line sql.y:5132 { yyLOCAL = &JSONAttributesExpr{Type: LengthAttributeType, JSONDoc: yyDollar[3].exprUnion(), Path: yyDollar[5].jsonPathParam} } yyVAL.union = yyLOCAL - case 990: + case 1007: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5037 +//line sql.y:5136 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayAppendType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 991: + case 1008: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5041 +//line sql.y:5140 { yyLOCAL = &JSONValueModifierExpr{Type: JSONArrayInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 992: + case 1009: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5045 +//line sql.y:5144 { yyLOCAL = &JSONValueModifierExpr{Type: JSONInsertType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 993: + case 1010: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5049 +//line sql.y:5148 { yyLOCAL = &JSONValueModifierExpr{Type: JSONReplaceType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 994: + case 1011: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5053 +//line sql.y:5152 { yyLOCAL = &JSONValueModifierExpr{Type: JSONSetType, JSONDoc: yyDollar[3].exprUnion(), Params: yyDollar[5].jsonObjectParamsUnion()} } yyVAL.union = yyLOCAL - case 995: + case 1012: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5057 +//line sql.y:5156 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergeType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 996: + case 1013: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5061 +//line sql.y:5160 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePatchType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 997: + case 1014: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5065 +//line sql.y:5164 { yyLOCAL = &JSONValueMergeExpr{Type: JSONMergePreserveType, JSONDoc: yyDollar[3].exprUnion(), JSONDocList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 998: + case 1015: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL Expr -//line sql.y:5069 +//line sql.y:5168 { yyLOCAL = &JSONRemoveExpr{JSONDoc: yyDollar[3].exprUnion(), PathList: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 999: + case 1016: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5073 +//line sql.y:5172 { yyLOCAL = &JSONUnquoteExpr{JSONValue: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1000: + case 1017: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []JSONPathParam -//line sql.y:5078 +//line sql.y:5177 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1001: + case 1018: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []JSONPathParam -//line sql.y:5082 +//line sql.y:5181 { yyLOCAL = yyDollar[2].jsonPathParamsUnion() } yyVAL.union = yyLOCAL - case 1002: + case 1019: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []JSONPathParam -//line sql.y:5088 +//line sql.y:5187 { yyLOCAL = []JSONPathParam{yyDollar[1].jsonPathParam} } yyVAL.union = yyLOCAL - case 1003: + case 1020: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5092 +//line sql.y:5191 { yySLICE := (*[]JSONPathParam)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].jsonPathParam) } - case 1004: + case 1021: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5098 +//line sql.y:5197 { yyVAL.jsonPathParam = JSONPathParam(yyDollar[1].exprUnion()) } - case 1005: + case 1022: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5102 +//line sql.y:5201 { yyVAL.jsonPathParam = JSONPathParam(yyDollar[1].colNameUnion()) } - case 1006: + case 1023: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5108 +//line sql.y:5207 { } - case 1007: + case 1024: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5110 +//line sql.y:5209 { yyLOCAL = IntervalDayHour } yyVAL.union = yyLOCAL - case 1008: + case 1025: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5114 +//line sql.y:5213 { yyLOCAL = IntervalDayMicrosecond } yyVAL.union = yyLOCAL - case 1009: + case 1026: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5118 +//line sql.y:5217 { yyLOCAL = IntervalDayMinute } yyVAL.union = yyLOCAL - case 1010: + case 1027: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5122 +//line sql.y:5221 { yyLOCAL = IntervalDaySecond } yyVAL.union = yyLOCAL - case 1011: + case 1028: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5126 +//line sql.y:5225 { yyLOCAL = IntervalHourMicrosecond } yyVAL.union = yyLOCAL - case 1012: + case 1029: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5130 +//line sql.y:5229 { yyLOCAL = IntervalHourMinute } yyVAL.union = yyLOCAL - case 1013: + case 1030: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5134 +//line sql.y:5233 { yyLOCAL = IntervalHourSecond } yyVAL.union = yyLOCAL - case 1014: + case 1031: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5138 +//line sql.y:5237 { yyLOCAL = IntervalMinuteMicrosecond } yyVAL.union = yyLOCAL - case 1015: + case 1032: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5142 +//line sql.y:5241 { yyLOCAL = IntervalMinuteSecond } yyVAL.union = yyLOCAL - case 1016: + case 1033: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5146 +//line sql.y:5245 { yyLOCAL = IntervalSecondMicrosecond } yyVAL.union = yyLOCAL - case 1017: + case 1034: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5150 +//line sql.y:5249 { yyLOCAL = IntervalYearMonth } yyVAL.union = yyLOCAL - case 1018: + case 1035: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5156 +//line sql.y:5255 { yyLOCAL = IntervalDay } yyVAL.union = yyLOCAL - case 1019: + case 1036: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5160 +//line sql.y:5259 { yyLOCAL = IntervalWeek } yyVAL.union = yyLOCAL - case 1020: + case 1037: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5164 +//line sql.y:5263 { yyLOCAL = IntervalHour } yyVAL.union = yyLOCAL - case 1021: + case 1038: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5168 +//line sql.y:5267 { yyLOCAL = IntervalMinute } yyVAL.union = yyLOCAL - case 1022: + case 1039: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5172 +//line sql.y:5271 { yyLOCAL = IntervalMonth } yyVAL.union = yyLOCAL - case 1023: + case 1040: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5176 +//line sql.y:5275 { yyLOCAL = IntervalQuarter } yyVAL.union = yyLOCAL - case 1024: + case 1041: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5180 +//line sql.y:5279 { yyLOCAL = IntervalSecond } yyVAL.union = yyLOCAL - case 1025: + case 1042: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5184 +//line sql.y:5283 { yyLOCAL = IntervalMicrosecond } yyVAL.union = yyLOCAL - case 1026: + case 1043: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL IntervalTypes -//line sql.y:5188 +//line sql.y:5287 { yyLOCAL = IntervalYear } yyVAL.union = yyLOCAL - case 1029: + case 1046: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5198 +//line sql.y:5297 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1030: + case 1047: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5202 +//line sql.y:5301 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1031: + case 1048: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5206 +//line sql.y:5305 { yyLOCAL = NewIntLiteral(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1032: + case 1049: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Expr -//line sql.y:5210 +//line sql.y:5309 { yyLOCAL = NewArgument(yyDollar[2].str[1:]) bindVariable(yylex, yyDollar[2].str[1:]) } yyVAL.union = yyLOCAL - case 1033: + case 1050: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5221 +//line sql.y:5320 { yyLOCAL = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1034: + case 1051: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5225 +//line sql.y:5324 { yyLOCAL = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1035: + case 1052: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5229 +//line sql.y:5328 { yyLOCAL = &FuncExpr{Name: NewColIdent("schema"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1036: + case 1053: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5233 +//line sql.y:5332 { yyLOCAL = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1037: + case 1054: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Expr -//line sql.y:5237 +//line sql.y:5336 { yyLOCAL = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprsUnion()} } yyVAL.union = yyLOCAL - case 1038: + case 1055: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:5243 +//line sql.y:5342 { yyLOCAL = NoOption } yyVAL.union = yyLOCAL - case 1039: + case 1056: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:5247 +//line sql.y:5346 { yyLOCAL = BooleanModeOpt } yyVAL.union = yyLOCAL - case 1040: + case 1057: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:5251 +//line sql.y:5350 { yyLOCAL = NaturalLanguageModeOpt } yyVAL.union = yyLOCAL - case 1041: + case 1058: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:5255 +//line sql.y:5354 { yyLOCAL = NaturalLanguageModeWithQueryExpansionOpt } yyVAL.union = yyLOCAL - case 1042: + case 1059: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL MatchExprOption -//line sql.y:5259 +//line sql.y:5358 { yyLOCAL = QueryExpansionOpt } yyVAL.union = yyLOCAL - case 1043: + case 1060: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5265 +//line sql.y:5364 { yyVAL.str = string(yyDollar[1].colIdent.String()) } - case 1044: + case 1061: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5269 +//line sql.y:5368 { yyVAL.str = string(yyDollar[1].str) } - case 1045: + case 1062: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5273 +//line sql.y:5372 { yyVAL.str = string(yyDollar[1].str) } - case 1046: + case 1063: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5279 +//line sql.y:5378 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1047: + case 1064: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5283 +//line sql.y:5382 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: NewIntLiteral(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 1048: + case 1065: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5287 +//line sql.y:5386 { yyLOCAL = &ConvertType{Type: string(yyDollar[2].str), Length: NewIntLiteral(yyDollar[4].str)} } yyVAL.union = yyLOCAL - case 1049: + case 1066: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5293 +//line sql.y:5392 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL - case 1050: + case 1067: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5297 +//line sql.y:5396 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion(), Charset: yyDollar[3].str} } yyVAL.union = yyLOCAL - case 1051: + case 1068: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5301 +//line sql.y:5400 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1052: + case 1069: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5305 +//line sql.y:5404 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL - case 1053: + case 1070: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5309 +//line sql.y:5408 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} yyLOCAL.Length = yyDollar[2].LengthScaleOption.Length yyLOCAL.Scale = yyDollar[2].LengthScaleOption.Scale } yyVAL.union = yyLOCAL - case 1054: + case 1071: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5315 +//line sql.y:5414 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1055: + case 1072: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5319 +//line sql.y:5418 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL - case 1056: + case 1073: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5323 +//line sql.y:5422 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1057: + case 1074: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5327 +//line sql.y:5426 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1058: + case 1075: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5331 +//line sql.y:5430 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL - case 1059: + case 1076: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5335 +//line sql.y:5434 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1060: + case 1077: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5339 +//line sql.y:5438 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1061: + case 1078: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5343 +//line sql.y:5442 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str), Length: yyDollar[2].literalUnion()} } yyVAL.union = yyLOCAL - case 1062: + case 1079: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5347 +//line sql.y:5446 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1063: + case 1080: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ConvertType -//line sql.y:5351 +//line sql.y:5450 { yyLOCAL = &ConvertType{Type: string(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 1064: + case 1081: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5357 +//line sql.y:5456 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1065: + case 1082: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5361 +//line sql.y:5460 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1066: + case 1083: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5366 +//line sql.y:5465 { yyVAL.str = string("") } - case 1067: + case 1084: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5370 +//line sql.y:5469 { yyVAL.str = " separator " + encodeSQLString(yyDollar[2].str) } - case 1068: + case 1085: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*When -//line sql.y:5376 +//line sql.y:5475 { yyLOCAL = []*When{yyDollar[1].whenUnion()} } yyVAL.union = yyLOCAL - case 1069: + case 1086: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5380 +//line sql.y:5479 { yySLICE := (*[]*When)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[2].whenUnion()) } - case 1070: + case 1087: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *When -//line sql.y:5386 +//line sql.y:5485 { yyLOCAL = &When{Cond: yyDollar[2].exprUnion(), Val: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1071: + case 1088: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5391 +//line sql.y:5490 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1072: + case 1089: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5395 +//line sql.y:5494 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1073: + case 1090: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *ColName -//line sql.y:5401 +//line sql.y:5500 { yyLOCAL = &ColName{Name: yyDollar[1].colIdent} } yyVAL.union = yyLOCAL - case 1074: + case 1091: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *ColName -//line sql.y:5405 +//line sql.y:5504 { yyLOCAL = &ColName{Qualifier: TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } yyVAL.union = yyLOCAL - case 1075: + case 1092: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *ColName -//line sql.y:5409 +//line sql.y:5508 { yyLOCAL = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent} } yyVAL.union = yyLOCAL - case 1076: + case 1093: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5415 +//line sql.y:5514 { // TODO(sougou): Deprecate this construct. if yyDollar[1].colIdent.Lowered() != "value" { @@ -15615,380 +15759,380 @@ yydefault: yyLOCAL = NewIntLiteral("1") } yyVAL.union = yyLOCAL - case 1077: + case 1094: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5424 +//line sql.y:5523 { yyLOCAL = NewIntLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1078: + case 1095: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5428 +//line sql.y:5527 { yyLOCAL = NewArgument(yyDollar[1].str[1:]) bindVariable(yylex, yyDollar[1].str[1:]) } yyVAL.union = yyLOCAL - case 1079: + case 1096: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:5434 +//line sql.y:5533 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1080: + case 1097: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Exprs -//line sql.y:5438 +//line sql.y:5537 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1081: + case 1098: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Expr -//line sql.y:5443 +//line sql.y:5542 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1082: + case 1099: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Expr -//line sql.y:5447 +//line sql.y:5546 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1083: + case 1100: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderBy -//line sql.y:5452 +//line sql.y:5551 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1084: + case 1101: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:5456 +//line sql.y:5555 { yyLOCAL = yyDollar[1].orderByUnion() } yyVAL.union = yyLOCAL - case 1085: + case 1102: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL OrderBy -//line sql.y:5462 +//line sql.y:5561 { yyLOCAL = yyDollar[3].orderByUnion() } yyVAL.union = yyLOCAL - case 1086: + case 1103: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderBy -//line sql.y:5468 +//line sql.y:5567 { yyLOCAL = OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL - case 1087: + case 1104: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5472 +//line sql.y:5571 { yySLICE := (*OrderBy)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].orderUnion()) } - case 1088: + case 1105: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Order -//line sql.y:5478 +//line sql.y:5577 { yyLOCAL = &Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].orderDirectionUnion()} } yyVAL.union = yyLOCAL - case 1089: + case 1106: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:5483 +//line sql.y:5582 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1090: + case 1107: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:5487 +//line sql.y:5586 { yyLOCAL = AscOrder } yyVAL.union = yyLOCAL - case 1091: + case 1108: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL OrderDirection -//line sql.y:5491 +//line sql.y:5590 { yyLOCAL = DescOrder } yyVAL.union = yyLOCAL - case 1092: + case 1109: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Limit -//line sql.y:5496 +//line sql.y:5595 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1093: + case 1110: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Limit -//line sql.y:5500 +//line sql.y:5599 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1094: + case 1111: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Limit -//line sql.y:5506 +//line sql.y:5605 { yyLOCAL = &Limit{Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1095: + case 1112: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:5510 +//line sql.y:5609 { yyLOCAL = &Limit{Offset: yyDollar[2].exprUnion(), Rowcount: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1096: + case 1113: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Limit -//line sql.y:5514 +//line sql.y:5613 { yyLOCAL = &Limit{Offset: yyDollar[4].exprUnion(), Rowcount: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1097: + case 1114: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:5519 +//line sql.y:5618 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1098: + case 1115: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:5523 +//line sql.y:5622 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1099: + case 1116: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:5527 +//line sql.y:5626 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion(), yyDollar[2].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1100: + case 1117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:5531 +//line sql.y:5630 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1101: + case 1118: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []AlterOption -//line sql.y:5535 +//line sql.y:5634 { yyLOCAL = []AlterOption{yyDollar[1].alterOptionUnion()} } yyVAL.union = yyLOCAL - case 1102: + case 1119: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:5542 +//line sql.y:5641 { yyLOCAL = &LockOption{Type: DefaultType} } yyVAL.union = yyLOCAL - case 1103: + case 1120: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:5546 +//line sql.y:5645 { yyLOCAL = &LockOption{Type: NoneType} } yyVAL.union = yyLOCAL - case 1104: + case 1121: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:5550 +//line sql.y:5649 { yyLOCAL = &LockOption{Type: SharedType} } yyVAL.union = yyLOCAL - case 1105: + case 1122: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:5554 +//line sql.y:5653 { yyLOCAL = &LockOption{Type: ExclusiveType} } yyVAL.union = yyLOCAL - case 1106: + case 1123: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:5560 +//line sql.y:5659 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1107: + case 1124: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:5564 +//line sql.y:5663 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1108: + case 1125: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL AlterOption -//line sql.y:5568 +//line sql.y:5667 { yyLOCAL = AlgorithmValue(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1109: + case 1126: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5573 +//line sql.y:5672 { yyVAL.str = "" } - case 1110: + case 1127: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5577 +//line sql.y:5676 { yyVAL.str = string(yyDollar[3].str) } - case 1111: + case 1128: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5581 +//line sql.y:5680 { yyVAL.str = string(yyDollar[3].str) } - case 1112: + case 1129: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5585 +//line sql.y:5684 { yyVAL.str = string(yyDollar[3].str) } - case 1113: + case 1130: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5590 +//line sql.y:5689 { yyVAL.str = "" } - case 1114: + case 1131: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5594 +//line sql.y:5693 { yyVAL.str = yyDollar[3].str } - case 1115: + case 1132: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5600 +//line sql.y:5699 { yyVAL.str = string(yyDollar[1].str) } - case 1116: + case 1133: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5604 +//line sql.y:5703 { yyVAL.str = string(yyDollar[1].str) } - case 1117: + case 1134: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5609 +//line sql.y:5708 { yyVAL.str = "" } - case 1118: + case 1135: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:5613 +//line sql.y:5712 { yyVAL.str = yyDollar[2].str } - case 1119: + case 1136: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5618 +//line sql.y:5717 { yyVAL.str = "cascaded" } - case 1120: + case 1137: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5622 +//line sql.y:5721 { yyVAL.str = string(yyDollar[1].str) } - case 1121: + case 1138: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5626 +//line sql.y:5725 { yyVAL.str = string(yyDollar[1].str) } - case 1122: + case 1139: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *Definer -//line sql.y:5631 +//line sql.y:5730 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1123: + case 1140: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:5635 +//line sql.y:5734 { yyLOCAL = yyDollar[3].definerUnion() } yyVAL.union = yyLOCAL - case 1124: + case 1141: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Definer -//line sql.y:5641 +//line sql.y:5740 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1125: + case 1142: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *Definer -//line sql.y:5647 +//line sql.y:5746 { yyLOCAL = &Definer{ Name: string(yyDollar[1].str), } } yyVAL.union = yyLOCAL - case 1126: + case 1143: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Definer -//line sql.y:5653 +//line sql.y:5752 { yyLOCAL = &Definer{ Name: yyDollar[1].str, @@ -15996,361 +16140,361 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1127: + case 1144: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5662 +//line sql.y:5761 { yyVAL.str = encodeSQLString(yyDollar[1].str) } - case 1128: + case 1145: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5666 +//line sql.y:5765 { yyVAL.str = formatIdentifier(yyDollar[1].str) } - case 1129: + case 1146: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5671 +//line sql.y:5770 { yyVAL.str = "" } - case 1130: + case 1147: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5675 +//line sql.y:5774 { yyVAL.str = formatAddress(yyDollar[1].str) } - case 1131: + case 1148: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL Lock -//line sql.y:5681 +//line sql.y:5780 { yyLOCAL = ForUpdateLock } yyVAL.union = yyLOCAL - case 1132: + case 1149: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL Lock -//line sql.y:5685 +//line sql.y:5784 { yyLOCAL = ShareModeLock } yyVAL.union = yyLOCAL - case 1133: + case 1150: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:5691 +//line sql.y:5790 { yyLOCAL = &SelectInto{Type: IntoOutfileS3, FileName: encodeSQLString(yyDollar[4].str), Charset: yyDollar[5].str, FormatOption: yyDollar[6].str, ExportOption: yyDollar[7].str, Manifest: yyDollar[8].str, Overwrite: yyDollar[9].str} } yyVAL.union = yyLOCAL - case 1134: + case 1151: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:5695 +//line sql.y:5794 { yyLOCAL = &SelectInto{Type: IntoDumpfile, FileName: encodeSQLString(yyDollar[3].str), Charset: "", FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1135: + case 1152: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *SelectInto -//line sql.y:5699 +//line sql.y:5798 { yyLOCAL = &SelectInto{Type: IntoOutfile, FileName: encodeSQLString(yyDollar[3].str), Charset: yyDollar[4].str, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } yyVAL.union = yyLOCAL - case 1136: + case 1153: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5704 +//line sql.y:5803 { yyVAL.str = "" } - case 1137: + case 1154: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5708 +//line sql.y:5807 { yyVAL.str = " format csv" + yyDollar[3].str } - case 1138: + case 1155: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5712 +//line sql.y:5811 { yyVAL.str = " format text" + yyDollar[3].str } - case 1139: + case 1156: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5717 +//line sql.y:5816 { yyVAL.str = "" } - case 1140: + case 1157: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5721 +//line sql.y:5820 { yyVAL.str = " header" } - case 1141: + case 1158: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5726 +//line sql.y:5825 { yyVAL.str = "" } - case 1142: + case 1159: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5730 +//line sql.y:5829 { yyVAL.str = " manifest on" } - case 1143: + case 1160: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5734 +//line sql.y:5833 { yyVAL.str = " manifest off" } - case 1144: + case 1161: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5739 +//line sql.y:5838 { yyVAL.str = "" } - case 1145: + case 1162: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5743 +//line sql.y:5842 { yyVAL.str = " overwrite on" } - case 1146: + case 1163: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5747 +//line sql.y:5846 { yyVAL.str = " overwrite off" } - case 1147: + case 1164: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5753 +//line sql.y:5852 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1148: + case 1165: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5758 +//line sql.y:5857 { yyVAL.str = "" } - case 1149: + case 1166: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5762 +//line sql.y:5861 { yyVAL.str = " lines" + yyDollar[2].str } - case 1150: + case 1167: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5768 +//line sql.y:5867 { yyVAL.str = yyDollar[1].str } - case 1151: + case 1168: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5772 +//line sql.y:5871 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1152: + case 1169: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5778 +//line sql.y:5877 { yyVAL.str = " starting by " + encodeSQLString(yyDollar[3].str) } - case 1153: + case 1170: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5782 +//line sql.y:5881 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1154: + case 1171: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5787 +//line sql.y:5886 { yyVAL.str = "" } - case 1155: + case 1172: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5791 +//line sql.y:5890 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str } - case 1156: + case 1173: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5797 +//line sql.y:5896 { yyVAL.str = yyDollar[1].str } - case 1157: + case 1174: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5801 +//line sql.y:5900 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 1158: + case 1175: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5807 +//line sql.y:5906 { yyVAL.str = " terminated by " + encodeSQLString(yyDollar[3].str) } - case 1159: + case 1176: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:5811 +//line sql.y:5910 { yyVAL.str = yyDollar[1].str + " enclosed by " + encodeSQLString(yyDollar[4].str) } - case 1160: + case 1177: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5815 +//line sql.y:5914 { yyVAL.str = " escaped by " + encodeSQLString(yyDollar[3].str) } - case 1161: + case 1178: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5820 +//line sql.y:5919 { yyVAL.str = "" } - case 1162: + case 1179: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5824 +//line sql.y:5923 { yyVAL.str = " optionally" } - case 1163: + case 1180: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *Insert -//line sql.y:5837 +//line sql.y:5936 { yyLOCAL = &Insert{Rows: yyDollar[2].valuesUnion()} } yyVAL.union = yyLOCAL - case 1164: + case 1181: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *Insert -//line sql.y:5841 +//line sql.y:5940 { yyLOCAL = &Insert{Rows: yyDollar[1].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1165: + case 1182: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *Insert -//line sql.y:5845 +//line sql.y:5944 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[5].valuesUnion()} } yyVAL.union = yyLOCAL - case 1166: + case 1183: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:5849 +//line sql.y:5948 { yyLOCAL = &Insert{Rows: yyDollar[4].valuesUnion()} } yyVAL.union = yyLOCAL - case 1167: + case 1184: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *Insert -//line sql.y:5853 +//line sql.y:5952 { yyLOCAL = &Insert{Columns: yyDollar[2].columnsUnion(), Rows: yyDollar[4].selStmtUnion()} } yyVAL.union = yyLOCAL - case 1168: + case 1185: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Columns -//line sql.y:5859 +//line sql.y:5958 { yyLOCAL = Columns{yyDollar[1].colIdent} } yyVAL.union = yyLOCAL - case 1169: + case 1186: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL Columns -//line sql.y:5863 +//line sql.y:5962 { yyLOCAL = Columns{yyDollar[3].colIdent} } yyVAL.union = yyLOCAL - case 1170: + case 1187: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5867 +//line sql.y:5966 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].colIdent) } - case 1171: + case 1188: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:5871 +//line sql.y:5970 { yySLICE := (*Columns)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[5].colIdent) } - case 1172: + case 1189: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:5876 +//line sql.y:5975 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1173: + case 1190: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:5880 +//line sql.y:5979 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 1174: + case 1191: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Values -//line sql.y:5886 +//line sql.y:5985 { yyLOCAL = Values{yyDollar[1].valTupleUnion()} } yyVAL.union = yyLOCAL - case 1175: + case 1192: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5890 +//line sql.y:5989 { yySLICE := (*Values)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].valTupleUnion()) } - case 1176: + case 1193: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL ValTuple -//line sql.y:5896 +//line sql.y:5995 { yyLOCAL = yyDollar[1].valTupleUnion() } yyVAL.union = yyLOCAL - case 1177: + case 1194: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL ValTuple -//line sql.y:5900 +//line sql.y:5999 { yyLOCAL = ValTuple{} } yyVAL.union = yyLOCAL - case 1178: + case 1195: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL ValTuple -//line sql.y:5906 +//line sql.y:6005 { yyLOCAL = ValTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 1179: + case 1196: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5911 +//line sql.y:6010 { if len(yyDollar[1].valTupleUnion()) == 1 { yyLOCAL = yyDollar[1].valTupleUnion()[0] @@ -16359,329 +16503,329 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1180: + case 1197: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL UpdateExprs -//line sql.y:5921 +//line sql.y:6020 { yyLOCAL = UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 1181: + case 1198: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5925 +//line sql.y:6024 { yySLICE := (*UpdateExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].updateExprUnion()) } - case 1182: + case 1199: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *UpdateExpr -//line sql.y:5931 +//line sql.y:6030 { yyLOCAL = &UpdateExpr{Name: yyDollar[1].colNameUnion(), Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1183: + case 1200: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL SetExprs -//line sql.y:5937 +//line sql.y:6036 { yyLOCAL = SetExprs{yyDollar[1].setExprUnion()} } yyVAL.union = yyLOCAL - case 1184: + case 1201: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:5941 +//line sql.y:6040 { yySLICE := (*SetExprs)(yyIaddr(yyVAL.union)) *yySLICE = append(*yySLICE, yyDollar[3].setExprUnion()) } - case 1185: + case 1202: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:5947 +//line sql.y:6046 { yyLOCAL = &SetExpr{Name: yyDollar[1].colIdent, Scope: ImplicitScope, Expr: NewStrLiteral("on")} } yyVAL.union = yyLOCAL - case 1186: + case 1203: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:5951 +//line sql.y:6050 { yyLOCAL = &SetExpr{Name: yyDollar[1].colIdent, Scope: ImplicitScope, Expr: NewStrLiteral("off")} } yyVAL.union = yyLOCAL - case 1187: + case 1204: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:5955 +//line sql.y:6054 { yyLOCAL = &SetExpr{Name: yyDollar[1].colIdent, Scope: ImplicitScope, Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 1188: + case 1205: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:5959 +//line sql.y:6058 { yyLOCAL = &SetExpr{Name: NewColIdent(string(yyDollar[1].str)), Scope: ImplicitScope, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1189: + case 1206: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *SetExpr -//line sql.y:5963 +//line sql.y:6062 { yyDollar[2].setExprUnion().Scope = yyDollar[1].scopeUnion() yyLOCAL = yyDollar[2].setExprUnion() } yyVAL.union = yyLOCAL - case 1191: + case 1208: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:5971 +//line sql.y:6070 { yyVAL.str = "charset" } - case 1194: + case 1211: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5981 +//line sql.y:6080 { yyLOCAL = NewStrLiteral(yyDollar[1].colIdent.String()) } yyVAL.union = yyLOCAL - case 1195: + case 1212: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5985 +//line sql.y:6084 { yyLOCAL = NewStrLiteral(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1196: + case 1213: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Expr -//line sql.y:5989 +//line sql.y:6088 { yyLOCAL = &Default{} } yyVAL.union = yyLOCAL - case 1199: + case 1216: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:5998 +//line sql.y:6097 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1200: + case 1217: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line sql.y:6000 +//line sql.y:6099 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1201: + case 1218: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:6003 +//line sql.y:6102 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1202: + case 1219: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line sql.y:6005 +//line sql.y:6104 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1203: + case 1220: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line sql.y:6008 +//line sql.y:6107 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1204: + case 1221: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line sql.y:6010 +//line sql.y:6109 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1205: + case 1222: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Ignore -//line sql.y:6013 +//line sql.y:6112 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1206: + case 1223: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Ignore -//line sql.y:6015 +//line sql.y:6114 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1207: + case 1224: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6018 +//line sql.y:6117 { yyVAL.empty = struct{}{} } - case 1208: + case 1225: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6020 +//line sql.y:6119 { yyVAL.empty = struct{}{} } - case 1209: + case 1226: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6022 +//line sql.y:6121 { yyVAL.empty = struct{}{} } - case 1210: + case 1227: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL Statement -//line sql.y:6026 +//line sql.y:6125 { yyLOCAL = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprsUnion()} } yyVAL.union = yyLOCAL - case 1211: + case 1228: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL Exprs -//line sql.y:6031 +//line sql.y:6130 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1212: + case 1229: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL Exprs -//line sql.y:6035 +//line sql.y:6134 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 1213: + case 1230: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:6040 +//line sql.y:6139 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1214: + case 1231: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*IndexOption -//line sql.y:6042 +//line sql.y:6141 { yyLOCAL = []*IndexOption{yyDollar[1].indexOptionUnion()} } yyVAL.union = yyLOCAL - case 1215: + case 1232: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *IndexOption -//line sql.y:6046 +//line sql.y:6145 { yyLOCAL = &IndexOption{Name: string(yyDollar[1].str), String: string(yyDollar[2].colIdent.String())} } yyVAL.union = yyLOCAL - case 1216: + case 1233: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6052 +//line sql.y:6151 { yyVAL.colIdent = yyDollar[1].colIdent } - case 1217: + case 1234: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6056 +//line sql.y:6155 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].str)) } - case 1219: + case 1236: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6063 +//line sql.y:6162 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].str)) } - case 1220: + case 1237: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6069 +//line sql.y:6168 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].colIdent.String())) } - case 1221: + case 1238: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6073 +//line sql.y:6172 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].str)) } - case 1222: + case 1239: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6079 +//line sql.y:6178 { yyVAL.tableIdent = NewTableIdent("") } - case 1223: + case 1240: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6083 +//line sql.y:6182 { yyVAL.tableIdent = yyDollar[1].tableIdent } - case 1225: + case 1242: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6090 +//line sql.y:6189 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].str)) } - case 1711: + case 1728: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6600 +//line sql.y:6699 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 1712: + case 1729: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6609 +//line sql.y:6708 { decNesting(yylex) } - case 1713: + case 1730: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6614 +//line sql.y:6713 { skipToEnd(yylex) } - case 1714: + case 1731: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:6619 +//line sql.y:6718 { skipToEnd(yylex) } - case 1715: + case 1732: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6623 +//line sql.y:6722 { skipToEnd(yylex) } - case 1716: + case 1733: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:6627 +//line sql.y:6726 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index 114766ac423..f300e1cd105 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -118,6 +118,7 @@ func bindVariable(yylex yyLexer, bvar string) { alterTable *AlterTable tableOption *TableOption columnTypeOptions *ColumnTypeOptions + partitionDefinitionOptions *PartitionDefinitionOptions constraintDefinition *ConstraintDefinition revertMigration *RevertMigration alterMigration *AlterMigration @@ -136,6 +137,7 @@ func bindVariable(yylex yyLexer, bvar string) { jsonObjectParams []*JSONObjectParam partDefs []*PartitionDefinition partitionValueRange *PartitionValueRange + partitionEngine *PartitionEngine partSpecs []*PartitionSpec characteristics []Characteristic selectExpr SelectExpr @@ -344,7 +346,7 @@ func bindVariable(yylex yyLexer, bvar string) { %token PARTITIONS LINEAR RANGE LIST SUBPARTITION SUBPARTITIONS HASH %type range_or_list -%type partitions_opt algorithm_opt subpartitions_opt +%type partitions_opt algorithm_opt subpartitions_opt partition_max_rows partition_min_rows %type command %type query_expression_parens query_expression query_expression_body select_statement query_primary select_stmt_with_into %type explain_statement explainable_statement @@ -365,7 +367,7 @@ func bindVariable(yylex yyLexer, bvar string) { %type alter_database_prefix %type collate character_set %type create_options create_options_opt -%type default_optional first_opt linear_opt jt_exists_opt jt_path_opt +%type default_optional first_opt linear_opt jt_exists_opt jt_path_opt partition_storage_opt %type analyze_statement show_statement use_statement other_statement %type begin_statement commit_statement rollback_statement savepoint_statement release_statement load_statement %type lock_statement unlock_statement call_statement @@ -377,6 +379,7 @@ func bindVariable(yylex yyLexer, bvar string) { %type insert_or_replace %type explain_synonyms %type partitions_options_opt partitions_options_beginning +%type partition_definition_attribute_list_opt %type subpartition_opt %type interval_time_stamp interval %type cache_opt separator_opt flush_option for_channel_opt maxvalue @@ -459,7 +462,7 @@ func bindVariable(yylex yyLexer, bvar string) { %type convert_type convert_type_weight_string %type column_type %type int_type decimal_type numeric_type time_type char_type spatial_type -%type length_opt +%type length_opt partition_comment partition_data_directory partition_index_directory %type func_datetime_precision %type charset_opt collate_opt %type float_length_opt decimal_length_opt @@ -471,7 +474,7 @@ func bindVariable(yylex yyLexer, bvar string) { %type constraint_definition check_constraint_definition %type index_or_key index_symbols from_or_in index_or_key_opt %type name_opt constraint_name_opt -%type equal_opt +%type equal_opt partition_tablespace_name %type table_spec table_column_list %type create_like %type table_opt_value @@ -485,7 +488,8 @@ func bindVariable(yylex yyLexer, bvar string) { %type constraint_info check_constraint_info %type partition_definitions partition_definitions_opt %type partition_definition partition_name -%type partition_value_range_opt +%type partition_value_range +%type partition_engine %type partition_operation %type vindex_param %type vindex_param_list vindex_params_opt @@ -3197,16 +3201,60 @@ partition_definitions: } partition_definition: - partition_name partition_value_range_opt + partition_name partition_definition_attribute_list_opt { - $$.ValueRange = $2 + $$.Options = $2 } -partition_value_range_opt: +partition_definition_attribute_list_opt: { - $$ = nil + $$ = &PartitionDefinitionOptions{} + } +| partition_definition_attribute_list_opt partition_value_range + { + $1.ValueRange = $2 + $$ = $1 } -| VALUES LESS THAN row_tuple +| partition_definition_attribute_list_opt partition_comment + { + $1.Comment = $2 + $$ = $1 + } +| partition_definition_attribute_list_opt partition_engine + { + $1.Engine = $2 + $$ = $1 + } +| partition_definition_attribute_list_opt partition_data_directory + { + $1.DataDirectory = $2 + $$ = $1 + } +| partition_definition_attribute_list_opt partition_index_directory + { + $1.IndexDirectory = $2 + $$ = $1 + } +| partition_definition_attribute_list_opt partition_max_rows + { + val := $2 + $1.MaxRows = &val + $$ = $1 + } +| partition_definition_attribute_list_opt partition_min_rows + { + val := $2 + $1.MinRows = &val + $$ = $1 + } +| partition_definition_attribute_list_opt partition_tablespace_name + { + $1.TableSpace = $2 + $$ = $1 + } + +partition_value_range: + VALUES LESS THAN row_tuple { $$ = &PartitionValueRange{ Type: LessThanType, @@ -3228,6 +3276,57 @@ partition_value_range_opt: } } +partition_storage_opt: + { + $$ = false + } +| STORAGE + { + $$ = true + } + +partition_engine: + partition_storage_opt ENGINE equal_opt table_alias + { + $$ = &PartitionEngine{Storage:$1, Name: $4.String()} + } + +partition_comment: + COMMENT_KEYWORD equal_opt STRING + { + $$ = NewStrLiteral($3) + } + +partition_data_directory: + DATA DIRECTORY equal_opt STRING + { + $$ = NewStrLiteral($4) + } + +partition_index_directory: + INDEX DIRECTORY equal_opt STRING + { + $$ = NewStrLiteral($4) + } + +partition_max_rows: + MAX_ROWS equal_opt INTEGRAL + { + $$ = convertStringToInt($3) + } + +partition_min_rows: + MIN_ROWS equal_opt INTEGRAL + { + $$ = convertStringToInt($3) + } + +partition_tablespace_name: + TABLESPACE equal_opt table_alias + { + $$ = $3.String() + } + partition_name: PARTITION sql_id { From 26d7cca8c71ac7fc06522cad06ef17635a03620d Mon Sep 17 00:00:00 2001 From: FlorentP <35779988+frouioui@users.noreply.github.com> Date: Thu, 28 Apr 2022 13:16:05 -0400 Subject: [PATCH 09/22] Automatically comment Pull Request with the review checklist (#10155) * addition of the comment_pull_request workflow Signed-off-by: Florent Poinsard * addition of permissions to use GITHUB_TOKEN Signed-off-by: Florent Poinsard * Display the review checklist when openening and undrafting a PR Signed-off-by: Florent Poinsard * Fixed typo and added reopened type to the trigger Signed-off-by: Florent Poinsard * Added the review checklist Signed-off-by: Florent Poinsard * Changed the format of the review checklist Signed-off-by: Florent Poinsard * Changed the name of the workflow's job Signed-off-by: Florent Poinsard * Fixed typos Signed-off-by: Florent Poinsard --- .github/workflows/comment_pull_request.yml | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 .github/workflows/comment_pull_request.yml diff --git a/.github/workflows/comment_pull_request.yml b/.github/workflows/comment_pull_request.yml new file mode 100644 index 00000000000..8abd279ce9a --- /dev/null +++ b/.github/workflows/comment_pull_request.yml @@ -0,0 +1,48 @@ +name: comment_pull_request +on: + pull_request_target: + types: [opened, reopened, ready_for_review] + +permissions: + contents: write + pull-requests: write + +jobs: + review_checklist: + if: ${{ !github.event.pull_request.draft }} + runs-on: ubuntu-latest + name: Comment Pull Request with the Review Checklist + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Comment PR + uses: thollander/actions-comment-pull-request@v1 + with: + comment_includes: 'Review Checklist' + message: | + ### Review Checklist + + Hello reviewers! :wave: Please follow this checklist when reviewing this Pull Request. + + #### General + - [ ] Ensure that the Pull Request has the correct `release notes` label. `release notes none` should only be used for PRs that are so trivial that they need not be included. + - [ ] If a new flag is being introduced, review whether it is really needed. The flag names should be clear and intuitive (as far as possible), and the flag's help should be descriptive. + + #### Bug fixes + - [ ] There should be at least one unit or end-to-end test. + - [ ] The Pull Request description should either include a link to an issue that describes the bug OR an actual description of the bug and how to reproduce, along with a description of the fix. + + #### Non-trivial changes + - [ ] There should be some code comments as to why things are implemented the way they are. + + #### New/Existing features + - [ ] Should be documented, either by modifying the existing documentation or creating new documentation. + - [ ] New features should have a link to a feature request issue or an RFC that documents the use cases, corner cases and test cases. + + #### Backward compatibility + - [ ] Protobuf changes should be wire-compatible. + - [ ] Changes to `_vt` tables and RPCs need to be backward compatible. + - [ ] `vtctl` command output order should be stable and `awk`-able. + + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 27c0f8fab2fb5121fc6285dc2b51e4dd282bec45 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 28 Apr 2022 13:49:21 -0400 Subject: [PATCH 10/22] This effectively reverts 65226ad1d77629fe29e852393a19250a9a910024 It was NOT backwards compatible. Signed-off-by: Matt Lord --- go/mysql/replication_status.go | 32 +++- .../replicationdata/replicationdata.pb.go | 148 ++++++++++-------- .../replicationdata_vtproto.pb.go | 119 +++++++++----- go/vt/vtadmin/cluster/cluster_test.go | 37 +++-- .../reparentutil/emergency_reparenter_test.go | 44 +++--- go/vt/vtctl/reparentutil/replication.go | 2 +- go/vt/vtctl/reparentutil/replication_test.go | 16 +- go/vt/vttablet/tmrpctest/test_tm_rpc.go | 6 +- proto/replicationdata.proto | 10 +- web/vtadmin/src/proto/vtadmin.d.ts | 26 +-- web/vtadmin/src/proto/vtadmin.js | 98 +++++++----- 11 files changed, 315 insertions(+), 223 deletions(-) diff --git a/go/mysql/replication_status.go b/go/mysql/replication_status.go index 114f4e7ac51..201c88a426c 100644 --- a/go/mysql/replication_status.go +++ b/go/mysql/replication_status.go @@ -75,7 +75,7 @@ func (s *ReplicationStatus) SQLHealthy() bool { // ReplicationStatusToProto translates a Status to proto3. func ReplicationStatusToProto(s ReplicationStatus) *replicationdatapb.Status { - return &replicationdatapb.Status{ + replstatus := replicationdatapb.Status{ Position: EncodePosition(s.Position), RelayLogPosition: EncodePosition(s.RelayLogPosition), FilePosition: EncodePosition(s.FilePosition), @@ -86,11 +86,18 @@ func ReplicationStatusToProto(s ReplicationStatus) *replicationdatapb.Status { SourcePort: int32(s.SourcePort), ConnectRetry: int32(s.ConnectRetry), SourceUuid: s.SourceUUID.String(), - IoState: int32(s.IOState), LastIoError: s.LastIOError, - SqlState: int32(s.SQLState), LastSqlError: s.LastSQLError, } + if s.IOState == ReplicationStateRunning { + replstatus.IoThreadRunning = true + } else if s.IOState == ReplicationStateConnecting { + replstatus.IoThreadConnecting = true + } + if s.SQLState == ReplicationStateRunning { + replstatus.SqlThreadRunning = true + } + return &replstatus } // ProtoToReplicationStatus translates a proto Status, or panics. @@ -118,7 +125,7 @@ func ProtoToReplicationStatus(s *replicationdatapb.Status) ReplicationStatus { panic(vterrors.Wrapf(err, "cannot decode SourceUUID")) } } - return ReplicationStatus{ + replstatus := ReplicationStatus{ Position: pos, RelayLogPosition: relayPos, FilePosition: filePos, @@ -129,11 +136,20 @@ func ProtoToReplicationStatus(s *replicationdatapb.Status) ReplicationStatus { SourcePort: int(s.SourcePort), ConnectRetry: int(s.ConnectRetry), SourceUUID: sid, - IOState: ReplicationState(s.IoState), - LastIOError: s.LastIoError, - SQLState: ReplicationState(s.SqlState), - LastSQLError: s.LastSqlError, } + if s.IoThreadRunning { + replstatus.IOState = ReplicationStateRunning + } else if s.IoThreadConnecting { + replstatus.IOState = ReplicationStateConnecting + } else { + replstatus.IOState = ReplicationStateStopped + } + if s.SqlThreadRunning { + replstatus.SQLState = ReplicationStateRunning + } else { + replstatus.SQLState = ReplicationStateStopped + } + return replstatus } // FindErrantGTIDs can be used to find errant GTIDs in the receiver's relay log, by comparing it against all known replicas, diff --git a/go/vt/proto/replicationdata/replicationdata.pb.go b/go/vt/proto/replicationdata/replicationdata.pb.go index 1dd0142248e..97d782b90c5 100644 --- a/go/vt/proto/replicationdata/replicationdata.pb.go +++ b/go/vt/proto/replicationdata/replicationdata.pb.go @@ -92,6 +92,8 @@ type Status struct { unknownFields protoimpl.UnknownFields Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + IoThreadRunning bool `protobuf:"varint,2,opt,name=io_thread_running,json=ioThreadRunning,proto3" json:"io_thread_running,omitempty"` + SqlThreadRunning bool `protobuf:"varint,3,opt,name=sql_thread_running,json=sqlThreadRunning,proto3" json:"sql_thread_running,omitempty"` ReplicationLagSeconds uint32 `protobuf:"varint,4,opt,name=replication_lag_seconds,json=replicationLagSeconds,proto3" json:"replication_lag_seconds,omitempty"` SourceHost string `protobuf:"bytes,5,opt,name=source_host,json=sourceHost,proto3" json:"source_host,omitempty"` SourcePort int32 `protobuf:"varint,6,opt,name=source_port,json=sourcePort,proto3" json:"source_port,omitempty"` @@ -102,10 +104,9 @@ type Status struct { FileRelayLogPosition string `protobuf:"bytes,10,opt,name=file_relay_log_position,json=fileRelayLogPosition,proto3" json:"file_relay_log_position,omitempty"` SourceServerId uint32 `protobuf:"varint,11,opt,name=source_server_id,json=sourceServerId,proto3" json:"source_server_id,omitempty"` SourceUuid string `protobuf:"bytes,12,opt,name=source_uuid,json=sourceUuid,proto3" json:"source_uuid,omitempty"` - IoState int32 `protobuf:"varint,13,opt,name=io_state,json=ioState,proto3" json:"io_state,omitempty"` + IoThreadConnecting bool `protobuf:"varint,13,opt,name=io_thread_connecting,json=ioThreadConnecting,proto3" json:"io_thread_connecting,omitempty"` LastIoError string `protobuf:"bytes,14,opt,name=last_io_error,json=lastIoError,proto3" json:"last_io_error,omitempty"` - SqlState int32 `protobuf:"varint,15,opt,name=sql_state,json=sqlState,proto3" json:"sql_state,omitempty"` - LastSqlError string `protobuf:"bytes,16,opt,name=last_sql_error,json=lastSqlError,proto3" json:"last_sql_error,omitempty"` + LastSqlError string `protobuf:"bytes,15,opt,name=last_sql_error,json=lastSqlError,proto3" json:"last_sql_error,omitempty"` } func (x *Status) Reset() { @@ -147,6 +148,20 @@ func (x *Status) GetPosition() string { return "" } +func (x *Status) GetIoThreadRunning() bool { + if x != nil { + return x.IoThreadRunning + } + return false +} + +func (x *Status) GetSqlThreadRunning() bool { + if x != nil { + return x.SqlThreadRunning + } + return false +} + func (x *Status) GetReplicationLagSeconds() uint32 { if x != nil { return x.ReplicationLagSeconds @@ -210,11 +225,11 @@ func (x *Status) GetSourceUuid() string { return "" } -func (x *Status) GetIoState() int32 { +func (x *Status) GetIoThreadConnecting() bool { if x != nil { - return x.IoState + return x.IoThreadConnecting } - return 0 + return false } func (x *Status) GetLastIoError() string { @@ -224,13 +239,6 @@ func (x *Status) GetLastIoError() string { return "" } -func (x *Status) GetSqlState() int32 { - if x != nil { - return x.SqlState - } - return 0 -} - func (x *Status) GetLastSqlError() string { if x != nil { return x.LastSqlError @@ -356,64 +364,66 @@ var File_replicationdata_proto protoreflect.FileDescriptor var file_replicationdata_proto_rawDesc = []byte{ 0x0a, 0x15, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x22, 0xcd, 0x04, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x22, 0xee, 0x04, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2a, 0x0a, 0x11, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x6f, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x73, + 0x71, 0x6c, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x71, 0x6c, 0x54, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x67, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, + 0x6f, 0x72, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x72, + 0x65, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x52, 0x65, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, + 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x4c, 0x6f, 0x67, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, + 0x69, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x17, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x66, 0x69, + 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4c, 0x6f, 0x67, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x30, 0x0a, + 0x14, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x6f, 0x54, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x12, + 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6f, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x71, 0x6c, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, + 0x74, 0x53, 0x71, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x77, 0x0a, 0x15, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 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, 0x06, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 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, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x22, 0x50, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x36, 0x0a, 0x17, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, - 0x61, 0x67, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x15, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x67, - 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x65, 0x74, 0x72, 0x79, 0x12, 0x2c, - 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x61, - 0x79, 0x4c, 0x6f, 0x67, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x35, 0x0a, 0x17, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, - 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x4c, 0x6f, 0x67, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, - 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, - 0x75, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x69, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, - 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6f, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6f, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x71, 0x6c, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, - 0x04, 0x52, 0x11, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x12, 0x73, 0x71, 0x6c, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, - 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x77, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 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, 0x06, 0x62, 0x65, 0x66, 0x6f, - 0x72, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 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, 0x61, 0x66, 0x74, 0x65, - 0x72, 0x22, 0x50, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, - 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x2a, 0x3b, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4f, - 0x41, 0x4e, 0x44, 0x53, 0x51, 0x4c, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x10, 0x00, 0x12, 0x10, - 0x0a, 0x0c, 0x49, 0x4f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, - 0x42, 0x2e, 0x5a, 0x2c, 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, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x3b, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x49, + 0x4f, 0x41, 0x4e, 0x44, 0x53, 0x51, 0x4c, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x10, 0x00, 0x12, + 0x10, 0x0a, 0x0c, 0x49, 0x4f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x10, + 0x01, 0x42, 0x2e, 0x5a, 0x2c, 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, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go b/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go index 252150801c7..3bced0530ef 100644 --- a/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go +++ b/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go @@ -53,14 +53,7 @@ func (m *Status) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.LastSqlError) i = encodeVarint(dAtA, i, uint64(len(m.LastSqlError))) i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x82 - } - if m.SqlState != 0 { - i = encodeVarint(dAtA, i, uint64(m.SqlState)) - i-- - dAtA[i] = 0x78 + dAtA[i] = 0x7a } if len(m.LastIoError) > 0 { i -= len(m.LastIoError) @@ -69,8 +62,13 @@ func (m *Status) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i-- dAtA[i] = 0x72 } - if m.IoState != 0 { - i = encodeVarint(dAtA, i, uint64(m.IoState)) + if m.IoThreadConnecting { + i-- + if m.IoThreadConnecting { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } i-- dAtA[i] = 0x68 } @@ -129,6 +127,26 @@ func (m *Status) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } + if m.SqlThreadRunning { + i-- + if m.SqlThreadRunning { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if m.IoThreadRunning { + i-- + if m.IoThreadRunning { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } if len(m.Position) > 0 { i -= len(m.Position) copy(dAtA[i:], m.Position) @@ -260,6 +278,12 @@ func (m *Status) SizeVT() (n int) { if l > 0 { n += 1 + l + sov(uint64(l)) } + if m.IoThreadRunning { + n += 2 + } + if m.SqlThreadRunning { + n += 2 + } if m.ReplicationLagSeconds != 0 { n += 1 + sov(uint64(m.ReplicationLagSeconds)) } @@ -292,19 +316,16 @@ func (m *Status) SizeVT() (n int) { if l > 0 { n += 1 + l + sov(uint64(l)) } - if m.IoState != 0 { - n += 1 + sov(uint64(m.IoState)) + if m.IoThreadConnecting { + n += 2 } l = len(m.LastIoError) if l > 0 { n += 1 + l + sov(uint64(l)) } - if m.SqlState != 0 { - n += 1 + sov(uint64(m.SqlState)) - } l = len(m.LastSqlError) if l > 0 { - n += 2 + l + sov(uint64(l)) + n += 1 + l + sov(uint64(l)) } if m.unknownFields != nil { n += len(m.unknownFields) @@ -419,6 +440,46 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } m.Position = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IoThreadRunning", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IoThreadRunning = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SqlThreadRunning", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SqlThreadRunning = bool(v != 0) case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field ReplicationLagSeconds", wireType) @@ -657,9 +718,9 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { iNdEx = postIndex case 13: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IoState", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IoThreadConnecting", wireType) } - m.IoState = 0 + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -669,11 +730,12 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.IoState |= int32(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } + m.IoThreadConnecting = bool(v != 0) case 14: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field LastIoError", wireType) @@ -707,25 +769,6 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { m.LastIoError = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 15: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SqlState", wireType) - } - m.SqlState = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.SqlState |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 16: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field LastSqlError", wireType) } diff --git a/go/vt/vtadmin/cluster/cluster_test.go b/go/vt/vtadmin/cluster/cluster_test.go index 38293064cc2..aa9d9d5b646 100644 --- a/go/vt/vtadmin/cluster/cluster_test.go +++ b/go/vt/vtadmin/cluster/cluster_test.go @@ -29,7 +29,6 @@ import ( "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/util/sets" - "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/protoutil" "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/topo" @@ -2427,19 +2426,19 @@ func TestGetShardReplicationPositions(t *testing.T) { Response: &vtctldatapb.ShardReplicationPositionsResponse{ ReplicationStatuses: map[string]*replicationdatapb.Status{ "zone1-001": { - IoState: int32(mysql.ReplicationStateStopped), - SqlState: int32(mysql.ReplicationStateStopped), - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoThreadRunning: false, + SqlThreadRunning: false, + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, "zone1-002": { // Note: in reality other fields will be set on replicating hosts as well, but this is sufficient to illustrate in the testing. - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoThreadRunning: true, + SqlThreadRunning: true, + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, "zone1-003": { - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoThreadRunning: true, + SqlThreadRunning: true, + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, }, TabletMap: map[string]*topodatapb.Tablet{ @@ -2490,19 +2489,19 @@ func TestGetShardReplicationPositions(t *testing.T) { PositionInfo: &vtctldatapb.ShardReplicationPositionsResponse{ ReplicationStatuses: map[string]*replicationdatapb.Status{ "zone1-001": { - IoState: int32(mysql.ReplicationStateStopped), - SqlState: int32(mysql.ReplicationStateStopped), - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoThreadRunning: false, + SqlThreadRunning: false, + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, "zone1-002": { - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoThreadRunning: true, + SqlThreadRunning: true, + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, "zone1-003": { - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoThreadRunning: true, + SqlThreadRunning: true, + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, }, TabletMap: map[string]*topodatapb.Tablet{ diff --git a/go/vt/vtctl/reparentutil/emergency_reparenter_test.go b/go/vt/vtctl/reparentutil/emergency_reparenter_test.go index 746c3c70d88..9055588bd44 100644 --- a/go/vt/vtctl/reparentutil/emergency_reparenter_test.go +++ b/go/vt/vtctl/reparentutil/emergency_reparenter_test.go @@ -2038,14 +2038,14 @@ func TestEmergencyReparenter_promoteNewPrimary(t *testing.T) { statusMap: map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { // forceStart = false Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateStopped), - SqlState: int32(mysql.ReplicationStateStopped), + IoThreadRunning: false, + SqlThreadRunning: false, }, }, "zone1-0000000102": { // forceStart = true Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), + IoThreadRunning: true, + SqlThreadRunning: true, }, }, }, @@ -2416,14 +2416,14 @@ func TestEmergencyReparenter_promoteNewPrimary(t *testing.T) { statusMap: map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { // forceStart = false Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateStopped), - SqlState: int32(mysql.ReplicationStateStopped), + IoThreadRunning: false, + SqlThreadRunning: false, }, }, "zone1-0000000102": { // forceStart = true Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), + IoThreadRunning: true, + SqlThreadRunning: true, }, }, }, @@ -3229,14 +3229,14 @@ func TestEmergencyReparenter_reparentReplicas(t *testing.T) { statusMap: map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { // forceStart = false Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateStopped), - SqlState: int32(mysql.ReplicationStateStopped), + IoThreadRunning: false, + SqlThreadRunning: false, }, }, "zone1-0000000102": { // forceStart = true Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), + IoThreadRunning: true, + SqlThreadRunning: true, }, }, }, @@ -3622,14 +3622,14 @@ func TestEmergencyReparenter_promoteIntermediateSource(t *testing.T) { statusMap: map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { // forceStart = false Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateStopped), - SqlState: int32(mysql.ReplicationStateStopped), + IoThreadRunning: false, + SqlThreadRunning: false, }, }, "zone1-0000000102": { // forceStart = true Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), + IoThreadRunning: true, + SqlThreadRunning: true, }, }, }, @@ -3896,14 +3896,14 @@ func TestEmergencyReparenter_promoteIntermediateSource(t *testing.T) { statusMap: map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { // forceStart = false Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateStopped), - SqlState: int32(mysql.ReplicationStateStopped), + IoThreadRunning: false, + SqlThreadRunning: false, }, }, "zone1-0000000102": { // forceStart = true Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), + IoThreadRunning: true, + SqlThreadRunning: true, }, }, }, @@ -4242,8 +4242,8 @@ func TestParentContextCancelled(t *testing.T) { statusMap := map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), + IoThreadRunning: true, + SqlThreadRunning: true, }, }, } diff --git a/go/vt/vtctl/reparentutil/replication.go b/go/vt/vtctl/reparentutil/replication.go index a98053f829e..ca5337bbbfe 100644 --- a/go/vt/vtctl/reparentutil/replication.go +++ b/go/vt/vtctl/reparentutil/replication.go @@ -150,7 +150,7 @@ func ReplicaWasRunning(stopStatus *replicationdatapb.StopReplicationStatus) (boo return false, vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "could not determine Before state of StopReplicationStatus %v", stopStatus) } - return stopStatus.Before.IoState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.SqlState == int32(mysql.ReplicationStateRunning), nil + return stopStatus.Before.IoThreadRunning || stopStatus.Before.SqlThreadRunning, nil } // SetReplicationSource is used to set the replication source on the specified diff --git a/go/vt/vtctl/reparentutil/replication_test.go b/go/vt/vtctl/reparentutil/replication_test.go index 13f25295599..d50c0487769 100644 --- a/go/vt/vtctl/reparentutil/replication_test.go +++ b/go/vt/vtctl/reparentutil/replication_test.go @@ -1098,8 +1098,8 @@ func TestReplicaWasRunning(t *testing.T) { name: "io thread running", in: &replicationdatapb.StopReplicationStatus{ Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateStopped), + IoThreadRunning: true, + SqlThreadRunning: false, }, }, expected: true, @@ -1109,8 +1109,8 @@ func TestReplicaWasRunning(t *testing.T) { name: "sql thread running", in: &replicationdatapb.StopReplicationStatus{ Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateStopped), - SqlState: int32(mysql.ReplicationStateRunning), + IoThreadRunning: false, + SqlThreadRunning: true, }, }, expected: true, @@ -1120,8 +1120,8 @@ func TestReplicaWasRunning(t *testing.T) { name: "io and sql threads running", in: &replicationdatapb.StopReplicationStatus{ Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), + IoThreadRunning: true, + SqlThreadRunning: true, }, }, expected: true, @@ -1131,8 +1131,8 @@ func TestReplicaWasRunning(t *testing.T) { name: "no replication threads running", in: &replicationdatapb.StopReplicationStatus{ Before: &replicationdatapb.Status{ - IoState: int32(mysql.ReplicationStateStopped), - SqlState: int32(mysql.ReplicationStateStopped), + IoThreadRunning: false, + SqlThreadRunning: false, }, }, expected: false, diff --git a/go/vt/vttablet/tmrpctest/test_tm_rpc.go b/go/vt/vttablet/tmrpctest/test_tm_rpc.go index ed0c338868e..9d7531aa551 100644 --- a/go/vt/vttablet/tmrpctest/test_tm_rpc.go +++ b/go/vt/vttablet/tmrpctest/test_tm_rpc.go @@ -25,8 +25,6 @@ import ( "testing" "time" - "vitess.io/vitess/go/mysql" - "context" "google.golang.org/protobuf/proto" @@ -686,8 +684,8 @@ func tmRPCTestExecuteFetchPanic(ctx context.Context, t *testing.T, client tmclie var testReplicationStatus = &replicationdatapb.Status{ Position: "MariaDB/1-345-789", - IoState: int32(mysql.ReplicationStateRunning), - SqlState: int32(mysql.ReplicationStateRunning), + IoThreadRunning: true, + SqlThreadRunning: true, ReplicationLagSeconds: 654, SourceHost: "source.host", SourcePort: 3366, diff --git a/proto/replicationdata.proto b/proto/replicationdata.proto index b6ef28ec119..87a6ea331e7 100644 --- a/proto/replicationdata.proto +++ b/proto/replicationdata.proto @@ -25,9 +25,8 @@ package replicationdata; // flavor-specific command and parsed into a Position and fields. message Status { string position = 1; - // These two fields were removed in Vitess 14 and replaced by the io_state and sql_state fields - reserved 2, 3; - reserved "io_thread_running", "sql_thread_running"; + bool io_thread_running = 2; + bool sql_thread_running = 3; uint32 replication_lag_seconds = 4; string source_host = 5; int32 source_port = 6; @@ -38,10 +37,9 @@ message Status { string file_relay_log_position = 10; uint32 source_server_id = 11; string source_uuid = 12; - int32 io_state = 13; + bool io_thread_connecting = 13; string last_io_error = 14; - int32 sql_state = 15; - string last_sql_error = 16; + string last_sql_error = 15; } // StopReplicationStatus represents the replication status before calling StopReplication, and the replication status collected immediately after diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index f71a6629194..cafafa89ef7 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -26860,6 +26860,12 @@ export namespace replicationdata { /** Status position */ position?: (string|null); + /** Status io_thread_running */ + io_thread_running?: (boolean|null); + + /** Status sql_thread_running */ + sql_thread_running?: (boolean|null); + /** Status replication_lag_seconds */ replication_lag_seconds?: (number|null); @@ -26887,15 +26893,12 @@ export namespace replicationdata { /** Status source_uuid */ source_uuid?: (string|null); - /** Status io_state */ - io_state?: (number|null); + /** Status io_thread_connecting */ + io_thread_connecting?: (boolean|null); /** Status last_io_error */ last_io_error?: (string|null); - /** Status sql_state */ - sql_state?: (number|null); - /** Status last_sql_error */ last_sql_error?: (string|null); } @@ -26912,6 +26915,12 @@ export namespace replicationdata { /** Status position. */ public position: string; + /** Status io_thread_running. */ + public io_thread_running: boolean; + + /** Status sql_thread_running. */ + public sql_thread_running: boolean; + /** Status replication_lag_seconds. */ public replication_lag_seconds: number; @@ -26939,15 +26948,12 @@ export namespace replicationdata { /** Status source_uuid. */ public source_uuid: string; - /** Status io_state. */ - public io_state: number; + /** Status io_thread_connecting. */ + public io_thread_connecting: boolean; /** Status last_io_error. */ public last_io_error: string; - /** Status sql_state. */ - public sql_state: number; - /** Status last_sql_error. */ public last_sql_error: string; diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index 647e7fbfc46..61d1b71f9cd 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -63272,6 +63272,8 @@ $root.replicationdata = (function() { * @memberof replicationdata * @interface IStatus * @property {string|null} [position] Status position + * @property {boolean|null} [io_thread_running] Status io_thread_running + * @property {boolean|null} [sql_thread_running] Status sql_thread_running * @property {number|null} [replication_lag_seconds] Status replication_lag_seconds * @property {string|null} [source_host] Status source_host * @property {number|null} [source_port] Status source_port @@ -63281,9 +63283,8 @@ $root.replicationdata = (function() { * @property {string|null} [file_relay_log_position] Status file_relay_log_position * @property {number|null} [source_server_id] Status source_server_id * @property {string|null} [source_uuid] Status source_uuid - * @property {number|null} [io_state] Status io_state + * @property {boolean|null} [io_thread_connecting] Status io_thread_connecting * @property {string|null} [last_io_error] Status last_io_error - * @property {number|null} [sql_state] Status sql_state * @property {string|null} [last_sql_error] Status last_sql_error */ @@ -63310,6 +63311,22 @@ $root.replicationdata = (function() { */ Status.prototype.position = ""; + /** + * Status io_thread_running. + * @member {boolean} io_thread_running + * @memberof replicationdata.Status + * @instance + */ + Status.prototype.io_thread_running = false; + + /** + * Status sql_thread_running. + * @member {boolean} sql_thread_running + * @memberof replicationdata.Status + * @instance + */ + Status.prototype.sql_thread_running = false; + /** * Status replication_lag_seconds. * @member {number} replication_lag_seconds @@ -63383,12 +63400,12 @@ $root.replicationdata = (function() { Status.prototype.source_uuid = ""; /** - * Status io_state. - * @member {number} io_state + * Status io_thread_connecting. + * @member {boolean} io_thread_connecting * @memberof replicationdata.Status * @instance */ - Status.prototype.io_state = 0; + Status.prototype.io_thread_connecting = false; /** * Status last_io_error. @@ -63398,14 +63415,6 @@ $root.replicationdata = (function() { */ Status.prototype.last_io_error = ""; - /** - * Status sql_state. - * @member {number} sql_state - * @memberof replicationdata.Status - * @instance - */ - Status.prototype.sql_state = 0; - /** * Status last_sql_error. * @member {string} last_sql_error @@ -63440,6 +63449,10 @@ $root.replicationdata = (function() { writer = $Writer.create(); if (message.position != null && Object.hasOwnProperty.call(message, "position")) writer.uint32(/* id 1, wireType 2 =*/10).string(message.position); + if (message.io_thread_running != null && Object.hasOwnProperty.call(message, "io_thread_running")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.io_thread_running); + if (message.sql_thread_running != null && Object.hasOwnProperty.call(message, "sql_thread_running")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.sql_thread_running); if (message.replication_lag_seconds != null && Object.hasOwnProperty.call(message, "replication_lag_seconds")) writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.replication_lag_seconds); if (message.source_host != null && Object.hasOwnProperty.call(message, "source_host")) @@ -63458,14 +63471,12 @@ $root.replicationdata = (function() { writer.uint32(/* id 11, wireType 0 =*/88).uint32(message.source_server_id); if (message.source_uuid != null && Object.hasOwnProperty.call(message, "source_uuid")) writer.uint32(/* id 12, wireType 2 =*/98).string(message.source_uuid); - if (message.io_state != null && Object.hasOwnProperty.call(message, "io_state")) - writer.uint32(/* id 13, wireType 0 =*/104).int32(message.io_state); + if (message.io_thread_connecting != null && Object.hasOwnProperty.call(message, "io_thread_connecting")) + writer.uint32(/* id 13, wireType 0 =*/104).bool(message.io_thread_connecting); if (message.last_io_error != null && Object.hasOwnProperty.call(message, "last_io_error")) writer.uint32(/* id 14, wireType 2 =*/114).string(message.last_io_error); - if (message.sql_state != null && Object.hasOwnProperty.call(message, "sql_state")) - writer.uint32(/* id 15, wireType 0 =*/120).int32(message.sql_state); if (message.last_sql_error != null && Object.hasOwnProperty.call(message, "last_sql_error")) - writer.uint32(/* id 16, wireType 2 =*/130).string(message.last_sql_error); + writer.uint32(/* id 15, wireType 2 =*/122).string(message.last_sql_error); return writer; }; @@ -63503,6 +63514,12 @@ $root.replicationdata = (function() { case 1: message.position = reader.string(); break; + case 2: + message.io_thread_running = reader.bool(); + break; + case 3: + message.sql_thread_running = reader.bool(); + break; case 4: message.replication_lag_seconds = reader.uint32(); break; @@ -63531,15 +63548,12 @@ $root.replicationdata = (function() { message.source_uuid = reader.string(); break; case 13: - message.io_state = reader.int32(); + message.io_thread_connecting = reader.bool(); break; case 14: message.last_io_error = reader.string(); break; case 15: - message.sql_state = reader.int32(); - break; - case 16: message.last_sql_error = reader.string(); break; default: @@ -63580,6 +63594,12 @@ $root.replicationdata = (function() { if (message.position != null && message.hasOwnProperty("position")) if (!$util.isString(message.position)) return "position: string expected"; + if (message.io_thread_running != null && message.hasOwnProperty("io_thread_running")) + if (typeof message.io_thread_running !== "boolean") + return "io_thread_running: boolean expected"; + if (message.sql_thread_running != null && message.hasOwnProperty("sql_thread_running")) + if (typeof message.sql_thread_running !== "boolean") + return "sql_thread_running: boolean expected"; if (message.replication_lag_seconds != null && message.hasOwnProperty("replication_lag_seconds")) if (!$util.isInteger(message.replication_lag_seconds)) return "replication_lag_seconds: integer expected"; @@ -63607,15 +63627,12 @@ $root.replicationdata = (function() { if (message.source_uuid != null && message.hasOwnProperty("source_uuid")) if (!$util.isString(message.source_uuid)) return "source_uuid: string expected"; - if (message.io_state != null && message.hasOwnProperty("io_state")) - if (!$util.isInteger(message.io_state)) - return "io_state: integer expected"; + if (message.io_thread_connecting != null && message.hasOwnProperty("io_thread_connecting")) + if (typeof message.io_thread_connecting !== "boolean") + return "io_thread_connecting: boolean expected"; if (message.last_io_error != null && message.hasOwnProperty("last_io_error")) if (!$util.isString(message.last_io_error)) return "last_io_error: string expected"; - if (message.sql_state != null && message.hasOwnProperty("sql_state")) - if (!$util.isInteger(message.sql_state)) - return "sql_state: integer expected"; if (message.last_sql_error != null && message.hasOwnProperty("last_sql_error")) if (!$util.isString(message.last_sql_error)) return "last_sql_error: string expected"; @@ -63636,6 +63653,10 @@ $root.replicationdata = (function() { var message = new $root.replicationdata.Status(); if (object.position != null) message.position = String(object.position); + if (object.io_thread_running != null) + message.io_thread_running = Boolean(object.io_thread_running); + if (object.sql_thread_running != null) + message.sql_thread_running = Boolean(object.sql_thread_running); if (object.replication_lag_seconds != null) message.replication_lag_seconds = object.replication_lag_seconds >>> 0; if (object.source_host != null) @@ -63654,12 +63675,10 @@ $root.replicationdata = (function() { message.source_server_id = object.source_server_id >>> 0; if (object.source_uuid != null) message.source_uuid = String(object.source_uuid); - if (object.io_state != null) - message.io_state = object.io_state | 0; + if (object.io_thread_connecting != null) + message.io_thread_connecting = Boolean(object.io_thread_connecting); if (object.last_io_error != null) message.last_io_error = String(object.last_io_error); - if (object.sql_state != null) - message.sql_state = object.sql_state | 0; if (object.last_sql_error != null) message.last_sql_error = String(object.last_sql_error); return message; @@ -63680,6 +63699,8 @@ $root.replicationdata = (function() { var object = {}; if (options.defaults) { object.position = ""; + object.io_thread_running = false; + object.sql_thread_running = false; object.replication_lag_seconds = 0; object.source_host = ""; object.source_port = 0; @@ -63689,13 +63710,16 @@ $root.replicationdata = (function() { object.file_relay_log_position = ""; object.source_server_id = 0; object.source_uuid = ""; - object.io_state = 0; + object.io_thread_connecting = false; object.last_io_error = ""; - object.sql_state = 0; object.last_sql_error = ""; } if (message.position != null && message.hasOwnProperty("position")) object.position = message.position; + if (message.io_thread_running != null && message.hasOwnProperty("io_thread_running")) + object.io_thread_running = message.io_thread_running; + if (message.sql_thread_running != null && message.hasOwnProperty("sql_thread_running")) + object.sql_thread_running = message.sql_thread_running; if (message.replication_lag_seconds != null && message.hasOwnProperty("replication_lag_seconds")) object.replication_lag_seconds = message.replication_lag_seconds; if (message.source_host != null && message.hasOwnProperty("source_host")) @@ -63714,12 +63738,10 @@ $root.replicationdata = (function() { object.source_server_id = message.source_server_id; if (message.source_uuid != null && message.hasOwnProperty("source_uuid")) object.source_uuid = message.source_uuid; - if (message.io_state != null && message.hasOwnProperty("io_state")) - object.io_state = message.io_state; + if (message.io_thread_connecting != null && message.hasOwnProperty("io_thread_connecting")) + object.io_thread_connecting = message.io_thread_connecting; if (message.last_io_error != null && message.hasOwnProperty("last_io_error")) object.last_io_error = message.last_io_error; - if (message.sql_state != null && message.hasOwnProperty("sql_state")) - object.sql_state = message.sql_state; if (message.last_sql_error != null && message.hasOwnProperty("last_sql_error")) object.last_sql_error = message.last_sql_error; return object; From 34018e060706e9fb1d45f7d636517dd9773f4312 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 28 Apr 2022 13:58:17 -0400 Subject: [PATCH 11/22] This adds the new state fields back so that we can switch to them in v15 Signed-off-by: Matt Lord --- .../replicationdata/replicationdata.pb.go | 81 ++++++---- .../replicationdata_vtproto.pb.go | 66 ++++++++- proto/replicationdata.proto | 9 +- web/vtadmin/src/proto/vtadmin.d.ts | 36 +++++ web/vtadmin/src/proto/vtadmin.js | 138 +++++++++++++++++- 5 files changed, 292 insertions(+), 38 deletions(-) diff --git a/go/vt/proto/replicationdata/replicationdata.pb.go b/go/vt/proto/replicationdata/replicationdata.pb.go index 97d782b90c5..a2c134dcaaa 100644 --- a/go/vt/proto/replicationdata/replicationdata.pb.go +++ b/go/vt/proto/replicationdata/replicationdata.pb.go @@ -91,7 +91,10 @@ type Status struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` + // These fields need to be removed in Vitess 15 and fully replaced by the io_state and sql_state fields + // reserved 2, 3, 13; + // reserved "io_thread_running", "sql_thread_running", "io_thread_connecting"; IoThreadRunning bool `protobuf:"varint,2,opt,name=io_thread_running,json=ioThreadRunning,proto3" json:"io_thread_running,omitempty"` SqlThreadRunning bool `protobuf:"varint,3,opt,name=sql_thread_running,json=sqlThreadRunning,proto3" json:"sql_thread_running,omitempty"` ReplicationLagSeconds uint32 `protobuf:"varint,4,opt,name=replication_lag_seconds,json=replicationLagSeconds,proto3" json:"replication_lag_seconds,omitempty"` @@ -105,8 +108,10 @@ type Status struct { SourceServerId uint32 `protobuf:"varint,11,opt,name=source_server_id,json=sourceServerId,proto3" json:"source_server_id,omitempty"` SourceUuid string `protobuf:"bytes,12,opt,name=source_uuid,json=sourceUuid,proto3" json:"source_uuid,omitempty"` IoThreadConnecting bool `protobuf:"varint,13,opt,name=io_thread_connecting,json=ioThreadConnecting,proto3" json:"io_thread_connecting,omitempty"` - LastIoError string `protobuf:"bytes,14,opt,name=last_io_error,json=lastIoError,proto3" json:"last_io_error,omitempty"` - LastSqlError string `protobuf:"bytes,15,opt,name=last_sql_error,json=lastSqlError,proto3" json:"last_sql_error,omitempty"` + IoState int32 `protobuf:"varint,14,opt,name=io_state,json=ioState,proto3" json:"io_state,omitempty"` + LastIoError string `protobuf:"bytes,15,opt,name=last_io_error,json=lastIoError,proto3" json:"last_io_error,omitempty"` + SqlState int32 `protobuf:"varint,16,opt,name=sql_state,json=sqlState,proto3" json:"sql_state,omitempty"` + LastSqlError string `protobuf:"bytes,17,opt,name=last_sql_error,json=lastSqlError,proto3" json:"last_sql_error,omitempty"` } func (x *Status) Reset() { @@ -232,6 +237,13 @@ func (x *Status) GetIoThreadConnecting() bool { return false } +func (x *Status) GetIoState() int32 { + if x != nil { + return x.IoState + } + return 0 +} + func (x *Status) GetLastIoError() string { if x != nil { return x.LastIoError @@ -239,6 +251,13 @@ func (x *Status) GetLastIoError() string { return "" } +func (x *Status) GetSqlState() int32 { + if x != nil { + return x.SqlState + } + return 0 +} + func (x *Status) GetLastSqlError() string { if x != nil { return x.LastSqlError @@ -364,7 +383,7 @@ var File_replicationdata_proto protoreflect.FileDescriptor var file_replicationdata_proto_rawDesc = []byte{ 0x0a, 0x15, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x22, 0xee, 0x04, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa6, 0x05, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x75, 0x6e, @@ -399,31 +418,35 @@ var file_replicationdata_proto_rawDesc = []byte{ 0x14, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x6f, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x12, - 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6f, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6f, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x71, 0x6c, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, - 0x74, 0x53, 0x71, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x77, 0x0a, 0x15, 0x53, 0x74, 0x6f, - 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 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, 0x06, 0x62, 0x65, 0x66, - 0x6f, 0x72, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 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, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x22, 0x50, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x3b, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x49, - 0x4f, 0x41, 0x4e, 0x44, 0x53, 0x51, 0x4c, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x10, 0x00, 0x12, - 0x10, 0x0a, 0x0c, 0x49, 0x4f, 0x54, 0x48, 0x52, 0x45, 0x41, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x10, - 0x01, 0x42, 0x2e, 0x5a, 0x2c, 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, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x19, 0x0a, 0x08, 0x69, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x07, 0x69, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x69, 0x6f, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1b, + 0x0a, 0x09, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x71, 0x6c, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x77, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 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, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x61, + 0x66, 0x74, 0x65, 0x72, 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, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0x50, 0x0a, 0x0d, 0x50, 0x72, + 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x66, 0x69, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x3b, 0x0a, 0x13, + 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4f, 0x41, 0x4e, 0x44, 0x53, 0x51, 0x4c, 0x54, + 0x48, 0x52, 0x45, 0x41, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4f, 0x54, 0x48, 0x52, + 0x45, 0x41, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x42, 0x2e, 0x5a, 0x2c, 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, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go b/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go index 3bced0530ef..ac1dedf5458 100644 --- a/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go +++ b/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go @@ -53,14 +53,28 @@ func (m *Status) MarshalToSizedBufferVT(dAtA []byte) (int, error) { copy(dAtA[i:], m.LastSqlError) i = encodeVarint(dAtA, i, uint64(len(m.LastSqlError))) i-- - dAtA[i] = 0x7a + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x8a + } + if m.SqlState != 0 { + i = encodeVarint(dAtA, i, uint64(m.SqlState)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x80 } if len(m.LastIoError) > 0 { i -= len(m.LastIoError) copy(dAtA[i:], m.LastIoError) i = encodeVarint(dAtA, i, uint64(len(m.LastIoError))) i-- - dAtA[i] = 0x72 + dAtA[i] = 0x7a + } + if m.IoState != 0 { + i = encodeVarint(dAtA, i, uint64(m.IoState)) + i-- + dAtA[i] = 0x70 } if m.IoThreadConnecting { i-- @@ -319,13 +333,19 @@ func (m *Status) SizeVT() (n int) { if m.IoThreadConnecting { n += 2 } + if m.IoState != 0 { + n += 1 + sov(uint64(m.IoState)) + } l = len(m.LastIoError) if l > 0 { n += 1 + l + sov(uint64(l)) } + if m.SqlState != 0 { + n += 2 + sov(uint64(m.SqlState)) + } l = len(m.LastSqlError) if l > 0 { - n += 1 + l + sov(uint64(l)) + n += 2 + l + sov(uint64(l)) } if m.unknownFields != nil { n += len(m.unknownFields) @@ -737,6 +757,25 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } m.IoThreadConnecting = bool(v != 0) case 14: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IoState", wireType) + } + m.IoState = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.IoState |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 15: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field LastIoError", wireType) } @@ -768,7 +807,26 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } m.LastIoError = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 15: + case 16: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SqlState", wireType) + } + m.SqlState = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SqlState |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 17: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field LastSqlError", wireType) } diff --git a/proto/replicationdata.proto b/proto/replicationdata.proto index 87a6ea331e7..d378c08dc1f 100644 --- a/proto/replicationdata.proto +++ b/proto/replicationdata.proto @@ -25,6 +25,9 @@ package replicationdata; // flavor-specific command and parsed into a Position and fields. message Status { string position = 1; + // These fields should be removed in Vitess 15+ and fully replaced by the io_state and sql_state fields + // reserved 2, 3, 13; + // reserved "io_thread_running", "sql_thread_running", "io_thread_connecting"; bool io_thread_running = 2; bool sql_thread_running = 3; uint32 replication_lag_seconds = 4; @@ -38,8 +41,10 @@ message Status { uint32 source_server_id = 11; string source_uuid = 12; bool io_thread_connecting = 13; - string last_io_error = 14; - string last_sql_error = 15; + int32 io_state = 14; + string last_io_error = 15; + int32 sql_state = 16; + string last_sql_error = 17; } // StopReplicationStatus represents the replication status before calling StopReplication, and the replication status collected immediately after diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index cafafa89ef7..e04334e7fc9 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -26896,9 +26896,15 @@ export namespace replicationdata { /** Status io_thread_connecting */ io_thread_connecting?: (boolean|null); + /** Status io_state */ + io_state?: (number|null); + /** Status last_io_error */ last_io_error?: (string|null); + /** Status sql_state */ + sql_state?: (number|null); + /** Status last_sql_error */ last_sql_error?: (string|null); } @@ -26951,9 +26957,15 @@ export namespace replicationdata { /** Status io_thread_connecting. */ public io_thread_connecting: boolean; + /** Status io_state. */ + public io_state: number; + /** Status last_io_error. */ public last_io_error: string; + /** Status sql_state. */ + public sql_state: number; + /** Status last_sql_error. */ public last_sql_error: string; @@ -28590,6 +28602,12 @@ export namespace vtctldata { /** MaterializeSettings materialization_intent */ materialization_intent?: (vtctldata.MaterializationIntent|null); + + /** MaterializeSettings source_time_zone */ + source_time_zone?: (string|null); + + /** MaterializeSettings target_time_zone */ + target_time_zone?: (string|null); } /** Represents a MaterializeSettings. */ @@ -28628,6 +28646,12 @@ export namespace vtctldata { /** MaterializeSettings materialization_intent. */ public materialization_intent: vtctldata.MaterializationIntent; + /** MaterializeSettings source_time_zone. */ + public source_time_zone: string; + + /** MaterializeSettings target_time_zone. */ + public target_time_zone: string; + /** * Creates a new MaterializeSettings instance using the specified properties. * @param [properties] Properties to set @@ -45819,6 +45843,12 @@ export namespace binlogdata { /** BinlogSource external_cluster */ external_cluster?: (string|null); + + /** BinlogSource source_time_zone */ + source_time_zone?: (string|null); + + /** BinlogSource target_time_zone */ + target_time_zone?: (string|null); } /** Represents a BinlogSource. */ @@ -45860,6 +45890,12 @@ export namespace binlogdata { /** BinlogSource external_cluster. */ public external_cluster: string; + /** BinlogSource source_time_zone. */ + public source_time_zone: string; + + /** BinlogSource target_time_zone. */ + public target_time_zone: string; + /** * Creates a new BinlogSource 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 61d1b71f9cd..cf013ea65c6 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -63284,7 +63284,9 @@ $root.replicationdata = (function() { * @property {number|null} [source_server_id] Status source_server_id * @property {string|null} [source_uuid] Status source_uuid * @property {boolean|null} [io_thread_connecting] Status io_thread_connecting + * @property {number|null} [io_state] Status io_state * @property {string|null} [last_io_error] Status last_io_error + * @property {number|null} [sql_state] Status sql_state * @property {string|null} [last_sql_error] Status last_sql_error */ @@ -63407,6 +63409,14 @@ $root.replicationdata = (function() { */ Status.prototype.io_thread_connecting = false; + /** + * Status io_state. + * @member {number} io_state + * @memberof replicationdata.Status + * @instance + */ + Status.prototype.io_state = 0; + /** * Status last_io_error. * @member {string} last_io_error @@ -63415,6 +63425,14 @@ $root.replicationdata = (function() { */ Status.prototype.last_io_error = ""; + /** + * Status sql_state. + * @member {number} sql_state + * @memberof replicationdata.Status + * @instance + */ + Status.prototype.sql_state = 0; + /** * Status last_sql_error. * @member {string} last_sql_error @@ -63473,10 +63491,14 @@ $root.replicationdata = (function() { writer.uint32(/* id 12, wireType 2 =*/98).string(message.source_uuid); if (message.io_thread_connecting != null && Object.hasOwnProperty.call(message, "io_thread_connecting")) writer.uint32(/* id 13, wireType 0 =*/104).bool(message.io_thread_connecting); + if (message.io_state != null && Object.hasOwnProperty.call(message, "io_state")) + writer.uint32(/* id 14, wireType 0 =*/112).int32(message.io_state); if (message.last_io_error != null && Object.hasOwnProperty.call(message, "last_io_error")) - writer.uint32(/* id 14, wireType 2 =*/114).string(message.last_io_error); + writer.uint32(/* id 15, wireType 2 =*/122).string(message.last_io_error); + if (message.sql_state != null && Object.hasOwnProperty.call(message, "sql_state")) + writer.uint32(/* id 16, wireType 0 =*/128).int32(message.sql_state); if (message.last_sql_error != null && Object.hasOwnProperty.call(message, "last_sql_error")) - writer.uint32(/* id 15, wireType 2 =*/122).string(message.last_sql_error); + writer.uint32(/* id 17, wireType 2 =*/138).string(message.last_sql_error); return writer; }; @@ -63551,9 +63573,15 @@ $root.replicationdata = (function() { message.io_thread_connecting = reader.bool(); break; case 14: - message.last_io_error = reader.string(); + message.io_state = reader.int32(); break; case 15: + message.last_io_error = reader.string(); + break; + case 16: + message.sql_state = reader.int32(); + break; + case 17: message.last_sql_error = reader.string(); break; default: @@ -63630,9 +63658,15 @@ $root.replicationdata = (function() { if (message.io_thread_connecting != null && message.hasOwnProperty("io_thread_connecting")) if (typeof message.io_thread_connecting !== "boolean") return "io_thread_connecting: boolean expected"; + if (message.io_state != null && message.hasOwnProperty("io_state")) + if (!$util.isInteger(message.io_state)) + return "io_state: integer expected"; if (message.last_io_error != null && message.hasOwnProperty("last_io_error")) if (!$util.isString(message.last_io_error)) return "last_io_error: string expected"; + if (message.sql_state != null && message.hasOwnProperty("sql_state")) + if (!$util.isInteger(message.sql_state)) + return "sql_state: integer expected"; if (message.last_sql_error != null && message.hasOwnProperty("last_sql_error")) if (!$util.isString(message.last_sql_error)) return "last_sql_error: string expected"; @@ -63677,8 +63711,12 @@ $root.replicationdata = (function() { message.source_uuid = String(object.source_uuid); if (object.io_thread_connecting != null) message.io_thread_connecting = Boolean(object.io_thread_connecting); + if (object.io_state != null) + message.io_state = object.io_state | 0; if (object.last_io_error != null) message.last_io_error = String(object.last_io_error); + if (object.sql_state != null) + message.sql_state = object.sql_state | 0; if (object.last_sql_error != null) message.last_sql_error = String(object.last_sql_error); return message; @@ -63711,7 +63749,9 @@ $root.replicationdata = (function() { object.source_server_id = 0; object.source_uuid = ""; object.io_thread_connecting = false; + object.io_state = 0; object.last_io_error = ""; + object.sql_state = 0; object.last_sql_error = ""; } if (message.position != null && message.hasOwnProperty("position")) @@ -63740,8 +63780,12 @@ $root.replicationdata = (function() { object.source_uuid = message.source_uuid; if (message.io_thread_connecting != null && message.hasOwnProperty("io_thread_connecting")) object.io_thread_connecting = message.io_thread_connecting; + if (message.io_state != null && message.hasOwnProperty("io_state")) + object.io_state = message.io_state; if (message.last_io_error != null && message.hasOwnProperty("last_io_error")) object.last_io_error = message.last_io_error; + if (message.sql_state != null && message.hasOwnProperty("sql_state")) + object.sql_state = message.sql_state; if (message.last_sql_error != null && message.hasOwnProperty("last_sql_error")) object.last_sql_error = message.last_sql_error; return object; @@ -67759,6 +67803,8 @@ $root.vtctldata = (function() { * @property {string|null} [tablet_types] MaterializeSettings tablet_types * @property {string|null} [external_cluster] MaterializeSettings external_cluster * @property {vtctldata.MaterializationIntent|null} [materialization_intent] MaterializeSettings materialization_intent + * @property {string|null} [source_time_zone] MaterializeSettings source_time_zone + * @property {string|null} [target_time_zone] MaterializeSettings target_time_zone */ /** @@ -67849,6 +67895,22 @@ $root.vtctldata = (function() { */ MaterializeSettings.prototype.materialization_intent = 0; + /** + * MaterializeSettings source_time_zone. + * @member {string} source_time_zone + * @memberof vtctldata.MaterializeSettings + * @instance + */ + MaterializeSettings.prototype.source_time_zone = ""; + + /** + * MaterializeSettings target_time_zone. + * @member {string} target_time_zone + * @memberof vtctldata.MaterializeSettings + * @instance + */ + MaterializeSettings.prototype.target_time_zone = ""; + /** * Creates a new MaterializeSettings instance using the specified properties. * @function create @@ -67892,6 +67954,10 @@ $root.vtctldata = (function() { writer.uint32(/* id 8, wireType 2 =*/66).string(message.external_cluster); if (message.materialization_intent != null && Object.hasOwnProperty.call(message, "materialization_intent")) writer.uint32(/* id 9, wireType 0 =*/72).int32(message.materialization_intent); + if (message.source_time_zone != null && Object.hasOwnProperty.call(message, "source_time_zone")) + writer.uint32(/* id 10, wireType 2 =*/82).string(message.source_time_zone); + if (message.target_time_zone != null && Object.hasOwnProperty.call(message, "target_time_zone")) + writer.uint32(/* id 11, wireType 2 =*/90).string(message.target_time_zone); return writer; }; @@ -67955,6 +68021,12 @@ $root.vtctldata = (function() { case 9: message.materialization_intent = reader.int32(); break; + case 10: + message.source_time_zone = reader.string(); + break; + case 11: + message.target_time_zone = reader.string(); + break; default: reader.skipType(tag & 7); break; @@ -68029,6 +68101,12 @@ $root.vtctldata = (function() { case 2: break; } + if (message.source_time_zone != null && message.hasOwnProperty("source_time_zone")) + if (!$util.isString(message.source_time_zone)) + return "source_time_zone: string expected"; + if (message.target_time_zone != null && message.hasOwnProperty("target_time_zone")) + if (!$util.isString(message.target_time_zone)) + return "target_time_zone: string expected"; return null; }; @@ -68082,6 +68160,10 @@ $root.vtctldata = (function() { message.materialization_intent = 2; break; } + if (object.source_time_zone != null) + message.source_time_zone = String(object.source_time_zone); + if (object.target_time_zone != null) + message.target_time_zone = String(object.target_time_zone); return message; }; @@ -68109,6 +68191,8 @@ $root.vtctldata = (function() { object.tablet_types = ""; object.external_cluster = ""; object.materialization_intent = options.enums === String ? "CUSTOM" : 0; + object.source_time_zone = ""; + object.target_time_zone = ""; } if (message.workflow != null && message.hasOwnProperty("workflow")) object.workflow = message.workflow; @@ -68131,6 +68215,10 @@ $root.vtctldata = (function() { object.external_cluster = message.external_cluster; if (message.materialization_intent != null && message.hasOwnProperty("materialization_intent")) object.materialization_intent = options.enums === String ? $root.vtctldata.MaterializationIntent[message.materialization_intent] : message.materialization_intent; + if (message.source_time_zone != null && message.hasOwnProperty("source_time_zone")) + object.source_time_zone = message.source_time_zone; + if (message.target_time_zone != null && message.hasOwnProperty("target_time_zone")) + object.target_time_zone = message.target_time_zone; return object; }; @@ -108038,6 +108126,8 @@ $root.binlogdata = (function() { * @property {string|null} [external_mysql] BinlogSource external_mysql * @property {boolean|null} [stop_after_copy] BinlogSource stop_after_copy * @property {string|null} [external_cluster] BinlogSource external_cluster + * @property {string|null} [source_time_zone] BinlogSource source_time_zone + * @property {string|null} [target_time_zone] BinlogSource target_time_zone */ /** @@ -108136,6 +108226,22 @@ $root.binlogdata = (function() { */ BinlogSource.prototype.external_cluster = ""; + /** + * BinlogSource source_time_zone. + * @member {string} source_time_zone + * @memberof binlogdata.BinlogSource + * @instance + */ + BinlogSource.prototype.source_time_zone = ""; + + /** + * BinlogSource target_time_zone. + * @member {string} target_time_zone + * @memberof binlogdata.BinlogSource + * @instance + */ + BinlogSource.prototype.target_time_zone = ""; + /** * Creates a new BinlogSource instance using the specified properties. * @function create @@ -108181,6 +108287,10 @@ $root.binlogdata = (function() { writer.uint32(/* id 9, wireType 0 =*/72).bool(message.stop_after_copy); if (message.external_cluster != null && Object.hasOwnProperty.call(message, "external_cluster")) writer.uint32(/* id 10, wireType 2 =*/82).string(message.external_cluster); + if (message.source_time_zone != null && Object.hasOwnProperty.call(message, "source_time_zone")) + writer.uint32(/* id 11, wireType 2 =*/90).string(message.source_time_zone); + if (message.target_time_zone != null && Object.hasOwnProperty.call(message, "target_time_zone")) + writer.uint32(/* id 12, wireType 2 =*/98).string(message.target_time_zone); return writer; }; @@ -108247,6 +108357,12 @@ $root.binlogdata = (function() { case 10: message.external_cluster = reader.string(); break; + case 11: + message.source_time_zone = reader.string(); + break; + case 12: + message.target_time_zone = reader.string(); + break; default: reader.skipType(tag & 7); break; @@ -108341,6 +108457,12 @@ $root.binlogdata = (function() { if (message.external_cluster != null && message.hasOwnProperty("external_cluster")) if (!$util.isString(message.external_cluster)) return "external_cluster: string expected"; + if (message.source_time_zone != null && message.hasOwnProperty("source_time_zone")) + if (!$util.isString(message.source_time_zone)) + return "source_time_zone: string expected"; + if (message.target_time_zone != null && message.hasOwnProperty("target_time_zone")) + if (!$util.isString(message.target_time_zone)) + return "target_time_zone: string expected"; return null; }; @@ -108447,6 +108569,10 @@ $root.binlogdata = (function() { message.stop_after_copy = Boolean(object.stop_after_copy); if (object.external_cluster != null) message.external_cluster = String(object.external_cluster); + if (object.source_time_zone != null) + message.source_time_zone = String(object.source_time_zone); + if (object.target_time_zone != null) + message.target_time_zone = String(object.target_time_zone); return message; }; @@ -108475,6 +108601,8 @@ $root.binlogdata = (function() { object.external_mysql = ""; object.stop_after_copy = false; object.external_cluster = ""; + object.source_time_zone = ""; + object.target_time_zone = ""; } if (message.keyspace != null && message.hasOwnProperty("keyspace")) object.keyspace = message.keyspace; @@ -108499,6 +108627,10 @@ $root.binlogdata = (function() { object.stop_after_copy = message.stop_after_copy; if (message.external_cluster != null && message.hasOwnProperty("external_cluster")) object.external_cluster = message.external_cluster; + if (message.source_time_zone != null && message.hasOwnProperty("source_time_zone")) + object.source_time_zone = message.source_time_zone; + if (message.target_time_zone != null && message.hasOwnProperty("target_time_zone")) + object.target_time_zone = message.target_time_zone; return object; }; From 5aa5273f3d88d0279fa53e7dd3240d2011e5a841 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 28 Apr 2022 14:11:26 -0400 Subject: [PATCH 12/22] Allow for safe/smooth upgrades within 14.0-SNAPSHOT We are only appending the last io_thread_connecting field Signed-off-by: Matt Lord --- .../replicationdata/replicationdata.pb.go | 54 ++++++------ .../replicationdata_vtproto.pb.go | 84 +++++++++---------- proto/replicationdata.proto | 12 +-- web/vtadmin/src/proto/vtadmin.d.ts | 12 +-- web/vtadmin/src/proto/vtadmin.js | 56 ++++++------- 5 files changed, 109 insertions(+), 109 deletions(-) diff --git a/go/vt/proto/replicationdata/replicationdata.pb.go b/go/vt/proto/replicationdata/replicationdata.pb.go index a2c134dcaaa..8053a800127 100644 --- a/go/vt/proto/replicationdata/replicationdata.pb.go +++ b/go/vt/proto/replicationdata/replicationdata.pb.go @@ -92,8 +92,8 @@ type Status struct { unknownFields protoimpl.UnknownFields Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` - // These fields need to be removed in Vitess 15 and fully replaced by the io_state and sql_state fields - // reserved 2, 3, 13; + // These fields should be removed in Vitess 15+ and fully replaced by the io_state and sql_state fields + // reserved 2, 3, 17; // reserved "io_thread_running", "sql_thread_running", "io_thread_connecting"; IoThreadRunning bool `protobuf:"varint,2,opt,name=io_thread_running,json=ioThreadRunning,proto3" json:"io_thread_running,omitempty"` SqlThreadRunning bool `protobuf:"varint,3,opt,name=sql_thread_running,json=sqlThreadRunning,proto3" json:"sql_thread_running,omitempty"` @@ -107,11 +107,11 @@ type Status struct { FileRelayLogPosition string `protobuf:"bytes,10,opt,name=file_relay_log_position,json=fileRelayLogPosition,proto3" json:"file_relay_log_position,omitempty"` SourceServerId uint32 `protobuf:"varint,11,opt,name=source_server_id,json=sourceServerId,proto3" json:"source_server_id,omitempty"` SourceUuid string `protobuf:"bytes,12,opt,name=source_uuid,json=sourceUuid,proto3" json:"source_uuid,omitempty"` - IoThreadConnecting bool `protobuf:"varint,13,opt,name=io_thread_connecting,json=ioThreadConnecting,proto3" json:"io_thread_connecting,omitempty"` - IoState int32 `protobuf:"varint,14,opt,name=io_state,json=ioState,proto3" json:"io_state,omitempty"` - LastIoError string `protobuf:"bytes,15,opt,name=last_io_error,json=lastIoError,proto3" json:"last_io_error,omitempty"` - SqlState int32 `protobuf:"varint,16,opt,name=sql_state,json=sqlState,proto3" json:"sql_state,omitempty"` - LastSqlError string `protobuf:"bytes,17,opt,name=last_sql_error,json=lastSqlError,proto3" json:"last_sql_error,omitempty"` + IoState int32 `protobuf:"varint,13,opt,name=io_state,json=ioState,proto3" json:"io_state,omitempty"` + LastIoError string `protobuf:"bytes,14,opt,name=last_io_error,json=lastIoError,proto3" json:"last_io_error,omitempty"` + SqlState int32 `protobuf:"varint,15,opt,name=sql_state,json=sqlState,proto3" json:"sql_state,omitempty"` + LastSqlError string `protobuf:"bytes,16,opt,name=last_sql_error,json=lastSqlError,proto3" json:"last_sql_error,omitempty"` + IoThreadConnecting bool `protobuf:"varint,17,opt,name=io_thread_connecting,json=ioThreadConnecting,proto3" json:"io_thread_connecting,omitempty"` } func (x *Status) Reset() { @@ -230,13 +230,6 @@ func (x *Status) GetSourceUuid() string { return "" } -func (x *Status) GetIoThreadConnecting() bool { - if x != nil { - return x.IoThreadConnecting - } - return false -} - func (x *Status) GetIoState() int32 { if x != nil { return x.IoState @@ -265,6 +258,13 @@ func (x *Status) GetLastSqlError() string { return "" } +func (x *Status) GetIoThreadConnecting() bool { + if x != nil { + return x.IoThreadConnecting + } + return false +} + // StopReplicationStatus represents the replication status before calling StopReplication, and the replication status collected immediately after // calling StopReplication. type StopReplicationStatus struct { @@ -414,19 +414,19 @@ var file_replicationdata_proto_rawDesc = []byte{ 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x30, 0x0a, - 0x14, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x6f, 0x54, - 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x12, - 0x19, 0x0a, 0x08, 0x69, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x07, 0x69, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x69, 0x6f, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1b, - 0x0a, 0x09, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x71, 0x6c, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0x77, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x19, 0x0a, + 0x08, 0x69, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x69, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x69, 0x6f, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x09, + 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x73, 0x71, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x71, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, + 0x30, 0x0a, 0x14, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, + 0x6f, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, + 0x67, 0x22, 0x77, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 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, diff --git a/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go b/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go index ac1dedf5458..f42a15091bc 100644 --- a/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go +++ b/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go @@ -48,6 +48,18 @@ func (m *Status) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.IoThreadConnecting { + i-- + if m.IoThreadConnecting { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x88 + } if len(m.LastSqlError) > 0 { i -= len(m.LastSqlError) copy(dAtA[i:], m.LastSqlError) @@ -55,35 +67,23 @@ func (m *Status) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1 i-- - dAtA[i] = 0x8a + dAtA[i] = 0x82 } if m.SqlState != 0 { i = encodeVarint(dAtA, i, uint64(m.SqlState)) i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x80 + dAtA[i] = 0x78 } if len(m.LastIoError) > 0 { i -= len(m.LastIoError) copy(dAtA[i:], m.LastIoError) i = encodeVarint(dAtA, i, uint64(len(m.LastIoError))) i-- - dAtA[i] = 0x7a + dAtA[i] = 0x72 } if m.IoState != 0 { i = encodeVarint(dAtA, i, uint64(m.IoState)) i-- - dAtA[i] = 0x70 - } - if m.IoThreadConnecting { - i-- - if m.IoThreadConnecting { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- dAtA[i] = 0x68 } if len(m.SourceUuid) > 0 { @@ -330,9 +330,6 @@ func (m *Status) SizeVT() (n int) { if l > 0 { n += 1 + l + sov(uint64(l)) } - if m.IoThreadConnecting { - n += 2 - } if m.IoState != 0 { n += 1 + sov(uint64(m.IoState)) } @@ -341,12 +338,15 @@ func (m *Status) SizeVT() (n int) { n += 1 + l + sov(uint64(l)) } if m.SqlState != 0 { - n += 2 + sov(uint64(m.SqlState)) + n += 1 + sov(uint64(m.SqlState)) } l = len(m.LastSqlError) if l > 0 { n += 2 + l + sov(uint64(l)) } + if m.IoThreadConnecting { + n += 3 + } if m.unknownFields != nil { n += len(m.unknownFields) } @@ -737,26 +737,6 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { m.SourceUuid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 13: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IoThreadConnecting", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IoThreadConnecting = bool(v != 0) - case 14: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field IoState", wireType) } @@ -775,7 +755,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { break } } - case 15: + case 14: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field LastIoError", wireType) } @@ -807,7 +787,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } m.LastIoError = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 16: + case 15: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SqlState", wireType) } @@ -826,7 +806,7 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { break } } - case 17: + case 16: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field LastSqlError", wireType) } @@ -858,6 +838,26 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } m.LastSqlError = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 17: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IoThreadConnecting", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IoThreadConnecting = bool(v != 0) default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) diff --git a/proto/replicationdata.proto b/proto/replicationdata.proto index d378c08dc1f..f6bb8df1a06 100644 --- a/proto/replicationdata.proto +++ b/proto/replicationdata.proto @@ -26,7 +26,7 @@ package replicationdata; message Status { string position = 1; // These fields should be removed in Vitess 15+ and fully replaced by the io_state and sql_state fields - // reserved 2, 3, 13; + // reserved 2, 3, 17; // reserved "io_thread_running", "sql_thread_running", "io_thread_connecting"; bool io_thread_running = 2; bool sql_thread_running = 3; @@ -40,11 +40,11 @@ message Status { string file_relay_log_position = 10; uint32 source_server_id = 11; string source_uuid = 12; - bool io_thread_connecting = 13; - int32 io_state = 14; - string last_io_error = 15; - int32 sql_state = 16; - string last_sql_error = 17; + int32 io_state = 13; + string last_io_error = 14; + int32 sql_state = 15; + string last_sql_error = 16; + bool io_thread_connecting = 17; } // StopReplicationStatus represents the replication status before calling StopReplication, and the replication status collected immediately after diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index e04334e7fc9..57fcb758727 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -26893,9 +26893,6 @@ export namespace replicationdata { /** Status source_uuid */ source_uuid?: (string|null); - /** Status io_thread_connecting */ - io_thread_connecting?: (boolean|null); - /** Status io_state */ io_state?: (number|null); @@ -26907,6 +26904,9 @@ export namespace replicationdata { /** Status last_sql_error */ last_sql_error?: (string|null); + + /** Status io_thread_connecting */ + io_thread_connecting?: (boolean|null); } /** Represents a Status. */ @@ -26954,9 +26954,6 @@ export namespace replicationdata { /** Status source_uuid. */ public source_uuid: string; - /** Status io_thread_connecting. */ - public io_thread_connecting: boolean; - /** Status io_state. */ public io_state: number; @@ -26969,6 +26966,9 @@ export namespace replicationdata { /** Status last_sql_error. */ public last_sql_error: string; + /** Status io_thread_connecting. */ + public io_thread_connecting: boolean; + /** * Creates a new Status 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 cf013ea65c6..5df8e60eb33 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -63283,11 +63283,11 @@ $root.replicationdata = (function() { * @property {string|null} [file_relay_log_position] Status file_relay_log_position * @property {number|null} [source_server_id] Status source_server_id * @property {string|null} [source_uuid] Status source_uuid - * @property {boolean|null} [io_thread_connecting] Status io_thread_connecting * @property {number|null} [io_state] Status io_state * @property {string|null} [last_io_error] Status last_io_error * @property {number|null} [sql_state] Status sql_state * @property {string|null} [last_sql_error] Status last_sql_error + * @property {boolean|null} [io_thread_connecting] Status io_thread_connecting */ /** @@ -63401,14 +63401,6 @@ $root.replicationdata = (function() { */ Status.prototype.source_uuid = ""; - /** - * Status io_thread_connecting. - * @member {boolean} io_thread_connecting - * @memberof replicationdata.Status - * @instance - */ - Status.prototype.io_thread_connecting = false; - /** * Status io_state. * @member {number} io_state @@ -63441,6 +63433,14 @@ $root.replicationdata = (function() { */ Status.prototype.last_sql_error = ""; + /** + * Status io_thread_connecting. + * @member {boolean} io_thread_connecting + * @memberof replicationdata.Status + * @instance + */ + Status.prototype.io_thread_connecting = false; + /** * Creates a new Status instance using the specified properties. * @function create @@ -63489,16 +63489,16 @@ $root.replicationdata = (function() { writer.uint32(/* id 11, wireType 0 =*/88).uint32(message.source_server_id); if (message.source_uuid != null && Object.hasOwnProperty.call(message, "source_uuid")) writer.uint32(/* id 12, wireType 2 =*/98).string(message.source_uuid); - if (message.io_thread_connecting != null && Object.hasOwnProperty.call(message, "io_thread_connecting")) - writer.uint32(/* id 13, wireType 0 =*/104).bool(message.io_thread_connecting); if (message.io_state != null && Object.hasOwnProperty.call(message, "io_state")) - writer.uint32(/* id 14, wireType 0 =*/112).int32(message.io_state); + writer.uint32(/* id 13, wireType 0 =*/104).int32(message.io_state); if (message.last_io_error != null && Object.hasOwnProperty.call(message, "last_io_error")) - writer.uint32(/* id 15, wireType 2 =*/122).string(message.last_io_error); + writer.uint32(/* id 14, wireType 2 =*/114).string(message.last_io_error); if (message.sql_state != null && Object.hasOwnProperty.call(message, "sql_state")) - writer.uint32(/* id 16, wireType 0 =*/128).int32(message.sql_state); + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.sql_state); if (message.last_sql_error != null && Object.hasOwnProperty.call(message, "last_sql_error")) - writer.uint32(/* id 17, wireType 2 =*/138).string(message.last_sql_error); + writer.uint32(/* id 16, wireType 2 =*/130).string(message.last_sql_error); + if (message.io_thread_connecting != null && Object.hasOwnProperty.call(message, "io_thread_connecting")) + writer.uint32(/* id 17, wireType 0 =*/136).bool(message.io_thread_connecting); return writer; }; @@ -63570,19 +63570,19 @@ $root.replicationdata = (function() { message.source_uuid = reader.string(); break; case 13: - message.io_thread_connecting = reader.bool(); + message.io_state = reader.int32(); break; case 14: - message.io_state = reader.int32(); + message.last_io_error = reader.string(); break; case 15: - message.last_io_error = reader.string(); + message.sql_state = reader.int32(); break; case 16: - message.sql_state = reader.int32(); + message.last_sql_error = reader.string(); break; case 17: - message.last_sql_error = reader.string(); + message.io_thread_connecting = reader.bool(); break; default: reader.skipType(tag & 7); @@ -63655,9 +63655,6 @@ $root.replicationdata = (function() { if (message.source_uuid != null && message.hasOwnProperty("source_uuid")) if (!$util.isString(message.source_uuid)) return "source_uuid: string expected"; - if (message.io_thread_connecting != null && message.hasOwnProperty("io_thread_connecting")) - if (typeof message.io_thread_connecting !== "boolean") - return "io_thread_connecting: boolean expected"; if (message.io_state != null && message.hasOwnProperty("io_state")) if (!$util.isInteger(message.io_state)) return "io_state: integer expected"; @@ -63670,6 +63667,9 @@ $root.replicationdata = (function() { if (message.last_sql_error != null && message.hasOwnProperty("last_sql_error")) if (!$util.isString(message.last_sql_error)) return "last_sql_error: string expected"; + if (message.io_thread_connecting != null && message.hasOwnProperty("io_thread_connecting")) + if (typeof message.io_thread_connecting !== "boolean") + return "io_thread_connecting: boolean expected"; return null; }; @@ -63709,8 +63709,6 @@ $root.replicationdata = (function() { message.source_server_id = object.source_server_id >>> 0; if (object.source_uuid != null) message.source_uuid = String(object.source_uuid); - if (object.io_thread_connecting != null) - message.io_thread_connecting = Boolean(object.io_thread_connecting); if (object.io_state != null) message.io_state = object.io_state | 0; if (object.last_io_error != null) @@ -63719,6 +63717,8 @@ $root.replicationdata = (function() { message.sql_state = object.sql_state | 0; if (object.last_sql_error != null) message.last_sql_error = String(object.last_sql_error); + if (object.io_thread_connecting != null) + message.io_thread_connecting = Boolean(object.io_thread_connecting); return message; }; @@ -63748,11 +63748,11 @@ $root.replicationdata = (function() { object.file_relay_log_position = ""; object.source_server_id = 0; object.source_uuid = ""; - object.io_thread_connecting = false; object.io_state = 0; object.last_io_error = ""; object.sql_state = 0; object.last_sql_error = ""; + object.io_thread_connecting = false; } if (message.position != null && message.hasOwnProperty("position")) object.position = message.position; @@ -63778,8 +63778,6 @@ $root.replicationdata = (function() { object.source_server_id = message.source_server_id; if (message.source_uuid != null && message.hasOwnProperty("source_uuid")) object.source_uuid = message.source_uuid; - if (message.io_thread_connecting != null && message.hasOwnProperty("io_thread_connecting")) - object.io_thread_connecting = message.io_thread_connecting; if (message.io_state != null && message.hasOwnProperty("io_state")) object.io_state = message.io_state; if (message.last_io_error != null && message.hasOwnProperty("last_io_error")) @@ -63788,6 +63786,8 @@ $root.replicationdata = (function() { object.sql_state = message.sql_state; if (message.last_sql_error != null && message.hasOwnProperty("last_sql_error")) object.last_sql_error = message.last_sql_error; + if (message.io_thread_connecting != null && message.hasOwnProperty("io_thread_connecting")) + object.io_thread_connecting = message.io_thread_connecting; return object; }; From 1621856537d1e58c36347f51f9e0d00862a030c9 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 28 Apr 2022 14:45:36 -0400 Subject: [PATCH 13/22] Avoid intermediate io_thread_connecting protobuf field Signed-off-by: Matt Lord --- go/mysql/replication_status.go | 40 ++++++------- .../replicationdata/replicationdata.pb.go | 60 ++++++++----------- .../replicationdata_vtproto.pb.go | 35 ----------- proto/replicationdata.proto | 5 +- web/vtadmin/src/proto/vtadmin.d.ts | 6 -- web/vtadmin/src/proto/vtadmin.js | 22 ------- 6 files changed, 44 insertions(+), 124 deletions(-) diff --git a/go/mysql/replication_status.go b/go/mysql/replication_status.go index 201c88a426c..fb2a0f242d7 100644 --- a/go/mysql/replication_status.go +++ b/go/mysql/replication_status.go @@ -75,7 +75,7 @@ func (s *ReplicationStatus) SQLHealthy() bool { // ReplicationStatusToProto translates a Status to proto3. func ReplicationStatusToProto(s ReplicationStatus) *replicationdatapb.Status { - replstatus := replicationdatapb.Status{ + return &replicationdatapb.Status{ Position: EncodePosition(s.Position), RelayLogPosition: EncodePosition(s.RelayLogPosition), FilePosition: EncodePosition(s.FilePosition), @@ -86,18 +86,11 @@ func ReplicationStatusToProto(s ReplicationStatus) *replicationdatapb.Status { SourcePort: int32(s.SourcePort), ConnectRetry: int32(s.ConnectRetry), SourceUuid: s.SourceUUID.String(), + IoState: int32(s.IOState), LastIoError: s.LastIOError, + SqlState: int32(s.SQLState), LastSqlError: s.LastSQLError, } - if s.IOState == ReplicationStateRunning { - replstatus.IoThreadRunning = true - } else if s.IOState == ReplicationStateConnecting { - replstatus.IoThreadConnecting = true - } - if s.SQLState == ReplicationStateRunning { - replstatus.SqlThreadRunning = true - } - return &replstatus } // ProtoToReplicationStatus translates a proto Status, or panics. @@ -136,18 +129,21 @@ func ProtoToReplicationStatus(s *replicationdatapb.Status) ReplicationStatus { SourcePort: int(s.SourcePort), ConnectRetry: int(s.ConnectRetry), SourceUUID: sid, - } - if s.IoThreadRunning { - replstatus.IOState = ReplicationStateRunning - } else if s.IoThreadConnecting { - replstatus.IOState = ReplicationStateConnecting - } else { - replstatus.IOState = ReplicationStateStopped - } - if s.SqlThreadRunning { - replstatus.SQLState = ReplicationStateRunning - } else { - replstatus.SQLState = ReplicationStateStopped + IOState: ReplicationState(s.IoState), + LastIOError: s.LastIoError, + SQLState: ReplicationState(s.SqlState), + LastSQLError: s.LastSqlError, + } + // We need to be able to process gRPC response messages from v13 and older tablets. + // In those cases there will be no value (uknown) for the IoState but the message + // will have the IoThreadRunning boolean and we need to revert to our assumptions + // about a binary state as that's all the older tablet can provide. + if s.IoState == int32(ReplicationStateUnknown) { + if s.IoThreadRunning { + replstatus.IOState = ReplicationStateRunning + } else { + replstatus.IOState = ReplicationStateStopped + } } return replstatus } diff --git a/go/vt/proto/replicationdata/replicationdata.pb.go b/go/vt/proto/replicationdata/replicationdata.pb.go index 8053a800127..ea787626223 100644 --- a/go/vt/proto/replicationdata/replicationdata.pb.go +++ b/go/vt/proto/replicationdata/replicationdata.pb.go @@ -93,8 +93,8 @@ type Status struct { Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` // These fields should be removed in Vitess 15+ and fully replaced by the io_state and sql_state fields - // reserved 2, 3, 17; - // reserved "io_thread_running", "sql_thread_running", "io_thread_connecting"; + // reserved 2, 3; + // reserved "io_thread_running", "sql_thread_running"; IoThreadRunning bool `protobuf:"varint,2,opt,name=io_thread_running,json=ioThreadRunning,proto3" json:"io_thread_running,omitempty"` SqlThreadRunning bool `protobuf:"varint,3,opt,name=sql_thread_running,json=sqlThreadRunning,proto3" json:"sql_thread_running,omitempty"` ReplicationLagSeconds uint32 `protobuf:"varint,4,opt,name=replication_lag_seconds,json=replicationLagSeconds,proto3" json:"replication_lag_seconds,omitempty"` @@ -111,7 +111,6 @@ type Status struct { LastIoError string `protobuf:"bytes,14,opt,name=last_io_error,json=lastIoError,proto3" json:"last_io_error,omitempty"` SqlState int32 `protobuf:"varint,15,opt,name=sql_state,json=sqlState,proto3" json:"sql_state,omitempty"` LastSqlError string `protobuf:"bytes,16,opt,name=last_sql_error,json=lastSqlError,proto3" json:"last_sql_error,omitempty"` - IoThreadConnecting bool `protobuf:"varint,17,opt,name=io_thread_connecting,json=ioThreadConnecting,proto3" json:"io_thread_connecting,omitempty"` } func (x *Status) Reset() { @@ -258,13 +257,6 @@ func (x *Status) GetLastSqlError() string { return "" } -func (x *Status) GetIoThreadConnecting() bool { - if x != nil { - return x.IoThreadConnecting - } - return false -} - // StopReplicationStatus represents the replication status before calling StopReplication, and the replication status collected immediately after // calling StopReplication. type StopReplicationStatus struct { @@ -383,7 +375,7 @@ var File_replicationdata_proto protoreflect.FileDescriptor var file_replicationdata_proto_rawDesc = []byte{ 0x0a, 0x15, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa6, 0x05, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x22, 0xf4, 0x04, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x72, 0x75, 0x6e, @@ -422,31 +414,27 @@ var file_replicationdata_proto_rawDesc = []byte{ 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x71, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x71, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x30, 0x0a, 0x14, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, - 0x6f, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, - 0x67, 0x22, 0x77, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x62, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 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, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x61, - 0x66, 0x74, 0x65, 0x72, 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, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0x50, 0x0a, 0x0d, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x66, 0x69, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x3b, 0x0a, 0x13, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4f, 0x41, 0x4e, 0x44, 0x53, 0x51, 0x4c, 0x54, - 0x48, 0x52, 0x45, 0x41, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4f, 0x54, 0x48, 0x52, - 0x45, 0x41, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x42, 0x2e, 0x5a, 0x2c, 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, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x71, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x77, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x18, 0x01, 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, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x61, 0x66, 0x74, + 0x65, 0x72, 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, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0x50, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x69, + 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x3b, 0x0a, 0x13, 0x53, 0x74, + 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4f, 0x41, 0x4e, 0x44, 0x53, 0x51, 0x4c, 0x54, 0x48, 0x52, + 0x45, 0x41, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4f, 0x54, 0x48, 0x52, 0x45, 0x41, + 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x42, 0x2e, 0x5a, 0x2c, 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, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go b/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go index f42a15091bc..e928b53e79e 100644 --- a/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go +++ b/go/vt/proto/replicationdata/replicationdata_vtproto.pb.go @@ -48,18 +48,6 @@ func (m *Status) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.IoThreadConnecting { - i-- - if m.IoThreadConnecting { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0x88 - } if len(m.LastSqlError) > 0 { i -= len(m.LastSqlError) copy(dAtA[i:], m.LastSqlError) @@ -344,9 +332,6 @@ func (m *Status) SizeVT() (n int) { if l > 0 { n += 2 + l + sov(uint64(l)) } - if m.IoThreadConnecting { - n += 3 - } if m.unknownFields != nil { n += len(m.unknownFields) } @@ -838,26 +823,6 @@ func (m *Status) UnmarshalVT(dAtA []byte) error { } m.LastSqlError = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 17: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IoThreadConnecting", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IoThreadConnecting = bool(v != 0) default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) diff --git a/proto/replicationdata.proto b/proto/replicationdata.proto index f6bb8df1a06..f62b63b5c9e 100644 --- a/proto/replicationdata.proto +++ b/proto/replicationdata.proto @@ -26,8 +26,8 @@ package replicationdata; message Status { string position = 1; // These fields should be removed in Vitess 15+ and fully replaced by the io_state and sql_state fields - // reserved 2, 3, 17; - // reserved "io_thread_running", "sql_thread_running", "io_thread_connecting"; + // reserved 2, 3; + // reserved "io_thread_running", "sql_thread_running"; bool io_thread_running = 2; bool sql_thread_running = 3; uint32 replication_lag_seconds = 4; @@ -44,7 +44,6 @@ message Status { string last_io_error = 14; int32 sql_state = 15; string last_sql_error = 16; - bool io_thread_connecting = 17; } // StopReplicationStatus represents the replication status before calling StopReplication, and the replication status collected immediately after diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index 57fcb758727..d331f9eff3c 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -26904,9 +26904,6 @@ export namespace replicationdata { /** Status last_sql_error */ last_sql_error?: (string|null); - - /** Status io_thread_connecting */ - io_thread_connecting?: (boolean|null); } /** Represents a Status. */ @@ -26966,9 +26963,6 @@ export namespace replicationdata { /** Status last_sql_error. */ public last_sql_error: string; - /** Status io_thread_connecting. */ - public io_thread_connecting: boolean; - /** * Creates a new Status 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 5df8e60eb33..e7661676c18 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -63287,7 +63287,6 @@ $root.replicationdata = (function() { * @property {string|null} [last_io_error] Status last_io_error * @property {number|null} [sql_state] Status sql_state * @property {string|null} [last_sql_error] Status last_sql_error - * @property {boolean|null} [io_thread_connecting] Status io_thread_connecting */ /** @@ -63433,14 +63432,6 @@ $root.replicationdata = (function() { */ Status.prototype.last_sql_error = ""; - /** - * Status io_thread_connecting. - * @member {boolean} io_thread_connecting - * @memberof replicationdata.Status - * @instance - */ - Status.prototype.io_thread_connecting = false; - /** * Creates a new Status instance using the specified properties. * @function create @@ -63497,8 +63488,6 @@ $root.replicationdata = (function() { writer.uint32(/* id 15, wireType 0 =*/120).int32(message.sql_state); if (message.last_sql_error != null && Object.hasOwnProperty.call(message, "last_sql_error")) writer.uint32(/* id 16, wireType 2 =*/130).string(message.last_sql_error); - if (message.io_thread_connecting != null && Object.hasOwnProperty.call(message, "io_thread_connecting")) - writer.uint32(/* id 17, wireType 0 =*/136).bool(message.io_thread_connecting); return writer; }; @@ -63581,9 +63570,6 @@ $root.replicationdata = (function() { case 16: message.last_sql_error = reader.string(); break; - case 17: - message.io_thread_connecting = reader.bool(); - break; default: reader.skipType(tag & 7); break; @@ -63667,9 +63653,6 @@ $root.replicationdata = (function() { if (message.last_sql_error != null && message.hasOwnProperty("last_sql_error")) if (!$util.isString(message.last_sql_error)) return "last_sql_error: string expected"; - if (message.io_thread_connecting != null && message.hasOwnProperty("io_thread_connecting")) - if (typeof message.io_thread_connecting !== "boolean") - return "io_thread_connecting: boolean expected"; return null; }; @@ -63717,8 +63700,6 @@ $root.replicationdata = (function() { message.sql_state = object.sql_state | 0; if (object.last_sql_error != null) message.last_sql_error = String(object.last_sql_error); - if (object.io_thread_connecting != null) - message.io_thread_connecting = Boolean(object.io_thread_connecting); return message; }; @@ -63752,7 +63733,6 @@ $root.replicationdata = (function() { object.last_io_error = ""; object.sql_state = 0; object.last_sql_error = ""; - object.io_thread_connecting = false; } if (message.position != null && message.hasOwnProperty("position")) object.position = message.position; @@ -63786,8 +63766,6 @@ $root.replicationdata = (function() { object.sql_state = message.sql_state; if (message.last_sql_error != null && message.hasOwnProperty("last_sql_error")) object.last_sql_error = message.last_sql_error; - if (message.io_thread_connecting != null && message.hasOwnProperty("io_thread_connecting")) - object.io_thread_connecting = message.io_thread_connecting; return object; }; From a68d9a8470faf90768d812376f1f9dae4ead039b Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 28 Apr 2022 17:38:11 -0400 Subject: [PATCH 14/22] Continue using replication states in v14 tests Signed-off-by: Matt Lord --- go/vt/vtadmin/cluster/cluster_test.go | 37 ++++++++-------- .../reparentutil/emergency_reparenter_test.go | 44 +++++++++---------- go/vt/vtctl/reparentutil/replication.go | 2 +- go/vt/vtctl/reparentutil/replication_test.go | 16 +++---- go/vt/vttablet/tmrpctest/test_tm_rpc.go | 6 ++- 5 files changed, 54 insertions(+), 51 deletions(-) diff --git a/go/vt/vtadmin/cluster/cluster_test.go b/go/vt/vtadmin/cluster/cluster_test.go index aa9d9d5b646..38293064cc2 100644 --- a/go/vt/vtadmin/cluster/cluster_test.go +++ b/go/vt/vtadmin/cluster/cluster_test.go @@ -29,6 +29,7 @@ import ( "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/util/sets" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/protoutil" "vitess.io/vitess/go/test/utils" "vitess.io/vitess/go/vt/topo" @@ -2426,19 +2427,19 @@ func TestGetShardReplicationPositions(t *testing.T) { Response: &vtctldatapb.ShardReplicationPositionsResponse{ ReplicationStatuses: map[string]*replicationdatapb.Status{ "zone1-001": { - IoThreadRunning: false, - SqlThreadRunning: false, - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoState: int32(mysql.ReplicationStateStopped), + SqlState: int32(mysql.ReplicationStateStopped), + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, "zone1-002": { // Note: in reality other fields will be set on replicating hosts as well, but this is sufficient to illustrate in the testing. - IoThreadRunning: true, - SqlThreadRunning: true, - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, "zone1-003": { - IoThreadRunning: true, - SqlThreadRunning: true, - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, }, TabletMap: map[string]*topodatapb.Tablet{ @@ -2489,19 +2490,19 @@ func TestGetShardReplicationPositions(t *testing.T) { PositionInfo: &vtctldatapb.ShardReplicationPositionsResponse{ ReplicationStatuses: map[string]*replicationdatapb.Status{ "zone1-001": { - IoThreadRunning: false, - SqlThreadRunning: false, - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoState: int32(mysql.ReplicationStateStopped), + SqlState: int32(mysql.ReplicationStateStopped), + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, "zone1-002": { - IoThreadRunning: true, - SqlThreadRunning: true, - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, "zone1-003": { - IoThreadRunning: true, - SqlThreadRunning: true, - Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), + Position: "MySQL56/08d0dbbb-be29-11eb-9fea-0aafb9701138:1-109848265", }, }, TabletMap: map[string]*topodatapb.Tablet{ diff --git a/go/vt/vtctl/reparentutil/emergency_reparenter_test.go b/go/vt/vtctl/reparentutil/emergency_reparenter_test.go index 9055588bd44..746c3c70d88 100644 --- a/go/vt/vtctl/reparentutil/emergency_reparenter_test.go +++ b/go/vt/vtctl/reparentutil/emergency_reparenter_test.go @@ -2038,14 +2038,14 @@ func TestEmergencyReparenter_promoteNewPrimary(t *testing.T) { statusMap: map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { // forceStart = false Before: &replicationdatapb.Status{ - IoThreadRunning: false, - SqlThreadRunning: false, + IoState: int32(mysql.ReplicationStateStopped), + SqlState: int32(mysql.ReplicationStateStopped), }, }, "zone1-0000000102": { // forceStart = true Before: &replicationdatapb.Status{ - IoThreadRunning: true, - SqlThreadRunning: true, + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), }, }, }, @@ -2416,14 +2416,14 @@ func TestEmergencyReparenter_promoteNewPrimary(t *testing.T) { statusMap: map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { // forceStart = false Before: &replicationdatapb.Status{ - IoThreadRunning: false, - SqlThreadRunning: false, + IoState: int32(mysql.ReplicationStateStopped), + SqlState: int32(mysql.ReplicationStateStopped), }, }, "zone1-0000000102": { // forceStart = true Before: &replicationdatapb.Status{ - IoThreadRunning: true, - SqlThreadRunning: true, + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), }, }, }, @@ -3229,14 +3229,14 @@ func TestEmergencyReparenter_reparentReplicas(t *testing.T) { statusMap: map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { // forceStart = false Before: &replicationdatapb.Status{ - IoThreadRunning: false, - SqlThreadRunning: false, + IoState: int32(mysql.ReplicationStateStopped), + SqlState: int32(mysql.ReplicationStateStopped), }, }, "zone1-0000000102": { // forceStart = true Before: &replicationdatapb.Status{ - IoThreadRunning: true, - SqlThreadRunning: true, + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), }, }, }, @@ -3622,14 +3622,14 @@ func TestEmergencyReparenter_promoteIntermediateSource(t *testing.T) { statusMap: map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { // forceStart = false Before: &replicationdatapb.Status{ - IoThreadRunning: false, - SqlThreadRunning: false, + IoState: int32(mysql.ReplicationStateStopped), + SqlState: int32(mysql.ReplicationStateStopped), }, }, "zone1-0000000102": { // forceStart = true Before: &replicationdatapb.Status{ - IoThreadRunning: true, - SqlThreadRunning: true, + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), }, }, }, @@ -3896,14 +3896,14 @@ func TestEmergencyReparenter_promoteIntermediateSource(t *testing.T) { statusMap: map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { // forceStart = false Before: &replicationdatapb.Status{ - IoThreadRunning: false, - SqlThreadRunning: false, + IoState: int32(mysql.ReplicationStateStopped), + SqlState: int32(mysql.ReplicationStateStopped), }, }, "zone1-0000000102": { // forceStart = true Before: &replicationdatapb.Status{ - IoThreadRunning: true, - SqlThreadRunning: true, + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), }, }, }, @@ -4242,8 +4242,8 @@ func TestParentContextCancelled(t *testing.T) { statusMap := map[string]*replicationdatapb.StopReplicationStatus{ "zone1-0000000101": { Before: &replicationdatapb.Status{ - IoThreadRunning: true, - SqlThreadRunning: true, + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), }, }, } diff --git a/go/vt/vtctl/reparentutil/replication.go b/go/vt/vtctl/reparentutil/replication.go index ca5337bbbfe..a98053f829e 100644 --- a/go/vt/vtctl/reparentutil/replication.go +++ b/go/vt/vtctl/reparentutil/replication.go @@ -150,7 +150,7 @@ func ReplicaWasRunning(stopStatus *replicationdatapb.StopReplicationStatus) (boo return false, vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "could not determine Before state of StopReplicationStatus %v", stopStatus) } - return stopStatus.Before.IoThreadRunning || stopStatus.Before.SqlThreadRunning, nil + return stopStatus.Before.IoState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.SqlState == int32(mysql.ReplicationStateRunning), nil } // SetReplicationSource is used to set the replication source on the specified diff --git a/go/vt/vtctl/reparentutil/replication_test.go b/go/vt/vtctl/reparentutil/replication_test.go index d50c0487769..13f25295599 100644 --- a/go/vt/vtctl/reparentutil/replication_test.go +++ b/go/vt/vtctl/reparentutil/replication_test.go @@ -1098,8 +1098,8 @@ func TestReplicaWasRunning(t *testing.T) { name: "io thread running", in: &replicationdatapb.StopReplicationStatus{ Before: &replicationdatapb.Status{ - IoThreadRunning: true, - SqlThreadRunning: false, + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateStopped), }, }, expected: true, @@ -1109,8 +1109,8 @@ func TestReplicaWasRunning(t *testing.T) { name: "sql thread running", in: &replicationdatapb.StopReplicationStatus{ Before: &replicationdatapb.Status{ - IoThreadRunning: false, - SqlThreadRunning: true, + IoState: int32(mysql.ReplicationStateStopped), + SqlState: int32(mysql.ReplicationStateRunning), }, }, expected: true, @@ -1120,8 +1120,8 @@ func TestReplicaWasRunning(t *testing.T) { name: "io and sql threads running", in: &replicationdatapb.StopReplicationStatus{ Before: &replicationdatapb.Status{ - IoThreadRunning: true, - SqlThreadRunning: true, + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), }, }, expected: true, @@ -1131,8 +1131,8 @@ func TestReplicaWasRunning(t *testing.T) { name: "no replication threads running", in: &replicationdatapb.StopReplicationStatus{ Before: &replicationdatapb.Status{ - IoThreadRunning: false, - SqlThreadRunning: false, + IoState: int32(mysql.ReplicationStateStopped), + SqlState: int32(mysql.ReplicationStateStopped), }, }, expected: false, diff --git a/go/vt/vttablet/tmrpctest/test_tm_rpc.go b/go/vt/vttablet/tmrpctest/test_tm_rpc.go index 9d7531aa551..ed0c338868e 100644 --- a/go/vt/vttablet/tmrpctest/test_tm_rpc.go +++ b/go/vt/vttablet/tmrpctest/test_tm_rpc.go @@ -25,6 +25,8 @@ import ( "testing" "time" + "vitess.io/vitess/go/mysql" + "context" "google.golang.org/protobuf/proto" @@ -684,8 +686,8 @@ func tmRPCTestExecuteFetchPanic(ctx context.Context, t *testing.T, client tmclie var testReplicationStatus = &replicationdatapb.Status{ Position: "MariaDB/1-345-789", - IoThreadRunning: true, - SqlThreadRunning: true, + IoState: int32(mysql.ReplicationStateRunning), + SqlState: int32(mysql.ReplicationStateRunning), ReplicationLagSeconds: 654, SourceHost: "source.host", SourcePort: 3366, From 392ee9f085eed080dcdaeade42c9ebb4e17eb248 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 28 Apr 2022 17:59:20 -0400 Subject: [PATCH 15/22] Translate SQL running status to state as well Signed-off-by: Matt Lord --- go/mysql/replication_status.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/go/mysql/replication_status.go b/go/mysql/replication_status.go index fb2a0f242d7..7e894b39b14 100644 --- a/go/mysql/replication_status.go +++ b/go/mysql/replication_status.go @@ -134,10 +134,13 @@ func ProtoToReplicationStatus(s *replicationdatapb.Status) ReplicationStatus { SQLState: ReplicationState(s.SqlState), LastSQLError: s.LastSqlError, } + // We need to be able to process gRPC response messages from v13 and older tablets. - // In those cases there will be no value (uknown) for the IoState but the message - // will have the IoThreadRunning boolean and we need to revert to our assumptions - // about a binary state as that's all the older tablet can provide. + // In those cases there will be no value (uknown) for the IoState or SqlState but + // the message will have the IoThreadRunning and SqlThreadRunning booleans and we + // need to revert to our assumptions about a binary state as that's all the older + // tablet can provide (really only applicable to the IO status as that is NOT binary + // but rather has three states: Running, Stopped, Connecting). if s.IoState == int32(ReplicationStateUnknown) { if s.IoThreadRunning { replstatus.IOState = ReplicationStateRunning @@ -145,6 +148,14 @@ func ProtoToReplicationStatus(s *replicationdatapb.Status) ReplicationStatus { replstatus.IOState = ReplicationStateStopped } } + if s.SqlState == int32(ReplicationStateUnknown) { + if s.SqlThreadRunning { + replstatus.SQLState = ReplicationStateRunning + } else { + replstatus.SQLState = ReplicationStateStopped + } + } + return replstatus } From cbabd946b11e1616724f1113c44217893b351f5f Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 28 Apr 2022 22:47:32 -0400 Subject: [PATCH 16/22] Use backward compat ReplicaWasRunning check Signed-off-by: Matt Lord --- go/mysql/replication_status.go | 4 ++-- go/vt/vtctl/reparentutil/replication.go | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/go/mysql/replication_status.go b/go/mysql/replication_status.go index 7e894b39b14..2447dbc3c04 100644 --- a/go/mysql/replication_status.go +++ b/go/mysql/replication_status.go @@ -141,14 +141,14 @@ func ProtoToReplicationStatus(s *replicationdatapb.Status) ReplicationStatus { // need to revert to our assumptions about a binary state as that's all the older // tablet can provide (really only applicable to the IO status as that is NOT binary // but rather has three states: Running, Stopped, Connecting). - if s.IoState == int32(ReplicationStateUnknown) { + if replstatus.IOState == ReplicationStateUnknown { if s.IoThreadRunning { replstatus.IOState = ReplicationStateRunning } else { replstatus.IOState = ReplicationStateStopped } } - if s.SqlState == int32(ReplicationStateUnknown) { + if replstatus.SQLState == ReplicationStateUnknown { if s.SqlThreadRunning { replstatus.SQLState = ReplicationStateRunning } else { diff --git a/go/vt/vtctl/reparentutil/replication.go b/go/vt/vtctl/reparentutil/replication.go index a98053f829e..d3e229118ec 100644 --- a/go/vt/vtctl/reparentutil/replication.go +++ b/go/vt/vtctl/reparentutil/replication.go @@ -150,7 +150,11 @@ func ReplicaWasRunning(stopStatus *replicationdatapb.StopReplicationStatus) (boo return false, vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "could not determine Before state of StopReplicationStatus %v", stopStatus) } - return stopStatus.Before.IoState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.SqlState == int32(mysql.ReplicationStateRunning), nil + // v13 and older tablets will only provide the binary IoThreadRunning and + // SqlThreadRunning values while v14 and newer tablets will provide the + // non-binary replication states + return ((stopStatus.Before.IoState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.IoThreadRunning) || + (stopStatus.Before.SqlState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.SqlThreadRunning)), nil } // SetReplicationSource is used to set the replication source on the specified From 09bc950d1afe47b6191a3ff962aa47b920aa4bf6 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 28 Apr 2022 22:57:34 -0400 Subject: [PATCH 17/22] Add backward compat SQLThreadWasRunning function Signed-off-by: Matt Lord --- go/vt/vtctl/reparentutil/replication.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/go/vt/vtctl/reparentutil/replication.go b/go/vt/vtctl/reparentutil/replication.go index d3e229118ec..4f5945356ba 100644 --- a/go/vt/vtctl/reparentutil/replication.go +++ b/go/vt/vtctl/reparentutil/replication.go @@ -152,11 +152,26 @@ func ReplicaWasRunning(stopStatus *replicationdatapb.StopReplicationStatus) (boo // v13 and older tablets will only provide the binary IoThreadRunning and // SqlThreadRunning values while v14 and newer tablets will provide the - // non-binary replication states + // non-binary replication states. + // This backwards compatible check can be removed in v15. return ((stopStatus.Before.IoState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.IoThreadRunning) || (stopStatus.Before.SqlState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.SqlThreadRunning)), nil } +// SQLThreadWasRunning returns true if a StopReplicationStatus indicates that the +// replica had a running sql thread. It returns an error if the Before state of +// replication is nil. +func SQLThreadWasRunning(stopStatus *replicationdatapb.StopReplicationStatus) (bool, error) { + if stopStatus == nil || stopStatus.Before == nil { + return false, vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "could not determine Before state of StopReplicationStatus %v", stopStatus) + } + + // v13 and older tablets will only provide the binary SqlThreadRunning value + // while v14 and newer tablets will provide the non-binary replication states. + // This backwards compatible check can be removed in v15. + return (stopStatus.Before.SqlState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.SqlThreadRunning), nil +} + // SetReplicationSource is used to set the replication source on the specified // tablet to the current shard primary (if available). It also figures out if // the tablet should be sending semi-sync ACKs or not and passes that to the From a056b7cf812d33ba897d77cbfac62eba7cb26ae7 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Thu, 28 Apr 2022 23:02:06 -0400 Subject: [PATCH 18/22] Add comment about when backward compat can be removed Signed-off-by: Matt Lord --- go/mysql/replication_status.go | 3 ++- go/vt/vtctl/reparentutil/replication.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/go/mysql/replication_status.go b/go/mysql/replication_status.go index 2447dbc3c04..c45c8c59114 100644 --- a/go/mysql/replication_status.go +++ b/go/mysql/replication_status.go @@ -136,11 +136,12 @@ func ProtoToReplicationStatus(s *replicationdatapb.Status) ReplicationStatus { } // We need to be able to process gRPC response messages from v13 and older tablets. - // In those cases there will be no value (uknown) for the IoState or SqlState but + // In those cases there will be no value (unknown) for the IoState or SqlState but // the message will have the IoThreadRunning and SqlThreadRunning booleans and we // need to revert to our assumptions about a binary state as that's all the older // tablet can provide (really only applicable to the IO status as that is NOT binary // but rather has three states: Running, Stopped, Connecting). + // This backwards compatibility can be removed in v15+. if replstatus.IOState == ReplicationStateUnknown { if s.IoThreadRunning { replstatus.IOState = ReplicationStateRunning diff --git a/go/vt/vtctl/reparentutil/replication.go b/go/vt/vtctl/reparentutil/replication.go index 4f5945356ba..713059d4f87 100644 --- a/go/vt/vtctl/reparentutil/replication.go +++ b/go/vt/vtctl/reparentutil/replication.go @@ -153,7 +153,7 @@ func ReplicaWasRunning(stopStatus *replicationdatapb.StopReplicationStatus) (boo // v13 and older tablets will only provide the binary IoThreadRunning and // SqlThreadRunning values while v14 and newer tablets will provide the // non-binary replication states. - // This backwards compatible check can be removed in v15. + // This backwards compatible check can be removed in v15+. return ((stopStatus.Before.IoState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.IoThreadRunning) || (stopStatus.Before.SqlState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.SqlThreadRunning)), nil } @@ -168,7 +168,7 @@ func SQLThreadWasRunning(stopStatus *replicationdatapb.StopReplicationStatus) (b // v13 and older tablets will only provide the binary SqlThreadRunning value // while v14 and newer tablets will provide the non-binary replication states. - // This backwards compatible check can be removed in v15. + // This backwards compatible check can be removed in v15+. return (stopStatus.Before.SqlState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.SqlThreadRunning), nil } From cd3055301638096682c3ff866cf02a90a3996d92 Mon Sep 17 00:00:00 2001 From: Matt Lord Date: Fri, 29 Apr 2022 02:11:44 -0400 Subject: [PATCH 19/22] Support older clients with new tablets Signed-off-by: Matt Lord --- go/mysql/replication_status.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/go/mysql/replication_status.go b/go/mysql/replication_status.go index c45c8c59114..689992ce822 100644 --- a/go/mysql/replication_status.go +++ b/go/mysql/replication_status.go @@ -75,7 +75,7 @@ func (s *ReplicationStatus) SQLHealthy() bool { // ReplicationStatusToProto translates a Status to proto3. func ReplicationStatusToProto(s ReplicationStatus) *replicationdatapb.Status { - return &replicationdatapb.Status{ + replstatuspb := &replicationdatapb.Status{ Position: EncodePosition(s.Position), RelayLogPosition: EncodePosition(s.RelayLogPosition), FilePosition: EncodePosition(s.FilePosition), @@ -91,6 +91,21 @@ func ReplicationStatusToProto(s ReplicationStatus) *replicationdatapb.Status { SqlState: int32(s.SQLState), LastSqlError: s.LastSQLError, } + + // We need to be able to send gRPC response messages from v14 and newer tablets to + // v13 and older clients. The older clients will not be processing the IoState or + // SqlState values in the message but instead looking at the IoThreadRunning and + // SqlThreadRunning booleans so we need to map and share this dual state. + // Note: v13 and older clients considered the IO thread state of connecting to + // be equal to running. That is why we do so here when mapping the states. + // This backwards compatibility can be removed in v15+. + if s.IOState == ReplicationStateRunning || s.IOState == ReplicationStateConnecting { + replstatuspb.IoThreadRunning = true + } + if s.SQLState == ReplicationStateRunning { + replstatuspb.SqlThreadRunning = true + } + return replstatuspb } // ProtoToReplicationStatus translates a proto Status, or panics. From ba90f819fac58f6ae22860e5c1a679efaf259439 Mon Sep 17 00:00:00 2001 From: Manan Gupta Date: Fri, 29 Apr 2022 12:41:16 +0530 Subject: [PATCH 20/22] feat: remove SQLThreadWasRunning unused function Signed-off-by: Manan Gupta --- go/vt/vtctl/reparentutil/replication.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/go/vt/vtctl/reparentutil/replication.go b/go/vt/vtctl/reparentutil/replication.go index 713059d4f87..a62a45b2ddd 100644 --- a/go/vt/vtctl/reparentutil/replication.go +++ b/go/vt/vtctl/reparentutil/replication.go @@ -158,20 +158,6 @@ func ReplicaWasRunning(stopStatus *replicationdatapb.StopReplicationStatus) (boo (stopStatus.Before.SqlState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.SqlThreadRunning)), nil } -// SQLThreadWasRunning returns true if a StopReplicationStatus indicates that the -// replica had a running sql thread. It returns an error if the Before state of -// replication is nil. -func SQLThreadWasRunning(stopStatus *replicationdatapb.StopReplicationStatus) (bool, error) { - if stopStatus == nil || stopStatus.Before == nil { - return false, vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "could not determine Before state of StopReplicationStatus %v", stopStatus) - } - - // v13 and older tablets will only provide the binary SqlThreadRunning value - // while v14 and newer tablets will provide the non-binary replication states. - // This backwards compatible check can be removed in v15+. - return (stopStatus.Before.SqlState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.SqlThreadRunning), nil -} - // SetReplicationSource is used to set the replication source on the specified // tablet to the current shard primary (if available). It also figures out if // the tablet should be sending semi-sync ACKs or not and passes that to the From 7dd3dadf3ee41f36486114678cdc3eaa365956b5 Mon Sep 17 00:00:00 2001 From: Manan Gupta Date: Fri, 29 Apr 2022 12:43:04 +0530 Subject: [PATCH 21/22] test: add an upgrade test to verify the replicationstatus is backward compatible Signed-off-by: Manan Gupta --- go/test/endtoend/cluster/cluster_util.go | 11 +++++ .../reparent/plannedreparent/reparent_test.go | 41 +++++++++++++++++++ go/test/endtoend/reparent/utils/utils.go | 36 ++++++++++++++++ 3 files changed, 88 insertions(+) diff --git a/go/test/endtoend/cluster/cluster_util.go b/go/test/endtoend/cluster/cluster_util.go index 0e1ed5957f2..7975a26d99e 100644 --- a/go/test/endtoend/cluster/cluster_util.go +++ b/go/test/endtoend/cluster/cluster_util.go @@ -24,6 +24,8 @@ import ( "testing" "time" + replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -86,6 +88,15 @@ func GetPrimaryPosition(t *testing.T, vttablet Vttablet, hostname string) (strin return pos, gtID } +// GetReplicationPosition gets the replication status of given vttablet +func GetReplicationPosition(t *testing.T, vttablet *Vttablet, hostname string) *replicationdatapb.Status { + ctx := context.Background() + vtablet := getTablet(vttablet.GrpcPort, hostname) + pos, err := tmClient.ReplicationStatus(ctx, vtablet) + require.NoError(t, err) + return pos +} + // VerifyRowsInTabletForTable verifies the total number of rows in a table. // This is used to check that replication has caught up with the changes on primary. func VerifyRowsInTabletForTable(t *testing.T, vttablet *Vttablet, ksName string, expectedRows int, tableName string) { diff --git a/go/test/endtoend/reparent/plannedreparent/reparent_test.go b/go/test/endtoend/reparent/plannedreparent/reparent_test.go index ca903e8f799..9d447018d2b 100644 --- a/go/test/endtoend/reparent/plannedreparent/reparent_test.go +++ b/go/test/endtoend/reparent/plannedreparent/reparent_test.go @@ -378,3 +378,44 @@ func TestReparentDoesntHangIfPrimaryFails(t *testing.T) { require.Error(t, err) assert.Contains(t, out, "primary failed to PopulateReparentJournal") } + +func TestReplicationStatus(t *testing.T) { + defer cluster.PanicHandler(t) + clusterInstance := utils.SetupReparentCluster(t, true) + defer utils.TeardownCluster(clusterInstance) + tablets := clusterInstance.Keyspaces[0].Shards[0].Vttablets + utils.ConfirmReplication(t, tablets[0], []*cluster.Vttablet{tablets[1], tablets[2], tablets[3]}) + + // Stop the SQL_THREAD on tablets[1] + err := clusterInstance.VtctlclientProcess.ExecuteCommand("ExecuteFetchAsDba", tablets[1].Alias, `STOP SLAVE SQL_THREAD;`) + require.NoError(t, err) + // Check the replication status on tablets[1] and assert that the IO thread is read to be running and SQL thread is stopped + replicationStatus := cluster.GetReplicationPosition(t, tablets[1], utils.Hostname) + ioThread, sqlThread := utils.ReplicationThreadsStatus(t, replicationStatus, clusterInstance.VtctlMajorVersion, clusterInstance.VtTabletMajorVersion) + require.True(t, ioThread) + require.False(t, sqlThread) + + // Stop replication on tablets[1] and verify that both the threads are reported as not running + err = clusterInstance.VtctlclientProcess.ExecuteCommand("ExecuteFetchAsDba", tablets[1].Alias, `STOP SLAVE;`) + require.NoError(t, err) + replicationStatus = cluster.GetReplicationPosition(t, tablets[1], utils.Hostname) + ioThread, sqlThread = utils.ReplicationThreadsStatus(t, replicationStatus, clusterInstance.VtctlMajorVersion, clusterInstance.VtTabletMajorVersion) + require.False(t, ioThread) + require.False(t, sqlThread) + + // Start replication on tablets[1] and verify that both the threads are reported as running + err = clusterInstance.VtctlclientProcess.ExecuteCommand("ExecuteFetchAsDba", tablets[1].Alias, `START SLAVE;`) + require.NoError(t, err) + replicationStatus = cluster.GetReplicationPosition(t, tablets[1], utils.Hostname) + ioThread, sqlThread = utils.ReplicationThreadsStatus(t, replicationStatus, clusterInstance.VtctlMajorVersion, clusterInstance.VtTabletMajorVersion) + require.True(t, ioThread) + require.True(t, sqlThread) + + // Stop IO_THREAD on tablets[1] and verify that the IO thread is read to be stopped and SQL thread is running + err = clusterInstance.VtctlclientProcess.ExecuteCommand("ExecuteFetchAsDba", tablets[1].Alias, `STOP SLAVE IO_THREAD;`) + require.NoError(t, err) + replicationStatus = cluster.GetReplicationPosition(t, tablets[1], utils.Hostname) + ioThread, sqlThread = utils.ReplicationThreadsStatus(t, replicationStatus, clusterInstance.VtctlMajorVersion, clusterInstance.VtTabletMajorVersion) + require.False(t, ioThread) + require.True(t, sqlThread) +} diff --git a/go/test/endtoend/reparent/utils/utils.go b/go/test/endtoend/reparent/utils/utils.go index ed6b823b618..34172157037 100644 --- a/go/test/endtoend/reparent/utils/utils.go +++ b/go/test/endtoend/reparent/utils/utils.go @@ -34,6 +34,7 @@ import ( "vitess.io/vitess/go/json2" "vitess.io/vitess/go/vt/log" querypb "vitess.io/vitess/go/vt/proto/query" + replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" "vitess.io/vitess/go/mysql" @@ -744,3 +745,38 @@ func CheckReplicationStatus(ctx context.Context, t *testing.T, tablet *cluster.V require.Equal(t, "No", res.Rows[0][11].ToString()) } } + +// ReplicationThreadsStatus returns the status of the IO and SQL thread. It reads the result of the replication status +// based on the vtctl major version provided. It also uses the vttabletVersion to assert on the expectation of the new fields +// being unknown for the old vttablets and that they match for the new vttablets +func ReplicationThreadsStatus(t *testing.T, status *replicationdatapb.Status, vtctlVersion, vttabletVersion int) (bool, bool) { + if vttabletVersion == 13 { + // If vttablet is version 13, then the new fields should be unknown + require.Equal(t, mysql.ReplicationStateUnknown, mysql.ReplicationState(status.IoState)) + require.Equal(t, mysql.ReplicationStateUnknown, mysql.ReplicationState(status.SqlState)) + } else { + // For the new vttablet, the new parameters should not be unknown. Moreover, the old parameters should also be provided + // and should agree with the new ones + require.NotEqual(t, mysql.ReplicationStateUnknown, mysql.ReplicationState(status.IoState)) + require.NotEqual(t, mysql.ReplicationStateUnknown, mysql.ReplicationState(status.SqlState)) + require.Equal(t, status.IoThreadRunning, mysql.ReplicationState(status.IoState) == mysql.ReplicationStateRunning) + require.Equal(t, status.SqlThreadRunning, mysql.ReplicationState(status.SqlState) == mysql.ReplicationStateRunning) + } + + // if vtctlVersion provided is 13, then we should read the old parameters, since that is what old vtctl would do + if vtctlVersion == 13 { + return status.IoThreadRunning, status.SqlThreadRunning + } + // If we are at the latest vtctl version, we should read the latest parameters if provided otherwise the old ones + ioState := mysql.ReplicationState(status.IoState) + ioThread := status.IoThreadRunning + if ioState != mysql.ReplicationStateUnknown { + ioThread = ioState == mysql.ReplicationStateRunning + } + sqlState := mysql.ReplicationState(status.SqlState) + sqlThread := status.SqlThreadRunning + if sqlState != mysql.ReplicationStateUnknown { + sqlThread = sqlState == mysql.ReplicationStateRunning + } + return ioThread, sqlThread +} From cdca70e98dfdcf70ccbcda5523f5c0da3bd77c02 Mon Sep 17 00:00:00 2001 From: Manan Gupta Date: Fri, 29 Apr 2022 13:29:54 +0530 Subject: [PATCH 22/22] feat: fix ReplicaWasRunning so that it doesn't have code dependent on the upgrade Signed-off-by: Manan Gupta --- go/vt/vtctl/reparentutil/replication.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/go/vt/vtctl/reparentutil/replication.go b/go/vt/vtctl/reparentutil/replication.go index a62a45b2ddd..63403f7c70e 100644 --- a/go/vt/vtctl/reparentutil/replication.go +++ b/go/vt/vtctl/reparentutil/replication.go @@ -150,12 +150,9 @@ func ReplicaWasRunning(stopStatus *replicationdatapb.StopReplicationStatus) (boo return false, vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "could not determine Before state of StopReplicationStatus %v", stopStatus) } - // v13 and older tablets will only provide the binary IoThreadRunning and - // SqlThreadRunning values while v14 and newer tablets will provide the - // non-binary replication states. - // This backwards compatible check can be removed in v15+. - return ((stopStatus.Before.IoState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.IoThreadRunning) || - (stopStatus.Before.SqlState == int32(mysql.ReplicationStateRunning) || stopStatus.Before.SqlThreadRunning)), nil + replStatus := mysql.ProtoToReplicationStatus(stopStatus.Before) + return (replStatus.IOState == mysql.ReplicationStateRunning) || + (replStatus.SQLState == mysql.ReplicationStateRunning), nil } // SetReplicationSource is used to set the replication source on the specified