From b612c8b52bb5fd17f069f98fb32232333085aec1 Mon Sep 17 00:00:00 2001 From: alishakawaguchi Date: Sun, 16 Feb 2025 14:27:54 -0800 Subject: [PATCH] Adds Resumable Sync for higher stability of syncing large datasets (#3266) Co-authored-by: Nick Zelei <2420177+nickzelei@users.noreply.github.com> --- .../gen/go/db/dbschemas/postgresql/querier.go | 1 + .../go/db/dbschemas/postgresql/system.sql.go | 58 +- .../mgmt/v1alpha1/connection_data.pb.go | 239 +- .../mgmt/v1alpha1/connection_data.pb.json.go | 20 + backend/gen/go/protos/mgmt/v1alpha1/job.pb.go | 2582 +++++++++-------- backend/internal/connectiondata/sql.go | 13 + .../sql/postgresql/queries/system.sql | 23 +- backend/pkg/mssql-querier/querier.go | 1 + backend/pkg/mssql-querier/system.sql.go | 63 + backend/pkg/sqlmanager/mssql/mssql-manager.go | 41 +- backend/pkg/sqlmanager/mysql/mysql-manager.go | 2 + .../sqlmanager/postgres/postgres-manager.go | 17 + backend/pkg/sqlmanager/shared/types.go | 5 + .../pkg/table-dependency/table-dependency.go | 44 + .../table-dependency/table-dependency_test.go | 22 +- .../mgmt/v1alpha1/connection_data.proto | 12 + .../mgmt/v1alpha1/job-service/runs.go | 76 + cli/internal/cmds/neosync/sync/sync.go | 27 +- .../v1alpha1/connection_data.openapi.yaml | 42 + docs/openapi/mgmt/v1alpha1/job.openapi.yaml | 3 + docs/openapi/neosync.mgmt.v1alpha1.yaml | 45 + .../mgmt/v1alpha1/connection_data.proto.mdx | 40 +- docs/protos/proto_docs.json | 96 + .../JobRunActivityTable/columns.tsx | 16 +- .../app/(mgmt)/[account]/runs/[id]/page.tsx | 2 +- .../components/RunTImeline/RunTimeline.tsx | 63 +- .../mgmt/v1alpha1/connection_data_pb.ts | 53 +- .../sdk/src/client/mgmt/v1alpha1/job_pb.ts | 2 +- .../benthos-stream/client.go | 35 +- .../benthos-builder/benthos-builder.go | 10 +- .../benthos-builder/builders/aws-s3.go | 2 +- .../benthos-builder/builders/dynamodb.go | 2 +- .../builders/gcp-cloud-storage.go | 2 +- .../benthos-builder/builders/generate-ai.go | 2 +- .../benthos-builder/builders/generate.go | 2 +- .../benthos-builder/builders/mongodb.go | 2 +- .../benthos/benthos-builder/builders/sql.go | 16 +- .../benthos-builder/generate-benthos.go | 4 +- .../benthos/benthos-builder/internal/types.go | 4 +- .../continuation-token/continuation-token.go | 52 + .../worker/workflow/datasync-workflow.go | 16 +- .../mgmt/v1alpha1/connection_data_pb2.py | 38 +- .../mgmt/v1alpha1/connection_data_pb2.pyi | 25 +- python/src/neosync/mgmt/v1alpha1/job_pb2.py | 538 ++-- worker/internal/cmds/worker/serve/serve.go | 22 +- worker/pkg/benthos/config.go | 5 +- worker/pkg/benthos/environment/environment.go | 9 +- worker/pkg/benthos/sql/input_sql_raw.go | 284 +- worker/pkg/benthos/sql/input_sql_raw_test.go | 2 +- worker/pkg/benthos/sql/output_sql_insert.go | 23 +- worker/pkg/query-builder2/querybuilder.go | 76 +- worker/pkg/query-builder2/subset.go | 21 +- .../gen-benthos-configs/activity.go | 5 +- .../gen-benthos-configs/benthos-builder.go | 54 +- .../datasync/activities/shared/shared.go | 5 + .../datasync/activities/sync/activity.go | 305 -- .../datasync/activities/sync/activity_test.go | 467 --- .../sync/mock_BenthosStreamClient.go | 175 -- .../sync/mock_BenthosStreamManagerClient.go | 93 - .../workflows/datasync/workflow/workflow.go | 68 +- .../tablesync/activities/sync/activity.go | 464 +++ .../activities/sync/activity_test.go | 469 +++ .../tablesync/workflow/register/register.go | 43 + .../workflows/tablesync/workflow/workflow.go | 89 + 64 files changed, 4045 insertions(+), 2992 deletions(-) rename worker/pkg/workflows/datasync/activities/sync/benthos-stream.go => internal/benthos-stream/client.go (69%) create mode 100644 internal/continuation-token/continuation-token.go delete mode 100644 worker/pkg/workflows/datasync/activities/sync/activity.go delete mode 100644 worker/pkg/workflows/datasync/activities/sync/activity_test.go delete mode 100644 worker/pkg/workflows/datasync/activities/sync/mock_BenthosStreamClient.go delete mode 100644 worker/pkg/workflows/datasync/activities/sync/mock_BenthosStreamManagerClient.go create mode 100644 worker/pkg/workflows/tablesync/activities/sync/activity.go create mode 100644 worker/pkg/workflows/tablesync/activities/sync/activity_test.go create mode 100644 worker/pkg/workflows/tablesync/workflow/register/register.go create mode 100644 worker/pkg/workflows/tablesync/workflow/workflow.go diff --git a/backend/gen/go/db/dbschemas/postgresql/querier.go b/backend/gen/go/db/dbschemas/postgresql/querier.go index 6b52a0ca12..9eb2d3fec2 100644 --- a/backend/gen/go/db/dbschemas/postgresql/querier.go +++ b/backend/gen/go/db/dbschemas/postgresql/querier.go @@ -20,6 +20,7 @@ type Querier interface { GetIndicesBySchemasAndTables(ctx context.Context, db DBTX, schematables []string) ([]*GetIndicesBySchemasAndTablesRow, error) GetNonForeignKeyTableConstraintsBySchema(ctx context.Context, db DBTX, schema []string) ([]*GetNonForeignKeyTableConstraintsBySchemaRow, error) GetPostgresRolePermissions(ctx context.Context, db DBTX) ([]*GetPostgresRolePermissionsRow, error) + GetUniqueIndexesBySchema(ctx context.Context, db DBTX, schema []string) ([]*GetUniqueIndexesBySchemaRow, error) } var _ Querier = (*Queries)(nil) diff --git a/backend/gen/go/db/dbschemas/postgresql/system.sql.go b/backend/gen/go/db/dbschemas/postgresql/system.sql.go index d7fcaf146a..12f13f18fe 100644 --- a/backend/gen/go/db/dbschemas/postgresql/system.sql.go +++ b/backend/gen/go/db/dbschemas/postgresql/system.sql.go @@ -1071,7 +1071,6 @@ FROM information_schema.table_constraints AS tc JOIN pg_catalog.pg_constraint AS pgcon ON pgcon.conname = tc.constraint_name AND pgcon.connamespace = pn.oid - WHERE tc.table_schema = ANY($1::TEXT[]) /* Exclude foreign keys */ @@ -1169,3 +1168,60 @@ func (q *Queries) GetPostgresRolePermissions(ctx context.Context, db DBTX) ([]*G } return items, nil } + +const getUniqueIndexesBySchema = `-- name: GetUniqueIndexesBySchema :many +SELECT + ns.nspname AS table_schema, -- Schema name for the table + tbl.relname AS table_name, -- Name of the table the index belongs to + idx.relname AS index_name, -- Name of the index + array_agg(col.attname ORDER BY key_info.ordinality)::TEXT[] AS index_columns -- Comma-separated list of index columns +FROM pg_catalog.pg_class AS tbl + -- Join to get the schema information for the table + JOIN pg_catalog.pg_namespace AS ns ON tbl.relnamespace = ns.oid + -- Join to retrieve index metadata for the table + JOIN pg_catalog.pg_index AS idx_meta ON tbl.oid = idx_meta.indrelid + -- Join to get the index object details + JOIN pg_catalog.pg_class AS idx ON idx_meta.indexrelid = idx.oid + -- Unnest the index key attribute numbers along with their ordinal positions + JOIN unnest(idx_meta.indkey) WITH ORDINALITY AS key_info(attnum, ordinality) ON true + -- Join to get the column attributes corresponding to the index keys + JOIN pg_catalog.pg_attribute AS col ON col.attrelid = tbl.oid AND col.attnum = key_info.attnum +WHERE ns.nspname = ANY($1::TEXT[]) + AND idx_meta.indisunique = true +GROUP BY ns.nspname, tbl.relname, idx.relname +` + +type GetUniqueIndexesBySchemaRow struct { + TableSchema string + TableName string + IndexName string + IndexColumns []string +} + +func (q *Queries) GetUniqueIndexesBySchema(ctx context.Context, db DBTX, schema []string) ([]*GetUniqueIndexesBySchemaRow, error) { + rows, err := db.QueryContext(ctx, getUniqueIndexesBySchema, pq.Array(schema)) + if err != nil { + return nil, err + } + defer rows.Close() + var items []*GetUniqueIndexesBySchemaRow + for rows.Next() { + var i GetUniqueIndexesBySchemaRow + if err := rows.Scan( + &i.TableSchema, + &i.TableName, + &i.IndexName, + pq.Array(&i.IndexColumns), + ); err != nil { + return nil, err + } + items = append(items, &i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/backend/gen/go/protos/mgmt/v1alpha1/connection_data.pb.go b/backend/gen/go/protos/mgmt/v1alpha1/connection_data.pb.go index d0651da0ca..b345333b9a 100644 --- a/backend/gen/go/protos/mgmt/v1alpha1/connection_data.pb.go +++ b/backend/gen/go/protos/mgmt/v1alpha1/connection_data.pb.go @@ -2220,6 +2220,98 @@ func (x *UniqueConstraints) GetConstraints() []*UniqueConstraint { return nil } +type UniqueIndexes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The unique indexes found for the table + Indexes []*UniqueIndex `protobuf:"bytes,1,rep,name=indexes,proto3" json:"indexes,omitempty"` +} + +func (x *UniqueIndexes) Reset() { + *x = UniqueIndexes{} + mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UniqueIndexes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UniqueIndexes) ProtoMessage() {} + +func (x *UniqueIndexes) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[37] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UniqueIndexes.ProtoReflect.Descriptor instead. +func (*UniqueIndexes) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_connection_data_proto_rawDescGZIP(), []int{37} +} + +func (x *UniqueIndexes) GetIndexes() []*UniqueIndex { + if x != nil { + return x.Indexes + } + return nil +} + +type UniqueIndex struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The columns that are part of the unique index + Columns []string `protobuf:"bytes,1,rep,name=columns,proto3" json:"columns,omitempty"` +} + +func (x *UniqueIndex) Reset() { + *x = UniqueIndex{} + mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UniqueIndex) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UniqueIndex) ProtoMessage() {} + +func (x *UniqueIndex) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[38] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UniqueIndex.ProtoReflect.Descriptor instead. +func (*UniqueIndex) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_connection_data_proto_rawDescGZIP(), []int{38} +} + +func (x *UniqueIndex) GetColumns() []string { + if x != nil { + return x.Columns + } + return nil +} + type GetConnectionTableConstraintsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2231,11 +2323,13 @@ type GetConnectionTableConstraintsResponse struct { PrimaryKeyConstraints map[string]*PrimaryConstraint `protobuf:"bytes,2,rep,name=primary_key_constraints,json=primaryKeyConstraints,proto3" json:"primary_key_constraints,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // the key here is . and value is the unique constraint UniqueConstraints map[string]*UniqueConstraints `protobuf:"bytes,3,rep,name=unique_constraints,json=uniqueConstraints,proto3" json:"unique_constraints,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // the key here is .
and value is the unique index + UniqueIndexes map[string]*UniqueIndexes `protobuf:"bytes,4,rep,name=unique_indexes,json=uniqueIndexes,proto3" json:"unique_indexes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *GetConnectionTableConstraintsResponse) Reset() { *x = GetConnectionTableConstraintsResponse{} - mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[37] + mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2247,7 +2341,7 @@ func (x *GetConnectionTableConstraintsResponse) String() string { func (*GetConnectionTableConstraintsResponse) ProtoMessage() {} func (x *GetConnectionTableConstraintsResponse) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[37] + mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2260,7 +2354,7 @@ func (x *GetConnectionTableConstraintsResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use GetConnectionTableConstraintsResponse.ProtoReflect.Descriptor instead. func (*GetConnectionTableConstraintsResponse) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_data_proto_rawDescGZIP(), []int{37} + return file_mgmt_v1alpha1_connection_data_proto_rawDescGZIP(), []int{39} } func (x *GetConnectionTableConstraintsResponse) GetForeignKeyConstraints() map[string]*ForeignConstraintTables { @@ -2284,6 +2378,13 @@ func (x *GetConnectionTableConstraintsResponse) GetUniqueConstraints() map[strin return nil } +func (x *GetConnectionTableConstraintsResponse) GetUniqueIndexes() map[string]*UniqueIndexes { + if x != nil { + return x.UniqueIndexes + } + return nil +} + type GetTableRowCountRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2301,7 +2402,7 @@ type GetTableRowCountRequest struct { func (x *GetTableRowCountRequest) Reset() { *x = GetTableRowCountRequest{} - mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[38] + mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2313,7 +2414,7 @@ func (x *GetTableRowCountRequest) String() string { func (*GetTableRowCountRequest) ProtoMessage() {} func (x *GetTableRowCountRequest) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[38] + mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2326,7 +2427,7 @@ func (x *GetTableRowCountRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTableRowCountRequest.ProtoReflect.Descriptor instead. func (*GetTableRowCountRequest) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_data_proto_rawDescGZIP(), []int{38} + return file_mgmt_v1alpha1_connection_data_proto_rawDescGZIP(), []int{40} } func (x *GetTableRowCountRequest) GetConnectionId() string { @@ -2368,7 +2469,7 @@ type GetTableRowCountResponse struct { func (x *GetTableRowCountResponse) Reset() { *x = GetTableRowCountResponse{} - mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[39] + mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2380,7 +2481,7 @@ func (x *GetTableRowCountResponse) String() string { func (*GetTableRowCountResponse) ProtoMessage() {} func (x *GetTableRowCountResponse) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[39] + mi := &file_mgmt_v1alpha1_connection_data_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2393,7 +2494,7 @@ func (x *GetTableRowCountResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTableRowCountResponse.ProtoReflect.Descriptor instead. func (*GetTableRowCountResponse) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_connection_data_proto_rawDescGZIP(), []int{39} + return file_mgmt_v1alpha1_connection_data_proto_rawDescGZIP(), []int{41} } func (x *GetTableRowCountResponse) GetCount() int64 { @@ -2735,7 +2836,14 @@ var file_mgmt_v1alpha1_connection_data_proto_rawDesc = []byte{ 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, - 0x61, 0x69, 0x6e, 0x74, 0x73, 0x22, 0xfd, 0x05, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x61, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x45, 0x0a, 0x0d, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x22, 0x27, 0x0a, 0x0b, + 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x22, 0xcd, 0x07, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x17, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, @@ -2762,7 +2870,14 @@ var file_mgmt_v1alpha1_connection_data_proto_rawDesc = []byte{ 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x75, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x1a, + 0x69, 0x71, 0x75, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, + 0x6e, 0x0a, 0x0e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x61, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0d, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x1a, 0x70, 0x0a, 0x1a, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 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, @@ -2783,6 +2898,12 @@ var file_mgmt_v1alpha1_connection_data_proto_rawDesc = []byte{ 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5e, 0x0a, 0x12, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 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, 0x32, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x65, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc1, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, @@ -2890,7 +3011,7 @@ func file_mgmt_v1alpha1_connection_data_proto_rawDescGZIP() []byte { return file_mgmt_v1alpha1_connection_data_proto_rawDescData } -var file_mgmt_v1alpha1_connection_data_proto_msgTypes = make([]protoimpl.MessageInfo, 46) +var file_mgmt_v1alpha1_connection_data_proto_msgTypes = make([]protoimpl.MessageInfo, 49) var file_mgmt_v1alpha1_connection_data_proto_goTypes = []any{ (*PostgresStreamConfig)(nil), // 0: mgmt.v1alpha1.PostgresStreamConfig (*MysqlStreamConfig)(nil), // 1: mgmt.v1alpha1.MysqlStreamConfig @@ -2929,16 +3050,19 @@ var file_mgmt_v1alpha1_connection_data_proto_goTypes = []any{ (*GetAiGeneratedDataResponse)(nil), // 34: mgmt.v1alpha1.GetAiGeneratedDataResponse (*GetConnectionTableConstraintsRequest)(nil), // 35: mgmt.v1alpha1.GetConnectionTableConstraintsRequest (*UniqueConstraints)(nil), // 36: mgmt.v1alpha1.UniqueConstraints - (*GetConnectionTableConstraintsResponse)(nil), // 37: mgmt.v1alpha1.GetConnectionTableConstraintsResponse - (*GetTableRowCountRequest)(nil), // 38: mgmt.v1alpha1.GetTableRowCountRequest - (*GetTableRowCountResponse)(nil), // 39: mgmt.v1alpha1.GetTableRowCountResponse - nil, // 40: mgmt.v1alpha1.GetConnectionSchemaMapResponse.SchemaMapEntry - nil, // 41: mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableInitStatementsEntry - nil, // 42: mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableTruncateStatementsEntry - nil, // 43: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry - nil, // 44: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntry - nil, // 45: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueConstraintsEntry - (*structpb.Struct)(nil), // 46: google.protobuf.Struct + (*UniqueIndexes)(nil), // 37: mgmt.v1alpha1.UniqueIndexes + (*UniqueIndex)(nil), // 38: mgmt.v1alpha1.UniqueIndex + (*GetConnectionTableConstraintsResponse)(nil), // 39: mgmt.v1alpha1.GetConnectionTableConstraintsResponse + (*GetTableRowCountRequest)(nil), // 40: mgmt.v1alpha1.GetTableRowCountRequest + (*GetTableRowCountResponse)(nil), // 41: mgmt.v1alpha1.GetTableRowCountResponse + nil, // 42: mgmt.v1alpha1.GetConnectionSchemaMapResponse.SchemaMapEntry + nil, // 43: mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableInitStatementsEntry + nil, // 44: mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableTruncateStatementsEntry + nil, // 45: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry + nil, // 46: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntry + nil, // 47: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueConstraintsEntry + nil, // 48: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueIndexesEntry + (*structpb.Struct)(nil), // 49: google.protobuf.Struct } var file_mgmt_v1alpha1_connection_data_proto_depIdxs = []int32{ 0, // 0: mgmt.v1alpha1.ConnectionStreamConfig.pg_config:type_name -> mgmt.v1alpha1.PostgresStreamConfig @@ -2957,46 +3081,49 @@ var file_mgmt_v1alpha1_connection_data_proto_depIdxs = []int32{ 15, // 13: mgmt.v1alpha1.GetConnectionSchemaRequest.schema_config:type_name -> mgmt.v1alpha1.ConnectionSchemaConfig 16, // 14: mgmt.v1alpha1.GetConnectionSchemaResponse.schemas:type_name -> mgmt.v1alpha1.DatabaseColumn 15, // 15: mgmt.v1alpha1.GetConnectionSchemaMapRequest.schema_config:type_name -> mgmt.v1alpha1.ConnectionSchemaConfig - 40, // 16: mgmt.v1alpha1.GetConnectionSchemaMapResponse.schema_map:type_name -> mgmt.v1alpha1.GetConnectionSchemaMapResponse.SchemaMapEntry + 42, // 16: mgmt.v1alpha1.GetConnectionSchemaMapResponse.schema_map:type_name -> mgmt.v1alpha1.GetConnectionSchemaMapResponse.SchemaMapEntry 19, // 17: mgmt.v1alpha1.GetConnectionSchemaMapsRequest.requests:type_name -> mgmt.v1alpha1.GetConnectionSchemaMapRequest 20, // 18: mgmt.v1alpha1.GetConnectionSchemaMapsResponse.responses:type_name -> mgmt.v1alpha1.GetConnectionSchemaMapResponse 23, // 19: mgmt.v1alpha1.ForeignConstraint.foreign_key:type_name -> mgmt.v1alpha1.ForeignKey 24, // 20: mgmt.v1alpha1.ForeignConstraintTables.constraints:type_name -> mgmt.v1alpha1.ForeignConstraint 26, // 21: mgmt.v1alpha1.GetConnectionInitStatementsRequest.options:type_name -> mgmt.v1alpha1.InitStatementOptions - 41, // 22: mgmt.v1alpha1.GetConnectionInitStatementsResponse.table_init_statements:type_name -> mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableInitStatementsEntry - 42, // 23: mgmt.v1alpha1.GetConnectionInitStatementsResponse.table_truncate_statements:type_name -> mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableTruncateStatementsEntry + 43, // 22: mgmt.v1alpha1.GetConnectionInitStatementsResponse.table_init_statements:type_name -> mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableInitStatementsEntry + 44, // 23: mgmt.v1alpha1.GetConnectionInitStatementsResponse.table_truncate_statements:type_name -> mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableTruncateStatementsEntry 28, // 24: mgmt.v1alpha1.GetConnectionInitStatementsResponse.schema_init_statements:type_name -> mgmt.v1alpha1.SchemaInitStatements 33, // 25: mgmt.v1alpha1.GetAiGeneratedDataRequest.table:type_name -> mgmt.v1alpha1.DatabaseTable - 46, // 26: mgmt.v1alpha1.GetAiGeneratedDataResponse.records:type_name -> google.protobuf.Struct + 49, // 26: mgmt.v1alpha1.GetAiGeneratedDataResponse.records:type_name -> google.protobuf.Struct 31, // 27: mgmt.v1alpha1.UniqueConstraints.constraints:type_name -> mgmt.v1alpha1.UniqueConstraint - 43, // 28: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.foreign_key_constraints:type_name -> mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry - 44, // 29: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.primary_key_constraints:type_name -> mgmt.v1alpha1.GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntry - 45, // 30: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.unique_constraints:type_name -> mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueConstraintsEntry - 18, // 31: mgmt.v1alpha1.GetConnectionSchemaMapResponse.SchemaMapEntry.value:type_name -> mgmt.v1alpha1.GetConnectionSchemaResponse - 25, // 32: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry.value:type_name -> mgmt.v1alpha1.ForeignConstraintTables - 30, // 33: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntry.value:type_name -> mgmt.v1alpha1.PrimaryConstraint - 36, // 34: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueConstraintsEntry.value:type_name -> mgmt.v1alpha1.UniqueConstraints - 6, // 35: mgmt.v1alpha1.ConnectionDataService.GetConnectionDataStream:input_type -> mgmt.v1alpha1.GetConnectionDataStreamRequest - 17, // 36: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchema:input_type -> mgmt.v1alpha1.GetConnectionSchemaRequest - 19, // 37: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchemaMap:input_type -> mgmt.v1alpha1.GetConnectionSchemaMapRequest - 21, // 38: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchemaMaps:input_type -> mgmt.v1alpha1.GetConnectionSchemaMapsRequest - 35, // 39: mgmt.v1alpha1.ConnectionDataService.GetConnectionTableConstraints:input_type -> mgmt.v1alpha1.GetConnectionTableConstraintsRequest - 27, // 40: mgmt.v1alpha1.ConnectionDataService.GetConnectionInitStatements:input_type -> mgmt.v1alpha1.GetConnectionInitStatementsRequest - 32, // 41: mgmt.v1alpha1.ConnectionDataService.GetAiGeneratedData:input_type -> mgmt.v1alpha1.GetAiGeneratedDataRequest - 38, // 42: mgmt.v1alpha1.ConnectionDataService.GetTableRowCount:input_type -> mgmt.v1alpha1.GetTableRowCountRequest - 7, // 43: mgmt.v1alpha1.ConnectionDataService.GetConnectionDataStream:output_type -> mgmt.v1alpha1.GetConnectionDataStreamResponse - 18, // 44: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchema:output_type -> mgmt.v1alpha1.GetConnectionSchemaResponse - 20, // 45: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchemaMap:output_type -> mgmt.v1alpha1.GetConnectionSchemaMapResponse - 22, // 46: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchemaMaps:output_type -> mgmt.v1alpha1.GetConnectionSchemaMapsResponse - 37, // 47: mgmt.v1alpha1.ConnectionDataService.GetConnectionTableConstraints:output_type -> mgmt.v1alpha1.GetConnectionTableConstraintsResponse - 29, // 48: mgmt.v1alpha1.ConnectionDataService.GetConnectionInitStatements:output_type -> mgmt.v1alpha1.GetConnectionInitStatementsResponse - 34, // 49: mgmt.v1alpha1.ConnectionDataService.GetAiGeneratedData:output_type -> mgmt.v1alpha1.GetAiGeneratedDataResponse - 39, // 50: mgmt.v1alpha1.ConnectionDataService.GetTableRowCount:output_type -> mgmt.v1alpha1.GetTableRowCountResponse - 43, // [43:51] is the sub-list for method output_type - 35, // [35:43] is the sub-list for method input_type - 35, // [35:35] is the sub-list for extension type_name - 35, // [35:35] is the sub-list for extension extendee - 0, // [0:35] is the sub-list for field type_name + 38, // 28: mgmt.v1alpha1.UniqueIndexes.indexes:type_name -> mgmt.v1alpha1.UniqueIndex + 45, // 29: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.foreign_key_constraints:type_name -> mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry + 46, // 30: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.primary_key_constraints:type_name -> mgmt.v1alpha1.GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntry + 47, // 31: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.unique_constraints:type_name -> mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueConstraintsEntry + 48, // 32: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.unique_indexes:type_name -> mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueIndexesEntry + 18, // 33: mgmt.v1alpha1.GetConnectionSchemaMapResponse.SchemaMapEntry.value:type_name -> mgmt.v1alpha1.GetConnectionSchemaResponse + 25, // 34: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry.value:type_name -> mgmt.v1alpha1.ForeignConstraintTables + 30, // 35: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntry.value:type_name -> mgmt.v1alpha1.PrimaryConstraint + 36, // 36: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueConstraintsEntry.value:type_name -> mgmt.v1alpha1.UniqueConstraints + 37, // 37: mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueIndexesEntry.value:type_name -> mgmt.v1alpha1.UniqueIndexes + 6, // 38: mgmt.v1alpha1.ConnectionDataService.GetConnectionDataStream:input_type -> mgmt.v1alpha1.GetConnectionDataStreamRequest + 17, // 39: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchema:input_type -> mgmt.v1alpha1.GetConnectionSchemaRequest + 19, // 40: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchemaMap:input_type -> mgmt.v1alpha1.GetConnectionSchemaMapRequest + 21, // 41: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchemaMaps:input_type -> mgmt.v1alpha1.GetConnectionSchemaMapsRequest + 35, // 42: mgmt.v1alpha1.ConnectionDataService.GetConnectionTableConstraints:input_type -> mgmt.v1alpha1.GetConnectionTableConstraintsRequest + 27, // 43: mgmt.v1alpha1.ConnectionDataService.GetConnectionInitStatements:input_type -> mgmt.v1alpha1.GetConnectionInitStatementsRequest + 32, // 44: mgmt.v1alpha1.ConnectionDataService.GetAiGeneratedData:input_type -> mgmt.v1alpha1.GetAiGeneratedDataRequest + 40, // 45: mgmt.v1alpha1.ConnectionDataService.GetTableRowCount:input_type -> mgmt.v1alpha1.GetTableRowCountRequest + 7, // 46: mgmt.v1alpha1.ConnectionDataService.GetConnectionDataStream:output_type -> mgmt.v1alpha1.GetConnectionDataStreamResponse + 18, // 47: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchema:output_type -> mgmt.v1alpha1.GetConnectionSchemaResponse + 20, // 48: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchemaMap:output_type -> mgmt.v1alpha1.GetConnectionSchemaMapResponse + 22, // 49: mgmt.v1alpha1.ConnectionDataService.GetConnectionSchemaMaps:output_type -> mgmt.v1alpha1.GetConnectionSchemaMapsResponse + 39, // 50: mgmt.v1alpha1.ConnectionDataService.GetConnectionTableConstraints:output_type -> mgmt.v1alpha1.GetConnectionTableConstraintsResponse + 29, // 51: mgmt.v1alpha1.ConnectionDataService.GetConnectionInitStatements:output_type -> mgmt.v1alpha1.GetConnectionInitStatementsResponse + 34, // 52: mgmt.v1alpha1.ConnectionDataService.GetAiGeneratedData:output_type -> mgmt.v1alpha1.GetAiGeneratedDataResponse + 41, // 53: mgmt.v1alpha1.ConnectionDataService.GetTableRowCount:output_type -> mgmt.v1alpha1.GetTableRowCountResponse + 46, // [46:54] is the sub-list for method output_type + 38, // [38:46] is the sub-list for method input_type + 38, // [38:38] is the sub-list for extension type_name + 38, // [38:38] is the sub-list for extension extendee + 0, // [0:38] is the sub-list for field type_name } func init() { file_mgmt_v1alpha1_connection_data_proto_init() } @@ -3038,14 +3165,14 @@ func file_mgmt_v1alpha1_connection_data_proto_init() { } file_mgmt_v1alpha1_connection_data_proto_msgTypes[16].OneofWrappers = []any{} file_mgmt_v1alpha1_connection_data_proto_msgTypes[32].OneofWrappers = []any{} - file_mgmt_v1alpha1_connection_data_proto_msgTypes[38].OneofWrappers = []any{} + file_mgmt_v1alpha1_connection_data_proto_msgTypes[40].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mgmt_v1alpha1_connection_data_proto_rawDesc, NumEnums: 0, - NumMessages: 46, + NumMessages: 49, NumExtensions: 0, NumServices: 1, }, diff --git a/backend/gen/go/protos/mgmt/v1alpha1/connection_data.pb.json.go b/backend/gen/go/protos/mgmt/v1alpha1/connection_data.pb.json.go index 147973fa4a..77bfeaac16 100644 --- a/backend/gen/go/protos/mgmt/v1alpha1/connection_data.pb.json.go +++ b/backend/gen/go/protos/mgmt/v1alpha1/connection_data.pb.json.go @@ -377,6 +377,26 @@ func (msg *UniqueConstraints) UnmarshalJSON(b []byte) error { return protojson.UnmarshalOptions{}.Unmarshal(b, msg) } +// MarshalJSON implements json.Marshaler +func (msg *UniqueIndexes) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *UniqueIndexes) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *UniqueIndex) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *UniqueIndex) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + // MarshalJSON implements json.Marshaler func (msg *GetConnectionTableConstraintsResponse) MarshalJSON() ([]byte, error) { return protojson.MarshalOptions{}.Marshal(msg) diff --git a/backend/gen/go/protos/mgmt/v1alpha1/job.pb.go b/backend/gen/go/protos/mgmt/v1alpha1/job.pb.go index f492dff3e5..f787985ad3 100644 --- a/backend/gen/go/protos/mgmt/v1alpha1/job.pb.go +++ b/backend/gen/go/protos/mgmt/v1alpha1/job.pb.go @@ -11788,7 +11788,7 @@ var file_mgmt_v1alpha1_job_proto_rawDesc = []byte{ 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x22, 0xf2, 0x04, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, + 0x6f, 0x64, 0x22, 0x86, 0x05, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, @@ -11798,508 +11798,546 @@ var file_mgmt_v1alpha1_job_proto_rawDesc = []byte{ 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x12, 0x3f, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6d, - 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x64, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x6a, - 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x12, 0x49, 0x0a, 0x10, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x0c, 0x73, 0x79, 0x6e, 0x63, 0x5f, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x73, - 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x14, 0x76, 0x69, - 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, - 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, - 0x74, 0x52, 0x12, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x71, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x75, - 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, - 0x00, 0x52, 0x0a, 0x72, 0x75, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, - 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, - 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, - 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x95, 0x02, 0x0a, 0x0f, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, - 0x0a, 0x19, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x42, 0x07, 0xba, 0x48, 0x04, 0x22, 0x02, 0x28, 0x01, 0x48, 0x00, 0x52, 0x16, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x6f, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xba, 0x48, 0x04, 0x22, 0x02, 0x28, 0x01, - 0x48, 0x01, 0x52, 0x13, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x6f, 0x43, 0x6c, 0x6f, 0x73, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x0c, 0x72, 0x65, - 0x74, 0x72, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0b, 0x72, 0x65, - 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x22, 0x5b, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x37, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x61, 0x74, 0x74, - 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, 0x07, 0xba, 0x48, 0x04, - 0x1a, 0x02, 0x28, 0x00, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x22, - 0x39, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x57, 0x0a, 0x15, 0x4a, 0x6f, - 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, - 0x6d, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, - 0x01, 0x10, 0x02, 0x22, 0xb5, 0x01, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x12, 0x1d, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x12, 0x46, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x52, 0x0b, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, - 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x36, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x42, 0x08, 0xba, + 0x48, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x73, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, + 0xba, 0x48, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x74, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, + 0x12, 0x49, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x0c, 0x73, + 0x79, 0x6e, 0x63, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, + 0x0a, 0x14, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, + 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x72, + 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, + 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, + 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x71, 0x0a, 0x0f, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, + 0x0a, 0x0b, 0x72, 0x75, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x75, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, + 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, + 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x95, + 0x02, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x19, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, + 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xba, 0x48, 0x04, 0x22, 0x02, 0x28, 0x01, 0x48, 0x00, + 0x52, 0x16, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x6f, 0x43, 0x6c, 0x6f, 0x73, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x16, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x07, 0xba, 0x48, 0x04, + 0x22, 0x02, 0x28, 0x01, 0x48, 0x01, 0x52, 0x13, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x6f, 0x43, + 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3d, + 0x0a, 0x0c, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x1c, 0x0a, + 0x1a, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x19, 0x0a, 0x17, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x5b, 0x0a, 0x0b, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x37, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x42, + 0x07, 0xba, 0x48, 0x04, 0x1a, 0x02, 0x28, 0x00, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x88, 0x01, 0x01, 0x42, 0x13, + 0x0a, 0x11, 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x73, 0x22, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x70, - 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, - 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x22, 0x41, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, - 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, - 0x6a, 0x6f, 0x62, 0x22, 0x63, 0x0a, 0x0f, 0x50, 0x61, 0x75, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x70, 0x61, 0x75, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x88, 0x01, 0x01, 0x42, - 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x22, 0x38, 0x0a, 0x10, 0x50, 0x61, 0x75, 0x73, - 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x57, + 0x0a, 0x15, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0xb5, 0x01, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x4d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1d, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x46, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, + 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x65, 0x72, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x22, + 0x29, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, + 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x36, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, - 0x6f, 0x62, 0x22, 0x80, 0x02, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, - 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x59, 0x0a, 0x14, 0x76, 0x69, - 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, - 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, - 0x74, 0x52, 0x12, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x49, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, - 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, - 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, - 0x22, 0x72, 0x0a, 0x1a, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x54, - 0x0a, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x73, 0x22, 0x66, 0x0a, 0x17, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, - 0x4b, 0x0a, 0x0d, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, - 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, 0x5e, 0x0a, 0x1a, - 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x6f, 0x44, 0x42, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x6f, 0x44, 0x42, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x66, 0x0a, 0x17, - 0x4d, 0x73, 0x73, 0x71, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x4b, 0x0a, 0x0d, 0x6d, 0x73, 0x73, 0x71, 0x6c, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, - 0x73, 0x73, 0x71, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6d, 0x73, 0x73, 0x71, 0x6c, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x73, 0x22, 0xf8, 0x02, 0x0a, 0x18, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x71, 0x6c, 0x53, 0x75, 0x62, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x73, 0x12, 0x54, 0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x73, 0x75, - 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, - 0x75, 0x62, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x73, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x4b, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x79, - 0x73, 0x71, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, - 0x75, 0x62, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x75, - 0x62, 0x73, 0x65, 0x74, 0x12, 0x54, 0x0a, 0x0f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x6f, 0x64, 0x62, - 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x79, - 0x6e, 0x61, 0x6d, 0x6f, 0x44, 0x42, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x64, 0x79, 0x6e, 0x61, - 0x6d, 0x6f, 0x64, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x4b, 0x0a, 0x0c, 0x6d, 0x73, - 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4d, 0x73, 0x73, 0x71, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x73, 0x73, 0x71, - 0x6c, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x42, 0x10, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x73, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, - 0xd0, 0x01, 0x0a, 0x27, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, - 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, + 0x6f, 0x62, 0x22, 0x70, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, + 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, + 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x22, 0x41, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, + 0x62, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, + 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x63, 0x0a, 0x0f, 0x50, 0x61, 0x75, 0x73, 0x65, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x75, 0x73, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x70, 0x61, 0x75, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x6f, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, + 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x22, 0x38, 0x0a, 0x10, + 0x50, 0x61, 0x75, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, + 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x80, 0x02, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, - 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x41, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x53, 0x71, 0x6c, 0x53, 0x75, 0x62, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, - 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x48, 0x0a, 0x21, 0x73, 0x75, 0x62, 0x73, - 0x65, 0x74, 0x5f, 0x62, 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, - 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x1d, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x42, 0x79, 0x46, 0x6f, 0x72, - 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, - 0x74, 0x73, 0x22, 0x50, 0x0a, 0x28, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, + 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x59, + 0x0a, 0x14, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, + 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x72, + 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, + 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x49, 0x0a, 0x21, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, - 0x03, 0x6a, 0x6f, 0x62, 0x22, 0xde, 0x01, 0x0a, 0x25, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, - 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, - 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, - 0x2d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, - 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3e, - 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, - 0x0a, 0x0e, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x26, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, - 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, - 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, - 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x58, 0x0a, 0x25, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, - 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, - 0x0a, 0x0e, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, - 0x52, 0x0d, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, - 0x28, 0x0a, 0x26, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x26, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, - 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x67, - 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4f, - 0x0a, 0x27, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, + 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x72, 0x0a, 0x1a, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, + 0x65, 0x74, 0x12, 0x54, 0x0a, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, 0x66, 0x0a, 0x17, 0x4d, 0x79, 0x73, 0x71, + 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x75, 0x62, + 0x73, 0x65, 0x74, 0x12, 0x4b, 0x0a, 0x0d, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x79, 0x73, 0x71, 0x6c, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x22, 0x5e, 0x0a, 0x1a, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x6f, 0x44, 0x42, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x40, + 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, + 0x79, 0x6e, 0x61, 0x6d, 0x6f, 0x44, 0x42, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x22, 0x66, 0x0a, 0x17, 0x4d, 0x73, 0x73, 0x71, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x4b, 0x0a, 0x0d, 0x6d, + 0x73, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x73, 0x71, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6d, 0x73, 0x73, 0x71, + 0x6c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, 0xf8, 0x02, 0x0a, 0x18, 0x4a, 0x6f, 0x62, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x71, 0x6c, 0x53, 0x75, 0x62, 0x65, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x54, 0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x4b, 0x0a, 0x0c, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x54, 0x0a, 0x0f, 0x64, 0x79, 0x6e, 0x61, + 0x6d, 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x6f, 0x44, 0x42, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0e, + 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x6f, 0x64, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x4b, + 0x0a, 0x0c, 0x6d, 0x73, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d, 0x73, 0x73, 0x71, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0b, + 0x6d, 0x73, 0x73, 0x71, 0x6c, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x42, 0x10, 0x0a, 0x07, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x4a, 0x04, 0x08, + 0x01, 0x10, 0x02, 0x22, 0xd0, 0x01, 0x0a, 0x27, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, + 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x41, 0x0a, 0x07, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x71, 0x6c, 0x53, 0x75, 0x62, 0x65, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x48, 0x0a, 0x21, + 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x5f, 0x62, 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, + 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x42, + 0x79, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x50, 0x0a, 0x28, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0xde, 0x01, 0x0a, 0x25, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, + 0x62, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, + 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x26, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x58, 0x0a, 0x25, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x0e, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, + 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0d, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x22, 0x28, 0x0a, 0x26, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, + 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, + 0x0a, 0x26, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, - 0x2c, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x13, 0x0a, - 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x73, 0x0a, 0x19, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0xba, - 0x48, 0x16, 0x72, 0x14, 0x32, 0x12, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, - 0x7b, 0x33, 0x2c, 0x31, 0x30, 0x30, 0x7d, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, + 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x0c, 0x64, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xba, 0x48, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x0c, + 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4f, 0x0a, 0x27, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x2c, 0x0a, + 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, + 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x73, 0x0a, 0x19, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0xba, 0x48, 0x16, + 0x72, 0x14, 0x32, 0x12, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, 0x7b, 0x33, + 0x2c, 0x31, 0x30, 0x30, 0x7d, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0a, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x1a, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x4e, 0x61, + 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x67, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x06, 0x6a, + 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, + 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x00, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x3f, 0x0a, 0x1a, 0x49, 0x73, 0x4a, 0x6f, 0x62, - 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x67, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, + 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x00, 0x52, 0x09, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x42, 0x04, 0x0a, 0x02, 0x69, 0x64, 0x22, + 0x46, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x07, + 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6a, + 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, + 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x49, 0x64, 0x22, 0x43, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x6a, 0x6f, 0x62, 0x5f, 0x72, + 0x75, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, + 0x06, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x22, 0x36, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, + 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, + 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, + 0x16, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5c, 0x0a, 0x13, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0a, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x16, 0x0a, 0x14, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, + 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe9, 0x05, + 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2b, 0x0a, + 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x64, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, + 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, + 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x41, + 0x0a, 0x0c, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x49, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x14, + 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, + 0x69, 0x6e, 0x74, 0x52, 0x12, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, + 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x67, 0x0a, 0x0c, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, + 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x63, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, - 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x00, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, - 0x12, 0x29, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x00, - 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x42, 0x04, 0x0a, 0x02, 0x69, - 0x64, 0x22, 0x46, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x72, - 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x67, 0x6d, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, - 0x52, 0x07, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x49, 0x64, 0x22, 0x43, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x6a, 0x6f, 0x62, - 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, - 0x6e, 0x52, 0x06, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x22, 0x36, 0x0a, 0x13, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, - 0x64, 0x22, 0x16, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5c, 0x0a, 0x13, 0x43, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x27, - 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x16, 0x0a, 0x14, 0x43, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xe9, 0x05, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x2b, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x67, - 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x41, 0x0a, - 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6d, - 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x41, 0x0a, 0x0c, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, - 0x0a, 0x14, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, - 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, - 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, - 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, - 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, - 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x67, 0x0a, 0x0c, 0x4a, - 0x6f, 0x62, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x58, + 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, 0x72, 0x65, + 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x0a, 0x72, 0x65, + 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x22, 0x4f, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x4e, + 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0e, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x72, 0x75, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, - 0x75, 0x6e, 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, - 0x22, 0x58, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, - 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0b, - 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x0a, - 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x22, 0x4f, 0x0a, 0x0b, 0x4a, 0x6f, - 0x62, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0e, 0x6e, 0x65, 0x78, - 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6e, - 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x22, 0x38, 0x0a, 0x15, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, - 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4e, - 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x37, 0x0a, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x08, - 0x6e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x22, 0x36, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, - 0x22, 0x48, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x64, 0x0a, 0x0f, 0x4a, 0x6f, - 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x1f, 0x0a, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6e, 0x65, 0x78, + 0x74, 0x52, 0x75, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x22, 0x38, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x4a, 0x6f, 0x62, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, + 0x62, 0x49, 0x64, 0x22, 0x51, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4e, 0x65, 0x78, + 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, + 0x09, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x08, 0x6e, 0x65, + 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x22, 0x36, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, - 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x30, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, - 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x40, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, - 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x49, 0x64, 0x22, 0x54, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x08, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, - 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x08, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x69, 0x74, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x0f, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x48, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x64, 0x0a, 0x0f, 0x4a, 0x6f, 0x62, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x6a, + 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, + 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x40, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, + 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, + 0x22, 0x54, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x22, 0x2b, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x0f, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, - 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, - 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, - 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x69, 0x74, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x6c, - 0x61, 0x73, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, - 0x0d, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x22, 0xdd, - 0x02, 0x0a, 0x06, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x42, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x4d, 0x0a, 0x12, 0x70, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x69, 0x74, 0x79, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x51, - 0x0a, 0x14, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x22, 0xab, 0x01, 0x0a, 0x0f, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x74, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x6c, 0x61, 0x73, + 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x22, 0xdd, 0x02, 0x0a, + 0x06, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x42, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x4d, 0x0a, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x51, 0x0a, 0x14, + 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, + 0xab, 0x01, 0x0a, 0x0f, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x42, 0x0a, + 0x12, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x72, 0x0a, 0x13, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x79, 0x6e, 0x63, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x42, 0x11, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x05, + 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0x9d, 0x02, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, - 0x42, 0x0a, 0x12, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x22, 0x72, 0x0a, 0x13, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x79, - 0x6e, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x42, 0x11, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0x9d, 0x02, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x52, - 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x34, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x5f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x49, 0x64, 0x12, - 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x75, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, - 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x73, 0x5f, 0x72, 0x75, - 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x22, - 0x5c, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, - 0x75, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, - 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x16, 0x0a, - 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5f, 0x0a, 0x16, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x3e, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x34, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, + 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x5f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, + 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xb2, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, - 0x6f, 0x67, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x75, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x32, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x69, 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x69, 0x73, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x5c, 0x0a, + 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, + 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, + 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x16, 0x0a, 0x14, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x5f, 0x0a, 0x16, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x49, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0xb2, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, + 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0a, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, + 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x68, + 0x6f, 0x75, 0x6c, 0x64, 0x54, 0x61, 0x69, 0x6c, 0x12, 0x30, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, + 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, + 0x07, 0xba, 0x48, 0x04, 0x22, 0x02, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x4c, + 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0a, 0x6c, 0x6f, + 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x17, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, + 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x22, 0x90, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, + 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x12, + 0x3d, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x88, 0x01, 0x01, 0x12, 0x4e, + 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, + 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x8b, 0x02, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, @@ -12307,854 +12345,818 @@ var file_mgmt_v1alpha1_job_proto_rawDesc = []byte{ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x68, 0x6f, - 0x75, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x54, 0x61, 0x69, 0x6c, 0x12, 0x30, 0x0a, 0x0d, 0x6d, 0x61, - 0x78, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x42, 0x07, 0xba, 0x48, 0x04, 0x22, 0x02, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x61, - 0x78, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0a, - 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x6f, 0x67, - 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x90, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, + 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x30, 0x0a, 0x0d, 0x6d, 0x61, 0x78, + 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x42, 0x07, 0xba, 0x48, 0x04, 0x22, 0x02, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x61, 0x78, + 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0a, 0x6c, + 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x17, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0xe3, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x49, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, + 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x1a, 0xfe, 0x01, 0x0a, 0x07, 0x4c, + 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x88, 0x01, 0x01, - 0x12, 0x4e, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x8b, 0x02, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x49, 0x64, - 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x57, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x30, 0x0a, 0x0d, 0x6d, - 0x61, 0x78, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x42, 0x07, 0xba, 0x48, 0x04, 0x22, 0x02, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x6d, - 0x61, 0x78, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, - 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x17, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x6f, - 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0xe3, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x49, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, - 0x6e, 0x65, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x1a, 0xfe, 0x01, 0x0a, - 0x07, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, - 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x4c, - 0x69, 0x6e, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x88, - 0x01, 0x01, 0x12, 0x50, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, - 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, - 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x83, 0x01, - 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, - 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x49, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x66, - 0x6b, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x66, 0x6b, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x45, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x77, 0x0a, 0x18, 0x53, 0x65, - 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x41, 0x0a, 0x0c, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x41, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x79, 0x6e, - 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, - 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0xd3, 0x02, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, - 0xb0, 0x01, 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x35, - 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6d, 0x61, 0x70, - 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, - 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x59, 0x0a, 0x14, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, - 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, - 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x76, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, - 0x3c, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, - 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xe7, 0x07, 0x0a, - 0x0b, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x12, 0x1a, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x51, - 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x73, 0x1a, 0x6d, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x22, 0xb3, 0x05, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x29, 0x0a, 0x25, 0x43, 0x4f, 0x4c, 0x55, 0x4d, - 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x54, - 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x10, 0x01, 0x12, 0x2a, 0x0a, 0x26, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, - 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x3a, - 0x0a, 0x36, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, - 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4c, - 0x55, 0x4d, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, - 0x5f, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x3f, 0x0a, 0x3b, 0x43, 0x4f, - 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, - 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x45, 0x49, 0x47, 0x4e, - 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, - 0x4e, 0x5f, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x4b, 0x0a, 0x47, 0x43, - 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, - 0x43, 0x55, 0x4c, 0x41, 0x52, 0x5f, 0x44, 0x45, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x4e, 0x43, 0x59, - 0x5f, 0x41, 0x54, 0x5f, 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x4e, 0x55, - 0x4c, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x3c, 0x0a, 0x38, 0x43, 0x4f, 0x4c, 0x55, - 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, - 0x4b, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x50, - 0x50, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x3b, 0x0a, 0x37, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, + 0x12, 0x50, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x83, 0x01, 0x0a, 0x1c, + 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, + 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x49, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x66, 0x6b, 0x6c, + 0x6f, 0x77, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x66, 0x6b, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x45, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x77, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x41, + 0x0a, 0x0c, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x41, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x79, 0x6e, 0x63, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, + 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x52, + 0x03, 0x6a, 0x6f, 0x62, 0x22, 0xd3, 0x02, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, + 0x01, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x08, + 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, + 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, + 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x59, 0x0a, 0x14, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x66, 0x6f, + 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x43, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x76, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x3c, 0x0a, + 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6a, + 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xe7, 0x07, 0x0a, 0x0b, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x12, 0x1a, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x0d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x1a, + 0x6d, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb3, + 0x05, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, + 0x64, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x29, 0x0a, 0x25, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, + 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x01, + 0x12, 0x2a, 0x0a, 0x26, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, + 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x3a, 0x0a, 0x36, + 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, + 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, + 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, + 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x3f, 0x0a, 0x3b, 0x43, 0x4f, 0x4c, 0x55, + 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, + 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x45, 0x49, 0x47, 0x4e, 0x5f, 0x4b, + 0x45, 0x59, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, + 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x4b, 0x0a, 0x47, 0x43, 0x4f, 0x4c, + 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x55, + 0x4c, 0x41, 0x52, 0x5f, 0x44, 0x45, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x41, + 0x54, 0x5f, 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, + 0x41, 0x42, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x3c, 0x0a, 0x38, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x4e, 0x4f, - 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x10, 0x07, 0x12, 0x3c, 0x0a, 0x38, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, - 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, - 0x08, 0x12, 0x3b, 0x0a, 0x37, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x50, 0x50, 0x49, + 0x4e, 0x47, 0x10, 0x06, 0x12, 0x3b, 0x0a, 0x37, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, + 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, + 0x07, 0x12, 0x3c, 0x0a, 0x38, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, - 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x09, 0x12, 0x32, - 0x0a, 0x2e, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, - 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x44, - 0x41, 0x54, 0x41, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, - 0x10, 0x0a, 0x12, 0x32, 0x0a, 0x2e, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x55, 0x4e, - 0x49, 0x51, 0x55, 0x45, 0x10, 0x0b, 0x22, 0xdb, 0x03, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x1e, - 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x59, - 0x0a, 0x0f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, 0x61, - 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x73, 0x0a, 0x13, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x12, 0x42, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, - 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x93, - 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x57, - 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x4f, 0x4c, - 0x55, 0x4d, 0x4e, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x44, 0x45, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x10, 0x01, 0x12, 0x2c, 0x0a, 0x28, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, - 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, - 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x50, 0x50, 0x49, - 0x4e, 0x47, 0x10, 0x02, 0x22, 0xae, 0x03, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x73, 0x12, 0x55, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x67, 0x6d, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0c, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x73, 0x0a, 0x13, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x12, 0x42, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, - 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb4, - 0x01, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x4d, 0x0a, 0x49, 0x44, 0x41, 0x54, - 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, - 0x43, 0x55, 0x4c, 0x41, 0x52, 0x5f, 0x44, 0x45, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x4e, 0x43, 0x59, - 0x5f, 0x41, 0x54, 0x5f, 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x4e, 0x55, - 0x4c, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x44, 0x41, 0x54, 0x41, - 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, - 0x56, 0x46, 0x4b, 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, - 0x54, 0x43, 0x48, 0x10, 0x02, 0x22, 0xca, 0x04, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x4f, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x1a, 0x6a, 0x0a, 0x10, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, - 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0xd0, 0x02, 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, + 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x12, + 0x3b, 0x0a, 0x37, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, + 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, + 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x09, 0x12, 0x32, 0x0a, 0x2e, + 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, + 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x44, 0x41, 0x54, + 0x41, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x0a, + 0x12, 0x32, 0x0a, 0x2e, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x51, + 0x55, 0x45, 0x10, 0x0b, 0x22, 0xdb, 0x03, 0x0a, 0x0d, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x1e, 0x0a, 0x08, + 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x59, 0x0a, 0x0f, + 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x73, 0x0a, 0x13, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x42, + 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x93, 0x01, 0x0a, + 0x11, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x64, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x57, 0x41, 0x52, + 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x4f, 0x4c, 0x55, 0x4d, + 0x4e, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x10, 0x01, 0x12, 0x3a, 0x0a, 0x36, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, - 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x02, - 0x12, 0x39, 0x0a, 0x35, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, - 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x3a, 0x0a, 0x36, 0x54, - 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, - 0x56, 0x46, 0x4b, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, - 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x39, 0x0a, 0x35, 0x54, 0x41, 0x42, 0x4c, 0x45, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, - 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x54, - 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x10, 0x05, 0x22, 0xaa, 0x02, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4a, - 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, + 0x43, 0x45, 0x10, 0x01, 0x12, 0x2c, 0x0a, 0x28, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x57, + 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, + 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, + 0x10, 0x02, 0x22, 0xae, 0x03, 0x0a, 0x0d, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x12, 0x55, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x73, 0x0a, 0x13, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x42, + 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, - 0x67, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, - 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb4, 0x01, 0x0a, + 0x11, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, + 0x64, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x4d, 0x0a, 0x49, 0x44, 0x41, 0x54, 0x41, 0x42, + 0x41, 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x55, + 0x4c, 0x41, 0x52, 0x5f, 0x44, 0x45, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x41, + 0x54, 0x5f, 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, + 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, + 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, + 0x4b, 0x5f, 0x43, 0x4f, 0x4c, 0x55, 0x4d, 0x4e, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, + 0x48, 0x10, 0x02, 0x22, 0xca, 0x04, 0x0a, 0x0a, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x4f, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, - 0x7d, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x4d, 0x61, - 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x2d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, - 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xd8, - 0x02, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0f, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x52, 0x0e, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x73, 0x12, 0x42, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x72, 0x61, 0x43, 0x6f, - 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x52, 0x0a, 0x0e, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, - 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x0d, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x73, 0x1a, 0x35, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x5b, 0x0a, 0x11, 0x56, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x18, 0x56, 0x69, 0x72, 0x74, 0x75, - 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, - 0x69, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x0b, 0x66, - 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, - 0x65, 0x79, 0x52, 0x0a, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x22, 0x88, - 0x01, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, - 0x12, 0x25, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x6a, - 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, - 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2c, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x75, - 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x2d, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5a, - 0x0a, 0x14, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x65, - 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0x18, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x03, 0x0a, 0x07, 0x4a, - 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x06, - 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, - 0x62, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x12, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, - 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x09, 0xba, 0x48, 0x06, 0x2a, 0x04, 0x18, 0x64, 0x28, 0x00, - 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0xdd, 0x01, 0x0a, 0x0a, 0x4e, - 0x65, 0x77, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x2d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0xba, 0x48, 0x16, 0x72, 0x14, 0x32, 0x12, - 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, 0x7b, 0x33, 0x2c, 0x31, 0x30, 0x30, - 0x7d, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, - 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x09, 0xba, 0x48, 0x06, 0x2a, 0x04, 0x18, 0x64, 0x28, 0x00, - 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0xbd, 0x03, 0x0a, 0x0d, 0x4a, - 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3b, 0x0a, 0x03, - 0x73, 0x71, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x6f, 0x72, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x1a, 0x6a, 0x0a, 0x10, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd0, 0x02, + 0x0a, 0x0e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x54, + 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x10, 0x01, 0x12, 0x3a, 0x0a, 0x36, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, + 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x39, + 0x0a, 0x35, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, + 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x41, + 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, + 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x3a, 0x0a, 0x36, 0x54, 0x41, 0x42, + 0x4c, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, + 0x4b, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, + 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x50, 0x50, + 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x39, 0x0a, 0x35, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x46, 0x4b, 0x5f, 0x54, 0x41, + 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, + 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x05, + 0x22, 0xaa, 0x02, 0x0a, 0x1b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, + 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x52, + 0x0e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x3c, 0x0a, 0x0c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x52, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x7d, 0x0a, + 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2d, 0x0a, + 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0c, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xd8, 0x02, 0x0a, + 0x16, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0f, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, + 0x0e, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, + 0x42, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x72, 0x61, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x12, 0x52, 0x0a, 0x0e, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x0d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0e, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x1a, 0x35, 0x0a, 0x05, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x5b, 0x0a, 0x11, 0x56, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x18, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, + 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x0b, 0x66, 0x6f, 0x72, + 0x65, 0x69, 0x67, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, + 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, + 0x52, 0x0a, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x4b, 0x65, 0x79, 0x22, 0x88, 0x01, 0x0a, + 0x0d, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x25, + 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x6a, 0x6f, 0x62, + 0x52, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, + 0x26, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x75, + 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2c, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2d, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5a, 0x0a, 0x14, + 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x52, + 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x5b, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x4b, 0x65, 0x79, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x18, + 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x03, 0x0a, 0x07, 0x4a, 0x6f, 0x62, + 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, + 0x62, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, + 0x64, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x2b, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x25, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0d, 0x42, 0x09, 0xba, 0x48, 0x06, 0x2a, 0x04, 0x18, 0x64, 0x28, 0x00, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0xdd, 0x01, 0x0a, 0x0a, 0x4e, 0x65, 0x77, + 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x2d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0xba, 0x48, 0x16, 0x72, 0x14, 0x32, 0x12, 0x5e, 0x5b, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, 0x7b, 0x33, 0x2c, 0x31, 0x30, 0x30, 0x7d, 0x24, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x25, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x42, 0x09, 0xba, 0x48, 0x06, 0x2a, 0x04, 0x18, 0x64, 0x28, 0x00, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0xbd, 0x03, 0x0a, 0x0d, 0x4a, 0x6f, 0x62, + 0x48, 0x6f, 0x6f, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3b, 0x0a, 0x03, 0x73, 0x71, + 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x71, 0x6c, 0x48, 0x6f, 0x6f, 0x6b, + 0x48, 0x00, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x1a, 0xc5, 0x02, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x53, + 0x71, 0x6c, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x1d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, + 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x46, 0x0a, 0x06, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x71, 0x6c, 0x48, 0x6f, 0x6f, 0x6b, 0x2e, 0x54, 0x69, + 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x1a, 0xa0, 0x01, 0x0a, + 0x06, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x40, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x5f, 0x73, + 0x79, 0x6e, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, - 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x71, 0x6c, 0x48, 0x6f, - 0x6f, 0x6b, 0x48, 0x00, 0x52, 0x03, 0x73, 0x71, 0x6c, 0x1a, 0xc5, 0x02, 0x0a, 0x0a, 0x4a, 0x6f, - 0x62, 0x53, 0x71, 0x6c, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x1d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, - 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x46, 0x0a, 0x06, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x71, 0x6c, 0x48, 0x6f, 0x6f, 0x6b, 0x2e, - 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x1a, 0xa0, - 0x01, 0x0a, 0x06, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x40, 0x0a, 0x08, 0x70, 0x72, 0x65, - 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x67, - 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, + 0x6b, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x00, + 0x52, 0x07, 0x70, 0x72, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x43, 0x0a, 0x09, 0x70, 0x6f, 0x73, + 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, + 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x79, + 0x6e, 0x63, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x42, 0x0f, + 0x0a, 0x06, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x42, + 0x0f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, + 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, + 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x16, 0x0a, 0x14, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x53, 0x79, 0x6e, 0x63, - 0x48, 0x00, 0x52, 0x07, 0x70, 0x72, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x43, 0x0a, 0x09, 0x70, - 0x6f, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, - 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x73, 0x74, - 0x53, 0x79, 0x6e, 0x63, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, - 0x42, 0x0f, 0x0a, 0x06, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, - 0x01, 0x42, 0x0f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x05, 0xba, 0x48, 0x02, - 0x08, 0x01, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, - 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x16, 0x0a, 0x14, 0x4a, 0x6f, - 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x65, 0x53, 0x79, - 0x6e, 0x63, 0x22, 0x17, 0x0a, 0x15, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x69, 0x6d, - 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x22, 0x35, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, - 0x49, 0x64, 0x22, 0x43, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x05, 0x68, 0x6f, 0x6f, - 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x22, 0x17, 0x0a, 0x15, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x69, 0x6d, 0x69, 0x6e, + 0x67, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x22, 0x35, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, + 0x22, 0x43, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x05, 0x68, 0x6f, 0x6f, 0x6b, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x05, + 0x68, 0x6f, 0x6f, 0x6b, 0x73, 0x22, 0x2d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, + 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x40, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, + 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x68, 0x6f, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, - 0x52, 0x05, 0x68, 0x6f, 0x6f, 0x6b, 0x73, 0x22, 0x2d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, - 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x40, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, - 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x04, - 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, - 0x6f, 0x6b, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x5c, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x65, 0x77, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, - 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x43, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2a, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, - 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x30, 0x0a, 0x14, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x17, 0x0a, - 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x0a, 0x1d, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x48, - 0x6f, 0x6f, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x1e, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x4e, - 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, - 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0xba, 0x48, 0x16, 0x72, 0x14, 0x32, - 0x12, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, 0x7b, 0x33, 0x2c, 0x31, 0x30, - 0x30, 0x7d, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x09, 0xba, 0x48, 0x06, 0x2a, 0x04, 0x18, 0x64, 0x28, - 0x00, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x43, 0x0a, 0x15, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, - 0x22, 0x4e, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, - 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x22, 0x47, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, + 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x5c, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, + 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x65, 0x77, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x04, + 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x43, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, + 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, - 0x6f, 0x6f, 0x6b, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0xde, 0x01, 0x0a, 0x20, 0x47, 0x65, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x42, - 0x79, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, - 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, - 0x4e, 0x0a, 0x06, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x36, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, - 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x22, - 0x49, 0x0a, 0x06, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, - 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x49, 0x4d, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x52, 0x45, 0x53, - 0x59, 0x4e, 0x43, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x49, 0x4d, 0x49, 0x4e, 0x47, 0x5f, - 0x50, 0x4f, 0x53, 0x54, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x02, 0x22, 0x51, 0x0a, 0x21, 0x47, 0x65, + 0x6f, 0x6f, 0x6b, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x30, 0x0a, 0x14, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, + 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x0a, 0x1d, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, + 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x43, 0x0a, 0x1e, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x4e, 0x61, 0x6d, + 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x81, 0x02, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, + 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0xba, 0x48, 0x16, 0x72, 0x14, 0x32, 0x12, 0x5e, + 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x2d, 0x5d, 0x7b, 0x33, 0x2c, 0x31, 0x30, 0x30, 0x7d, + 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0d, 0x42, 0x09, 0xba, 0x48, 0x06, 0x2a, 0x04, 0x18, 0x64, 0x28, 0x00, 0x52, + 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x43, 0x0a, 0x15, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x4e, + 0x0a, 0x18, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x47, + 0x0a, 0x19, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x68, + 0x6f, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, + 0x6b, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0xde, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x42, 0x79, 0x54, + 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, + 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, + 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x4e, 0x0a, + 0x06, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x42, - 0x79, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2c, 0x0a, 0x05, 0x68, 0x6f, 0x6f, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, - 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x05, 0x68, 0x6f, 0x6f, 0x6b, 0x73, 0x2a, 0x6f, 0x0a, - 0x09, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x16, 0x4a, 0x4f, - 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x15, - 0x0a, 0x11, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x41, 0x55, - 0x53, 0x45, 0x44, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x2a, 0xa7, - 0x01, 0x0a, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x10, - 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1c, - 0x0a, 0x18, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, + 0x79, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, + 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x22, 0x49, 0x0a, + 0x06, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x49, 0x4e, + 0x47, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x12, 0x0a, 0x0e, 0x54, 0x49, 0x4d, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x59, 0x4e, + 0x43, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x49, 0x4d, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x4f, + 0x53, 0x54, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x02, 0x22, 0x51, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x42, 0x79, 0x54, + 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, + 0x05, 0x68, 0x6f, 0x6f, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, + 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x05, 0x68, 0x6f, 0x6f, 0x6b, 0x73, 0x2a, 0x6f, 0x0a, 0x09, 0x4a, + 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x16, 0x4a, 0x4f, 0x42, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, + 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x41, 0x55, 0x53, 0x45, + 0x44, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x4a, 0x4f, 0x42, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x2a, 0xa7, 0x01, 0x0a, + 0x0e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x1f, 0x0a, 0x1b, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, + 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x92, 0x02, 0x0a, 0x0c, 0x4a, 0x6f, 0x62, - 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x1a, 0x4a, 0x4f, 0x42, - 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4a, 0x4f, 0x42, - 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, - 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, - 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x18, - 0x0a, 0x14, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x4a, 0x4f, 0x42, 0x5f, - 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, - 0x4c, 0x45, 0x44, 0x10, 0x05, 0x12, 0x1d, 0x0a, 0x19, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, - 0x45, 0x44, 0x10, 0x06, 0x12, 0x19, 0x0a, 0x15, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x07, 0x12, - 0x1c, 0x0a, 0x18, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x44, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x08, 0x2a, 0x7c, 0x0a, - 0x09, 0x4c, 0x6f, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x4f, - 0x47, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x49, 0x4d, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, - 0x0a, 0x16, 0x4c, 0x4f, 0x47, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x46, 0x49, 0x46, - 0x54, 0x45, 0x45, 0x4e, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, - 0x47, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x48, 0x4f, 0x55, - 0x52, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x4f, 0x47, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, - 0x57, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x44, 0x41, 0x59, 0x10, 0x03, 0x2a, 0x77, 0x0a, 0x08, 0x4c, - 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, - 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, - 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, - 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4c, - 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, - 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x04, 0x32, 0xb7, 0x20, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x1d, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, - 0x02, 0x01, 0x12, 0x4a, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x1c, 0x2e, 0x6d, + 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, + 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x92, 0x02, 0x0a, 0x0c, 0x4a, 0x6f, 0x62, 0x52, 0x75, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x1a, 0x4a, 0x4f, 0x42, 0x5f, 0x52, + 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4a, 0x4f, 0x42, 0x5f, 0x52, + 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, + 0x47, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, + 0x1b, 0x0a, 0x17, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, + 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, + 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, + 0x44, 0x10, 0x05, 0x12, 0x1d, 0x0a, 0x19, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, + 0x10, 0x06, 0x12, 0x19, 0x0a, 0x15, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x07, 0x12, 0x1c, 0x0a, + 0x18, 0x4a, 0x4f, 0x42, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x54, 0x49, 0x4d, 0x45, 0x44, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x08, 0x2a, 0x7c, 0x0a, 0x09, 0x4c, + 0x6f, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x22, 0x0a, 0x1e, 0x4c, 0x4f, 0x47, 0x5f, + 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, + 0x4c, 0x4f, 0x47, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x46, 0x49, 0x46, 0x54, 0x45, + 0x45, 0x4e, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, 0x47, 0x5f, + 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x48, 0x4f, 0x55, 0x52, 0x10, + 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x4f, 0x47, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, + 0x4f, 0x4e, 0x45, 0x5f, 0x44, 0x41, 0x59, 0x10, 0x03, 0x2a, 0x77, 0x0a, 0x08, 0x4c, 0x6f, 0x67, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, + 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x44, 0x45, + 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, + 0x45, 0x4c, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x4f, 0x47, + 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x13, 0x0a, + 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x10, 0x04, 0x32, 0xb7, 0x20, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x4d, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x1d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x67, 0x6d, + 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, + 0x12, 0x4a, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x50, - 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1f, 0x2e, 0x6d, 0x67, - 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x50, 0x0a, 0x09, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1f, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, + 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1f, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, - 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x50, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1f, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x12, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x28, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x4e, 0x61, - 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, - 0x02, 0x01, 0x12, 0x68, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, - 0x62, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, - 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x6d, 0x67, - 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x95, 0x01, 0x0a, 0x20, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, - 0x73, 0x65, 0x74, 0x73, 0x12, 0x36, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, - 0x62, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x6d, - 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, - 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8f, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x6e, 0x0a, 0x12, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x28, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, + 0x12, 0x68, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x19, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, + 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x95, 0x01, + 0x0a, 0x20, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x71, + 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x65, + 0x74, 0x73, 0x12, 0x36, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, + 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x73, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x71, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8f, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, + 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8f, 0x01, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8f, 0x01, 0x0a, 0x1e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x6d, - 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x92, 0x01, 0x0a, 0x1f, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x35, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, - 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x75, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1e, 0x2e, 0x6d, - 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x75, - 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, - 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x75, - 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x68, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x52, - 0x75, 0x6e, 0x73, 0x12, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, - 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x67, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x92, 0x01, 0x0a, 0x1f, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x44, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4d, + 0x0a, 0x08, 0x50, 0x61, 0x75, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1e, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x75, 0x73, 0x65, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, + 0x73, 0x12, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x62, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x4e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x5c, 0x0a, 0x0c, 0x47, + 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x62, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x4a, 0x6f, 0x62, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x24, 0x2e, 0x6d, 0x67, + 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x5c, 0x0a, - 0x0c, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x62, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x24, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, - 0x56, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x20, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x65, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x53, - 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x12, 0x1f, 0x2e, 0x6d, 0x67, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x56, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x20, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, - 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, - 0x90, 0x02, 0x01, 0x12, 0x59, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, - 0x52, 0x75, 0x6e, 0x12, 0x22, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, - 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, - 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x12, 0x22, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0c, 0x43, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x12, 0x22, 0x2e, 0x6d, 0x67, 0x6d, 0x74, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, - 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0f, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x12, 0x25, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, - 0x29, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x67, 0x6d, + 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x65, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, + 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, + 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x53, 0x0a, 0x09, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x12, 0x1f, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5c, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x23, 0x2e, 0x6d, 0x67, - 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x2b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, - 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, - 0x0a, 0x11, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, + 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, + 0x01, 0x12, 0x59, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, + 0x6e, 0x12, 0x22, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0c, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x12, 0x22, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x0c, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x12, 0x22, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, + 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x62, 0x0a, 0x0f, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x4a, + 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x12, 0x25, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x4a, + 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x70, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x29, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, + 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x2b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, - 0x4a, 0x6f, 0x62, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x29, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x24, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x25, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, - 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x52, 0x75, + 0x4a, 0x6f, 0x62, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x11, + 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x29, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x4a, 0x6f, 0x62, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x59, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x12, 0x21, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, - 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, - 0x90, 0x02, 0x01, 0x12, 0x56, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, - 0x6b, 0x12, 0x20, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x5c, 0x0a, 0x0d, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x23, 0x2e, 0x6d, - 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, + 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, + 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x59, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, + 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x12, 0x21, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, + 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, + 0x01, 0x12, 0x56, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x12, + 0x20, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x5c, 0x0a, 0x0d, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x16, 0x49, 0x73, 0x4a, 0x6f, 0x62, - 0x48, 0x6f, 0x6f, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x2c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4a, + 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x16, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x48, 0x6f, + 0x6f, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x2c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x73, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5c, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, - 0x6b, 0x12, 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, - 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, - 0x0a, 0x11, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, - 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, - 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x83, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x42, 0x79, - 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x42, 0xc4, - 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x42, 0x08, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x75, 0x63, - 0x6c, 0x65, 0x75, 0x73, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6e, 0x65, 0x6f, 0x73, 0x79, 0x6e, - 0x63, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x6d, 0x67, 0x6d, 0x74, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0d, 0x4d, 0x67, 0x6d, 0x74, 0x2e, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x0d, 0x4d, 0x67, 0x6d, 0x74, 0x5c, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x19, 0x4d, 0x67, 0x6d, 0x74, 0x5c, - 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x4d, 0x67, 0x6d, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x73, + 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, + 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x12, + 0x23, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, + 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x11, + 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x27, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4a, 0x6f, + 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x83, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x42, 0x79, 0x54, 0x69, + 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, + 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, + 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x42, 0xc4, 0x01, 0x0a, + 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x42, 0x08, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x50, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x75, 0x63, 0x6c, 0x65, + 0x75, 0x73, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6e, 0x65, 0x6f, 0x73, 0x79, 0x6e, 0x63, 0x2f, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x3b, 0x6d, 0x67, 0x6d, 0x74, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0d, 0x4d, 0x67, 0x6d, 0x74, 0x2e, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x0d, 0x4d, 0x67, 0x6d, 0x74, 0x5c, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x19, 0x4d, 0x67, 0x6d, 0x74, 0x5c, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x0e, 0x4d, 0x67, 0x6d, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/backend/internal/connectiondata/sql.go b/backend/internal/connectiondata/sql.go index 1307e6e594..573676d6ac 100644 --- a/backend/internal/connectiondata/sql.go +++ b/backend/internal/connectiondata/sql.go @@ -287,10 +287,23 @@ func (s *SQLConnectionDataService) GetTableConstraints( } } + uniqueIndexesMap := map[string]*mgmtv1alpha1.UniqueIndexes{} + for table, uniqueIndexes := range tableConstraints.UniqueIndexes { + uniqueIndexesMap[table] = &mgmtv1alpha1.UniqueIndexes{ + Indexes: []*mgmtv1alpha1.UniqueIndex{}, + } + for _, ui := range uniqueIndexes { + uniqueIndexesMap[table].Indexes = append(uniqueIndexesMap[table].Indexes, &mgmtv1alpha1.UniqueIndex{ + Columns: ui, + }) + } + } + return &mgmtv1alpha1.GetConnectionTableConstraintsResponse{ ForeignKeyConstraints: fkConstraintsMap, PrimaryKeyConstraints: pkConstraintsMap, UniqueConstraints: uniqueConstraintsMap, + UniqueIndexes: uniqueIndexesMap, }, nil } diff --git a/backend/pkg/dbschemas/sql/postgresql/queries/system.sql b/backend/pkg/dbschemas/sql/postgresql/queries/system.sql index 23aee8ae5c..94980a6583 100644 --- a/backend/pkg/dbschemas/sql/postgresql/queries/system.sql +++ b/backend/pkg/dbschemas/sql/postgresql/queries/system.sql @@ -596,7 +596,6 @@ FROM information_schema.table_constraints AS tc JOIN pg_catalog.pg_constraint AS pgcon ON pgcon.conname = tc.constraint_name AND pgcon.connamespace = pn.oid - WHERE tc.table_schema = ANY(sqlc.arg('schema')::TEXT[]) /* Exclude foreign keys */ @@ -680,3 +679,25 @@ GROUP BY referenced_schema.nspname, referenced_tbl.relname, ref_columns.foreign_column_names; + + +-- name: GetUniqueIndexesBySchema :many +SELECT + ns.nspname AS table_schema, -- Schema name for the table + tbl.relname AS table_name, -- Name of the table the index belongs to + idx.relname AS index_name, -- Name of the index + array_agg(col.attname ORDER BY key_info.ordinality)::TEXT[] AS index_columns -- Comma-separated list of index columns +FROM pg_catalog.pg_class AS tbl + -- Join to get the schema information for the table + JOIN pg_catalog.pg_namespace AS ns ON tbl.relnamespace = ns.oid + -- Join to retrieve index metadata for the table + JOIN pg_catalog.pg_index AS idx_meta ON tbl.oid = idx_meta.indrelid + -- Join to get the index object details + JOIN pg_catalog.pg_class AS idx ON idx_meta.indexrelid = idx.oid + -- Unnest the index key attribute numbers along with their ordinal positions + JOIN unnest(idx_meta.indkey) WITH ORDINALITY AS key_info(attnum, ordinality) ON true + -- Join to get the column attributes corresponding to the index keys + JOIN pg_catalog.pg_attribute AS col ON col.attrelid = tbl.oid AND col.attnum = key_info.attnum +WHERE ns.nspname = ANY(sqlc.arg('schema')::TEXT[]) + AND idx_meta.indisunique = true +GROUP BY ns.nspname, tbl.relname, idx.relname; diff --git a/backend/pkg/mssql-querier/querier.go b/backend/pkg/mssql-querier/querier.go index 9fd9763427..5129542242 100644 --- a/backend/pkg/mssql-querier/querier.go +++ b/backend/pkg/mssql-querier/querier.go @@ -16,6 +16,7 @@ type Querier interface { GetRolePermissions(ctx context.Context, db mysql_queries.DBTX) ([]*GetRolePermissionsRow, error) GetTableConstraintsBySchemas(ctx context.Context, db mysql_queries.DBTX, schemas []string) ([]*GetTableConstraintsBySchemasRow, error) GetViewsAndFunctionsBySchemas(ctx context.Context, db mysql_queries.DBTX, schemas []string) ([]*GetViewsAndFunctionsBySchemasRow, error) + GetUniqueIndexesBySchema(ctx context.Context, db mysql_queries.DBTX, schemas []string) ([]*GetUniqueIndexesBySchemaRow, error) } var _ Querier = (*Queries)(nil) diff --git a/backend/pkg/mssql-querier/system.sql.go b/backend/pkg/mssql-querier/system.sql.go index c1c22338be..eac6ecc62f 100644 --- a/backend/pkg/mssql-querier/system.sql.go +++ b/backend/pkg/mssql-querier/system.sql.go @@ -963,3 +963,66 @@ func createSchemaTableParams(values []string) (argPlaceholders string, arguments return strings.Join(placeholders, ","), args } + +const getUniqueIndexesBySchema = `-- name: getUniqueIndexesBySchema :many +SELECT + SCHEMA_NAME(t.schema_id) AS table_schema, + t.name AS table_name, + i.name AS index_name, + index_columns = ( + SELECT STRING_AGG(c.name, ', ') WITHIN GROUP (ORDER BY ic.key_ordinal) + FROM sys.index_columns ic + JOIN sys.columns c + ON ic.object_id = c.object_id + AND ic.column_id = c.column_id + WHERE ic.object_id = i.object_id + AND ic.index_id = i.index_id + AND ic.is_included_column = 0 + ) +FROM sys.indexes i +JOIN sys.tables t + ON i.object_id = t.object_id +WHERE i.type > 0 -- valid index types only + AND i.is_unique = 1 -- only unique indexes + AND i.is_unique_constraint = 0 -- exclude UNIQUE constraints + AND i.is_primary_key = 0 -- exclude primary keys + AND SCHEMA_NAME(t.schema_id) IN (%s) +ORDER BY i.index_id; +` + +type GetUniqueIndexesBySchemaRow struct { + TableSchema string + TableName string + IndexName string + IndexColumns string +} + +func (q *Queries) GetUniqueIndexesBySchema(ctx context.Context, db mysql_queries.DBTX, schemas []string) ([]*GetUniqueIndexesBySchemaRow, error) { + placeholders, args := createSchemaTableParams(schemas) + query := fmt.Sprintf(getUniqueIndexesBySchema, placeholders) + rows, err := db.QueryContext(ctx, query, args...) + if err != nil { + return nil, err + } + defer rows.Close() + var items []*GetUniqueIndexesBySchemaRow + for rows.Next() { + var i GetUniqueIndexesBySchemaRow + if err := rows.Scan( + &i.TableSchema, + &i.TableName, + &i.IndexName, + &i.IndexColumns, + ); err != nil { + return nil, err + } + items = append(items, &i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/backend/pkg/sqlmanager/mssql/mssql-manager.go b/backend/pkg/sqlmanager/mssql/mssql-manager.go index 3f9120f4df..e2e53cba51 100644 --- a/backend/pkg/sqlmanager/mssql/mssql-manager.go +++ b/backend/pkg/sqlmanager/mssql/mssql-manager.go @@ -13,6 +13,7 @@ import ( ee_sqlmanager_mssql "github.com/nucleuscloud/neosync/internal/ee/mssql-manager" "github.com/nucleuscloud/neosync/internal/gotypeutil" "github.com/nucleuscloud/neosync/internal/neosyncdb" + "golang.org/x/sync/errgroup" ) type Manager struct { @@ -188,18 +189,40 @@ func (m *Manager) GetTableConstraintsBySchema(ctx context.Context, schemas []str if len(schemas) == 0 { return &sqlmanager_shared.TableConstraints{}, nil } - rows, err := m.querier.GetTableConstraintsBySchemas(ctx, m.db, schemas) - if err != nil && !neosyncdb.IsNoRows(err) { + + errgrp, errctx := errgroup.WithContext(ctx) + constraints := []*mssql_queries.GetTableConstraintsBySchemasRow{} + errgrp.Go(func() error { + rows, err := m.querier.GetTableConstraintsBySchemas(ctx, m.db, schemas) + if err != nil && !neosyncdb.IsNoRows(err) { + return err + } else if err != nil && neosyncdb.IsNoRows(err) { + return nil + } + constraints = rows + return nil + }) + + uniqueIndexes := []*mssql_queries.GetUniqueIndexesBySchemaRow{} + errgrp.Go(func() error { + indexes, err := m.querier.GetUniqueIndexesBySchema(errctx, m.db, schemas) + if err != nil { + return err + } + uniqueIndexes = indexes + return nil + }) + + if err := errgrp.Wait(); err != nil { return nil, err - } else if err != nil && neosyncdb.IsNoRows(err) { - return &sqlmanager_shared.TableConstraints{}, nil } foreignKeyMap := map[string][]*sqlmanager_shared.ForeignConstraint{} primaryKeyMap := map[string][]string{} uniqueConstraintsMap := map[string][][]string{} + uniqueIndexesMap := map[string][][]string{} - for _, row := range rows { + for _, row := range constraints { tableName := sqlmanager_shared.BuildTable(row.SchemaName, row.TableName) constraintCols := splitAndStrip(row.ConstraintColumns, ", ") @@ -245,10 +268,16 @@ func (m *Manager) GetTableConstraintsBySchema(ctx context.Context, schemas []str } } + for _, row := range uniqueIndexes { + tableName := sqlmanager_shared.BuildTable(row.TableSchema, row.TableName) + uniqueIndexesMap[tableName] = append(uniqueIndexesMap[tableName], splitAndStrip(row.IndexColumns, ", ")) + } + return &sqlmanager_shared.TableConstraints{ ForeignKeyConstraints: foreignKeyMap, PrimaryKeyConstraints: primaryKeyMap, UniqueConstraints: uniqueConstraintsMap, + UniqueIndexes: uniqueIndexesMap, }, nil } @@ -289,7 +318,7 @@ func (m *Manager) GetRolePermissionsMap(ctx context.Context) (map[string][]strin return schemaTablePrivsMap, err } -func splitAndStrip(input, delim string) []string { +func splitAndStrip(input, delim string) []string { //nolint:unparam output := []string{} for _, piece := range strings.Split(input, delim) { diff --git a/backend/pkg/sqlmanager/mysql/mysql-manager.go b/backend/pkg/sqlmanager/mysql/mysql-manager.go index e59586f99f..6dd8e52796 100644 --- a/backend/pkg/sqlmanager/mysql/mysql-manager.go +++ b/backend/pkg/sqlmanager/mysql/mysql-manager.go @@ -264,6 +264,8 @@ func (m *MysqlManager) GetTableConstraintsBySchema(ctx context.Context, schemas ForeignKeyConstraints: foreignKeyMap, PrimaryKeyConstraints: primaryKeyMap, UniqueConstraints: uniqueConstraintsMap, + // there is no real distinction between unique indexes and unique constraints in mysql + UniqueIndexes: map[string][][]string{}, }, nil } diff --git a/backend/pkg/sqlmanager/postgres/postgres-manager.go b/backend/pkg/sqlmanager/postgres/postgres-manager.go index 5e9a8c86a7..d7ba398526 100644 --- a/backend/pkg/sqlmanager/postgres/postgres-manager.go +++ b/backend/pkg/sqlmanager/postgres/postgres-manager.go @@ -145,6 +145,16 @@ func (p *PostgresManager) GetTableConstraintsBySchema(ctx context.Context, schem return nil }) + uniqueIndexes := []*pg_queries.GetUniqueIndexesBySchemaRow{} + errgrp.Go(func() error { + indexes, err := p.querier.GetUniqueIndexesBySchema(errctx, p.db, schemas) + if err != nil { + return err + } + uniqueIndexes = indexes + return nil + }) + if err := errgrp.Wait(); err != nil { return nil, err } @@ -184,10 +194,17 @@ func (p *PostgresManager) GetTableConstraintsBySchema(ctx context.Context, schem }) } + uniqueIndexesMap := map[string][][]string{} + for _, row := range uniqueIndexes { + tableName := sqlmanager_shared.BuildTable(row.TableSchema, row.TableName) + uniqueIndexesMap[tableName] = append(uniqueIndexesMap[tableName], row.IndexColumns) + } + return &sqlmanager_shared.TableConstraints{ ForeignKeyConstraints: foreignKeyMap, PrimaryKeyConstraints: primaryKeyMap, UniqueConstraints: uniqueConstraintsMap, + UniqueIndexes: uniqueIndexesMap, }, nil } diff --git a/backend/pkg/sqlmanager/shared/types.go b/backend/pkg/sqlmanager/shared/types.go index 9f574bc2af..dbfcfc8804 100644 --- a/backend/pkg/sqlmanager/shared/types.go +++ b/backend/pkg/sqlmanager/shared/types.go @@ -125,6 +125,7 @@ type TableConstraints struct { ForeignKeyConstraints map[string][]*ForeignConstraint PrimaryKeyConstraints map[string][]string UniqueConstraints map[string][][]string + UniqueIndexes map[string][][]string } type DataType struct { @@ -183,7 +184,11 @@ type InitSchemaStatements struct { } type SelectQuery struct { + // Query is the query used to get all data Query string + // PageQuery is the query used to get a page of data based on a unique identifier like a primary key in the WHERE clause + PageQuery string + PageLimit int // If true, this query could return rows that violate foreign key constraints IsNotForeignKeySafeSubset bool diff --git a/backend/pkg/table-dependency/table-dependency.go b/backend/pkg/table-dependency/table-dependency.go index fe9aa52b1c..e452e1a81c 100644 --- a/backend/pkg/table-dependency/table-dependency.go +++ b/backend/pkg/table-dependency/table-dependency.go @@ -49,6 +49,7 @@ type RunConfig struct { runType RunType primaryKeys []string whereClause *string + orderByColumns []string // columns to order by selectQuery *string splitColumnPaths bool } @@ -122,6 +123,10 @@ func (rc *RunConfig) SelectQuery() *string { return rc.selectQuery } +func (rc *RunConfig) OrderByColumns() []string { + return rc.orderByColumns +} + func (rc *RunConfig) SplitColumnPaths() bool { return rc.splitColumnPaths } @@ -149,6 +154,10 @@ func (rc *RunConfig) appendForeignKey(fk *ForeignKey) { rc.foreignKeys = append(rc.foreignKeys, fk) } +func (rc *RunConfig) setOrderByColumns(orderBy []string) { + rc.orderByColumns = orderBy +} + func (rc *RunConfig) SetSelectQuery(query *string) { rc.selectQuery = query } @@ -158,6 +167,8 @@ func GetRunConfigs( subsets map[string]string, primaryKeyMap map[string][]string, tableColumnsMap map[string][]string, + uniqueIndexesMap map[string][][]string, + uniqueConstraintsMap map[string][][]string, ) ([]*RunConfig, error) { configs := []*RunConfig{} @@ -222,6 +233,8 @@ func GetRunConfigs( } } + setOrderByColumns(configs, primaryKeyMap, uniqueIndexesMap, uniqueConstraintsMap) + // check run path if !isValidRunOrder(configs) { return nil, errors.New("unable to build table run order. unsupported circular dependency detected.") @@ -230,6 +243,37 @@ func GetRunConfigs( return configs, nil } +func setOrderByColumns(configs []*RunConfig, primaryKeyMap map[string][]string, uniqueIndexes, uniqueConstraints map[string][][]string) { + for _, config := range configs { + cols := getOrderByColumns(config, primaryKeyMap, uniqueIndexes, uniqueConstraints) + config.setOrderByColumns(cols) + } +} + +// getOrderByColumns returns order by columns for a table, prioritizing primary keys, +// then unique indexes, and finally falling back to sorted select columns. +func getOrderByColumns(config *RunConfig, primaryKeyMap map[string][]string, uniqueIndexes, uniqueConstraints map[string][][]string) []string { + table := config.Table() + cols, ok := primaryKeyMap[table] + if ok { + return cols + } + + constraints := uniqueConstraints[table] + if len(constraints) > 0 { + return constraints[0] + } + + indexes := uniqueIndexes[table] + if len(indexes) > 0 { + return indexes[0] + } + + selectCols := config.SelectColumns() + slices.Sort(selectCols) + return selectCols +} + // removes update configs that have where clause // breaks circular dependencies and self references when subset is applied func filterConfigsWithWhereClause(configs []*RunConfig) []*RunConfig { diff --git a/backend/pkg/table-dependency/table-dependency_test.go b/backend/pkg/table-dependency/table-dependency_test.go index 3740a3d8b1..9545766782 100644 --- a/backend/pkg/table-dependency/table-dependency_test.go +++ b/backend/pkg/table-dependency/table-dependency_test.go @@ -255,7 +255,7 @@ func Test_GetRunConfigs_NoSubset_SingleCycle(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - actual, err := GetRunConfigs(tt.dependencies, tt.subsets, tt.primaryKeyMap, tt.tableColsMap) + actual, err := GetRunConfigs(tt.dependencies, tt.subsets, tt.primaryKeyMap, tt.tableColsMap, map[string][][]string{}, map[string][][]string{}) require.NoError(t, err) for _, e := range tt.expect { acutalConfig := getConfigByTableAndType(e.Table(), e.RunType(), actual) @@ -353,7 +353,7 @@ func Test_GetRunConfigs_Subset_SingleCycle(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - actual, err := GetRunConfigs(tt.dependencies, tt.subsets, tt.primaryKeyMap, tt.tableColsMap) + actual, err := GetRunConfigs(tt.dependencies, tt.subsets, tt.primaryKeyMap, tt.tableColsMap, map[string][][]string{}, map[string][][]string{}) require.NoError(t, err) for _, e := range tt.expect { acutalConfig := getConfigByTableAndType(e.Table(), e.RunType(), actual) @@ -536,7 +536,7 @@ func Test_GetRunConfigs_NoSubset_MultiCycle(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - actual, err := GetRunConfigs(tt.dependencies, tt.subsets, tt.primaryKeyMap, tt.tableColsMap) + actual, err := GetRunConfigs(tt.dependencies, tt.subsets, tt.primaryKeyMap, tt.tableColsMap, map[string][][]string{}, map[string][][]string{}) require.NoError(t, err) for _, e := range tt.expect { acutalConfig := getConfigByTableAndType(e.Table(), e.RunType(), actual) @@ -646,7 +646,7 @@ func Test_GetRunConfigs_NoSubset_NoCycle(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - actual, err := GetRunConfigs(tt.dependencies, tt.subsets, tt.primaryKeyMap, tt.tableColsMap) + actual, err := GetRunConfigs(tt.dependencies, tt.subsets, tt.primaryKeyMap, tt.tableColsMap, map[string][][]string{}, map[string][][]string{}) require.NoError(t, err) for _, e := range tt.expect { acutalConfig := getConfigByTableAndType(e.Table(), e.RunType(), actual) @@ -721,7 +721,7 @@ func Test_GetRunConfigs_CompositeKey(t *testing.T) { []*DependsOn{{Table: "public.employees", Columns: []string{"employee_id", "department_id"}}}), } - actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap) + actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap, map[string][][]string{}, map[string][][]string{}) require.NoError(t, err) for _, e := range expect { @@ -839,7 +839,7 @@ func Test_GetRunConfigs_HumanResources(t *testing.T) { []*DependsOn{{Table: "public.employees", Columns: []string{"employee_id"}}}), } - actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap) + actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap, map[string][][]string{}, map[string][][]string{}) require.NoError(t, err) for _, e := range expect { acutalConfig := getConfigByTableAndType(e.Table(), e.RunType(), actual) @@ -904,7 +904,7 @@ func Test_GetRunConfigs_SingleTable_WithFks(t *testing.T) { []*DependsOn{{Table: "public.employees", Columns: []string{"employee_id"}}}), } - actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap) + actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap, map[string][][]string{}, map[string][][]string{}) require.NoError(t, err) for _, e := range expect { acutalConfig := getConfigByTableAndType(e.Table(), e.RunType(), actual) @@ -991,7 +991,7 @@ func Test_GetRunConfigs_Complex_CircularDependency(t *testing.T) { }), } - actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap) + actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap, map[string][][]string{}, map[string][][]string{}) require.NoError(t, err) for _, e := range expect { actualConfig := getConfigByTableAndType(e.Table(), e.RunType(), actual) // Adjust getConfigByTableAndType according to your actual utility functions @@ -1070,7 +1070,7 @@ func Test_GetRunConfigs_Multiple_CircularDependency(t *testing.T) { }), } - actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap) + actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap, map[string][][]string{}, map[string][][]string{}) require.NoError(t, err) for _, e := range expect { actualConfig := getConfigByTableAndType(e.Table(), e.RunType(), actual) @@ -1140,7 +1140,7 @@ func Test_GetRunConfigs_CircularDependency_MultipleFksPerTable(t *testing.T) { }), } - actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap) + actual, err := GetRunConfigs(dependencies, map[string]string{}, primaryKeyMap, tablesColMap, map[string][][]string{}, map[string][][]string{}) require.NoError(t, err) for _, e := range expect { actualConfig := getConfigByTableAndType(e.Table(), e.RunType(), actual) @@ -1162,7 +1162,7 @@ func Test_GetRunConfigs_CircularDependencyNoneNullable(t *testing.T) { {Columns: []string{"a_id"}, NotNullable: []bool{true}, ForeignKey: &sqlmanager_shared.ForeignKey{Table: "public.a", Columns: []string{"id"}}}, }, } - _, err := GetRunConfigs(dependencies, map[string]string{}, map[string][]string{}, map[string][]string{"public.a": {}, "public.b": {}}) + _, err := GetRunConfigs(dependencies, map[string]string{}, map[string][]string{}, map[string][]string{"public.a": {}, "public.b": {}}, map[string][][]string{}, map[string][][]string{}) require.Error(t, err) } diff --git a/backend/protos/mgmt/v1alpha1/connection_data.proto b/backend/protos/mgmt/v1alpha1/connection_data.proto index a9c19307a4..62ab56e933 100644 --- a/backend/protos/mgmt/v1alpha1/connection_data.proto +++ b/backend/protos/mgmt/v1alpha1/connection_data.proto @@ -253,6 +253,16 @@ message UniqueConstraints { repeated UniqueConstraint constraints = 1; } +message UniqueIndexes { + // The unique indexes found for the table + repeated UniqueIndex indexes = 1; +} + +message UniqueIndex { + // The columns that are part of the unique index + repeated string columns = 1; +} + message GetConnectionTableConstraintsResponse { // the key here is .
and the list of tables that it depends on, also `.
` format. map foreign_key_constraints = 1; @@ -260,6 +270,8 @@ message GetConnectionTableConstraintsResponse { map primary_key_constraints = 2; // the key here is .
and value is the unique constraint map unique_constraints = 3; + // the key here is .
and value is the unique index + map unique_indexes = 4; } message GetTableRowCountRequest { diff --git a/backend/services/mgmt/v1alpha1/job-service/runs.go b/backend/services/mgmt/v1alpha1/job-service/runs.go index 529cbb0b99..eb35d685a1 100644 --- a/backend/services/mgmt/v1alpha1/job-service/runs.go +++ b/backend/services/mgmt/v1alpha1/job-service/runs.go @@ -22,6 +22,7 @@ import ( "github.com/nucleuscloud/neosync/internal/ee/rbac" nucleuserrors "github.com/nucleuscloud/neosync/internal/errors" "github.com/nucleuscloud/neosync/internal/neosyncdb" + tablesync_workflow "github.com/nucleuscloud/neosync/worker/pkg/workflows/tablesync/workflow" "go.temporal.io/api/enums/v1" temporalclient "go.temporal.io/sdk/client" "go.temporal.io/sdk/converter" @@ -234,6 +235,81 @@ func (s *Service) GetJobRunEvents( isRunComplete = true case enums.EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT: isRunComplete = true + + case enums.EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_FAILED: + isRunComplete = true + case enums.EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED: + activityOrder = append(activityOrder, event.GetEventId()) + attributes := event.GetStartChildWorkflowExecutionInitiatedEventAttributes() + jobRunEvent := &mgmtv1alpha1.JobRunEvent{ + Id: event.EventId, + Type: attributes.GetWorkflowType().GetName(), + StartTime: event.EventTime, + Tasks: []*mgmtv1alpha1.JobRunEventTask{ + dtomaps.ToJobRunEventTaskDto(event, nil), + }, + } + if len(attributes.Input.Payloads) > 0 { + if attributes.GetWorkflowType().GetName() == "TableSync" { + var tableSyncRequest tablesync_workflow.TableSyncRequest + err := converter.GetDefaultDataConverter().FromPayload(attributes.Input.Payloads[0], &tableSyncRequest) + if err != nil { + logger.Error(fmt.Errorf("unable to convert to event input payload: %w", err).Error()) + } + + metadata := &mgmtv1alpha1.JobRunEventMetadata{} + metadata.Metadata = &mgmtv1alpha1.JobRunEventMetadata_SyncMetadata{ + SyncMetadata: &mgmtv1alpha1.JobRunSyncMetadata{ + Schema: tableSyncRequest.TableSchema, + Table: tableSyncRequest.TableName, + }, + } + + jobRunEvent.Metadata = metadata + } + } + activityMap[event.EventId] = jobRunEvent + + case enums.EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED: + attributes := event.GetChildWorkflowExecutionStartedEventAttributes() + activity := activityMap[attributes.InitiatedEventId] + activity.Tasks = append(activity.Tasks, dtomaps.ToJobRunEventTaskDto(event, nil)) + + case enums.EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_COMPLETED: + attributes := event.GetChildWorkflowExecutionCompletedEventAttributes() + activity := activityMap[attributes.InitiatedEventId] + activity.CloseTime = event.EventTime + activity.Tasks = append(activity.Tasks, dtomaps.ToJobRunEventTaskDto(event, nil)) + + case enums.EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_FAILED: + attributes := event.GetChildWorkflowExecutionFailedEventAttributes() + activity := activityMap[attributes.InitiatedEventId] + activity.CloseTime = event.EventTime + errorDto := dtomaps.ToJobRunEventTaskErrorDto(attributes.Failure, attributes.RetryState) + activity.Tasks = append(activity.Tasks, dtomaps.ToJobRunEventTaskDto(event, errorDto)) + + isRunComplete = true + + case enums.EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TIMED_OUT: + attributes := event.GetChildWorkflowExecutionTimedOutEventAttributes() + activity := activityMap[attributes.InitiatedEventId] + activity.CloseTime = event.EventTime + activity.Tasks = append(activity.Tasks, dtomaps.ToJobRunEventTaskDto(event, nil)) + isRunComplete = true + + case enums.EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_CANCELED: + attributes := event.GetChildWorkflowExecutionCanceledEventAttributes() + activity := activityMap[attributes.InitiatedEventId] + activity.CloseTime = event.EventTime + activity.Tasks = append(activity.Tasks, dtomaps.ToJobRunEventTaskDto(event, nil)) + isRunComplete = true + + case enums.EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TERMINATED: + attributes := event.GetChildWorkflowExecutionTerminatedEventAttributes() + activity := activityMap[attributes.InitiatedEventId] + activity.CloseTime = event.EventTime + activity.Tasks = append(activity.Tasks, dtomaps.ToJobRunEventTaskDto(event, nil)) + isRunComplete = true default: } } diff --git a/cli/internal/cmds/neosync/sync/sync.go b/cli/internal/cmds/neosync/sync/sync.go index dcc3c26d83..99c7bff2b1 100644 --- a/cli/internal/cmds/neosync/sync/sync.go +++ b/cli/internal/cmds/neosync/sync/sync.go @@ -385,7 +385,7 @@ func (c *clisync) configureSync() ([][]*benthosbuilder.BenthosConfigResponse, er SourceJobRunId: jobRunId, DestinationConnection: c.destinationConnection, SyncConfigs: syncConfigs, - WorkflowId: job.Id, + JobRunId: job.Id, Logger: c.logger, Sqlmanagerclient: c.sqlmanagerclient, Transformerclient: c.transformerclient, @@ -803,7 +803,22 @@ func buildSyncConfigs( primaryKeysMap[table] = constraints.GetColumns() } - runConfigs, err := tabledependency.GetRunConfigs(schemaConfig.TableConstraints, map[string]string{}, primaryKeysMap, tableColMap) + uniqueIndexesMap := map[string][][]string{} + uniqueConstraintsMap := map[string][][]string{} + + for table, uniqueIndexes := range schemaConfig.TableUniqueIndexes { + for _, ui := range uniqueIndexes.GetIndexes() { + uniqueIndexesMap[table] = append(uniqueIndexesMap[table], ui.GetColumns()) + } + } + + for table, uniqueConstraints := range schemaConfig.TableUniqueConstraints { + for _, uc := range uniqueConstraints.GetConstraints() { + uniqueConstraintsMap[table] = append(uniqueConstraintsMap[table], uc.GetColumns()) + } + } + + runConfigs, err := tabledependency.GetRunConfigs(schemaConfig.TableConstraints, map[string]string{}, primaryKeysMap, tableColMap, uniqueIndexesMap, uniqueConstraintsMap) if err != nil { logger.Error(err.Error()) return nil @@ -851,6 +866,8 @@ type schemaConfig struct { TablePrimaryKeys map[string]*mgmtv1alpha1.PrimaryConstraint TruncateTableStatementsMap map[string]string InitSchemaStatements []*mgmtv1alpha1.SchemaInitStatements + TableUniqueIndexes map[string]*mgmtv1alpha1.UniqueIndexes + TableUniqueConstraints map[string]*mgmtv1alpha1.UniqueConstraints } func (c *clisync) getConnectionSchemaConfig() (*schemaConfig, error) { @@ -893,6 +910,8 @@ func (c *clisync) getSourceConnectionSqlSchemaConfig( ) (*schemaConfig, error) { var schemas []*mgmtv1alpha1.DatabaseColumn var tableConstraints map[string]*mgmtv1alpha1.ForeignConstraintTables + var tableUniqueIndexes map[string]*mgmtv1alpha1.UniqueIndexes + var tableUniqueConstraints map[string]*mgmtv1alpha1.UniqueConstraints var tablePrimaryKeys map[string]*mgmtv1alpha1.PrimaryConstraint var truncateTableStatementsMap map[string]string var initSchemaStatements []*mgmtv1alpha1.SchemaInitStatements @@ -916,6 +935,8 @@ func (c *clisync) getSourceConnectionSqlSchemaConfig( } tableConstraints = constraintConnectionResp.Msg.GetForeignKeyConstraints() tablePrimaryKeys = constraintConnectionResp.Msg.GetPrimaryKeyConstraints() + tableUniqueIndexes = constraintConnectionResp.Msg.GetUniqueIndexes() + tableUniqueConstraints = constraintConnectionResp.Msg.GetUniqueConstraints() return nil }) @@ -956,9 +977,11 @@ func (c *clisync) getSourceConnectionSqlSchemaConfig( return &schemaConfig{ Schemas: schemas, TableConstraints: tc, + TableUniqueIndexes: tableUniqueIndexes, TablePrimaryKeys: tablePrimaryKeys, TruncateTableStatementsMap: truncateTableStatementsMap, InitSchemaStatements: initSchemaStatements, + TableUniqueConstraints: tableUniqueConstraints, }, nil } diff --git a/docs/openapi/mgmt/v1alpha1/connection_data.openapi.yaml b/docs/openapi/mgmt/v1alpha1/connection_data.openapi.yaml index 65e41804dc..0a69579fa7 100644 --- a/docs/openapi/mgmt/v1alpha1/connection_data.openapi.yaml +++ b/docs/openapi/mgmt/v1alpha1/connection_data.openapi.yaml @@ -843,6 +843,14 @@ components: - $ref: '#/components/schemas/mgmt.v1alpha1.UniqueConstraints' title: value description: the key here is .
and value is the unique constraint + uniqueIndexes: + type: object + title: unique_indexes + additionalProperties: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.UniqueIndexes' + title: value + description: the key here is .
and value is the unique index title: GetConnectionTableConstraintsResponse additionalProperties: false mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry: @@ -881,6 +889,18 @@ components: title: value title: UniqueConstraintsEntry additionalProperties: false + mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueIndexesEntry: + type: object + properties: + key: + type: string + title: key + value: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.UniqueIndexes' + title: value + title: UniqueIndexesEntry + additionalProperties: false mgmt.v1alpha1.GetTableRowCountRequest: type: object allOf: @@ -1021,6 +1041,28 @@ components: description: The unique constraints found for the table title: UniqueConstraints additionalProperties: false + mgmt.v1alpha1.UniqueIndex: + type: object + properties: + columns: + type: array + items: + type: string + title: columns + description: The columns that are part of the unique index + title: UniqueIndex + additionalProperties: false + mgmt.v1alpha1.UniqueIndexes: + type: object + properties: + indexes: + type: array + items: + $ref: '#/components/schemas/mgmt.v1alpha1.UniqueIndex' + title: indexes + description: The unique indexes found for the table + title: UniqueIndexes + additionalProperties: false connect-protocol-version: type: number title: Connect-Protocol-Version diff --git a/docs/openapi/mgmt/v1alpha1/job.openapi.yaml b/docs/openapi/mgmt/v1alpha1/job.openapi.yaml index 33f2f7add2..5e95c08f17 100644 --- a/docs/openapi/mgmt/v1alpha1/job.openapi.yaml +++ b/docs/openapi/mgmt/v1alpha1/job.openapi.yaml @@ -636,6 +636,7 @@ components: items: $ref: '#/components/schemas/mgmt.v1alpha1.CreateJobDestination' title: destinations + minItems: 1 description: The list of destinations to create and associate with the job title: CreateJobDestinationConnectionsRequest additionalProperties: false @@ -710,6 +711,7 @@ components: items: $ref: '#/components/schemas/mgmt.v1alpha1.JobMapping' title: mappings + minItems: 1 description: The list of mappings that will be used to transform the data source: allOf: @@ -721,6 +723,7 @@ components: items: $ref: '#/components/schemas/mgmt.v1alpha1.CreateJobDestination' title: destinations + minItems: 1 description: The list of destinations that will be used to store the data initiateJobRun: type: boolean diff --git a/docs/openapi/neosync.mgmt.v1alpha1.yaml b/docs/openapi/neosync.mgmt.v1alpha1.yaml index 4a25e81771..265439ea74 100644 --- a/docs/openapi/neosync.mgmt.v1alpha1.yaml +++ b/docs/openapi/neosync.mgmt.v1alpha1.yaml @@ -9432,6 +9432,14 @@ components: - $ref: '#/components/schemas/mgmt.v1alpha1.UniqueConstraints' title: value description: the key here is .
and value is the unique constraint + uniqueIndexes: + type: object + title: unique_indexes + additionalProperties: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.UniqueIndexes' + title: value + description: the key here is .
and value is the unique index title: GetConnectionTableConstraintsResponse additionalProperties: false mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry: @@ -9470,6 +9478,18 @@ components: title: value title: UniqueConstraintsEntry additionalProperties: false + mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueIndexesEntry: + type: object + properties: + key: + type: string + title: key + value: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.UniqueIndexes' + title: value + title: UniqueIndexesEntry + additionalProperties: false mgmt.v1alpha1.GetTableRowCountRequest: type: object allOf: @@ -9614,6 +9634,28 @@ components: description: The unique constraints found for the table title: UniqueConstraints additionalProperties: false + mgmt.v1alpha1.UniqueIndex: + type: object + properties: + columns: + type: array + items: + type: string + title: columns + description: The columns that are part of the unique index + title: UniqueIndex + additionalProperties: false + mgmt.v1alpha1.UniqueIndexes: + type: object + properties: + indexes: + type: array + items: + $ref: '#/components/schemas/mgmt.v1alpha1.UniqueIndex' + title: indexes + description: The unique indexes found for the table + title: UniqueIndexes + additionalProperties: false mgmt.v1alpha1.ActivityStatus: type: string title: ActivityStatus @@ -10118,6 +10160,7 @@ components: items: $ref: '#/components/schemas/mgmt.v1alpha1.CreateJobDestination' title: destinations + minItems: 1 description: The list of destinations to create and associate with the job title: CreateJobDestinationConnectionsRequest additionalProperties: false @@ -10194,6 +10237,7 @@ components: items: $ref: '#/components/schemas/mgmt.v1alpha1.JobMapping' title: mappings + minItems: 1 description: The list of mappings that will be used to transform the data source: allOf: @@ -10205,6 +10249,7 @@ components: items: $ref: '#/components/schemas/mgmt.v1alpha1.CreateJobDestination' title: destinations + minItems: 1 description: The list of destinations that will be used to store the data initiateJobRun: type: boolean diff --git a/docs/protos/mgmt/v1alpha1/connection_data.proto.mdx b/docs/protos/mgmt/v1alpha1/connection_data.proto.mdx index f3c0b956d1..9c0e3013ef 100644 --- a/docs/protos/mgmt/v1alpha1/connection_data.proto.mdx +++ b/docs/protos/mgmt/v1alpha1/connection_data.proto.mdx @@ -134,7 +134,7 @@ _**package** mgmt.v1alpha1_ ### `GetConnectionTableConstraintsResponse` -.
and the list of tables that it depends on, also `.
` format.","label":"repeated","type":"ForeignKeyConstraintsEntry","longType":"GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry","fullType":"mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry","ismap":true,"isoneof":false,"oneofdecl":"","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/connection_data.proto#getconnectiontableconstraintsresponseforeignkeyconstraintsentry"},{"name":"primary_key_constraints","description":"the key here is .
and value is the primary constraint","label":"repeated","type":"PrimaryKeyConstraintsEntry","longType":"GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntry","fullType":"mgmt.v1alpha1.GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntry","ismap":true,"isoneof":false,"oneofdecl":"","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/connection_data.proto#getconnectiontableconstraintsresponseprimarykeyconstraintsentry"},{"name":"unique_constraints","description":"the key here is .
and value is the unique constraint","label":"repeated","type":"UniqueConstraintsEntry","longType":"GetConnectionTableConstraintsResponse.UniqueConstraintsEntry","fullType":"mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueConstraintsEntry","ismap":true,"isoneof":false,"oneofdecl":"","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/connection_data.proto#getconnectiontableconstraintsresponseuniqueconstraintsentry"}]}} /> +.
and the list of tables that it depends on, also `.
` format.","label":"repeated","type":"ForeignKeyConstraintsEntry","longType":"GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry","fullType":"mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry","ismap":true,"isoneof":false,"oneofdecl":"","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/connection_data.proto#getconnectiontableconstraintsresponseforeignkeyconstraintsentry"},{"name":"primary_key_constraints","description":"the key here is .
and value is the primary constraint","label":"repeated","type":"PrimaryKeyConstraintsEntry","longType":"GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntry","fullType":"mgmt.v1alpha1.GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntry","ismap":true,"isoneof":false,"oneofdecl":"","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/connection_data.proto#getconnectiontableconstraintsresponseprimarykeyconstraintsentry"},{"name":"unique_constraints","description":"the key here is .
and value is the unique constraint","label":"repeated","type":"UniqueConstraintsEntry","longType":"GetConnectionTableConstraintsResponse.UniqueConstraintsEntry","fullType":"mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueConstraintsEntry","ismap":true,"isoneof":false,"oneofdecl":"","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/connection_data.proto#getconnectiontableconstraintsresponseuniqueconstraintsentry"},{"name":"unique_indexes","description":"the key here is .
and value is the unique index","label":"repeated","type":"UniqueIndexesEntry","longType":"GetConnectionTableConstraintsResponse.UniqueIndexesEntry","fullType":"mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueIndexesEntry","ismap":true,"isoneof":false,"oneofdecl":"","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/connection_data.proto#getconnectiontableconstraintsresponseuniqueindexesentry"}]}} /> ### `GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntry` @@ -149,56 +149,68 @@ _**package** mgmt.v1alpha1_ +### `GetConnectionTableConstraintsResponse.UniqueIndexesEntry` + + + ### `GetTableRowCountRequest` - + ### `GetTableRowCountResponse` - + ### `InitStatementOptions` - + ### `MongoSchemaConfig` - + ### `MssqlSchemaConfig` - + ### `MysqlSchemaConfig` - + ### `MysqlStreamConfig` - + ### `PostgresSchemaConfig` - + ### `PostgresStreamConfig` - + ### `PrimaryConstraint` - + ### `SchemaInitStatements` - + ### `UniqueConstraint` - + ### `UniqueConstraints` - + + + +### `UniqueIndex` + + + +### `UniqueIndexes` + --- ## Services diff --git a/docs/protos/proto_docs.json b/docs/protos/proto_docs.json index 90f7c6f87e..419f15c55b 100644 --- a/docs/protos/proto_docs.json +++ b/docs/protos/proto_docs.json @@ -8913,6 +8913,18 @@ "isoneof": false, "oneofdecl": "", "defaultValue": "" + }, + { + "name": "unique_indexes", + "description": "the key here is \u003cschema\u003e.\u003ctable\u003e and value is the unique index", + "label": "repeated", + "type": "UniqueIndexesEntry", + "longType": "GetConnectionTableConstraintsResponse.UniqueIndexesEntry", + "fullType": "mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueIndexesEntry", + "ismap": true, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, @@ -9024,6 +9036,42 @@ } ] }, + { + "name": "UniqueIndexesEntry", + "longName": "GetConnectionTableConstraintsResponse.UniqueIndexesEntry", + "fullName": "mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueIndexesEntry", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "key", + "description": "", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "value", + "description": "", + "label": "", + "type": "UniqueIndexes", + "longType": "UniqueIndexes", + "fullType": "mgmt.v1alpha1.UniqueIndexes", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, { "name": "GetTableRowCountRequest", "longName": "GetTableRowCountRequest", @@ -9329,6 +9377,54 @@ "defaultValue": "" } ] + }, + { + "name": "UniqueIndex", + "longName": "UniqueIndex", + "fullName": "mgmt.v1alpha1.UniqueIndex", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "columns", + "description": "The columns that are part of the unique index", + "label": "repeated", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "UniqueIndexes", + "longName": "UniqueIndexes", + "fullName": "mgmt.v1alpha1.UniqueIndexes", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "indexes", + "description": "The unique indexes found for the table", + "label": "repeated", + "type": "UniqueIndex", + "longType": "UniqueIndex", + "fullType": "mgmt.v1alpha1.UniqueIndex", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] } ], "services": [ diff --git a/frontend/apps/web/app/(mgmt)/[account]/runs/[id]/components/JobRunActivityTable/columns.tsx b/frontend/apps/web/app/(mgmt)/[account]/runs/[id]/components/JobRunActivityTable/columns.tsx index 3a538f1a13..ca9031fe1e 100644 --- a/frontend/apps/web/app/(mgmt)/[account]/runs/[id]/components/JobRunActivityTable/columns.tsx +++ b/frontend/apps/web/app/(mgmt)/[account]/runs/[id]/components/JobRunActivityTable/columns.tsx @@ -35,7 +35,9 @@ export function getColumns(props: GetColumnsProps): ColumnDef[] { ), cell: ({ row }) => { const scheduledTime = row.original.tasks.find( - (item) => item.type == 'ActivityTaskScheduled' + (item) => + item.type == 'ActivityTaskScheduled' || + item.type == 'StartChildWorkflowExecutionInitiated' )?.eventTime; return (
@@ -71,7 +73,17 @@ export function getColumns(props: GetColumnsProps): ColumnDef[] { ), cell: ({ row }) => { const closeTime = row.original.tasks.find( - (item) => item.type == 'ActivityTaskCompleted' + (item) => + item.type === 'ActivityTaskCompleted' || + item.type === 'ActivityTaskFailed' || + item.type === 'ActivityTaskTerminated' || + item.type === 'ActivityTaskCanceled' || + item.type === 'ActivityTaskTimedOut' || + item.type === 'ChildWorkflowExecutionCompleted' || + item.type === 'ChildWorkflowExecutionFailed' || + item.type === 'ChildWorkflowExecutionTerminated' || + item.type === 'ChildWorkflowExecutionCanceled' || + item.type === 'ChildWorkflowExecutionTimedOut' )?.eventTime; return ( diff --git a/frontend/apps/web/app/(mgmt)/[account]/runs/[id]/page.tsx b/frontend/apps/web/app/(mgmt)/[account]/runs/[id]/page.tsx index 09ae84f3e4..f1173cfbfc 100644 --- a/frontend/apps/web/app/(mgmt)/[account]/runs/[id]/page.tsx +++ b/frontend/apps/web/app/(mgmt)/[account]/runs/[id]/page.tsx @@ -511,7 +511,7 @@ function getDuration(completedAt?: Date, startedAt?: Date): string { const duration = intervalToDuration({ start: startedAt, end: completedAt }); - return formatDuration(duration, { format: ['minutes', 'seconds'] }); + return formatDuration(duration, { format: ['hours', 'minutes', 'seconds'] }); } interface AlertProps { title: string; diff --git a/frontend/apps/web/components/RunTImeline/RunTimeline.tsx b/frontend/apps/web/components/RunTImeline/RunTimeline.tsx index 4d89cb816a..f5c571edb1 100644 --- a/frontend/apps/web/components/RunTImeline/RunTimeline.tsx +++ b/frontend/apps/web/components/RunTImeline/RunTimeline.tsx @@ -48,7 +48,7 @@ interface Props { const expandedRowHeight = 165; const defaultRowHeight = 40; -type RunStatus = 'running' | 'completed' | 'failed' | 'canceled'; +type RunStatus = 'running' | 'completed' | 'failed' | 'canceled' | 'terminated'; export default function RunTimeline(props: Props): ReactElement { const { tasks, jobStatus } = props; @@ -58,6 +58,7 @@ export default function RunTimeline(props: Props): ReactElement { 'completed', 'failed', 'canceled', + 'terminated', ]); const { timelineStart, totalDuration, timeLabels } = useMemo(() => { @@ -67,7 +68,9 @@ export default function RunTimeline(props: Props): ReactElement { tasks.forEach((t) => { const scheduled = t.tasks.find( - (st) => st.type == 'ActivityTaskScheduled' + (st) => + st.type === 'ActivityTaskScheduled' || + st.type === 'StartChildWorkflowExecutionInitiated' )?.eventTime; startTime = Math.min( startTime, @@ -226,7 +229,7 @@ function LeftActivityBar(props: LeftActivityBarProps): ReactElement { > getTaskStatus(task, jobStatus)} + status={getTaskStatus(task, jobStatus)} />
); @@ -262,7 +265,9 @@ function TimelineBar(props: TimelineBarProps) { } = props; const scheduled = task.tasks.find( - (st) => st.type == 'ActivityTaskScheduled' + (st) => + st.type == 'ActivityTaskScheduled' || + st.type == 'StartChildWorkflowExecutionInitiated' )?.eventTime; const failedTask = task.tasks.find((item) => item.error); @@ -285,7 +290,7 @@ function TimelineBar(props: TimelineBarProps) { className={cn( status === 'failed' ? 'bg-red-400 dark:bg-red-700' - : status === 'canceled' + : status === 'canceled' || status === 'terminated' ? 'bg-yellow-400 dark:bg-yellow-700' : 'bg-blue-500', 'absolute h-8 rounded hover:bg-opacity-80 cursor-pointer mx-6 flex items-center ' @@ -336,7 +341,9 @@ function TimelineBar(props: TimelineBarProps) {
Finish:{' '} - {status == 'failed' || status == 'canceled' + {status == 'failed' || + status == 'canceled' || + status == 'terminated' ? 'N/A' : formatFullDate(endTime)} @@ -403,11 +410,19 @@ function convertTimestampToDate(timestamp: Timestamp | undefined): Date { } // calculates the last time if the job is not successful so we can give the timeline an end date +// TODO: this should be revisited function getCloseOrErrorOrCancelDate(task: JobRunEvent): Date { const errorTask = task.tasks.find((item) => item.error); const errorTime = errorTask ? errorTask.eventTime : undefined; const cancelTime = task.tasks.find( - (t) => t.type === 'ActivityTaskCancelRequested' + (t) => + t.type === 'ActivityTaskCancelRequested' || + t.type === 'ActivityTaskCanceled' || + t.type === 'ActivityTaskTimedOut' || + t.type === 'ActivityTaskTerminated' || + // t.type === 'ChildWorkflowExecutionCanceled' || // has issues with close with new? + t.type === 'ChildWorkflowExecutionTerminated' || + t.type === 'ChildWorkflowExecutionTimedOut' )?.eventTime; return errorTime ? convertTimestampToDate(errorTime) @@ -434,13 +449,11 @@ function isSyncActivity(task: JobRunEvent): boolean { interface ActivityLabelProps { task: JobRunEvent; - getStatus: () => RunStatus; + status: RunStatus; } // generates the activity label that we see on the left hand activity column -function ActivityLabel({ task, getStatus }: ActivityLabelProps) { - const status = getStatus(); - +function ActivityLabel({ task, status }: ActivityLabelProps) { return (
{task.id.toString()}. @@ -461,6 +474,8 @@ function ActivityStatus({ status }: { status: RunStatus }) { return ; case 'running': return ; + case 'terminated': + return ; default: return null; } @@ -509,6 +524,12 @@ function StatusFilter({ selectedStatuses, onStatusChange }: StatusFilterProps) { > Canceled + onStatusChange('terminated', checked)} + > + Terminated + ); @@ -567,10 +588,17 @@ function getTaskStatus( for (const t of task.tasks) { switch (t.type) { case 'ActivityTaskCompleted': + case 'ChildWorkflowExecutionCompleted': isCompleted = true; break; case 'ActivityTaskFailed': case 'ActivityTaskTimedOut': + case 'ActivityTaskCanceled': + case 'ActivityTaskTerminated': + case 'ChildWorkflowExecutionFailed': + case 'ChildWorkflowExecutionTimedOut': + case 'ChildWorkflowExecutionTerminated': + case 'StartChildWorkflowExecutionFailed': isFailed = true; break; case 'ActivityTaskCancelRequested': @@ -578,6 +606,7 @@ function getTaskStatus( break; case 'ActivityTaskStarted': case 'ActivityTaskScheduled': + case 'StartChildWorkflowExecutionInitiated': break; } @@ -592,8 +621,9 @@ function getTaskStatus( if (isFailed) return 'failed'; const isJobTerminated = jobStatus === JobRunStatus.TERMINATED; + if (isJobTerminated) return 'terminated'; + if (isCanceled) return 'canceled'; - if (isCanceled || (isJobTerminated && !isCompleted)) return 'canceled'; return 'running'; } @@ -654,17 +684,26 @@ function ExpandedRowBody(props: ExpandedRowBodyProps): ReactElement { const getLabel = (type: string) => { switch (type) { case 'ActivityTaskScheduled': + case 'StartChildWorkflowExecutionInitiated': return 'Scheduled'; case 'ActivityTaskStarted': + case 'ChildWorkflowExecutionStarted': return 'Started'; case 'ActivityTaskCompleted': + case 'ChildWorkflowExecutionCompleted': return 'Completed'; case 'ActivityTaskFailed': + case 'ChildWorkflowExecutionFailed': + case 'StartChildWorkflowExecutionFailed': return 'Failed'; case 'ActivityTaskTimedOut': + case 'ChildWorkflowExecutionTimedOut': return 'Timed Out'; case 'ActivityTaskCancelRequested': return 'Cancel Requested'; + case 'ActivityTaskTerminated': + case 'ChildWorkflowExecutionTerminated': + return 'Terminated'; default: return type; } diff --git a/frontend/packages/sdk/src/client/mgmt/v1alpha1/connection_data_pb.ts b/frontend/packages/sdk/src/client/mgmt/v1alpha1/connection_data_pb.ts index ed01e72aa1..364d25a635 100644 --- a/frontend/packages/sdk/src/client/mgmt/v1alpha1/connection_data_pb.ts +++ b/frontend/packages/sdk/src/client/mgmt/v1alpha1/connection_data_pb.ts @@ -12,7 +12,7 @@ import type { JsonObject, Message } from "@bufbuild/protobuf"; * Describes the file mgmt/v1alpha1/connection_data.proto. */ export const file_mgmt_v1alpha1_connection_data: GenFile = /*@__PURE__*/ - fileDesc("CiNtZ210L3YxYWxwaGExL2Nvbm5lY3Rpb25fZGF0YS5wcm90bxINbWdtdC52MWFscGhhMSIWChRQb3N0Z3Jlc1N0cmVhbUNvbmZpZyITChFNeXNxbFN0cmVhbUNvbmZpZyIZChdBd3NEeW5hbW9EQlN0cmVhbUNvbmZpZyJUChFBd3NTM1N0cmVhbUNvbmZpZxIaCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBSAASHQoKam9iX3J1bl9pZBgCIAEoCUIHukgEcgIQAUgAQgQKAmlkIl4KG0djcENsb3VkU3RvcmFnZVN0cmVhbUNvbmZpZxIaCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBSAASHQoKam9iX3J1bl9pZBgCIAEoCUIHukgEcgIQAUgAQgQKAmlkIuoCChZDb25uZWN0aW9uU3RyZWFtQ29uZmlnEjgKCXBnX2NvbmZpZxgBIAEoCzIjLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTdHJlYW1Db25maWdIABI5Cg1hd3NfczNfY29uZmlnGAIgASgLMiAubWdtdC52MWFscGhhMS5Bd3NTM1N0cmVhbUNvbmZpZ0gAEjgKDG15c3FsX2NvbmZpZxgDIAEoCzIgLm1nbXQudjFhbHBoYTEuTXlzcWxTdHJlYW1Db25maWdIABJNChdnY3BfY2xvdWRzdG9yYWdlX2NvbmZpZxgEIAEoCzIqLm1nbXQudjFhbHBoYTEuR2NwQ2xvdWRTdG9yYWdlU3RyZWFtQ29uZmlnSAASQQoPZHluYW1vZGJfY29uZmlnGAUgASgLMiYubWdtdC52MWFscGhhMS5Bd3NEeW5hbW9EQlN0cmVhbUNvbmZpZ0gAQg8KBmNvbmZpZxIFukgCCAEingEKHkdldENvbm5lY3Rpb25EYXRhU3RyZWFtUmVxdWVzdBIfCg1jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABARI8Cg1zdHJlYW1fY29uZmlnGAIgASgLMiUubWdtdC52MWFscGhhMS5Db25uZWN0aW9uU3RyZWFtQ29uZmlnEg4KBnNjaGVtYRgDIAEoCRINCgV0YWJsZRgEIAEoCSI6Ch9HZXRDb25uZWN0aW9uRGF0YVN0cmVhbVJlc3BvbnNlEhEKCXJvd19ieXRlcxgCIAEoDEoECAEQAiIWChRQb3N0Z3Jlc1NjaGVtYUNvbmZpZyITChFNeXNxbFNjaGVtYUNvbmZpZyITChFNc3NxbFNjaGVtYUNvbmZpZyJUChFBd3NTM1NjaGVtYUNvbmZpZxIaCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBSAASHQoKam9iX3J1bl9pZBgCIAEoCUIHukgEcgIQAUgAQgQKAmlkIhMKEU1vbmdvU2NoZW1hQ29uZmlnIhYKFER5bmFtb0RCU2NoZW1hQ29uZmlnIl4KG0djcENsb3VkU3RvcmFnZVNjaGVtYUNvbmZpZxIaCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBSAASHQoKam9iX3J1bl9pZBgCIAEoCUIHukgEcgIQAUgAQgQKAmlkItsDChZDb25uZWN0aW9uU2NoZW1hQ29uZmlnEjgKCXBnX2NvbmZpZxgBIAEoCzIjLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTY2hlbWFDb25maWdIABI5Cg1hd3NfczNfY29uZmlnGAIgASgLMiAubWdtdC52MWFscGhhMS5Bd3NTM1NjaGVtYUNvbmZpZ0gAEjgKDG15c3FsX2NvbmZpZxgDIAEoCzIgLm1nbXQudjFhbHBoYTEuTXlzcWxTY2hlbWFDb25maWdIABI4Cgxtb25nb19jb25maWcYBCABKAsyIC5tZ210LnYxYWxwaGExLk1vbmdvU2NoZW1hQ29uZmlnSAASTQoXZ2NwX2Nsb3Vkc3RvcmFnZV9jb25maWcYBSABKAsyKi5tZ210LnYxYWxwaGExLkdjcENsb3VkU3RvcmFnZVNjaGVtYUNvbmZpZ0gAEj4KD2R5bmFtb2RiX2NvbmZpZxgGIAEoCzIjLm1nbXQudjFhbHBoYTEuRHluYW1vREJTY2hlbWFDb25maWdIABI4Cgxtc3NxbF9jb25maWcYByABKAsyIC5tZ210LnYxYWxwaGExLk1zc3FsU2NoZW1hQ29uZmlnSABCDwoGY29uZmlnEgW6SAIIASKBAgoORGF0YWJhc2VDb2x1bW4SDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEg4KBmNvbHVtbhgDIAEoCRIRCglkYXRhX3R5cGUYBCABKAkSEwoLaXNfbnVsbGFibGUYBSABKAkSGwoOY29sdW1uX2RlZmF1bHQYBiABKAlIAIgBARIbCg5nZW5lcmF0ZWRfdHlwZRgHIAEoCUgBiAEBEiAKE2lkZW50aXR5X2dlbmVyYXRpb24YCCABKAlIAogBAUIRCg9fY29sdW1uX2RlZmF1bHRCEQoPX2dlbmVyYXRlZF90eXBlQhYKFF9pZGVudGl0eV9nZW5lcmF0aW9uInsKGkdldENvbm5lY3Rpb25TY2hlbWFSZXF1ZXN0Eh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBEjwKDXNjaGVtYV9jb25maWcYAiABKAsyJS5tZ210LnYxYWxwaGExLkNvbm5lY3Rpb25TY2hlbWFDb25maWciTQobR2V0Q29ubmVjdGlvblNjaGVtYVJlc3BvbnNlEi4KB3NjaGVtYXMYASADKAsyHS5tZ210LnYxYWxwaGExLkRhdGFiYXNlQ29sdW1uIn4KHUdldENvbm5lY3Rpb25TY2hlbWFNYXBSZXF1ZXN0Eh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBEjwKDXNjaGVtYV9jb25maWcYAiABKAsyJS5tZ210LnYxYWxwaGExLkNvbm5lY3Rpb25TY2hlbWFDb25maWci0AEKHkdldENvbm5lY3Rpb25TY2hlbWFNYXBSZXNwb25zZRJQCgpzY2hlbWFfbWFwGAEgAygLMjwubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uU2NoZW1hTWFwUmVzcG9uc2UuU2NoZW1hTWFwRW50cnkaXAoOU2NoZW1hTWFwRW50cnkSCwoDa2V5GAEgASgJEjkKBXZhbHVlGAIgASgLMioubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uU2NoZW1hUmVzcG9uc2U6AjgBImAKHkdldENvbm5lY3Rpb25TY2hlbWFNYXBzUmVxdWVzdBI+CghyZXF1ZXN0cxgBIAMoCzIsLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvblNjaGVtYU1hcFJlcXVlc3QiewofR2V0Q29ubmVjdGlvblNjaGVtYU1hcHNSZXNwb25zZRJACglyZXNwb25zZXMYASADKAsyLS5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25TY2hlbWFNYXBSZXNwb25zZRIWCg5jb25uZWN0aW9uX2lkcxgCIAMoCSIyCgpGb3JlaWduS2V5Eg0KBXRhYmxlGAEgASgJEg8KB2NvbHVtbnMYAyADKAlKBAgCEAMidgoRRm9yZWlnbkNvbnN0cmFpbnQSLgoLZm9yZWlnbl9rZXkYAyABKAsyGS5tZ210LnYxYWxwaGExLkZvcmVpZ25LZXkSDwoHY29sdW1ucxgEIAMoCRIUCgxub3RfbnVsbGFibGUYBSADKAhKBAgBEAJKBAgCEAMiUAoXRm9yZWlnbkNvbnN0cmFpbnRUYWJsZXMSNQoLY29uc3RyYWludHMYASADKAsyIC5tZ210LnYxYWxwaGExLkZvcmVpZ25Db25zdHJhaW50ImUKFEluaXRTdGF0ZW1lbnRPcHRpb25zEhMKC2luaXRfc2NoZW1hGAEgASgIEh4KFnRydW5jYXRlX2JlZm9yZV9pbnNlcnQYAiABKAgSGAoQdHJ1bmNhdGVfY2FzY2FkZRgDIAEoCCJ7CiJHZXRDb25uZWN0aW9uSW5pdFN0YXRlbWVudHNSZXF1ZXN0Eh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBEjQKB29wdGlvbnMYAiABKAsyIy5tZ210LnYxYWxwaGExLkluaXRTdGF0ZW1lbnRPcHRpb25zIjkKFFNjaGVtYUluaXRTdGF0ZW1lbnRzEg0KBWxhYmVsGAEgASgJEhIKCnN0YXRlbWVudHMYAiADKAkiygMKI0dldENvbm5lY3Rpb25Jbml0U3RhdGVtZW50c1Jlc3BvbnNlEm4KFXRhYmxlX2luaXRfc3RhdGVtZW50cxgBIAMoCzJLLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvbkluaXRTdGF0ZW1lbnRzUmVzcG9uc2UuVGFibGVJbml0U3RhdGVtZW50c0VudHJ5QgIYARJyChl0YWJsZV90cnVuY2F0ZV9zdGF0ZW1lbnRzGAIgAygLMk8ubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uSW5pdFN0YXRlbWVudHNSZXNwb25zZS5UYWJsZVRydW5jYXRlU3RhdGVtZW50c0VudHJ5EkMKFnNjaGVtYV9pbml0X3N0YXRlbWVudHMYAyADKAsyIy5tZ210LnYxYWxwaGExLlNjaGVtYUluaXRTdGF0ZW1lbnRzGjoKGFRhYmxlSW5pdFN0YXRlbWVudHNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGj4KHFRhYmxlVHJ1bmNhdGVTdGF0ZW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIkChFQcmltYXJ5Q29uc3RyYWludBIPCgdjb2x1bW5zGAEgAygJIiMKEFVuaXF1ZUNvbnN0cmFpbnQSDwoHY29sdW1ucxgBIAMoCSLzAQoZR2V0QWlHZW5lcmF0ZWREYXRhUmVxdWVzdBIiChBhaV9jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIYCgVjb3VudBgCIAEoA0IJukgGIgQYCigBEhsKCm1vZGVsX25hbWUYAyABKAlCB7pIBHICEAESGAoLdXNlcl9wcm9tcHQYBCABKAlIAIgBARIkChJkYXRhX2Nvbm5lY3Rpb25faWQYBSABKAlCCLpIBXIDsAEBEisKBXRhYmxlGAYgASgLMhwubWdtdC52MWFscGhhMS5EYXRhYmFzZVRhYmxlQg4KDF91c2VyX3Byb21wdCJACg1EYXRhYmFzZVRhYmxlEhcKBnNjaGVtYRgBIAEoCUIHukgEcgIQARIWCgV0YWJsZRgCIAEoCUIHukgEcgIQASJGChpHZXRBaUdlbmVyYXRlZERhdGFSZXNwb25zZRIoCgdyZWNvcmRzGAEgAygLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCJHCiRHZXRDb25uZWN0aW9uVGFibGVDb25zdHJhaW50c1JlcXVlc3QSHwoNY29ubmVjdGlvbl9pZBgBIAEoCUIIukgFcgOwAQEiSQoRVW5pcXVlQ29uc3RyYWludHMSNAoLY29uc3RyYWludHMYASADKAsyHy5tZ210LnYxYWxwaGExLlVuaXF1ZUNvbnN0cmFpbnQilgUKJUdldENvbm5lY3Rpb25UYWJsZUNvbnN0cmFpbnRzUmVzcG9uc2UScAoXZm9yZWlnbl9rZXlfY29uc3RyYWludHMYASADKAsyTy5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25UYWJsZUNvbnN0cmFpbnRzUmVzcG9uc2UuRm9yZWlnbktleUNvbnN0cmFpbnRzRW50cnkScAoXcHJpbWFyeV9rZXlfY29uc3RyYWludHMYAiADKAsyTy5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25UYWJsZUNvbnN0cmFpbnRzUmVzcG9uc2UuUHJpbWFyeUtleUNvbnN0cmFpbnRzRW50cnkSZwoSdW5pcXVlX2NvbnN0cmFpbnRzGAMgAygLMksubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uVGFibGVDb25zdHJhaW50c1Jlc3BvbnNlLlVuaXF1ZUNvbnN0cmFpbnRzRW50cnkaZAoaRm9yZWlnbktleUNvbnN0cmFpbnRzRW50cnkSCwoDa2V5GAEgASgJEjUKBXZhbHVlGAIgASgLMiYubWdtdC52MWFscGhhMS5Gb3JlaWduQ29uc3RyYWludFRhYmxlczoCOAEaXgoaUHJpbWFyeUtleUNvbnN0cmFpbnRzRW50cnkSCwoDa2V5GAEgASgJEi8KBXZhbHVlGAIgASgLMiAubWdtdC52MWFscGhhMS5QcmltYXJ5Q29uc3RyYWludDoCOAEaWgoWVW5pcXVlQ29uc3RyYWludHNFbnRyeRILCgNrZXkYASABKAkSLwoFdmFsdWUYAiABKAsyIC5tZ210LnYxYWxwaGExLlVuaXF1ZUNvbnN0cmFpbnRzOgI4ASKXAQoXR2V0VGFibGVSb3dDb3VudFJlcXVlc3QSHwoNY29ubmVjdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESFwoGc2NoZW1hGAIgASgJQge6SARyAhABEhYKBXRhYmxlGAMgASgJQge6SARyAhABEhkKDHdoZXJlX2NsYXVzZRgEIAEoCUgAiAEBQg8KDV93aGVyZV9jbGF1c2UiKQoYR2V0VGFibGVSb3dDb3VudFJlc3BvbnNlEg0KBWNvdW50GAEgASgDMukHChVDb25uZWN0aW9uRGF0YVNlcnZpY2USfAoXR2V0Q29ubmVjdGlvbkRhdGFTdHJlYW0SLS5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25EYXRhU3RyZWFtUmVxdWVzdBouLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvbkRhdGFTdHJlYW1SZXNwb25zZSIAMAESbgoTR2V0Q29ubmVjdGlvblNjaGVtYRIpLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvblNjaGVtYVJlcXVlc3QaKi5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25TY2hlbWFSZXNwb25zZSIAEncKFkdldENvbm5lY3Rpb25TY2hlbWFNYXASLC5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25TY2hlbWFNYXBSZXF1ZXN0Gi0ubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uU2NoZW1hTWFwUmVzcG9uc2UiABJ6ChdHZXRDb25uZWN0aW9uU2NoZW1hTWFwcxItLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvblNjaGVtYU1hcHNSZXF1ZXN0Gi4ubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uU2NoZW1hTWFwc1Jlc3BvbnNlIgASjAEKHUdldENvbm5lY3Rpb25UYWJsZUNvbnN0cmFpbnRzEjMubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uVGFibGVDb25zdHJhaW50c1JlcXVlc3QaNC5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25UYWJsZUNvbnN0cmFpbnRzUmVzcG9uc2UiABKGAQobR2V0Q29ubmVjdGlvbkluaXRTdGF0ZW1lbnRzEjEubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uSW5pdFN0YXRlbWVudHNSZXF1ZXN0GjIubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uSW5pdFN0YXRlbWVudHNSZXNwb25zZSIAEmsKEkdldEFpR2VuZXJhdGVkRGF0YRIoLm1nbXQudjFhbHBoYTEuR2V0QWlHZW5lcmF0ZWREYXRhUmVxdWVzdBopLm1nbXQudjFhbHBoYTEuR2V0QWlHZW5lcmF0ZWREYXRhUmVzcG9uc2UiABJoChBHZXRUYWJsZVJvd0NvdW50EiYubWdtdC52MWFscGhhMS5HZXRUYWJsZVJvd0NvdW50UmVxdWVzdBonLm1nbXQudjFhbHBoYTEuR2V0VGFibGVSb3dDb3VudFJlc3BvbnNlIgOQAgFCzwEKEWNvbS5tZ210LnYxYWxwaGExQhNDb25uZWN0aW9uRGF0YVByb3RvUAFaUGdpdGh1Yi5jb20vbnVjbGV1c2Nsb3VkL25lb3N5bmMvYmFja2VuZC9nZW4vZ28vcHJvdG9zL21nbXQvdjFhbHBoYTE7bWdtdHYxYWxwaGExogIDTVhYqgINTWdtdC5WMWFscGhhMcoCDU1nbXRcVjFhbHBoYTHiAhlNZ210XFYxYWxwaGExXEdQQk1ldGFkYXRh6gIOTWdtdDo6VjFhbHBoYTFiBnByb3RvMw", [file_buf_validate_validate, file_google_protobuf_struct]); + fileDesc("CiNtZ210L3YxYWxwaGExL2Nvbm5lY3Rpb25fZGF0YS5wcm90bxINbWdtdC52MWFscGhhMSIWChRQb3N0Z3Jlc1N0cmVhbUNvbmZpZyITChFNeXNxbFN0cmVhbUNvbmZpZyIZChdBd3NEeW5hbW9EQlN0cmVhbUNvbmZpZyJUChFBd3NTM1N0cmVhbUNvbmZpZxIaCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBSAASHQoKam9iX3J1bl9pZBgCIAEoCUIHukgEcgIQAUgAQgQKAmlkIl4KG0djcENsb3VkU3RvcmFnZVN0cmVhbUNvbmZpZxIaCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBSAASHQoKam9iX3J1bl9pZBgCIAEoCUIHukgEcgIQAUgAQgQKAmlkIuoCChZDb25uZWN0aW9uU3RyZWFtQ29uZmlnEjgKCXBnX2NvbmZpZxgBIAEoCzIjLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTdHJlYW1Db25maWdIABI5Cg1hd3NfczNfY29uZmlnGAIgASgLMiAubWdtdC52MWFscGhhMS5Bd3NTM1N0cmVhbUNvbmZpZ0gAEjgKDG15c3FsX2NvbmZpZxgDIAEoCzIgLm1nbXQudjFhbHBoYTEuTXlzcWxTdHJlYW1Db25maWdIABJNChdnY3BfY2xvdWRzdG9yYWdlX2NvbmZpZxgEIAEoCzIqLm1nbXQudjFhbHBoYTEuR2NwQ2xvdWRTdG9yYWdlU3RyZWFtQ29uZmlnSAASQQoPZHluYW1vZGJfY29uZmlnGAUgASgLMiYubWdtdC52MWFscGhhMS5Bd3NEeW5hbW9EQlN0cmVhbUNvbmZpZ0gAQg8KBmNvbmZpZxIFukgCCAEingEKHkdldENvbm5lY3Rpb25EYXRhU3RyZWFtUmVxdWVzdBIfCg1jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABARI8Cg1zdHJlYW1fY29uZmlnGAIgASgLMiUubWdtdC52MWFscGhhMS5Db25uZWN0aW9uU3RyZWFtQ29uZmlnEg4KBnNjaGVtYRgDIAEoCRINCgV0YWJsZRgEIAEoCSI6Ch9HZXRDb25uZWN0aW9uRGF0YVN0cmVhbVJlc3BvbnNlEhEKCXJvd19ieXRlcxgCIAEoDEoECAEQAiIWChRQb3N0Z3Jlc1NjaGVtYUNvbmZpZyITChFNeXNxbFNjaGVtYUNvbmZpZyITChFNc3NxbFNjaGVtYUNvbmZpZyJUChFBd3NTM1NjaGVtYUNvbmZpZxIaCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBSAASHQoKam9iX3J1bl9pZBgCIAEoCUIHukgEcgIQAUgAQgQKAmlkIhMKEU1vbmdvU2NoZW1hQ29uZmlnIhYKFER5bmFtb0RCU2NoZW1hQ29uZmlnIl4KG0djcENsb3VkU3RvcmFnZVNjaGVtYUNvbmZpZxIaCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBSAASHQoKam9iX3J1bl9pZBgCIAEoCUIHukgEcgIQAUgAQgQKAmlkItsDChZDb25uZWN0aW9uU2NoZW1hQ29uZmlnEjgKCXBnX2NvbmZpZxgBIAEoCzIjLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTY2hlbWFDb25maWdIABI5Cg1hd3NfczNfY29uZmlnGAIgASgLMiAubWdtdC52MWFscGhhMS5Bd3NTM1NjaGVtYUNvbmZpZ0gAEjgKDG15c3FsX2NvbmZpZxgDIAEoCzIgLm1nbXQudjFhbHBoYTEuTXlzcWxTY2hlbWFDb25maWdIABI4Cgxtb25nb19jb25maWcYBCABKAsyIC5tZ210LnYxYWxwaGExLk1vbmdvU2NoZW1hQ29uZmlnSAASTQoXZ2NwX2Nsb3Vkc3RvcmFnZV9jb25maWcYBSABKAsyKi5tZ210LnYxYWxwaGExLkdjcENsb3VkU3RvcmFnZVNjaGVtYUNvbmZpZ0gAEj4KD2R5bmFtb2RiX2NvbmZpZxgGIAEoCzIjLm1nbXQudjFhbHBoYTEuRHluYW1vREJTY2hlbWFDb25maWdIABI4Cgxtc3NxbF9jb25maWcYByABKAsyIC5tZ210LnYxYWxwaGExLk1zc3FsU2NoZW1hQ29uZmlnSABCDwoGY29uZmlnEgW6SAIIASKBAgoORGF0YWJhc2VDb2x1bW4SDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEg4KBmNvbHVtbhgDIAEoCRIRCglkYXRhX3R5cGUYBCABKAkSEwoLaXNfbnVsbGFibGUYBSABKAkSGwoOY29sdW1uX2RlZmF1bHQYBiABKAlIAIgBARIbCg5nZW5lcmF0ZWRfdHlwZRgHIAEoCUgBiAEBEiAKE2lkZW50aXR5X2dlbmVyYXRpb24YCCABKAlIAogBAUIRCg9fY29sdW1uX2RlZmF1bHRCEQoPX2dlbmVyYXRlZF90eXBlQhYKFF9pZGVudGl0eV9nZW5lcmF0aW9uInsKGkdldENvbm5lY3Rpb25TY2hlbWFSZXF1ZXN0Eh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBEjwKDXNjaGVtYV9jb25maWcYAiABKAsyJS5tZ210LnYxYWxwaGExLkNvbm5lY3Rpb25TY2hlbWFDb25maWciTQobR2V0Q29ubmVjdGlvblNjaGVtYVJlc3BvbnNlEi4KB3NjaGVtYXMYASADKAsyHS5tZ210LnYxYWxwaGExLkRhdGFiYXNlQ29sdW1uIn4KHUdldENvbm5lY3Rpb25TY2hlbWFNYXBSZXF1ZXN0Eh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBEjwKDXNjaGVtYV9jb25maWcYAiABKAsyJS5tZ210LnYxYWxwaGExLkNvbm5lY3Rpb25TY2hlbWFDb25maWci0AEKHkdldENvbm5lY3Rpb25TY2hlbWFNYXBSZXNwb25zZRJQCgpzY2hlbWFfbWFwGAEgAygLMjwubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uU2NoZW1hTWFwUmVzcG9uc2UuU2NoZW1hTWFwRW50cnkaXAoOU2NoZW1hTWFwRW50cnkSCwoDa2V5GAEgASgJEjkKBXZhbHVlGAIgASgLMioubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uU2NoZW1hUmVzcG9uc2U6AjgBImAKHkdldENvbm5lY3Rpb25TY2hlbWFNYXBzUmVxdWVzdBI+CghyZXF1ZXN0cxgBIAMoCzIsLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvblNjaGVtYU1hcFJlcXVlc3QiewofR2V0Q29ubmVjdGlvblNjaGVtYU1hcHNSZXNwb25zZRJACglyZXNwb25zZXMYASADKAsyLS5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25TY2hlbWFNYXBSZXNwb25zZRIWCg5jb25uZWN0aW9uX2lkcxgCIAMoCSIyCgpGb3JlaWduS2V5Eg0KBXRhYmxlGAEgASgJEg8KB2NvbHVtbnMYAyADKAlKBAgCEAMidgoRRm9yZWlnbkNvbnN0cmFpbnQSLgoLZm9yZWlnbl9rZXkYAyABKAsyGS5tZ210LnYxYWxwaGExLkZvcmVpZ25LZXkSDwoHY29sdW1ucxgEIAMoCRIUCgxub3RfbnVsbGFibGUYBSADKAhKBAgBEAJKBAgCEAMiUAoXRm9yZWlnbkNvbnN0cmFpbnRUYWJsZXMSNQoLY29uc3RyYWludHMYASADKAsyIC5tZ210LnYxYWxwaGExLkZvcmVpZ25Db25zdHJhaW50ImUKFEluaXRTdGF0ZW1lbnRPcHRpb25zEhMKC2luaXRfc2NoZW1hGAEgASgIEh4KFnRydW5jYXRlX2JlZm9yZV9pbnNlcnQYAiABKAgSGAoQdHJ1bmNhdGVfY2FzY2FkZRgDIAEoCCJ7CiJHZXRDb25uZWN0aW9uSW5pdFN0YXRlbWVudHNSZXF1ZXN0Eh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBEjQKB29wdGlvbnMYAiABKAsyIy5tZ210LnYxYWxwaGExLkluaXRTdGF0ZW1lbnRPcHRpb25zIjkKFFNjaGVtYUluaXRTdGF0ZW1lbnRzEg0KBWxhYmVsGAEgASgJEhIKCnN0YXRlbWVudHMYAiADKAkiygMKI0dldENvbm5lY3Rpb25Jbml0U3RhdGVtZW50c1Jlc3BvbnNlEm4KFXRhYmxlX2luaXRfc3RhdGVtZW50cxgBIAMoCzJLLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvbkluaXRTdGF0ZW1lbnRzUmVzcG9uc2UuVGFibGVJbml0U3RhdGVtZW50c0VudHJ5QgIYARJyChl0YWJsZV90cnVuY2F0ZV9zdGF0ZW1lbnRzGAIgAygLMk8ubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uSW5pdFN0YXRlbWVudHNSZXNwb25zZS5UYWJsZVRydW5jYXRlU3RhdGVtZW50c0VudHJ5EkMKFnNjaGVtYV9pbml0X3N0YXRlbWVudHMYAyADKAsyIy5tZ210LnYxYWxwaGExLlNjaGVtYUluaXRTdGF0ZW1lbnRzGjoKGFRhYmxlSW5pdFN0YXRlbWVudHNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGj4KHFRhYmxlVHJ1bmNhdGVTdGF0ZW1lbnRzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIkChFQcmltYXJ5Q29uc3RyYWludBIPCgdjb2x1bW5zGAEgAygJIiMKEFVuaXF1ZUNvbnN0cmFpbnQSDwoHY29sdW1ucxgBIAMoCSLzAQoZR2V0QWlHZW5lcmF0ZWREYXRhUmVxdWVzdBIiChBhaV9jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIYCgVjb3VudBgCIAEoA0IJukgGIgQYCigBEhsKCm1vZGVsX25hbWUYAyABKAlCB7pIBHICEAESGAoLdXNlcl9wcm9tcHQYBCABKAlIAIgBARIkChJkYXRhX2Nvbm5lY3Rpb25faWQYBSABKAlCCLpIBXIDsAEBEisKBXRhYmxlGAYgASgLMhwubWdtdC52MWFscGhhMS5EYXRhYmFzZVRhYmxlQg4KDF91c2VyX3Byb21wdCJACg1EYXRhYmFzZVRhYmxlEhcKBnNjaGVtYRgBIAEoCUIHukgEcgIQARIWCgV0YWJsZRgCIAEoCUIHukgEcgIQASJGChpHZXRBaUdlbmVyYXRlZERhdGFSZXNwb25zZRIoCgdyZWNvcmRzGAEgAygLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCJHCiRHZXRDb25uZWN0aW9uVGFibGVDb25zdHJhaW50c1JlcXVlc3QSHwoNY29ubmVjdGlvbl9pZBgBIAEoCUIIukgFcgOwAQEiSQoRVW5pcXVlQ29uc3RyYWludHMSNAoLY29uc3RyYWludHMYASADKAsyHy5tZ210LnYxYWxwaGExLlVuaXF1ZUNvbnN0cmFpbnQiPAoNVW5pcXVlSW5kZXhlcxIrCgdpbmRleGVzGAEgAygLMhoubWdtdC52MWFscGhhMS5VbmlxdWVJbmRleCIeCgtVbmlxdWVJbmRleBIPCgdjb2x1bW5zGAEgAygJIssGCiVHZXRDb25uZWN0aW9uVGFibGVDb25zdHJhaW50c1Jlc3BvbnNlEnAKF2ZvcmVpZ25fa2V5X2NvbnN0cmFpbnRzGAEgAygLMk8ubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uVGFibGVDb25zdHJhaW50c1Jlc3BvbnNlLkZvcmVpZ25LZXlDb25zdHJhaW50c0VudHJ5EnAKF3ByaW1hcnlfa2V5X2NvbnN0cmFpbnRzGAIgAygLMk8ubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uVGFibGVDb25zdHJhaW50c1Jlc3BvbnNlLlByaW1hcnlLZXlDb25zdHJhaW50c0VudHJ5EmcKEnVuaXF1ZV9jb25zdHJhaW50cxgDIAMoCzJLLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvblRhYmxlQ29uc3RyYWludHNSZXNwb25zZS5VbmlxdWVDb25zdHJhaW50c0VudHJ5El8KDnVuaXF1ZV9pbmRleGVzGAQgAygLMkcubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uVGFibGVDb25zdHJhaW50c1Jlc3BvbnNlLlVuaXF1ZUluZGV4ZXNFbnRyeRpkChpGb3JlaWduS2V5Q29uc3RyYWludHNFbnRyeRILCgNrZXkYASABKAkSNQoFdmFsdWUYAiABKAsyJi5tZ210LnYxYWxwaGExLkZvcmVpZ25Db25zdHJhaW50VGFibGVzOgI4ARpeChpQcmltYXJ5S2V5Q29uc3RyYWludHNFbnRyeRILCgNrZXkYASABKAkSLwoFdmFsdWUYAiABKAsyIC5tZ210LnYxYWxwaGExLlByaW1hcnlDb25zdHJhaW50OgI4ARpaChZVbmlxdWVDb25zdHJhaW50c0VudHJ5EgsKA2tleRgBIAEoCRIvCgV2YWx1ZRgCIAEoCzIgLm1nbXQudjFhbHBoYTEuVW5pcXVlQ29uc3RyYWludHM6AjgBGlIKElVuaXF1ZUluZGV4ZXNFbnRyeRILCgNrZXkYASABKAkSKwoFdmFsdWUYAiABKAsyHC5tZ210LnYxYWxwaGExLlVuaXF1ZUluZGV4ZXM6AjgBIpcBChdHZXRUYWJsZVJvd0NvdW50UmVxdWVzdBIfCg1jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIXCgZzY2hlbWEYAiABKAlCB7pIBHICEAESFgoFdGFibGUYAyABKAlCB7pIBHICEAESGQoMd2hlcmVfY2xhdXNlGAQgASgJSACIAQFCDwoNX3doZXJlX2NsYXVzZSIpChhHZXRUYWJsZVJvd0NvdW50UmVzcG9uc2USDQoFY291bnQYASABKAMy6QcKFUNvbm5lY3Rpb25EYXRhU2VydmljZRJ8ChdHZXRDb25uZWN0aW9uRGF0YVN0cmVhbRItLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvbkRhdGFTdHJlYW1SZXF1ZXN0Gi4ubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uRGF0YVN0cmVhbVJlc3BvbnNlIgAwARJuChNHZXRDb25uZWN0aW9uU2NoZW1hEikubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uU2NoZW1hUmVxdWVzdBoqLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvblNjaGVtYVJlc3BvbnNlIgASdwoWR2V0Q29ubmVjdGlvblNjaGVtYU1hcBIsLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvblNjaGVtYU1hcFJlcXVlc3QaLS5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25TY2hlbWFNYXBSZXNwb25zZSIAEnoKF0dldENvbm5lY3Rpb25TY2hlbWFNYXBzEi0ubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uU2NoZW1hTWFwc1JlcXVlc3QaLi5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25TY2hlbWFNYXBzUmVzcG9uc2UiABKMAQodR2V0Q29ubmVjdGlvblRhYmxlQ29uc3RyYWludHMSMy5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25UYWJsZUNvbnN0cmFpbnRzUmVxdWVzdBo0Lm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvblRhYmxlQ29uc3RyYWludHNSZXNwb25zZSIAEoYBChtHZXRDb25uZWN0aW9uSW5pdFN0YXRlbWVudHMSMS5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25Jbml0U3RhdGVtZW50c1JlcXVlc3QaMi5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25Jbml0U3RhdGVtZW50c1Jlc3BvbnNlIgASawoSR2V0QWlHZW5lcmF0ZWREYXRhEigubWdtdC52MWFscGhhMS5HZXRBaUdlbmVyYXRlZERhdGFSZXF1ZXN0GikubWdtdC52MWFscGhhMS5HZXRBaUdlbmVyYXRlZERhdGFSZXNwb25zZSIAEmgKEEdldFRhYmxlUm93Q291bnQSJi5tZ210LnYxYWxwaGExLkdldFRhYmxlUm93Q291bnRSZXF1ZXN0GicubWdtdC52MWFscGhhMS5HZXRUYWJsZVJvd0NvdW50UmVzcG9uc2UiA5ACAULPAQoRY29tLm1nbXQudjFhbHBoYTFCE0Nvbm5lY3Rpb25EYXRhUHJvdG9QAVpQZ2l0aHViLmNvbS9udWNsZXVzY2xvdWQvbmVvc3luYy9iYWNrZW5kL2dlbi9nby9wcm90b3MvbWdtdC92MWFscGhhMTttZ210djFhbHBoYTGiAgNNWFiqAg1NZ210LlYxYWxwaGExygINTWdtdFxWMWFscGhhMeICGU1nbXRcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5NZ210OjpWMWFscGhhMWIGcHJvdG8z", [file_buf_validate_validate, file_google_protobuf_struct]); /** * @generated from message mgmt.v1alpha1.PostgresStreamConfig @@ -995,6 +995,44 @@ export type UniqueConstraints = Message<"mgmt.v1alpha1.UniqueConstraints"> & { export const UniqueConstraintsSchema: GenMessage = /*@__PURE__*/ messageDesc(file_mgmt_v1alpha1_connection_data, 36); +/** + * @generated from message mgmt.v1alpha1.UniqueIndexes + */ +export type UniqueIndexes = Message<"mgmt.v1alpha1.UniqueIndexes"> & { + /** + * The unique indexes found for the table + * + * @generated from field: repeated mgmt.v1alpha1.UniqueIndex indexes = 1; + */ + indexes: UniqueIndex[]; +}; + +/** + * Describes the message mgmt.v1alpha1.UniqueIndexes. + * Use `create(UniqueIndexesSchema)` to create a new message. + */ +export const UniqueIndexesSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_connection_data, 37); + +/** + * @generated from message mgmt.v1alpha1.UniqueIndex + */ +export type UniqueIndex = Message<"mgmt.v1alpha1.UniqueIndex"> & { + /** + * The columns that are part of the unique index + * + * @generated from field: repeated string columns = 1; + */ + columns: string[]; +}; + +/** + * Describes the message mgmt.v1alpha1.UniqueIndex. + * Use `create(UniqueIndexSchema)` to create a new message. + */ +export const UniqueIndexSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_connection_data, 38); + /** * @generated from message mgmt.v1alpha1.GetConnectionTableConstraintsResponse */ @@ -1019,6 +1057,13 @@ export type GetConnectionTableConstraintsResponse = Message<"mgmt.v1alpha1.GetCo * @generated from field: map unique_constraints = 3; */ uniqueConstraints: { [key: string]: UniqueConstraints }; + + /** + * the key here is .
and value is the unique index + * + * @generated from field: map unique_indexes = 4; + */ + uniqueIndexes: { [key: string]: UniqueIndexes }; }; /** @@ -1026,7 +1071,7 @@ export type GetConnectionTableConstraintsResponse = Message<"mgmt.v1alpha1.GetCo * Use `create(GetConnectionTableConstraintsResponseSchema)` to create a new message. */ export const GetConnectionTableConstraintsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_mgmt_v1alpha1_connection_data, 37); + messageDesc(file_mgmt_v1alpha1_connection_data, 39); /** * @generated from message mgmt.v1alpha1.GetTableRowCountRequest @@ -1066,7 +1111,7 @@ export type GetTableRowCountRequest = Message<"mgmt.v1alpha1.GetTableRowCountReq * Use `create(GetTableRowCountRequestSchema)` to create a new message. */ export const GetTableRowCountRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_mgmt_v1alpha1_connection_data, 38); + messageDesc(file_mgmt_v1alpha1_connection_data, 40); /** * @generated from message mgmt.v1alpha1.GetTableRowCountResponse @@ -1085,7 +1130,7 @@ export type GetTableRowCountResponse = Message<"mgmt.v1alpha1.GetTableRowCountRe * Use `create(GetTableRowCountResponseSchema)` to create a new message. */ export const GetTableRowCountResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_mgmt_v1alpha1_connection_data, 39); + messageDesc(file_mgmt_v1alpha1_connection_data, 41); /** * Service for managing connection data. diff --git a/frontend/packages/sdk/src/client/mgmt/v1alpha1/job_pb.ts b/frontend/packages/sdk/src/client/mgmt/v1alpha1/job_pb.ts index 7425c69a2a..4871444a02 100644 --- a/frontend/packages/sdk/src/client/mgmt/v1alpha1/job_pb.ts +++ b/frontend/packages/sdk/src/client/mgmt/v1alpha1/job_pb.ts @@ -17,7 +17,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file mgmt/v1alpha1/job.proto. */ export const file_mgmt_v1alpha1_job: GenFile = /*@__PURE__*/ - fileDesc("ChdtZ210L3YxYWxwaGExL2pvYi5wcm90bxINbWdtdC52MWFscGhhMSIuCg5HZXRKb2JzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABASIzCg9HZXRKb2JzUmVzcG9uc2USIAoEam9icxgBIAMoCzISLm1nbXQudjFhbHBoYTEuSm9iIkUKCUpvYlNvdXJjZRI4CgdvcHRpb25zGAEgASgLMh8ubWdtdC52MWFscGhhMS5Kb2JTb3VyY2VPcHRpb25zQga6SAPIAQEioQQKEEpvYlNvdXJjZU9wdGlvbnMSQgoIcG9zdGdyZXMYASABKAsyLi5tZ210LnYxYWxwaGExLlBvc3RncmVzU291cmNlQ29ubmVjdGlvbk9wdGlvbnNIABI9CgZhd3NfczMYAiABKAsyKy5tZ210LnYxYWxwaGExLkF3c1MzU291cmNlQ29ubmVjdGlvbk9wdGlvbnNIABI8CgVteXNxbBgDIAEoCzIrLm1nbXQudjFhbHBoYTEuTXlzcWxTb3VyY2VDb25uZWN0aW9uT3B0aW9uc0gAEjgKCGdlbmVyYXRlGAQgASgLMiQubWdtdC52MWFscGhhMS5HZW5lcmF0ZVNvdXJjZU9wdGlvbnNIABI9CgthaV9nZW5lcmF0ZRgFIAEoCzImLm1nbXQudjFhbHBoYTEuQWlHZW5lcmF0ZVNvdXJjZU9wdGlvbnNIABJACgdtb25nb2RiGAYgASgLMi0ubWdtdC52MWFscGhhMS5Nb25nb0RCU291cmNlQ29ubmVjdGlvbk9wdGlvbnNIABJCCghkeW5hbW9kYhgHIAEoCzIuLm1nbXQudjFhbHBoYTEuRHluYW1vREJTb3VyY2VDb25uZWN0aW9uT3B0aW9uc0gAEjwKBW1zc3FsGAggASgLMisubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zSABCDwoGY29uZmlnEgW6SAIIASJuChRDcmVhdGVKb2JEZXN0aW5hdGlvbhIfCg1jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABARI1CgdvcHRpb25zGAIgASgLMiQubWdtdC52MWFscGhhMS5Kb2JEZXN0aW5hdGlvbk9wdGlvbnMidAoOSm9iRGVzdGluYXRpb24SHwoNY29ubmVjdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESNQoHb3B0aW9ucxgCIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iRGVzdGluYXRpb25PcHRpb25zEgoKAmlkGAMgASgJIt0CChdBaUdlbmVyYXRlU291cmNlT3B0aW9ucxIiChBhaV9jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABARJGCgdzY2hlbWFzGAIgAygLMisubWdtdC52MWFscGhhMS5BaUdlbmVyYXRlU291cmNlU2NoZW1hT3B0aW9uQgi6SAWSAQIIARIuChdma19zb3VyY2VfY29ubmVjdGlvbl9pZBgDIAEoCUIIukgFcgOwAQFIAIgBARIbCgptb2RlbF9uYW1lGAQgASgJQge6SARyAhABEhgKC3VzZXJfcHJvbXB0GAUgASgJSAGIAQESKwoTZ2VuZXJhdGVfYmF0Y2hfc2l6ZRgGIAEoA0IJukgGIgQYZCgBSAKIAQFCGgoYX2ZrX3NvdXJjZV9jb25uZWN0aW9uX2lkQg4KDF91c2VyX3Byb21wdEIWChRfZ2VuZXJhdGVfYmF0Y2hfc2l6ZSJ9ChxBaUdlbmVyYXRlU291cmNlU2NoZW1hT3B0aW9uEhcKBnNjaGVtYRgBIAEoCUIHukgEcgIQARJECgZ0YWJsZXMYAiADKAsyKi5tZ210LnYxYWxwaGExLkFpR2VuZXJhdGVTb3VyY2VUYWJsZU9wdGlvbkIIukgFkgECCAEiVAobQWlHZW5lcmF0ZVNvdXJjZVRhYmxlT3B0aW9uEhYKBXRhYmxlGAEgASgJQge6SARyAhABEh0KCXJvd19jb3VudBgCIAEoA0IKukgHIgUY6AcoASKvAQoVR2VuZXJhdGVTb3VyY2VPcHRpb25zEkQKB3NjaGVtYXMYASADKAsyKS5tZ210LnYxYWxwaGExLkdlbmVyYXRlU291cmNlU2NoZW1hT3B0aW9uQgi6SAWSAQIIARIuChdma19zb3VyY2VfY29ubmVjdGlvbl9pZBgDIAEoCUIIukgFcgOwAQFIAIgBAUIaChhfZmtfc291cmNlX2Nvbm5lY3Rpb25faWRKBAgCEAMieQoaR2VuZXJhdGVTb3VyY2VTY2hlbWFPcHRpb24SFwoGc2NoZW1hGAEgASgJQge6SARyAhABEkIKBnRhYmxlcxgCIAMoCzIoLm1nbXQudjFhbHBoYTEuR2VuZXJhdGVTb3VyY2VUYWJsZU9wdGlvbkIIukgFkgECCAEiTwoZR2VuZXJhdGVTb3VyY2VUYWJsZU9wdGlvbhIWCgV0YWJsZRgBIAEoCUIHukgEcgIQARIaCglyb3dfY291bnQYAiABKANCB7pIBCICKAEiQQoeTW9uZ29EQlNvdXJjZUNvbm5lY3Rpb25PcHRpb25zEh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBIu8BCh9EeW5hbW9EQlNvdXJjZUNvbm5lY3Rpb25PcHRpb25zEh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBEjgKBnRhYmxlcxgCIAMoCzIoLm1nbXQudjFhbHBoYTEuRHluYW1vREJTb3VyY2VUYWJsZU9wdGlvbhJRChN1bm1hcHBlZF90cmFuc2Zvcm1zGAMgASgLMjQubWdtdC52MWFscGhhMS5EeW5hbW9EQlNvdXJjZVVubWFwcGVkVHJhbnNmb3JtQ29uZmlnEh4KFmVuYWJsZV9jb25zaXN0ZW50X3JlYWQYBCABKAgi/QEKJUR5bmFtb0RCU291cmNlVW5tYXBwZWRUcmFuc2Zvcm1Db25maWcSLwoBYhgBIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZ1RyYW5zZm9ybWVyEjUKB2Jvb2xlYW4YAiABKAsyJC5tZ210LnYxYWxwaGExLkpvYk1hcHBpbmdUcmFuc2Zvcm1lchIvCgFuGAQgASgLMiQubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nVHJhbnNmb3JtZXISLwoBcxgGIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZ1RyYW5zZm9ybWVySgQIAxAESgQIBRAGIl8KGUR5bmFtb0RCU291cmNlVGFibGVPcHRpb24SFgoFdGFibGUYASABKAlCB7pIBHICEAESGQoMd2hlcmVfY2xhdXNlGAIgASgJSACIAQFCDwoNX3doZXJlX2NsYXVzZSKeBwofUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucxI6CgdzY2hlbWFzGAIgAygLMikubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZVNjaGVtYU9wdGlvbhIfCg1jb25uZWN0aW9uX2lkGAMgASgJQgi6SAVyA7ABARIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYBCABKAgSbgocbmV3X2NvbHVtbl9hZGRpdGlvbl9zdHJhdGVneRgFIAEoCzJILm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5EmUKF2NvbHVtbl9yZW1vdmFsX3N0cmF0ZWd5GAYgASgLMkQubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneRqJAgoZTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneRJkCghoYWx0X2pvYhgBIAEoCzJQLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5LkhhbHRKb2JIABJkCghhdXRvX21hcBgCIAEoCzJQLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5LkF1dG9NYXBIABoJCgdIYWx0Sm9iGgkKB0F1dG9NYXBCCgoIc3RyYXRlZ3kaiQIKFUNvbHVtblJlbW92YWxTdHJhdGVneRJgCghoYWx0X2pvYhgBIAEoCzJMLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5Db2x1bW5SZW1vdmFsU3RyYXRlZ3kuSGFsdEpvYkgAEmgKDGNvbnRpbnVlX2pvYhgCIAEoCzJQLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5Db2x1bW5SZW1vdmFsU3RyYXRlZ3kuQ29udGludWVKb2JIABoJCgdIYWx0Sm9iGg0KC0NvbnRpbnVlSm9iQgoKCHN0cmF0ZWd5SgQIARACInkKGlBvc3RncmVzU291cmNlU2NoZW1hT3B0aW9uEhcKBnNjaGVtYRgBIAEoCUIHukgEcgIQARJCCgZ0YWJsZXMYAiADKAsyKC5tZ210LnYxYWxwaGExLlBvc3RncmVzU291cmNlVGFibGVPcHRpb25CCLpIBZIBAggBIl8KGVBvc3RncmVzU291cmNlVGFibGVPcHRpb24SFgoFdGFibGUYASABKAlCB7pIBHICEAESGQoMd2hlcmVfY2xhdXNlGAIgASgJSACIAQFCDwoNX3doZXJlX2NsYXVzZSKyBAocTXlzcWxTb3VyY2VDb25uZWN0aW9uT3B0aW9ucxIjChtoYWx0X29uX25ld19jb2x1bW5fYWRkaXRpb24YASABKAgSNwoHc2NoZW1hcxgCIAMoCzImLm1nbXQudjFhbHBoYTEuTXlzcWxTb3VyY2VTY2hlbWFPcHRpb24SHwoNY29ubmVjdGlvbl9pZBgDIAEoCUIIukgFcgOwAQESKQohc3Vic2V0X2J5X2ZvcmVpZ25fa2V5X2NvbnN0cmFpbnRzGAQgASgIEmIKF2NvbHVtbl9yZW1vdmFsX3N0cmF0ZWd5GAUgASgLMkEubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneRqDAgoVQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5El0KCGhhbHRfam9iGAEgASgLMkkubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5IYWx0Sm9iSAASZQoMY29udGludWVfam9iGAIgASgLMk0ubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5Db250aW51ZUpvYkgAGgkKB0hhbHRKb2IaDQoLQ29udGludWVKb2JCCgoIc3RyYXRlZ3kicwoXTXlzcWxTb3VyY2VTY2hlbWFPcHRpb24SFwoGc2NoZW1hGAEgASgJQge6SARyAhABEj8KBnRhYmxlcxgCIAMoCzIlLm1nbXQudjFhbHBoYTEuTXlzcWxTb3VyY2VUYWJsZU9wdGlvbkIIukgFkgECCAEiXAoWTXlzcWxTb3VyY2VUYWJsZU9wdGlvbhIWCgV0YWJsZRgBIAEoCUIHukgEcgIQARIZCgx3aGVyZV9jbGF1c2UYAiABKAlIAIgBAUIPCg1fd2hlcmVfY2xhdXNlIrIEChxNc3NxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zEiMKG2hhbHRfb25fbmV3X2NvbHVtbl9hZGRpdGlvbhgBIAEoCBI3CgdzY2hlbWFzGAIgAygLMiYubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZVNjaGVtYU9wdGlvbhIfCg1jb25uZWN0aW9uX2lkGAMgASgJQgi6SAVyA7ABARIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYBCABKAgSYgoXY29sdW1uX3JlbW92YWxfc3RyYXRlZ3kYBSABKAsyQS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5GoMCChVDb2x1bW5SZW1vdmFsU3RyYXRlZ3kSXQoIaGFsdF9qb2IYASABKAsySS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5LkhhbHRKb2JIABJlCgxjb250aW51ZV9qb2IYAiABKAsyTS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5LkNvbnRpbnVlSm9iSAAaCQoHSGFsdEpvYhoNCgtDb250aW51ZUpvYkIKCghzdHJhdGVneSJzChdNc3NxbFNvdXJjZVNjaGVtYU9wdGlvbhIXCgZzY2hlbWEYASABKAlCB7pIBHICEAESPwoGdGFibGVzGAIgAygLMiUubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZVRhYmxlT3B0aW9uQgi6SAWSAQIIASJcChZNc3NxbFNvdXJjZVRhYmxlT3B0aW9uEhYKBXRhYmxlGAEgASgJQge6SARyAhABEhkKDHdoZXJlX2NsYXVzZRgCIAEoCUgAiAEBQg8KDV93aGVyZV9jbGF1c2UiPwocQXdzUzNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucxIfCg1jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABASLbBAoVSm9iRGVzdGluYXRpb25PcHRpb25zEk8KEHBvc3RncmVzX29wdGlvbnMYASABKAsyMy5tZ210LnYxYWxwaGExLlBvc3RncmVzRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9uc0gAEkoKDmF3c19zM19vcHRpb25zGAIgASgLMjAubWdtdC52MWFscGhhMS5Bd3NTM0Rlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnNIABJJCg1teXNxbF9vcHRpb25zGAMgASgLMjAubWdtdC52MWFscGhhMS5NeXNxbERlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnNIABJNCg9tb25nb2RiX29wdGlvbnMYBCABKAsyMi5tZ210LnYxYWxwaGExLk1vbmdvREJEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSAASXgoYZ2NwX2Nsb3Vkc3RvcmFnZV9vcHRpb25zGAUgASgLMjoubWdtdC52MWFscGhhMS5HY3BDbG91ZFN0b3JhZ2VEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSAASTwoQZHluYW1vZGJfb3B0aW9ucxgGIAEoCzIzLm1nbXQudjFhbHBoYTEuRHluYW1vREJEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSAASSQoNbXNzcWxfb3B0aW9ucxgHIAEoCzIwLm1nbXQudjFhbHBoYTEuTXNzcWxEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSABCDwoGY29uZmlnEgW6SAIIASIlCiNNb25nb0RCRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucyItCitHY3BDbG91ZFN0b3JhZ2VEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zIm4KJER5bmFtb0RCRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucxJGCg50YWJsZV9tYXBwaW5ncxgBIAMoCzIuLm1nbXQudjFhbHBoYTEuRHluYW1vREJEZXN0aW5hdGlvblRhYmxlTWFwcGluZyJSCh9EeW5hbW9EQkRlc3RpbmF0aW9uVGFibGVNYXBwaW5nEhQKDHNvdXJjZV90YWJsZRgBIAEoCRIZChFkZXN0aW5hdGlvbl90YWJsZRgCIAEoCSLKAgokUG9zdGdyZXNEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zEkIKDnRydW5jYXRlX3RhYmxlGAEgASgLMioubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1RydW5jYXRlVGFibGVDb25maWcSGQoRaW5pdF90YWJsZV9zY2hlbWEYAiABKAgSPAoLb25fY29uZmxpY3QYAyABKAsyJy5tZ210LnYxYWxwaGExLlBvc3RncmVzT25Db25mbGljdENvbmZpZxIjChtza2lwX2ZvcmVpZ25fa2V5X3Zpb2xhdGlvbnMYBCABKAgSKQoFYmF0Y2gYBSABKAsyGi5tZ210LnYxYWxwaGExLkJhdGNoQ29uZmlnEiMKDW1heF9pbl9mbGlnaHQYBiABKA1CB7pIBCoCKAFIAIgBAUIQCg5fbWF4X2luX2ZsaWdodCKsAgoYUG9zdGdyZXNPbkNvbmZsaWN0Q29uZmlnEhYKCmRvX25vdGhpbmcYASABKAhCAhgBElYKB25vdGhpbmcYAiABKAsyQy5tZ210LnYxYWxwaGExLlBvc3RncmVzT25Db25mbGljdENvbmZpZy5Qb3N0Z3Jlc09uQ29uZmxpY3REb05vdGhpbmdIABJSCgZ1cGRhdGUYAyABKAsyQC5tZ210LnYxYWxwaGExLlBvc3RncmVzT25Db25mbGljdENvbmZpZy5Qb3N0Z3Jlc09uQ29uZmxpY3RVcGRhdGVIABodChtQb3N0Z3Jlc09uQ29uZmxpY3REb05vdGhpbmcaGgoYUG9zdGdyZXNPbkNvbmZsaWN0VXBkYXRlQhEKCHN0cmF0ZWd5EgW6SAIIACJOChtQb3N0Z3Jlc1RydW5jYXRlVGFibGVDb25maWcSHgoWdHJ1bmNhdGVfYmVmb3JlX2luc2VydBgBIAEoCBIPCgdjYXNjYWRlGAIgASgIIsECCiFNeXNxbERlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMSPwoOdHJ1bmNhdGVfdGFibGUYASABKAsyJy5tZ210LnYxYWxwaGExLk15c3FsVHJ1bmNhdGVUYWJsZUNvbmZpZxIZChFpbml0X3RhYmxlX3NjaGVtYRgCIAEoCBI5Cgtvbl9jb25mbGljdBgDIAEoCzIkLm1nbXQudjFhbHBoYTEuTXlzcWxPbkNvbmZsaWN0Q29uZmlnEiMKG3NraXBfZm9yZWlnbl9rZXlfdmlvbGF0aW9ucxgEIAEoCBIpCgViYXRjaBgFIAEoCzIaLm1nbXQudjFhbHBoYTEuQmF0Y2hDb25maWcSIwoNbWF4X2luX2ZsaWdodBgGIAEoDUIHukgEKgIoAUgAiAEBQhAKDl9tYXhfaW5fZmxpZ2h0IjoKGE15c3FsVHJ1bmNhdGVUYWJsZUNvbmZpZxIeChZ0cnVuY2F0ZV9iZWZvcmVfaW5zZXJ0GAEgASgIIpMCChVNeXNxbE9uQ29uZmxpY3RDb25maWcSEgoKZG9fbm90aGluZxgBIAEoCBJQCgdub3RoaW5nGAIgASgLMj0ubWdtdC52MWFscGhhMS5NeXNxbE9uQ29uZmxpY3RDb25maWcuTXlzcWxPbkNvbmZsaWN0RG9Ob3RoaW5nSAASTAoGdXBkYXRlGAMgASgLMjoubWdtdC52MWFscGhhMS5NeXNxbE9uQ29uZmxpY3RDb25maWcuTXlzcWxPbkNvbmZsaWN0VXBkYXRlSAAaGgoYTXlzcWxPbkNvbmZsaWN0RG9Ob3RoaW5nGhcKFU15c3FsT25Db25mbGljdFVwZGF0ZUIRCghzdHJhdGVneRIFukgCCAAiwQIKIU1zc3FsRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucxI/Cg50cnVuY2F0ZV90YWJsZRgBIAEoCzInLm1nbXQudjFhbHBoYTEuTXNzcWxUcnVuY2F0ZVRhYmxlQ29uZmlnEhkKEWluaXRfdGFibGVfc2NoZW1hGAIgASgIEjkKC29uX2NvbmZsaWN0GAMgASgLMiQubWdtdC52MWFscGhhMS5Nc3NxbE9uQ29uZmxpY3RDb25maWcSIwobc2tpcF9mb3JlaWduX2tleV92aW9sYXRpb25zGAQgASgIEikKBWJhdGNoGAUgASgLMhoubWdtdC52MWFscGhhMS5CYXRjaENvbmZpZxIjCg1tYXhfaW5fZmxpZ2h0GAYgASgNQge6SAQqAigBSACIAQFCEAoOX21heF9pbl9mbGlnaHQiOgoYTXNzcWxUcnVuY2F0ZVRhYmxlQ29uZmlnEh4KFnRydW5jYXRlX2JlZm9yZV9pbnNlcnQYASABKAgiKwoVTXNzcWxPbkNvbmZsaWN0Q29uZmlnEhIKCmRvX25vdGhpbmcYASABKAgijgQKIUF3c1MzRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucxJUCg1zdG9yYWdlX2NsYXNzGAEgASgOMj0ubWdtdC52MWFscGhhMS5Bd3NTM0Rlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMuU3RvcmFnZUNsYXNzEiMKDW1heF9pbl9mbGlnaHQYAiABKA1CB7pIBCoCKAFIAIgBARIUCgd0aW1lb3V0GAMgASgJSAGIAQESKQoFYmF0Y2gYBCABKAsyGi5tZ210LnYxYWxwaGExLkJhdGNoQ29uZmlnIo4CCgxTdG9yYWdlQ2xhc3MSHQoZU1RPUkFHRV9DTEFTU19VTlNQRUNJRklFRBAAEhoKFlNUT1JBR0VfQ0xBU1NfU1RBTkRBUkQQARIkCiBTVE9SQUdFX0NMQVNTX1JFRFVDRURfUkVEVU5EQU5DWRACEhkKFVNUT1JBR0VfQ0xBU1NfR0xBQ0lFUhADEh0KGVNUT1JBR0VfQ0xBU1NfU1RBTkRBUkRfSUEQBBIcChhTVE9SQUdFX0NMQVNTX09ORVpPTkVfSUEQBRIlCiFTVE9SQUdFX0NMQVNTX0lOVEVMTElHRU5UX1RJRVJJTkcQBhIeChpTVE9SQUdFX0NMQVNTX0RFRVBfQVJDSElWRRAHQhAKDl9tYXhfaW5fZmxpZ2h0QgoKCF90aW1lb3V0IksKC0JhdGNoQ29uZmlnEhIKBWNvdW50GAEgASgNSACIAQESEwoGcGVyaW9kGAIgASgJSAGIAQFCCAoGX2NvdW50QgkKB19wZXJpb2Qi7gMKEENyZWF0ZUpvYlJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESKwoIam9iX25hbWUYAiABKAlCGbpIFnIUMhJeW2EtejAtOS1dezMsMTAwfSQSGgoNY3Jvbl9zY2hlZHVsZRgDIAEoCUgAiAEBEisKCG1hcHBpbmdzGAQgAygLMhkubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nEigKBnNvdXJjZRgFIAEoCzIYLm1nbXQudjFhbHBoYTEuSm9iU291cmNlEjkKDGRlc3RpbmF0aW9ucxgGIAMoCzIjLm1nbXQudjFhbHBoYTEuQ3JlYXRlSm9iRGVzdGluYXRpb24SGAoQaW5pdGlhdGVfam9iX3J1bhgHIAEoCBI4ChB3b3JrZmxvd19vcHRpb25zGAggASgLMh4ubWdtdC52MWFscGhhMS5Xb3JrZmxvd09wdGlvbnMSNAoMc3luY19vcHRpb25zGAkgASgLMh4ubWdtdC52MWFscGhhMS5BY3Rpdml0eU9wdGlvbnMSRQoUdmlydHVhbF9mb3JlaWduX2tleXMYCiADKAsyJy5tZ210LnYxYWxwaGExLlZpcnR1YWxGb3JlaWduQ29uc3RyYWludEIQCg5fY3Jvbl9zY2hlZHVsZSJlCg9Xb3JrZmxvd09wdGlvbnMSGAoLcnVuX3RpbWVvdXQYCCABKANIAIgBAUIOCgxfcnVuX3RpbWVvdXRKBAgBEAJKBAgCEANKBAgDEARKBAgEEAVKBAgFEAZKBAgGEAdKBAgHEAgi2wEKD0FjdGl2aXR5T3B0aW9ucxIvChlzY2hlZHVsZV90b19jbG9zZV90aW1lb3V0GAEgASgDQge6SAQiAigBSACIAQESLAoWc3RhcnRfdG9fY2xvc2VfdGltZW91dBgCIAEoA0IHukgEIgIoAUgBiAEBEjAKDHJldHJ5X3BvbGljeRgDIAEoCzIaLm1nbXQudjFhbHBoYTEuUmV0cnlQb2xpY3lCHAoaX3NjaGVkdWxlX3RvX2Nsb3NlX3RpbWVvdXRCGQoXX3N0YXJ0X3RvX2Nsb3NlX3RpbWVvdXQiSgoLUmV0cnlQb2xpY3kSJgoQbWF4aW11bV9hdHRlbXB0cxgBIAEoBUIHukgEGgIoAEgAiAEBQhMKEV9tYXhpbXVtX2F0dGVtcHRzIjQKEUNyZWF0ZUpvYlJlc3BvbnNlEh8KA2pvYhgBIAEoCzISLm1nbXQudjFhbHBoYTEuSm9iIk8KFUpvYk1hcHBpbmdUcmFuc2Zvcm1lchIwCgZjb25maWcYAyABKAsyIC5tZ210LnYxYWxwaGExLlRyYW5zZm9ybWVyQ29uZmlnSgQIARACIpEBCgpKb2JNYXBwaW5nEhcKBnNjaGVtYRgBIAEoCUIHukgEcgIQARIWCgV0YWJsZRgCIAEoCUIHukgEcgIQARIXCgZjb2x1bW4YAyABKAlCB7pIBHICEAESOQoLdHJhbnNmb3JtZXIYBSABKAsyJC5tZ210LnYxYWxwaGExLkpvYk1hcHBpbmdUcmFuc2Zvcm1lciIlCg1HZXRKb2JSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABASIxCg5HZXRKb2JSZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiJeChhVcGRhdGVKb2JTY2hlZHVsZVJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEhoKDWNyb25fc2NoZWR1bGUYAiABKAlIAIgBAUIQCg5fY3Jvbl9zY2hlZHVsZSI8ChlVcGRhdGVKb2JTY2hlZHVsZVJlc3BvbnNlEh8KA2pvYhgBIAEoCzISLm1nbXQudjFhbHBoYTEuSm9iIlIKD1BhdXNlSm9iUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQESDQoFcGF1c2UYAiABKAgSEQoEbm90ZRgDIAEoCUgAiAEBQgcKBV9ub3RlIjMKEFBhdXNlSm9iUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2Ii1gEKIFVwZGF0ZUpvYlNvdXJjZUNvbm5lY3Rpb25SZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABARIoCgZzb3VyY2UYAiABKAsyGC5tZ210LnYxYWxwaGExLkpvYlNvdXJjZRIrCghtYXBwaW5ncxgDIAMoCzIZLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZxJFChR2aXJ0dWFsX2ZvcmVpZ25fa2V5cxgEIAMoCzInLm1nbXQudjFhbHBoYTEuVmlydHVhbEZvcmVpZ25Db25zdHJhaW50IkQKIVVwZGF0ZUpvYlNvdXJjZUNvbm5lY3Rpb25SZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiJhChpQb3N0Z3Jlc1NvdXJjZVNjaGVtYVN1YnNldBJDChBwb3N0Z3Jlc19zY2hlbWFzGAEgAygLMikubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZVNjaGVtYU9wdGlvbiJYChdNeXNxbFNvdXJjZVNjaGVtYVN1YnNldBI9Cg1teXNxbF9zY2hlbWFzGAEgAygLMiYubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZVNjaGVtYU9wdGlvbiJWChpEeW5hbW9EQlNvdXJjZVNjaGVtYVN1YnNldBI4CgZ0YWJsZXMYASADKAsyKC5tZ210LnYxYWxwaGExLkR5bmFtb0RCU291cmNlVGFibGVPcHRpb24iWAoXTXNzcWxTb3VyY2VTY2hlbWFTdWJzZXQSPQoNbXNzcWxfc2NoZW1hcxgBIAMoCzImLm1nbXQudjFhbHBoYTEuTXNzcWxTb3VyY2VTY2hlbWFPcHRpb24ivgIKGEpvYlNvdXJjZVNxbFN1YmV0U2NoZW1hcxJECg9wb3N0Z3Jlc19zdWJzZXQYAiABKAsyKS5tZ210LnYxYWxwaGExLlBvc3RncmVzU291cmNlU2NoZW1hU3Vic2V0SAASPgoMbXlzcWxfc3Vic2V0GAMgASgLMiYubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZVNjaGVtYVN1YnNldEgAEkQKD2R5bmFtb2RiX3N1YnNldBgEIAEoCzIpLm1nbXQudjFhbHBoYTEuRHluYW1vREJTb3VyY2VTY2hlbWFTdWJzZXRIABI+Cgxtc3NxbF9zdWJzZXQYBSABKAsyJi5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlU2NoZW1hU3Vic2V0SABCEAoHc2NoZW1hcxIFukgCCAFKBAgBEAIipAEKJ1NldEpvYlNvdXJjZVNxbENvbm5lY3Rpb25TdWJzZXRzUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQESOAoHc2NoZW1hcxgCIAEoCzInLm1nbXQudjFhbHBoYTEuSm9iU291cmNlU3FsU3ViZXRTY2hlbWFzEikKIXN1YnNldF9ieV9mb3JlaWduX2tleV9jb25zdHJhaW50cxgDIAEoCCJLCihTZXRKb2JTb3VyY2VTcWxDb25uZWN0aW9uU3Vic2V0c1Jlc3BvbnNlEh8KA2pvYhgBIAEoCzISLm1nbXQudjFhbHBoYTEuSm9iIrEBCiVVcGRhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXF1ZXN0EhgKBmpvYl9pZBgBIAEoCUIIukgFcgOwAQESHwoNY29ubmVjdGlvbl9pZBgCIAEoCUIIukgFcgOwAQESNQoHb3B0aW9ucxgDIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iRGVzdGluYXRpb25PcHRpb25zEhYKDmRlc3RpbmF0aW9uX2lkGAQgASgJIkkKJlVwZGF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvblJlc3BvbnNlEh8KA2pvYhgBIAEoCzISLm1nbXQudjFhbHBoYTEuSm9iIkkKJURlbGV0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvblJlcXVlc3QSIAoOZGVzdGluYXRpb25faWQYASABKAlCCLpIBXIDsAEBIigKJkRlbGV0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvblJlc3BvbnNlIn0KJkNyZWF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvbnNSZXF1ZXN0EhgKBmpvYl9pZBgBIAEoCUIIukgFcgOwAQESOQoMZGVzdGluYXRpb25zGAIgAygLMiMubWdtdC52MWFscGhhMS5DcmVhdGVKb2JEZXN0aW5hdGlvbiJKCidDcmVhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25zUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IiKAoQRGVsZXRlSm9iUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiEwoRRGVsZXRlSm9iUmVzcG9uc2UiYgoZSXNKb2JOYW1lQXZhaWxhYmxlUmVxdWVzdBInCgRuYW1lGAEgASgJQhm6SBZyFDISXlthLXowLTktXXszLDEwMH0kEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBIjIKGklzSm9iTmFtZUF2YWlsYWJsZVJlc3BvbnNlEhQKDGlzX2F2YWlsYWJsZRgBIAEoCCJVChFHZXRKb2JSdW5zUmVxdWVzdBIaCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBSAASHgoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQFIAEIECgJpZCI9ChJHZXRKb2JSdW5zUmVzcG9uc2USJwoIam9iX3J1bnMYASADKAsyFS5tZ210LnYxYWxwaGExLkpvYlJ1biJEChBHZXRKb2JSdW5SZXF1ZXN0EhIKCmpvYl9ydW5faWQYASABKAkSHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiOwoRR2V0Sm9iUnVuUmVzcG9uc2USJgoHam9iX3J1bhgBIAEoCzIVLm1nbXQudjFhbHBoYTEuSm9iUnVuIi8KE0NyZWF0ZUpvYlJ1blJlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABASIWChRDcmVhdGVKb2JSdW5SZXNwb25zZSJHChNDYW5jZWxKb2JSdW5SZXF1ZXN0EhIKCmpvYl9ydW5faWQYASABKAkSHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiFgoUQ2FuY2VsSm9iUnVuUmVzcG9uc2UivAQKA0pvYhIKCgJpZBgBIAEoCRIaChJjcmVhdGVkX2J5X3VzZXJfaWQYAiABKAkSLgoKY3JlYXRlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGgoSdXBkYXRlZF9ieV91c2VyX2lkGAQgASgJEi4KCnVwZGF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEgwKBG5hbWUYBiABKAkSKAoGc291cmNlGAcgASgLMhgubWdtdC52MWFscGhhMS5Kb2JTb3VyY2USMwoMZGVzdGluYXRpb25zGAggAygLMh0ubWdtdC52MWFscGhhMS5Kb2JEZXN0aW5hdGlvbhIrCghtYXBwaW5ncxgJIAMoCzIZLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZxIaCg1jcm9uX3NjaGVkdWxlGAogASgJSACIAQESEgoKYWNjb3VudF9pZBgLIAEoCRI0CgxzeW5jX29wdGlvbnMYDCABKAsyHi5tZ210LnYxYWxwaGExLkFjdGl2aXR5T3B0aW9ucxI4ChB3b3JrZmxvd19vcHRpb25zGA0gASgLMh4ubWdtdC52MWFscGhhMS5Xb3JrZmxvd09wdGlvbnMSRQoUdmlydHVhbF9mb3JlaWduX2tleXMYDiADKAsyJy5tZ210LnYxYWxwaGExLlZpcnR1YWxGb3JlaWduQ29uc3RyYWludEIQCg5fY3Jvbl9zY2hlZHVsZSJSCgxKb2JSZWNlbnRSdW4SLgoKc3RhcnRfdGltZRgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEgoKam9iX3J1bl9pZBgCIAEoCSIzChdHZXRKb2JSZWNlbnRSdW5zUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBIkwKGEdldEpvYlJlY2VudFJ1bnNSZXNwb25zZRIwCgtyZWNlbnRfcnVucxgBIAMoCzIbLm1nbXQudjFhbHBoYTEuSm9iUmVjZW50UnVuIkEKC0pvYk5leHRSdW5zEjIKDm5leHRfcnVuX3RpbWVzGAEgAygLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIxChVHZXRKb2JOZXh0UnVuc1JlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABASJHChZHZXRKb2JOZXh0UnVuc1Jlc3BvbnNlEi0KCW5leHRfcnVucxgBIAEoCzIaLm1nbXQudjFhbHBoYTEuSm9iTmV4dFJ1bnMiLwoTR2V0Sm9iU3RhdHVzUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBIkAKFEdldEpvYlN0YXR1c1Jlc3BvbnNlEigKBnN0YXR1cxgBIAEoDjIYLm1nbXQudjFhbHBoYTEuSm9iU3RhdHVzIlUKD0pvYlN0YXR1c1JlY29yZBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBEigKBnN0YXR1cxgCIAEoDjIYLm1nbXQudjFhbHBoYTEuSm9iU3RhdHVzIjUKFUdldEpvYlN0YXR1c2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABASJKChZHZXRKb2JTdGF0dXNlc1Jlc3BvbnNlEjAKCHN0YXR1c2VzGAEgAygLMh4ubWdtdC52MWFscGhhMS5Kb2JTdGF0dXNSZWNvcmQiIgoPQWN0aXZpdHlGYWlsdXJlEg8KB21lc3NhZ2UYASABKAkiowEKD1BlbmRpbmdBY3Rpdml0eRItCgZzdGF0dXMYASABKA4yHS5tZ210LnYxYWxwaGExLkFjdGl2aXR5U3RhdHVzEhUKDWFjdGl2aXR5X25hbWUYAiABKAkSOQoMbGFzdF9mYWlsdXJlGAMgASgLMh4ubWdtdC52MWFscGhhMS5BY3Rpdml0eUZhaWx1cmVIAIgBAUIPCg1fbGFzdF9mYWlsdXJlIpkCCgZKb2JSdW4SCgoCaWQYASABKAkSDgoGam9iX2lkGAIgASgJEgwKBG5hbWUYAyABKAkSKwoGc3RhdHVzGAQgASgOMhsubWdtdC52MWFscGhhMS5Kb2JSdW5TdGF0dXMSLgoKc3RhcnRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASNQoMY29tcGxldGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBEjoKEnBlbmRpbmdfYWN0aXZpdGllcxgIIAMoCzIeLm1nbXQudjFhbHBoYTEuUGVuZGluZ0FjdGl2aXR5Qg8KDV9jb21wbGV0ZWRfYXRKBAgFEAYiPAoUSm9iUnVuRXZlbnRUYXNrRXJyb3ISDwoHbWVzc2FnZRgBIAEoCRITCgtyZXRyeV9zdGF0ZRgCIAEoCSKPAQoPSm9iUnVuRXZlbnRUYXNrEgoKAmlkGAEgASgDEgwKBHR5cGUYAiABKAkSLgoKZXZlbnRfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMgoFZXJyb3IYBCABKAsyIy5tZ210LnYxYWxwaGExLkpvYlJ1bkV2ZW50VGFza0Vycm9yIjMKEkpvYlJ1blN5bmNNZXRhZGF0YRIOCgZzY2hlbWEYASABKAkSDQoFdGFibGUYAiABKAkiZAoTSm9iUnVuRXZlbnRNZXRhZGF0YRI6Cg1zeW5jX21ldGFkYXRhGAEgASgLMiEubWdtdC52MWFscGhhMS5Kb2JSdW5TeW5jTWV0YWRhdGFIAEIRCghtZXRhZGF0YRIFukgCCAEi7AEKC0pvYlJ1bkV2ZW50EgoKAmlkGAEgASgDEgwKBHR5cGUYAiABKAkSLgoKc3RhcnRfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKY2xvc2VfdGltZRgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASNAoIbWV0YWRhdGEYBSABKAsyIi5tZ210LnYxYWxwaGExLkpvYlJ1bkV2ZW50TWV0YWRhdGESLQoFdGFza3MYBiADKAsyHi5tZ210LnYxYWxwaGExLkpvYlJ1bkV2ZW50VGFzayJKChZHZXRKb2JSdW5FdmVudHNSZXF1ZXN0EhIKCmpvYl9ydW5faWQYASABKAkSHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiXgoXR2V0Sm9iUnVuRXZlbnRzUmVzcG9uc2USKgoGZXZlbnRzGAEgAygLMhoubWdtdC52MWFscGhhMS5Kb2JSdW5FdmVudBIXCg9pc19ydW5fY29tcGxldGUYAiABKAgiRwoTRGVsZXRlSm9iUnVuUmVxdWVzdBISCgpqb2JfcnVuX2lkGAEgASgJEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBIhYKFERlbGV0ZUpvYlJ1blJlc3BvbnNlIkoKFlRlcm1pbmF0ZUpvYlJ1blJlcXVlc3QSEgoKam9iX3J1bl9pZBgBIAEoCRIcCgphY2NvdW50X2lkGAIgASgJQgi6SAVyA7ABASIZChdUZXJtaW5hdGVKb2JSdW5SZXNwb25zZSLxAQoaR2V0Sm9iUnVuTG9nc1N0cmVhbVJlcXVlc3QSEgoKam9iX3J1bl9pZBgBIAEoCRIcCgphY2NvdW50X2lkGAIgASgJQgi6SAVyA7ABARIoCgZ3aW5kb3cYAyABKA4yGC5tZ210LnYxYWxwaGExLkxvZ1dpbmRvdxITCgtzaG91bGRfdGFpbBgEIAEoCBIjCg1tYXhfbG9nX2xpbmVzGAUgASgDQge6SAQiAigBSACIAQESKwoKbG9nX2xldmVscxgGIAMoDjIXLm1nbXQudjFhbHBoYTEuTG9nTGV2ZWxCEAoOX21heF9sb2dfbGluZXMi6AEKG0dldEpvYlJ1bkxvZ3NTdHJlYW1SZXNwb25zZRIQCghsb2dfbGluZRgBIAEoCRIyCgl0aW1lc3RhbXAYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSACIAQESRgoGbGFiZWxzGAMgAygLMjYubWdtdC52MWFscGhhMS5HZXRKb2JSdW5Mb2dzU3RyZWFtUmVzcG9uc2UuTGFiZWxzRW50cnkaLQoLTGFiZWxzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AUIMCgpfdGltZXN0YW1wItYBChRHZXRKb2JSdW5Mb2dzUmVxdWVzdBISCgpqb2JfcnVuX2lkGAEgASgJEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBEigKBndpbmRvdxgDIAEoDjIYLm1nbXQudjFhbHBoYTEuTG9nV2luZG93EiMKDW1heF9sb2dfbGluZXMYBCABKANCB7pIBCICKAFIAIgBARIrCgpsb2dfbGV2ZWxzGAUgAygOMhcubWdtdC52MWFscGhhMS5Mb2dMZXZlbEIQCg5fbWF4X2xvZ19saW5lcyKxAgoVR2V0Sm9iUnVuTG9nc1Jlc3BvbnNlEj8KCWxvZ19saW5lcxgBIAMoCzIsLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1Jlc3BvbnNlLkxvZ0xpbmUa1gEKB0xvZ0xpbmUSEAoIbG9nX2xpbmUYASABKAkSMgoJdGltZXN0YW1wGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBEkgKBmxhYmVscxgDIAMoCzI4Lm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1Jlc3BvbnNlLkxvZ0xpbmUuTGFiZWxzRW50cnkaLQoLTGFiZWxzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AUIMCgpfdGltZXN0YW1wIm4KHFNldEpvYldvcmtmbG93T3B0aW9uc1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEjgKEHdvcmZrbG93X29wdGlvbnMYAiABKAsyHi5tZ210LnYxYWxwaGExLldvcmtmbG93T3B0aW9ucyJACh1TZXRKb2JXb3JrZmxvd09wdGlvbnNSZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiJmChhTZXRKb2JTeW5jT3B0aW9uc1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEjQKDHN5bmNfb3B0aW9ucxgCIAEoCzIeLm1nbXQudjFhbHBoYTEuQWN0aXZpdHlPcHRpb25zIjwKGVNldEpvYlN5bmNPcHRpb25zUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IikQIKGlZhbGlkYXRlSm9iTWFwcGluZ3NSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEisKCG1hcHBpbmdzGAIgAygLMhkubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nEh8KDWNvbm5lY3Rpb25faWQYAyABKAlCCLpIBXIDsAEBEkUKFHZpcnR1YWxfZm9yZWlnbl9rZXlzGAQgAygLMicubWdtdC52MWFscGhhMS5WaXJ0dWFsRm9yZWlnbkNvbnN0cmFpbnQSMQoKam9iX3NvdXJjZRgFIAEoCzIYLm1nbXQudjFhbHBoYTEuSm9iU291cmNlSACIAQFCDQoLX2pvYl9zb3VyY2UiqwcKC0NvbHVtbkVycm9yEg4KBnNjaGVtYRgBIAEoCRINCgV0YWJsZRgCIAEoCRIOCgZjb2x1bW4YAyABKAkSEgoGZXJyb3JzGAQgAygJQgIYARJDCg1lcnJvcl9yZXBvcnRzGAUgAygLMiwubWdtdC52MWFscGhhMS5Db2x1bW5FcnJvci5Db2x1bW5FcnJvclJlcG9ydBpeChFDb2x1bW5FcnJvclJlcG9ydBI4CgRjb2RlGAEgASgOMioubWdtdC52MWFscGhhMS5Db2x1bW5FcnJvci5Db2x1bW5FcnJvckNvZGUSDwoHbWVzc2FnZRgCIAEoCSKzBQoPQ29sdW1uRXJyb3JDb2RlEiEKHUNPTFVNTl9FUlJPUl9DT0RFX1VOU1BFQ0lGSUVEEAASKQolQ09MVU1OX0VSUk9SX0NPREVfTk9UX0ZPVU5EX0lOX1NPVVJDRRABEioKJkNPTFVNTl9FUlJPUl9DT0RFX05PVF9GT1VORF9JTl9NQVBQSU5HEAISOgo2Q09MVU1OX0VSUk9SX0NPREVfUkVRVUlSRURfQ09MVU1OX05PVF9GT1VORF9JTl9NQVBQSU5HEAMSPwo7Q09MVU1OX0VSUk9SX0NPREVfUkVRVUlSRURfRk9SRUlHTl9LRVlfTk9UX0ZPVU5EX0lOX01BUFBJTkcQBBJLCkdDT0xVTU5fRVJST1JfQ09ERV9VTlNVUFBPUlRFRF9DSVJDVUxBUl9ERVBFTkRFTkNZX0FUX0xFQVNUX09ORV9OVUxMQUJMRRAFEjwKOENPTFVNTl9FUlJPUl9DT0RFX1ZGS19TT1VSQ0VfQ09MVU1OX05PVF9GT1VORF9JTl9NQVBQSU5HEAYSOwo3Q09MVU1OX0VSUk9SX0NPREVfVkZLX1NPVVJDRV9DT0xVTU5fTk9UX0ZPVU5EX0lOX1NPVVJDRRAHEjwKOENPTFVNTl9FUlJPUl9DT0RFX1ZGS19UQVJHRVRfQ09MVU1OX05PVF9GT1VORF9JTl9NQVBQSU5HEAgSOwo3Q09MVU1OX0VSUk9SX0NPREVfVkZLX1RBUkdFVF9DT0xVTU5fTk9UX0ZPVU5EX0lOX1NPVVJDRRAJEjIKLkNPTFVNTl9FUlJPUl9DT0RFX1ZGS19DT0xVTU5fREFUQVRZUEVfTUlTTUFUQ0gQChIyCi5DT0xVTU5fRVJST1JfQ09ERV9WRktfU09VUkNFX0NPTFVNTl9OT1RfVU5JUVVFEAsimwMKDUNvbHVtbldhcm5pbmcSDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEg4KBmNvbHVtbhgDIAEoCRIUCgh3YXJuaW5ncxgFIAMoCUICGAESSQoPd2FybmluZ19yZXBvcnRzGAYgAygLMjAubWdtdC52MWFscGhhMS5Db2x1bW5XYXJuaW5nLkNvbHVtbldhcm5pbmdSZXBvcnQaZAoTQ29sdW1uV2FybmluZ1JlcG9ydBI8CgRjb2RlGAEgASgOMi4ubWdtdC52MWFscGhhMS5Db2x1bW5XYXJuaW5nLkNvbHVtbldhcm5pbmdDb2RlEg8KB21lc3NhZ2UYAiABKAkikwEKEUNvbHVtbldhcm5pbmdDb2RlEiMKH0NPTFVNTl9XQVJOSU5HX0NPREVfVU5TUEVDSUZJRUQQABIrCidDT0xVTU5fV0FSTklOR19DT0RFX05PVF9GT1VORF9JTl9TT1VSQ0UQARIsCihDT0xVTU5fV0FSTklOR19DT0RFX05PVF9GT1VORF9JTl9NQVBQSU5HEAIiiQMKDURhdGFiYXNlRXJyb3ISEgoGZXJyb3JzGAEgAygJQgIYARJHCg1lcnJvcl9yZXBvcnRzGAIgAygLMjAubWdtdC52MWFscGhhMS5EYXRhYmFzZUVycm9yLkRhdGFiYXNlRXJyb3JSZXBvcnQaZAoTRGF0YWJhc2VFcnJvclJlcG9ydBI8CgRjb2RlGAEgASgOMi4ubWdtdC52MWFscGhhMS5EYXRhYmFzZUVycm9yLkRhdGFiYXNlRXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkitAEKEURhdGFiYXNlRXJyb3JDb2RlEiMKH0RBVEFCQVNFX0VSUk9SX0NPREVfVU5TUEVDSUZJRUQQABJNCklEQVRBQkFTRV9FUlJPUl9DT0RFX1VOU1VQUE9SVEVEX0NJUkNVTEFSX0RFUEVOREVOQ1lfQVRfTEVBU1RfT05FX05VTExBQkxFEAESKwonREFUQUJBU0VfRVJST1JfQ09ERV9WRktfQ09MVU1OX01JU01BVENIEAIingQKClRhYmxlRXJyb3ISDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEkEKDWVycm9yX3JlcG9ydHMYAyADKAsyKi5tZ210LnYxYWxwaGExLlRhYmxlRXJyb3IuVGFibGVFcnJvclJlcG9ydBpbChBUYWJsZUVycm9yUmVwb3J0EjYKBGNvZGUYASABKA4yKC5tZ210LnYxYWxwaGExLlRhYmxlRXJyb3IuVGFibGVFcnJvckNvZGUSDwoHbWVzc2FnZRgCIAEoCSLQAgoOVGFibGVFcnJvckNvZGUSIAocVEFCTEVfRVJST1JfQ09ERV9VTlNQRUNJRklFRBAAEi4KKlRBQkxFX0VSUk9SX0NPREVfVEFCTEVfTk9UX0ZPVU5EX0lOX1NPVVJDRRABEjoKNlRBQkxFX0VSUk9SX0NPREVfVkZLX1NPVVJDRV9UQUJMRV9OT1RfRk9VTkRfSU5fTUFQUElORxACEjkKNVRBQkxFX0VSUk9SX0NPREVfVkZLX1NPVVJDRV9UQUJMRV9OT1RfRk9VTkRfSU5fU09VUkNFEAMSOgo2VEFCTEVfRVJST1JfQ09ERV9WRktfVEFSR0VUX1RBQkxFX05PVF9GT1VORF9JTl9NQVBQSU5HEAQSOQo1VEFCTEVfRVJST1JfQ09ERV9WRktfVEFSR0VUX1RBQkxFX05PVF9GT1VORF9JTl9TT1VSQ0UQBSLvAQobVmFsaWRhdGVKb2JNYXBwaW5nc1Jlc3BvbnNlEjEKDWNvbHVtbl9lcnJvcnMYASADKAsyGi5tZ210LnYxYWxwaGExLkNvbHVtbkVycm9yEjUKD2RhdGFiYXNlX2Vycm9ycxgCIAEoCzIcLm1nbXQudjFhbHBoYTEuRGF0YWJhc2VFcnJvchI1Cg9jb2x1bW5fd2FybmluZ3MYAyADKAsyHC5tZ210LnYxYWxwaGExLkNvbHVtbldhcm5pbmcSLwoMdGFibGVfZXJyb3JzGAQgAygLMhkubWdtdC52MWFscGhhMS5UYWJsZUVycm9yImUKFVZhbGlkYXRlU2NoZW1hUmVxdWVzdBIrCghtYXBwaW5ncxgBIAMoCzIZLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZxIfCg1jb25uZWN0aW9uX2lkGAIgASgJQgi6SAVyA7ABASKMAgoWVmFsaWRhdGVTY2hlbWFSZXNwb25zZRI2Cg9taXNzaW5nX2NvbHVtbnMYASADKAsyHS5tZ210LnYxYWxwaGExLkRhdGFiYXNlQ29sdW1uEjQKDWV4dHJhX2NvbHVtbnMYAiADKAsyHS5tZ210LnYxYWxwaGExLkRhdGFiYXNlQ29sdW1uEkMKDm1pc3NpbmdfdGFibGVzGAMgAygLMisubWdtdC52MWFscGhhMS5WYWxpZGF0ZVNjaGVtYVJlc3BvbnNlLlRhYmxlEhcKD21pc3Npbmdfc2NoZW1hcxgEIAMoCRomCgVUYWJsZRIOCgZzY2hlbWEYASABKAkSDQoFdGFibGUYAiABKAkiQwoRVmlydHVhbEZvcmVpZ25LZXkSDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEg8KB2NvbHVtbnMYAyADKAkigQEKGFZpcnR1YWxGb3JlaWduQ29uc3RyYWludBIOCgZzY2hlbWEYASABKAkSDQoFdGFibGUYAiABKAkSDwoHY29sdW1ucxgDIAMoCRI1Cgtmb3JlaWduX2tleRgEIAEoCzIgLm1nbXQudjFhbHBoYTEuVmlydHVhbEZvcmVpZ25LZXkiZwoNUnVuQ29udGV4dEtleRIbCgpqb2JfcnVuX2lkGAEgASgJQge6SARyAhABEhwKC2V4dGVybmFsX2lkGAIgASgJQge6SARyAhABEhsKCmFjY291bnRfaWQYAyABKAlCB7pIBHICEAEiQAoUR2V0UnVuQ29udGV4dFJlcXVlc3QSKAoCaWQYASABKAsyHC5tZ210LnYxYWxwaGExLlJ1bkNvbnRleHRLZXkiJgoVR2V0UnVuQ29udGV4dFJlc3BvbnNlEg0KBXZhbHVlGAEgASgMIk8KFFNldFJ1bkNvbnRleHRSZXF1ZXN0EigKAmlkGAEgASgLMhwubWdtdC52MWFscGhhMS5SdW5Db250ZXh0S2V5Eg0KBXZhbHVlGAIgASgMIhcKFVNldFJ1bkNvbnRleHRSZXNwb25zZSJQChVTZXRSdW5Db250ZXh0c1JlcXVlc3QSKAoCaWQYASABKAsyHC5tZ210LnYxYWxwaGExLlJ1bkNvbnRleHRLZXkSDQoFdmFsdWUYAiABKAwiGAoWU2V0UnVuQ29udGV4dHNSZXNwb25zZSK8AgoHSm9iSG9vaxIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEg4KBmpvYl9pZBgEIAEoCRIsCgZjb25maWcYBSABKAsyHC5tZ210LnYxYWxwaGExLkpvYkhvb2tDb25maWcSGgoSY3JlYXRlZF9ieV91c2VyX2lkGAYgASgJEi4KCmNyZWF0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhoKEnVwZGF0ZWRfYnlfdXNlcl9pZBgIIAEoCRIuCgp1cGRhdGVkX2F0GAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIPCgdlbmFibGVkGAogASgIEhsKCHByaW9yaXR5GAsgASgNQgm6SAYqBBhkKAAirwEKCk5ld0pvYkhvb2sSJwoEbmFtZRgBIAEoCUIZukgWchQyEl5bYS16MC05LV17MywxMDB9JBIcCgtkZXNjcmlwdGlvbhgCIAEoCUIHukgEcgIQARIsCgZjb25maWcYAyABKAsyHC5tZ210LnYxYWxwaGExLkpvYkhvb2tDb25maWcSDwoHZW5hYmxlZBgEIAEoCBIbCghwcmlvcml0eRgFIAEoDUIJukgGKgQYZCgAIogDCg1Kb2JIb29rQ29uZmlnEjYKA3NxbBgFIAEoCzInLm1nbXQudjFhbHBoYTEuSm9iSG9va0NvbmZpZy5Kb2JTcWxIb29rSAAalQIKCkpvYlNxbEhvb2sSFgoFcXVlcnkYASABKAlCB7pIBHICEAESHwoNY29ubmVjdGlvbl9pZBgCIAEoCUIIukgFcgOwAQESPgoGdGltaW5nGAMgASgLMi4ubWdtdC52MWFscGhhMS5Kb2JIb29rQ29uZmlnLkpvYlNxbEhvb2suVGltaW5nGo0BCgZUaW1pbmcSNwoIcHJlX3N5bmMYAyABKAsyIy5tZ210LnYxYWxwaGExLkpvYkhvb2tUaW1pbmdQcmVTeW5jSAASOQoJcG9zdF9zeW5jGAQgASgLMiQubWdtdC52MWFscGhhMS5Kb2JIb29rVGltaW5nUG9zdFN5bmNIAEIPCgZ0aW1pbmcSBbpIAggBQg8KBmNvbmZpZxIFukgCCAFKBAgBEAJKBAgCEANKBAgDEARKBAgEEAUiFgoUSm9iSG9va1RpbWluZ1ByZVN5bmMiFwoVSm9iSG9va1RpbWluZ1Bvc3RTeW5jIi4KEkdldEpvYkhvb2tzUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBIjwKE0dldEpvYkhvb2tzUmVzcG9uc2USJQoFaG9va3MYASADKAsyFi5tZ210LnYxYWxwaGExLkpvYkhvb2siKQoRR2V0Sm9iSG9va1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBIjoKEkdldEpvYkhvb2tSZXNwb25zZRIkCgRob29rGAEgASgLMhYubWdtdC52MWFscGhhMS5Kb2JIb29rIk8KFENyZWF0ZUpvYkhvb2tSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRInCgRob29rGAIgASgLMhkubWdtdC52MWFscGhhMS5OZXdKb2JIb29rIj0KFUNyZWF0ZUpvYkhvb2tSZXNwb25zZRIkCgRob29rGAEgASgLMhYubWdtdC52MWFscGhhMS5Kb2JIb29rIiwKFERlbGV0ZUpvYkhvb2tSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABASIXChVEZWxldGVKb2JIb29rUmVzcG9uc2UiPQodSXNKb2JIb29rTmFtZUF2YWlsYWJsZVJlcXVlc3QSDgoGam9iX2lkGAEgASgJEgwKBG5hbWUYAiABKAkiNgoeSXNKb2JIb29rTmFtZUF2YWlsYWJsZVJlc3BvbnNlEhQKDGlzX2F2YWlsYWJsZRgBIAEoCCLPAQoUVXBkYXRlSm9iSG9va1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEicKBG5hbWUYAiABKAlCGbpIFnIUMhJeW2EtejAtOS1dezMsMTAwfSQSHAoLZGVzY3JpcHRpb24YAyABKAlCB7pIBHICEAESLAoGY29uZmlnGAQgASgLMhwubWdtdC52MWFscGhhMS5Kb2JIb29rQ29uZmlnEg8KB2VuYWJsZWQYBSABKAgSGwoIcHJpb3JpdHkYBiABKA1CCbpIBioEGGQoACI9ChVVcGRhdGVKb2JIb29rUmVzcG9uc2USJAoEaG9vaxgBIAEoCzIWLm1nbXQudjFhbHBoYTEuSm9iSG9vayJBChhTZXRKb2JIb29rRW5hYmxlZFJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEg8KB2VuYWJsZWQYAiABKAgiQQoZU2V0Sm9iSG9va0VuYWJsZWRSZXNwb25zZRIkCgRob29rGAEgASgLMhYubWdtdC52MWFscGhhMS5Kb2JIb29rIs8BCiBHZXRBY3RpdmVKb2JIb29rc0J5VGltaW5nUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBEkYKBnRpbWluZxgCIAEoDjI2Lm1nbXQudjFhbHBoYTEuR2V0QWN0aXZlSm9iSG9va3NCeVRpbWluZ1JlcXVlc3QuVGltaW5nIkkKBlRpbWluZxIWChJUSU1JTkdfVU5TUEVDSUZJRUQQABISCg5USU1JTkdfUFJFU1lOQxABEhMKD1RJTUlOR19QT1NUU1lOQxACIkoKIUdldEFjdGl2ZUpvYkhvb2tzQnlUaW1pbmdSZXNwb25zZRIlCgVob29rcxgBIAMoCzIWLm1nbXQudjFhbHBoYTEuSm9iSG9vaypvCglKb2JTdGF0dXMSGgoWSk9CX1NUQVRVU19VTlNQRUNJRklFRBAAEhYKEkpPQl9TVEFUVVNfRU5BQkxFRBABEhUKEUpPQl9TVEFUVVNfUEFVU0VEEAMSFwoTSk9CX1NUQVRVU19ESVNBQkxFRBAEKqcBCg5BY3Rpdml0eVN0YXR1cxIfChtBQ1RJVklUWV9TVEFUVVNfVU5TUEVDSUZJRUQQABIdChlBQ1RJVklUWV9TVEFUVVNfU0NIRURVTEVEEAESGwoXQUNUSVZJVFlfU1RBVFVTX1NUQVJURUQQAhIcChhBQ1RJVklUWV9TVEFUVVNfQ0FOQ0VMRUQQAxIaChZBQ1RJVklUWV9TVEFUVVNfRkFJTEVEEAQqkgIKDEpvYlJ1blN0YXR1cxIeChpKT0JfUlVOX1NUQVRVU19VTlNQRUNJRklFRBAAEhoKFkpPQl9SVU5fU1RBVFVTX1BFTkRJTkcQARIaChZKT0JfUlVOX1NUQVRVU19SVU5OSU5HEAISGwoXSk9CX1JVTl9TVEFUVVNfQ09NUExFVEUQAxIYChRKT0JfUlVOX1NUQVRVU19FUlJPUhAEEhsKF0pPQl9SVU5fU1RBVFVTX0NBTkNFTEVEEAUSHQoZSk9CX1JVTl9TVEFUVVNfVEVSTUlOQVRFRBAGEhkKFUpPQl9SVU5fU1RBVFVTX0ZBSUxFRBAHEhwKGEpPQl9SVU5fU1RBVFVTX1RJTUVEX09VVBAIKnwKCUxvZ1dpbmRvdxIiCh5MT0dfV0lORE9XX05PX1RJTUVfVU5TUEVDSUZJRUQQABIaChZMT0dfV0lORE9XX0ZJRlRFRU5fTUlOEAESFwoTTE9HX1dJTkRPV19PTkVfSE9VUhACEhYKEkxPR19XSU5ET1dfT05FX0RBWRADKncKCExvZ0xldmVsEhkKFUxPR19MRVZFTF9VTlNQRUNJRklFRBAAEhMKD0xPR19MRVZFTF9ERUJVRxABEhIKDkxPR19MRVZFTF9JTkZPEAISEgoOTE9HX0xFVkVMX1dBUk4QAxITCg9MT0dfTEVWRUxfRVJST1IQBDK3IAoKSm9iU2VydmljZRJNCgdHZXRKb2JzEh0ubWdtdC52MWFscGhhMS5HZXRKb2JzUmVxdWVzdBoeLm1nbXQudjFhbHBoYTEuR2V0Sm9ic1Jlc3BvbnNlIgOQAgESSgoGR2V0Sm9iEhwubWdtdC52MWFscGhhMS5HZXRKb2JSZXF1ZXN0Gh0ubWdtdC52MWFscGhhMS5HZXRKb2JSZXNwb25zZSIDkAIBElAKCUNyZWF0ZUpvYhIfLm1nbXQudjFhbHBoYTEuQ3JlYXRlSm9iUmVxdWVzdBogLm1nbXQudjFhbHBoYTEuQ3JlYXRlSm9iUmVzcG9uc2UiABJQCglEZWxldGVKb2ISHy5tZ210LnYxYWxwaGExLkRlbGV0ZUpvYlJlcXVlc3QaIC5tZ210LnYxYWxwaGExLkRlbGV0ZUpvYlJlc3BvbnNlIgASbgoSSXNKb2JOYW1lQXZhaWxhYmxlEigubWdtdC52MWFscGhhMS5Jc0pvYk5hbWVBdmFpbGFibGVSZXF1ZXN0GikubWdtdC52MWFscGhhMS5Jc0pvYk5hbWVBdmFpbGFibGVSZXNwb25zZSIDkAIBEmgKEVVwZGF0ZUpvYlNjaGVkdWxlEicubWdtdC52MWFscGhhMS5VcGRhdGVKb2JTY2hlZHVsZVJlcXVlc3QaKC5tZ210LnYxYWxwaGExLlVwZGF0ZUpvYlNjaGVkdWxlUmVzcG9uc2UiABKAAQoZVXBkYXRlSm9iU291cmNlQ29ubmVjdGlvbhIvLm1nbXQudjFhbHBoYTEuVXBkYXRlSm9iU291cmNlQ29ubmVjdGlvblJlcXVlc3QaMC5tZ210LnYxYWxwaGExLlVwZGF0ZUpvYlNvdXJjZUNvbm5lY3Rpb25SZXNwb25zZSIAEpUBCiBTZXRKb2JTb3VyY2VTcWxDb25uZWN0aW9uU3Vic2V0cxI2Lm1nbXQudjFhbHBoYTEuU2V0Sm9iU291cmNlU3FsQ29ubmVjdGlvblN1YnNldHNSZXF1ZXN0GjcubWdtdC52MWFscGhhMS5TZXRKb2JTb3VyY2VTcWxDb25uZWN0aW9uU3Vic2V0c1Jlc3BvbnNlIgASjwEKHlVwZGF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvbhI0Lm1nbXQudjFhbHBoYTEuVXBkYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uUmVxdWVzdBo1Lm1nbXQudjFhbHBoYTEuVXBkYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uUmVzcG9uc2UiABKPAQoeRGVsZXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uEjQubWdtdC52MWFscGhhMS5EZWxldGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXF1ZXN0GjUubWdtdC52MWFscGhhMS5EZWxldGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXNwb25zZSIAEpIBCh9DcmVhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25zEjUubWdtdC52MWFscGhhMS5DcmVhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25zUmVxdWVzdBo2Lm1nbXQudjFhbHBoYTEuQ3JlYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uc1Jlc3BvbnNlIgASTQoIUGF1c2VKb2ISHi5tZ210LnYxYWxwaGExLlBhdXNlSm9iUmVxdWVzdBofLm1nbXQudjFhbHBoYTEuUGF1c2VKb2JSZXNwb25zZSIAEmgKEEdldEpvYlJlY2VudFJ1bnMSJi5tZ210LnYxYWxwaGExLkdldEpvYlJlY2VudFJ1bnNSZXF1ZXN0GicubWdtdC52MWFscGhhMS5HZXRKb2JSZWNlbnRSdW5zUmVzcG9uc2UiA5ACARJiCg5HZXRKb2JOZXh0UnVucxIkLm1nbXQudjFhbHBoYTEuR2V0Sm9iTmV4dFJ1bnNSZXF1ZXN0GiUubWdtdC52MWFscGhhMS5HZXRKb2JOZXh0UnVuc1Jlc3BvbnNlIgOQAgESXAoMR2V0Sm9iU3RhdHVzEiIubWdtdC52MWFscGhhMS5HZXRKb2JTdGF0dXNSZXF1ZXN0GiMubWdtdC52MWFscGhhMS5HZXRKb2JTdGF0dXNSZXNwb25zZSIDkAIBEmIKDkdldEpvYlN0YXR1c2VzEiQubWdtdC52MWFscGhhMS5HZXRKb2JTdGF0dXNlc1JlcXVlc3QaJS5tZ210LnYxYWxwaGExLkdldEpvYlN0YXR1c2VzUmVzcG9uc2UiA5ACARJWCgpHZXRKb2JSdW5zEiAubWdtdC52MWFscGhhMS5HZXRKb2JSdW5zUmVxdWVzdBohLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuc1Jlc3BvbnNlIgOQAgESZQoPR2V0Sm9iUnVuRXZlbnRzEiUubWdtdC52MWFscGhhMS5HZXRKb2JSdW5FdmVudHNSZXF1ZXN0GiYubWdtdC52MWFscGhhMS5HZXRKb2JSdW5FdmVudHNSZXNwb25zZSIDkAIBElMKCUdldEpvYlJ1bhIfLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuUmVxdWVzdBogLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuUmVzcG9uc2UiA5ACARJZCgxEZWxldGVKb2JSdW4SIi5tZ210LnYxYWxwaGExLkRlbGV0ZUpvYlJ1blJlcXVlc3QaIy5tZ210LnYxYWxwaGExLkRlbGV0ZUpvYlJ1blJlc3BvbnNlIgASWQoMQ3JlYXRlSm9iUnVuEiIubWdtdC52MWFscGhhMS5DcmVhdGVKb2JSdW5SZXF1ZXN0GiMubWdtdC52MWFscGhhMS5DcmVhdGVKb2JSdW5SZXNwb25zZSIAElkKDENhbmNlbEpvYlJ1bhIiLm1nbXQudjFhbHBoYTEuQ2FuY2VsSm9iUnVuUmVxdWVzdBojLm1nbXQudjFhbHBoYTEuQ2FuY2VsSm9iUnVuUmVzcG9uc2UiABJiCg9UZXJtaW5hdGVKb2JSdW4SJS5tZ210LnYxYWxwaGExLlRlcm1pbmF0ZUpvYlJ1blJlcXVlc3QaJi5tZ210LnYxYWxwaGExLlRlcm1pbmF0ZUpvYlJ1blJlc3BvbnNlIgAScAoTR2V0Sm9iUnVuTG9nc1N0cmVhbRIpLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1N0cmVhbVJlcXVlc3QaKi5tZ210LnYxYWxwaGExLkdldEpvYlJ1bkxvZ3NTdHJlYW1SZXNwb25zZSIAMAESXAoNR2V0Sm9iUnVuTG9ncxIjLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1JlcXVlc3QaJC5tZ210LnYxYWxwaGExLkdldEpvYlJ1bkxvZ3NSZXNwb25zZSIAEnQKFVNldEpvYldvcmtmbG93T3B0aW9ucxIrLm1nbXQudjFhbHBoYTEuU2V0Sm9iV29ya2Zsb3dPcHRpb25zUmVxdWVzdBosLm1nbXQudjFhbHBoYTEuU2V0Sm9iV29ya2Zsb3dPcHRpb25zUmVzcG9uc2UiABJoChFTZXRKb2JTeW5jT3B0aW9ucxInLm1nbXQudjFhbHBoYTEuU2V0Sm9iU3luY09wdGlvbnNSZXF1ZXN0GigubWdtdC52MWFscGhhMS5TZXRKb2JTeW5jT3B0aW9uc1Jlc3BvbnNlIgASbgoTVmFsaWRhdGVKb2JNYXBwaW5ncxIpLm1nbXQudjFhbHBoYTEuVmFsaWRhdGVKb2JNYXBwaW5nc1JlcXVlc3QaKi5tZ210LnYxYWxwaGExLlZhbGlkYXRlSm9iTWFwcGluZ3NSZXNwb25zZSIAEl8KDlZhbGlkYXRlU2NoZW1hEiQubWdtdC52MWFscGhhMS5WYWxpZGF0ZVNjaGVtYVJlcXVlc3QaJS5tZ210LnYxYWxwaGExLlZhbGlkYXRlU2NoZW1hUmVzcG9uc2UiABJcCg1HZXRSdW5Db250ZXh0EiMubWdtdC52MWFscGhhMS5HZXRSdW5Db250ZXh0UmVxdWVzdBokLm1nbXQudjFhbHBoYTEuR2V0UnVuQ29udGV4dFJlc3BvbnNlIgASXAoNU2V0UnVuQ29udGV4dBIjLm1nbXQudjFhbHBoYTEuU2V0UnVuQ29udGV4dFJlcXVlc3QaJC5tZ210LnYxYWxwaGExLlNldFJ1bkNvbnRleHRSZXNwb25zZSIAEmEKDlNldFJ1bkNvbnRleHRzEiQubWdtdC52MWFscGhhMS5TZXRSdW5Db250ZXh0c1JlcXVlc3QaJS5tZ210LnYxYWxwaGExLlNldFJ1bkNvbnRleHRzUmVzcG9uc2UiACgBElkKC0dldEpvYkhvb2tzEiEubWdtdC52MWFscGhhMS5HZXRKb2JIb29rc1JlcXVlc3QaIi5tZ210LnYxYWxwaGExLkdldEpvYkhvb2tzUmVzcG9uc2UiA5ACARJWCgpHZXRKb2JIb29rEiAubWdtdC52MWFscGhhMS5HZXRKb2JIb29rUmVxdWVzdBohLm1nbXQudjFhbHBoYTEuR2V0Sm9iSG9va1Jlc3BvbnNlIgOQAgESXAoNQ3JlYXRlSm9iSG9vaxIjLm1nbXQudjFhbHBoYTEuQ3JlYXRlSm9iSG9va1JlcXVlc3QaJC5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYkhvb2tSZXNwb25zZSIAElwKDURlbGV0ZUpvYkhvb2sSIy5tZ210LnYxYWxwaGExLkRlbGV0ZUpvYkhvb2tSZXF1ZXN0GiQubWdtdC52MWFscGhhMS5EZWxldGVKb2JIb29rUmVzcG9uc2UiABJ3ChZJc0pvYkhvb2tOYW1lQXZhaWxhYmxlEiwubWdtdC52MWFscGhhMS5Jc0pvYkhvb2tOYW1lQXZhaWxhYmxlUmVxdWVzdBotLm1nbXQudjFhbHBoYTEuSXNKb2JIb29rTmFtZUF2YWlsYWJsZVJlc3BvbnNlIgASXAoNVXBkYXRlSm9iSG9vaxIjLm1nbXQudjFhbHBoYTEuVXBkYXRlSm9iSG9va1JlcXVlc3QaJC5tZ210LnYxYWxwaGExLlVwZGF0ZUpvYkhvb2tSZXNwb25zZSIAEmgKEVNldEpvYkhvb2tFbmFibGVkEicubWdtdC52MWFscGhhMS5TZXRKb2JIb29rRW5hYmxlZFJlcXVlc3QaKC5tZ210LnYxYWxwaGExLlNldEpvYkhvb2tFbmFibGVkUmVzcG9uc2UiABKDAQoZR2V0QWN0aXZlSm9iSG9va3NCeVRpbWluZxIvLm1nbXQudjFhbHBoYTEuR2V0QWN0aXZlSm9iSG9va3NCeVRpbWluZ1JlcXVlc3QaMC5tZ210LnYxYWxwaGExLkdldEFjdGl2ZUpvYkhvb2tzQnlUaW1pbmdSZXNwb25zZSIDkAIBQsQBChFjb20ubWdtdC52MWFscGhhMUIISm9iUHJvdG9QAVpQZ2l0aHViLmNvbS9udWNsZXVzY2xvdWQvbmVvc3luYy9iYWNrZW5kL2dlbi9nby9wcm90b3MvbWdtdC92MWFscGhhMTttZ210djFhbHBoYTGiAgNNWFiqAg1NZ210LlYxYWxwaGExygINTWdtdFxWMWFscGhhMeICGU1nbXRcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5NZ210OjpWMWFscGhhMWIGcHJvdG8z", [file_buf_validate_validate, file_google_protobuf_timestamp, file_mgmt_v1alpha1_connection_data, file_mgmt_v1alpha1_transformer]); + fileDesc("ChdtZ210L3YxYWxwaGExL2pvYi5wcm90bxINbWdtdC52MWFscGhhMSIuCg5HZXRKb2JzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABASIzCg9HZXRKb2JzUmVzcG9uc2USIAoEam9icxgBIAMoCzISLm1nbXQudjFhbHBoYTEuSm9iIkUKCUpvYlNvdXJjZRI4CgdvcHRpb25zGAEgASgLMh8ubWdtdC52MWFscGhhMS5Kb2JTb3VyY2VPcHRpb25zQga6SAPIAQEioQQKEEpvYlNvdXJjZU9wdGlvbnMSQgoIcG9zdGdyZXMYASABKAsyLi5tZ210LnYxYWxwaGExLlBvc3RncmVzU291cmNlQ29ubmVjdGlvbk9wdGlvbnNIABI9CgZhd3NfczMYAiABKAsyKy5tZ210LnYxYWxwaGExLkF3c1MzU291cmNlQ29ubmVjdGlvbk9wdGlvbnNIABI8CgVteXNxbBgDIAEoCzIrLm1nbXQudjFhbHBoYTEuTXlzcWxTb3VyY2VDb25uZWN0aW9uT3B0aW9uc0gAEjgKCGdlbmVyYXRlGAQgASgLMiQubWdtdC52MWFscGhhMS5HZW5lcmF0ZVNvdXJjZU9wdGlvbnNIABI9CgthaV9nZW5lcmF0ZRgFIAEoCzImLm1nbXQudjFhbHBoYTEuQWlHZW5lcmF0ZVNvdXJjZU9wdGlvbnNIABJACgdtb25nb2RiGAYgASgLMi0ubWdtdC52MWFscGhhMS5Nb25nb0RCU291cmNlQ29ubmVjdGlvbk9wdGlvbnNIABJCCghkeW5hbW9kYhgHIAEoCzIuLm1nbXQudjFhbHBoYTEuRHluYW1vREJTb3VyY2VDb25uZWN0aW9uT3B0aW9uc0gAEjwKBW1zc3FsGAggASgLMisubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zSABCDwoGY29uZmlnEgW6SAIIASJuChRDcmVhdGVKb2JEZXN0aW5hdGlvbhIfCg1jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABARI1CgdvcHRpb25zGAIgASgLMiQubWdtdC52MWFscGhhMS5Kb2JEZXN0aW5hdGlvbk9wdGlvbnMidAoOSm9iRGVzdGluYXRpb24SHwoNY29ubmVjdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESNQoHb3B0aW9ucxgCIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iRGVzdGluYXRpb25PcHRpb25zEgoKAmlkGAMgASgJIt0CChdBaUdlbmVyYXRlU291cmNlT3B0aW9ucxIiChBhaV9jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABARJGCgdzY2hlbWFzGAIgAygLMisubWdtdC52MWFscGhhMS5BaUdlbmVyYXRlU291cmNlU2NoZW1hT3B0aW9uQgi6SAWSAQIIARIuChdma19zb3VyY2VfY29ubmVjdGlvbl9pZBgDIAEoCUIIukgFcgOwAQFIAIgBARIbCgptb2RlbF9uYW1lGAQgASgJQge6SARyAhABEhgKC3VzZXJfcHJvbXB0GAUgASgJSAGIAQESKwoTZ2VuZXJhdGVfYmF0Y2hfc2l6ZRgGIAEoA0IJukgGIgQYZCgBSAKIAQFCGgoYX2ZrX3NvdXJjZV9jb25uZWN0aW9uX2lkQg4KDF91c2VyX3Byb21wdEIWChRfZ2VuZXJhdGVfYmF0Y2hfc2l6ZSJ9ChxBaUdlbmVyYXRlU291cmNlU2NoZW1hT3B0aW9uEhcKBnNjaGVtYRgBIAEoCUIHukgEcgIQARJECgZ0YWJsZXMYAiADKAsyKi5tZ210LnYxYWxwaGExLkFpR2VuZXJhdGVTb3VyY2VUYWJsZU9wdGlvbkIIukgFkgECCAEiVAobQWlHZW5lcmF0ZVNvdXJjZVRhYmxlT3B0aW9uEhYKBXRhYmxlGAEgASgJQge6SARyAhABEh0KCXJvd19jb3VudBgCIAEoA0IKukgHIgUY6AcoASKvAQoVR2VuZXJhdGVTb3VyY2VPcHRpb25zEkQKB3NjaGVtYXMYASADKAsyKS5tZ210LnYxYWxwaGExLkdlbmVyYXRlU291cmNlU2NoZW1hT3B0aW9uQgi6SAWSAQIIARIuChdma19zb3VyY2VfY29ubmVjdGlvbl9pZBgDIAEoCUIIukgFcgOwAQFIAIgBAUIaChhfZmtfc291cmNlX2Nvbm5lY3Rpb25faWRKBAgCEAMieQoaR2VuZXJhdGVTb3VyY2VTY2hlbWFPcHRpb24SFwoGc2NoZW1hGAEgASgJQge6SARyAhABEkIKBnRhYmxlcxgCIAMoCzIoLm1nbXQudjFhbHBoYTEuR2VuZXJhdGVTb3VyY2VUYWJsZU9wdGlvbkIIukgFkgECCAEiTwoZR2VuZXJhdGVTb3VyY2VUYWJsZU9wdGlvbhIWCgV0YWJsZRgBIAEoCUIHukgEcgIQARIaCglyb3dfY291bnQYAiABKANCB7pIBCICKAEiQQoeTW9uZ29EQlNvdXJjZUNvbm5lY3Rpb25PcHRpb25zEh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBIu8BCh9EeW5hbW9EQlNvdXJjZUNvbm5lY3Rpb25PcHRpb25zEh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBEjgKBnRhYmxlcxgCIAMoCzIoLm1nbXQudjFhbHBoYTEuRHluYW1vREJTb3VyY2VUYWJsZU9wdGlvbhJRChN1bm1hcHBlZF90cmFuc2Zvcm1zGAMgASgLMjQubWdtdC52MWFscGhhMS5EeW5hbW9EQlNvdXJjZVVubWFwcGVkVHJhbnNmb3JtQ29uZmlnEh4KFmVuYWJsZV9jb25zaXN0ZW50X3JlYWQYBCABKAgi/QEKJUR5bmFtb0RCU291cmNlVW5tYXBwZWRUcmFuc2Zvcm1Db25maWcSLwoBYhgBIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZ1RyYW5zZm9ybWVyEjUKB2Jvb2xlYW4YAiABKAsyJC5tZ210LnYxYWxwaGExLkpvYk1hcHBpbmdUcmFuc2Zvcm1lchIvCgFuGAQgASgLMiQubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nVHJhbnNmb3JtZXISLwoBcxgGIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZ1RyYW5zZm9ybWVySgQIAxAESgQIBRAGIl8KGUR5bmFtb0RCU291cmNlVGFibGVPcHRpb24SFgoFdGFibGUYASABKAlCB7pIBHICEAESGQoMd2hlcmVfY2xhdXNlGAIgASgJSACIAQFCDwoNX3doZXJlX2NsYXVzZSKeBwofUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucxI6CgdzY2hlbWFzGAIgAygLMikubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZVNjaGVtYU9wdGlvbhIfCg1jb25uZWN0aW9uX2lkGAMgASgJQgi6SAVyA7ABARIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYBCABKAgSbgocbmV3X2NvbHVtbl9hZGRpdGlvbl9zdHJhdGVneRgFIAEoCzJILm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5EmUKF2NvbHVtbl9yZW1vdmFsX3N0cmF0ZWd5GAYgASgLMkQubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneRqJAgoZTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneRJkCghoYWx0X2pvYhgBIAEoCzJQLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5LkhhbHRKb2JIABJkCghhdXRvX21hcBgCIAEoCzJQLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5LkF1dG9NYXBIABoJCgdIYWx0Sm9iGgkKB0F1dG9NYXBCCgoIc3RyYXRlZ3kaiQIKFUNvbHVtblJlbW92YWxTdHJhdGVneRJgCghoYWx0X2pvYhgBIAEoCzJMLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5Db2x1bW5SZW1vdmFsU3RyYXRlZ3kuSGFsdEpvYkgAEmgKDGNvbnRpbnVlX2pvYhgCIAEoCzJQLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5Db2x1bW5SZW1vdmFsU3RyYXRlZ3kuQ29udGludWVKb2JIABoJCgdIYWx0Sm9iGg0KC0NvbnRpbnVlSm9iQgoKCHN0cmF0ZWd5SgQIARACInkKGlBvc3RncmVzU291cmNlU2NoZW1hT3B0aW9uEhcKBnNjaGVtYRgBIAEoCUIHukgEcgIQARJCCgZ0YWJsZXMYAiADKAsyKC5tZ210LnYxYWxwaGExLlBvc3RncmVzU291cmNlVGFibGVPcHRpb25CCLpIBZIBAggBIl8KGVBvc3RncmVzU291cmNlVGFibGVPcHRpb24SFgoFdGFibGUYASABKAlCB7pIBHICEAESGQoMd2hlcmVfY2xhdXNlGAIgASgJSACIAQFCDwoNX3doZXJlX2NsYXVzZSKyBAocTXlzcWxTb3VyY2VDb25uZWN0aW9uT3B0aW9ucxIjChtoYWx0X29uX25ld19jb2x1bW5fYWRkaXRpb24YASABKAgSNwoHc2NoZW1hcxgCIAMoCzImLm1nbXQudjFhbHBoYTEuTXlzcWxTb3VyY2VTY2hlbWFPcHRpb24SHwoNY29ubmVjdGlvbl9pZBgDIAEoCUIIukgFcgOwAQESKQohc3Vic2V0X2J5X2ZvcmVpZ25fa2V5X2NvbnN0cmFpbnRzGAQgASgIEmIKF2NvbHVtbl9yZW1vdmFsX3N0cmF0ZWd5GAUgASgLMkEubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneRqDAgoVQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5El0KCGhhbHRfam9iGAEgASgLMkkubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5IYWx0Sm9iSAASZQoMY29udGludWVfam9iGAIgASgLMk0ubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5Db250aW51ZUpvYkgAGgkKB0hhbHRKb2IaDQoLQ29udGludWVKb2JCCgoIc3RyYXRlZ3kicwoXTXlzcWxTb3VyY2VTY2hlbWFPcHRpb24SFwoGc2NoZW1hGAEgASgJQge6SARyAhABEj8KBnRhYmxlcxgCIAMoCzIlLm1nbXQudjFhbHBoYTEuTXlzcWxTb3VyY2VUYWJsZU9wdGlvbkIIukgFkgECCAEiXAoWTXlzcWxTb3VyY2VUYWJsZU9wdGlvbhIWCgV0YWJsZRgBIAEoCUIHukgEcgIQARIZCgx3aGVyZV9jbGF1c2UYAiABKAlIAIgBAUIPCg1fd2hlcmVfY2xhdXNlIrIEChxNc3NxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zEiMKG2hhbHRfb25fbmV3X2NvbHVtbl9hZGRpdGlvbhgBIAEoCBI3CgdzY2hlbWFzGAIgAygLMiYubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZVNjaGVtYU9wdGlvbhIfCg1jb25uZWN0aW9uX2lkGAMgASgJQgi6SAVyA7ABARIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYBCABKAgSYgoXY29sdW1uX3JlbW92YWxfc3RyYXRlZ3kYBSABKAsyQS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5GoMCChVDb2x1bW5SZW1vdmFsU3RyYXRlZ3kSXQoIaGFsdF9qb2IYASABKAsySS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5LkhhbHRKb2JIABJlCgxjb250aW51ZV9qb2IYAiABKAsyTS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5LkNvbnRpbnVlSm9iSAAaCQoHSGFsdEpvYhoNCgtDb250aW51ZUpvYkIKCghzdHJhdGVneSJzChdNc3NxbFNvdXJjZVNjaGVtYU9wdGlvbhIXCgZzY2hlbWEYASABKAlCB7pIBHICEAESPwoGdGFibGVzGAIgAygLMiUubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZVRhYmxlT3B0aW9uQgi6SAWSAQIIASJcChZNc3NxbFNvdXJjZVRhYmxlT3B0aW9uEhYKBXRhYmxlGAEgASgJQge6SARyAhABEhkKDHdoZXJlX2NsYXVzZRgCIAEoCUgAiAEBQg8KDV93aGVyZV9jbGF1c2UiPwocQXdzUzNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucxIfCg1jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABASLbBAoVSm9iRGVzdGluYXRpb25PcHRpb25zEk8KEHBvc3RncmVzX29wdGlvbnMYASABKAsyMy5tZ210LnYxYWxwaGExLlBvc3RncmVzRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9uc0gAEkoKDmF3c19zM19vcHRpb25zGAIgASgLMjAubWdtdC52MWFscGhhMS5Bd3NTM0Rlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnNIABJJCg1teXNxbF9vcHRpb25zGAMgASgLMjAubWdtdC52MWFscGhhMS5NeXNxbERlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnNIABJNCg9tb25nb2RiX29wdGlvbnMYBCABKAsyMi5tZ210LnYxYWxwaGExLk1vbmdvREJEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSAASXgoYZ2NwX2Nsb3Vkc3RvcmFnZV9vcHRpb25zGAUgASgLMjoubWdtdC52MWFscGhhMS5HY3BDbG91ZFN0b3JhZ2VEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSAASTwoQZHluYW1vZGJfb3B0aW9ucxgGIAEoCzIzLm1nbXQudjFhbHBoYTEuRHluYW1vREJEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSAASSQoNbXNzcWxfb3B0aW9ucxgHIAEoCzIwLm1nbXQudjFhbHBoYTEuTXNzcWxEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSABCDwoGY29uZmlnEgW6SAIIASIlCiNNb25nb0RCRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucyItCitHY3BDbG91ZFN0b3JhZ2VEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zIm4KJER5bmFtb0RCRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucxJGCg50YWJsZV9tYXBwaW5ncxgBIAMoCzIuLm1nbXQudjFhbHBoYTEuRHluYW1vREJEZXN0aW5hdGlvblRhYmxlTWFwcGluZyJSCh9EeW5hbW9EQkRlc3RpbmF0aW9uVGFibGVNYXBwaW5nEhQKDHNvdXJjZV90YWJsZRgBIAEoCRIZChFkZXN0aW5hdGlvbl90YWJsZRgCIAEoCSLKAgokUG9zdGdyZXNEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zEkIKDnRydW5jYXRlX3RhYmxlGAEgASgLMioubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1RydW5jYXRlVGFibGVDb25maWcSGQoRaW5pdF90YWJsZV9zY2hlbWEYAiABKAgSPAoLb25fY29uZmxpY3QYAyABKAsyJy5tZ210LnYxYWxwaGExLlBvc3RncmVzT25Db25mbGljdENvbmZpZxIjChtza2lwX2ZvcmVpZ25fa2V5X3Zpb2xhdGlvbnMYBCABKAgSKQoFYmF0Y2gYBSABKAsyGi5tZ210LnYxYWxwaGExLkJhdGNoQ29uZmlnEiMKDW1heF9pbl9mbGlnaHQYBiABKA1CB7pIBCoCKAFIAIgBAUIQCg5fbWF4X2luX2ZsaWdodCKsAgoYUG9zdGdyZXNPbkNvbmZsaWN0Q29uZmlnEhYKCmRvX25vdGhpbmcYASABKAhCAhgBElYKB25vdGhpbmcYAiABKAsyQy5tZ210LnYxYWxwaGExLlBvc3RncmVzT25Db25mbGljdENvbmZpZy5Qb3N0Z3Jlc09uQ29uZmxpY3REb05vdGhpbmdIABJSCgZ1cGRhdGUYAyABKAsyQC5tZ210LnYxYWxwaGExLlBvc3RncmVzT25Db25mbGljdENvbmZpZy5Qb3N0Z3Jlc09uQ29uZmxpY3RVcGRhdGVIABodChtQb3N0Z3Jlc09uQ29uZmxpY3REb05vdGhpbmcaGgoYUG9zdGdyZXNPbkNvbmZsaWN0VXBkYXRlQhEKCHN0cmF0ZWd5EgW6SAIIACJOChtQb3N0Z3Jlc1RydW5jYXRlVGFibGVDb25maWcSHgoWdHJ1bmNhdGVfYmVmb3JlX2luc2VydBgBIAEoCBIPCgdjYXNjYWRlGAIgASgIIsECCiFNeXNxbERlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMSPwoOdHJ1bmNhdGVfdGFibGUYASABKAsyJy5tZ210LnYxYWxwaGExLk15c3FsVHJ1bmNhdGVUYWJsZUNvbmZpZxIZChFpbml0X3RhYmxlX3NjaGVtYRgCIAEoCBI5Cgtvbl9jb25mbGljdBgDIAEoCzIkLm1nbXQudjFhbHBoYTEuTXlzcWxPbkNvbmZsaWN0Q29uZmlnEiMKG3NraXBfZm9yZWlnbl9rZXlfdmlvbGF0aW9ucxgEIAEoCBIpCgViYXRjaBgFIAEoCzIaLm1nbXQudjFhbHBoYTEuQmF0Y2hDb25maWcSIwoNbWF4X2luX2ZsaWdodBgGIAEoDUIHukgEKgIoAUgAiAEBQhAKDl9tYXhfaW5fZmxpZ2h0IjoKGE15c3FsVHJ1bmNhdGVUYWJsZUNvbmZpZxIeChZ0cnVuY2F0ZV9iZWZvcmVfaW5zZXJ0GAEgASgIIpMCChVNeXNxbE9uQ29uZmxpY3RDb25maWcSEgoKZG9fbm90aGluZxgBIAEoCBJQCgdub3RoaW5nGAIgASgLMj0ubWdtdC52MWFscGhhMS5NeXNxbE9uQ29uZmxpY3RDb25maWcuTXlzcWxPbkNvbmZsaWN0RG9Ob3RoaW5nSAASTAoGdXBkYXRlGAMgASgLMjoubWdtdC52MWFscGhhMS5NeXNxbE9uQ29uZmxpY3RDb25maWcuTXlzcWxPbkNvbmZsaWN0VXBkYXRlSAAaGgoYTXlzcWxPbkNvbmZsaWN0RG9Ob3RoaW5nGhcKFU15c3FsT25Db25mbGljdFVwZGF0ZUIRCghzdHJhdGVneRIFukgCCAAiwQIKIU1zc3FsRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucxI/Cg50cnVuY2F0ZV90YWJsZRgBIAEoCzInLm1nbXQudjFhbHBoYTEuTXNzcWxUcnVuY2F0ZVRhYmxlQ29uZmlnEhkKEWluaXRfdGFibGVfc2NoZW1hGAIgASgIEjkKC29uX2NvbmZsaWN0GAMgASgLMiQubWdtdC52MWFscGhhMS5Nc3NxbE9uQ29uZmxpY3RDb25maWcSIwobc2tpcF9mb3JlaWduX2tleV92aW9sYXRpb25zGAQgASgIEikKBWJhdGNoGAUgASgLMhoubWdtdC52MWFscGhhMS5CYXRjaENvbmZpZxIjCg1tYXhfaW5fZmxpZ2h0GAYgASgNQge6SAQqAigBSACIAQFCEAoOX21heF9pbl9mbGlnaHQiOgoYTXNzcWxUcnVuY2F0ZVRhYmxlQ29uZmlnEh4KFnRydW5jYXRlX2JlZm9yZV9pbnNlcnQYASABKAgiKwoVTXNzcWxPbkNvbmZsaWN0Q29uZmlnEhIKCmRvX25vdGhpbmcYASABKAgijgQKIUF3c1MzRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucxJUCg1zdG9yYWdlX2NsYXNzGAEgASgOMj0ubWdtdC52MWFscGhhMS5Bd3NTM0Rlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMuU3RvcmFnZUNsYXNzEiMKDW1heF9pbl9mbGlnaHQYAiABKA1CB7pIBCoCKAFIAIgBARIUCgd0aW1lb3V0GAMgASgJSAGIAQESKQoFYmF0Y2gYBCABKAsyGi5tZ210LnYxYWxwaGExLkJhdGNoQ29uZmlnIo4CCgxTdG9yYWdlQ2xhc3MSHQoZU1RPUkFHRV9DTEFTU19VTlNQRUNJRklFRBAAEhoKFlNUT1JBR0VfQ0xBU1NfU1RBTkRBUkQQARIkCiBTVE9SQUdFX0NMQVNTX1JFRFVDRURfUkVEVU5EQU5DWRACEhkKFVNUT1JBR0VfQ0xBU1NfR0xBQ0lFUhADEh0KGVNUT1JBR0VfQ0xBU1NfU1RBTkRBUkRfSUEQBBIcChhTVE9SQUdFX0NMQVNTX09ORVpPTkVfSUEQBRIlCiFTVE9SQUdFX0NMQVNTX0lOVEVMTElHRU5UX1RJRVJJTkcQBhIeChpTVE9SQUdFX0NMQVNTX0RFRVBfQVJDSElWRRAHQhAKDl9tYXhfaW5fZmxpZ2h0QgoKCF90aW1lb3V0IksKC0JhdGNoQ29uZmlnEhIKBWNvdW50GAEgASgNSACIAQESEwoGcGVyaW9kGAIgASgJSAGIAQFCCAoGX2NvdW50QgkKB19wZXJpb2QiggQKEENyZWF0ZUpvYlJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESKwoIam9iX25hbWUYAiABKAlCGbpIFnIUMhJeW2EtejAtOS1dezMsMTAwfSQSGgoNY3Jvbl9zY2hlZHVsZRgDIAEoCUgAiAEBEjUKCG1hcHBpbmdzGAQgAygLMhkubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nQgi6SAWSAQIIARIoCgZzb3VyY2UYBSABKAsyGC5tZ210LnYxYWxwaGExLkpvYlNvdXJjZRJDCgxkZXN0aW5hdGlvbnMYBiADKAsyIy5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYkRlc3RpbmF0aW9uQgi6SAWSAQIIARIYChBpbml0aWF0ZV9qb2JfcnVuGAcgASgIEjgKEHdvcmtmbG93X29wdGlvbnMYCCABKAsyHi5tZ210LnYxYWxwaGExLldvcmtmbG93T3B0aW9ucxI0CgxzeW5jX29wdGlvbnMYCSABKAsyHi5tZ210LnYxYWxwaGExLkFjdGl2aXR5T3B0aW9ucxJFChR2aXJ0dWFsX2ZvcmVpZ25fa2V5cxgKIAMoCzInLm1nbXQudjFhbHBoYTEuVmlydHVhbEZvcmVpZ25Db25zdHJhaW50QhAKDl9jcm9uX3NjaGVkdWxlImUKD1dvcmtmbG93T3B0aW9ucxIYCgtydW5fdGltZW91dBgIIAEoA0gAiAEBQg4KDF9ydW5fdGltZW91dEoECAEQAkoECAIQA0oECAMQBEoECAQQBUoECAUQBkoECAYQB0oECAcQCCLbAQoPQWN0aXZpdHlPcHRpb25zEi8KGXNjaGVkdWxlX3RvX2Nsb3NlX3RpbWVvdXQYASABKANCB7pIBCICKAFIAIgBARIsChZzdGFydF90b19jbG9zZV90aW1lb3V0GAIgASgDQge6SAQiAigBSAGIAQESMAoMcmV0cnlfcG9saWN5GAMgASgLMhoubWdtdC52MWFscGhhMS5SZXRyeVBvbGljeUIcChpfc2NoZWR1bGVfdG9fY2xvc2VfdGltZW91dEIZChdfc3RhcnRfdG9fY2xvc2VfdGltZW91dCJKCgtSZXRyeVBvbGljeRImChBtYXhpbXVtX2F0dGVtcHRzGAEgASgFQge6SAQaAigASACIAQFCEwoRX21heGltdW1fYXR0ZW1wdHMiNAoRQ3JlYXRlSm9iUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IiTwoVSm9iTWFwcGluZ1RyYW5zZm9ybWVyEjAKBmNvbmZpZxgDIAEoCzIgLm1nbXQudjFhbHBoYTEuVHJhbnNmb3JtZXJDb25maWdKBAgBEAIikQEKCkpvYk1hcHBpbmcSFwoGc2NoZW1hGAEgASgJQge6SARyAhABEhYKBXRhYmxlGAIgASgJQge6SARyAhABEhcKBmNvbHVtbhgDIAEoCUIHukgEcgIQARI5Cgt0cmFuc2Zvcm1lchgFIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZ1RyYW5zZm9ybWVyIiUKDUdldEpvYlJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBIjEKDkdldEpvYlJlc3BvbnNlEh8KA2pvYhgBIAEoCzISLm1nbXQudjFhbHBoYTEuSm9iIl4KGFVwZGF0ZUpvYlNjaGVkdWxlUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQESGgoNY3Jvbl9zY2hlZHVsZRgCIAEoCUgAiAEBQhAKDl9jcm9uX3NjaGVkdWxlIjwKGVVwZGF0ZUpvYlNjaGVkdWxlUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IiUgoPUGF1c2VKb2JSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABARINCgVwYXVzZRgCIAEoCBIRCgRub3RlGAMgASgJSACIAQFCBwoFX25vdGUiMwoQUGF1c2VKb2JSZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiLWAQogVXBkYXRlSm9iU291cmNlQ29ubmVjdGlvblJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEigKBnNvdXJjZRgCIAEoCzIYLm1nbXQudjFhbHBoYTEuSm9iU291cmNlEisKCG1hcHBpbmdzGAMgAygLMhkubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nEkUKFHZpcnR1YWxfZm9yZWlnbl9rZXlzGAQgAygLMicubWdtdC52MWFscGhhMS5WaXJ0dWFsRm9yZWlnbkNvbnN0cmFpbnQiRAohVXBkYXRlSm9iU291cmNlQ29ubmVjdGlvblJlc3BvbnNlEh8KA2pvYhgBIAEoCzISLm1nbXQudjFhbHBoYTEuSm9iImEKGlBvc3RncmVzU291cmNlU2NoZW1hU3Vic2V0EkMKEHBvc3RncmVzX3NjaGVtYXMYASADKAsyKS5tZ210LnYxYWxwaGExLlBvc3RncmVzU291cmNlU2NoZW1hT3B0aW9uIlgKF015c3FsU291cmNlU2NoZW1hU3Vic2V0Ej0KDW15c3FsX3NjaGVtYXMYASADKAsyJi5tZ210LnYxYWxwaGExLk15c3FsU291cmNlU2NoZW1hT3B0aW9uIlYKGkR5bmFtb0RCU291cmNlU2NoZW1hU3Vic2V0EjgKBnRhYmxlcxgBIAMoCzIoLm1nbXQudjFhbHBoYTEuRHluYW1vREJTb3VyY2VUYWJsZU9wdGlvbiJYChdNc3NxbFNvdXJjZVNjaGVtYVN1YnNldBI9Cg1tc3NxbF9zY2hlbWFzGAEgAygLMiYubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZVNjaGVtYU9wdGlvbiK+AgoYSm9iU291cmNlU3FsU3ViZXRTY2hlbWFzEkQKD3Bvc3RncmVzX3N1YnNldBgCIAEoCzIpLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VTY2hlbWFTdWJzZXRIABI+CgxteXNxbF9zdWJzZXQYAyABKAsyJi5tZ210LnYxYWxwaGExLk15c3FsU291cmNlU2NoZW1hU3Vic2V0SAASRAoPZHluYW1vZGJfc3Vic2V0GAQgASgLMikubWdtdC52MWFscGhhMS5EeW5hbW9EQlNvdXJjZVNjaGVtYVN1YnNldEgAEj4KDG1zc3FsX3N1YnNldBgFIAEoCzImLm1nbXQudjFhbHBoYTEuTXNzcWxTb3VyY2VTY2hlbWFTdWJzZXRIAEIQCgdzY2hlbWFzEgW6SAIIAUoECAEQAiKkAQonU2V0Sm9iU291cmNlU3FsQ29ubmVjdGlvblN1YnNldHNSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABARI4CgdzY2hlbWFzGAIgASgLMicubWdtdC52MWFscGhhMS5Kb2JTb3VyY2VTcWxTdWJldFNjaGVtYXMSKQohc3Vic2V0X2J5X2ZvcmVpZ25fa2V5X2NvbnN0cmFpbnRzGAMgASgIIksKKFNldEpvYlNvdXJjZVNxbENvbm5lY3Rpb25TdWJzZXRzUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IisQEKJVVwZGF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvblJlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABARIfCg1jb25uZWN0aW9uX2lkGAIgASgJQgi6SAVyA7ABARI1CgdvcHRpb25zGAMgASgLMiQubWdtdC52MWFscGhhMS5Kb2JEZXN0aW5hdGlvbk9wdGlvbnMSFgoOZGVzdGluYXRpb25faWQYBCABKAkiSQomVXBkYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IiSQolRGVsZXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uUmVxdWVzdBIgCg5kZXN0aW5hdGlvbl9pZBgBIAEoCUIIukgFcgOwAQEiKAomRGVsZXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uUmVzcG9uc2UihwEKJkNyZWF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvbnNSZXF1ZXN0EhgKBmpvYl9pZBgBIAEoCUIIukgFcgOwAQESQwoMZGVzdGluYXRpb25zGAIgAygLMiMubWdtdC52MWFscGhhMS5DcmVhdGVKb2JEZXN0aW5hdGlvbkIIukgFkgECCAEiSgonQ3JlYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uc1Jlc3BvbnNlEh8KA2pvYhgBIAEoCzISLm1nbXQudjFhbHBoYTEuSm9iIigKEERlbGV0ZUpvYlJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBIhMKEURlbGV0ZUpvYlJlc3BvbnNlImIKGUlzSm9iTmFtZUF2YWlsYWJsZVJlcXVlc3QSJwoEbmFtZRgBIAEoCUIZukgWchQyEl5bYS16MC05LV17MywxMDB9JBIcCgphY2NvdW50X2lkGAIgASgJQgi6SAVyA7ABASIyChpJc0pvYk5hbWVBdmFpbGFibGVSZXNwb25zZRIUCgxpc19hdmFpbGFibGUYASABKAgiVQoRR2V0Sm9iUnVuc1JlcXVlc3QSGgoGam9iX2lkGAEgASgJQgi6SAVyA7ABAUgAEh4KCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBSABCBAoCaWQiPQoSR2V0Sm9iUnVuc1Jlc3BvbnNlEicKCGpvYl9ydW5zGAEgAygLMhUubWdtdC52MWFscGhhMS5Kb2JSdW4iRAoQR2V0Sm9iUnVuUmVxdWVzdBISCgpqb2JfcnVuX2lkGAEgASgJEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBIjsKEUdldEpvYlJ1blJlc3BvbnNlEiYKB2pvYl9ydW4YASABKAsyFS5tZ210LnYxYWxwaGExLkpvYlJ1biIvChNDcmVhdGVKb2JSdW5SZXF1ZXN0EhgKBmpvYl9pZBgBIAEoCUIIukgFcgOwAQEiFgoUQ3JlYXRlSm9iUnVuUmVzcG9uc2UiRwoTQ2FuY2VsSm9iUnVuUmVxdWVzdBISCgpqb2JfcnVuX2lkGAEgASgJEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBIhYKFENhbmNlbEpvYlJ1blJlc3BvbnNlIrwECgNKb2ISCgoCaWQYASABKAkSGgoSY3JlYXRlZF9ieV91c2VyX2lkGAIgASgJEi4KCmNyZWF0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhoKEnVwZGF0ZWRfYnlfdXNlcl9pZBgEIAEoCRIuCgp1cGRhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIMCgRuYW1lGAYgASgJEigKBnNvdXJjZRgHIAEoCzIYLm1nbXQudjFhbHBoYTEuSm9iU291cmNlEjMKDGRlc3RpbmF0aW9ucxgIIAMoCzIdLm1nbXQudjFhbHBoYTEuSm9iRGVzdGluYXRpb24SKwoIbWFwcGluZ3MYCSADKAsyGS5tZ210LnYxYWxwaGExLkpvYk1hcHBpbmcSGgoNY3Jvbl9zY2hlZHVsZRgKIAEoCUgAiAEBEhIKCmFjY291bnRfaWQYCyABKAkSNAoMc3luY19vcHRpb25zGAwgASgLMh4ubWdtdC52MWFscGhhMS5BY3Rpdml0eU9wdGlvbnMSOAoQd29ya2Zsb3dfb3B0aW9ucxgNIAEoCzIeLm1nbXQudjFhbHBoYTEuV29ya2Zsb3dPcHRpb25zEkUKFHZpcnR1YWxfZm9yZWlnbl9rZXlzGA4gAygLMicubWdtdC52MWFscGhhMS5WaXJ0dWFsRm9yZWlnbkNvbnN0cmFpbnRCEAoOX2Nyb25fc2NoZWR1bGUiUgoMSm9iUmVjZW50UnVuEi4KCnN0YXJ0X3RpbWUYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhIKCmpvYl9ydW5faWQYAiABKAkiMwoXR2V0Sm9iUmVjZW50UnVuc1JlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABASJMChhHZXRKb2JSZWNlbnRSdW5zUmVzcG9uc2USMAoLcmVjZW50X3J1bnMYASADKAsyGy5tZ210LnYxYWxwaGExLkpvYlJlY2VudFJ1biJBCgtKb2JOZXh0UnVucxIyCg5uZXh0X3J1bl90aW1lcxgBIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiMQoVR2V0Sm9iTmV4dFJ1bnNSZXF1ZXN0EhgKBmpvYl9pZBgBIAEoCUIIukgFcgOwAQEiRwoWR2V0Sm9iTmV4dFJ1bnNSZXNwb25zZRItCgluZXh0X3J1bnMYASABKAsyGi5tZ210LnYxYWxwaGExLkpvYk5leHRSdW5zIi8KE0dldEpvYlN0YXR1c1JlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABASJAChRHZXRKb2JTdGF0dXNSZXNwb25zZRIoCgZzdGF0dXMYASABKA4yGC5tZ210LnYxYWxwaGExLkpvYlN0YXR1cyJVCg9Kb2JTdGF0dXNSZWNvcmQSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABARIoCgZzdGF0dXMYAiABKA4yGC5tZ210LnYxYWxwaGExLkpvYlN0YXR1cyI1ChVHZXRKb2JTdGF0dXNlc1JlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQEiSgoWR2V0Sm9iU3RhdHVzZXNSZXNwb25zZRIwCghzdGF0dXNlcxgBIAMoCzIeLm1nbXQudjFhbHBoYTEuSm9iU3RhdHVzUmVjb3JkIiIKD0FjdGl2aXR5RmFpbHVyZRIPCgdtZXNzYWdlGAEgASgJIqMBCg9QZW5kaW5nQWN0aXZpdHkSLQoGc3RhdHVzGAEgASgOMh0ubWdtdC52MWFscGhhMS5BY3Rpdml0eVN0YXR1cxIVCg1hY3Rpdml0eV9uYW1lGAIgASgJEjkKDGxhc3RfZmFpbHVyZRgDIAEoCzIeLm1nbXQudjFhbHBoYTEuQWN0aXZpdHlGYWlsdXJlSACIAQFCDwoNX2xhc3RfZmFpbHVyZSKZAgoGSm9iUnVuEgoKAmlkGAEgASgJEg4KBmpvYl9pZBgCIAEoCRIMCgRuYW1lGAMgASgJEisKBnN0YXR1cxgEIAEoDjIbLm1nbXQudjFhbHBoYTEuSm9iUnVuU3RhdHVzEi4KCnN0YXJ0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjUKDGNvbXBsZXRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBARI6ChJwZW5kaW5nX2FjdGl2aXRpZXMYCCADKAsyHi5tZ210LnYxYWxwaGExLlBlbmRpbmdBY3Rpdml0eUIPCg1fY29tcGxldGVkX2F0SgQIBRAGIjwKFEpvYlJ1bkV2ZW50VGFza0Vycm9yEg8KB21lc3NhZ2UYASABKAkSEwoLcmV0cnlfc3RhdGUYAiABKAkijwEKD0pvYlJ1bkV2ZW50VGFzaxIKCgJpZBgBIAEoAxIMCgR0eXBlGAIgASgJEi4KCmV2ZW50X3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjIKBWVycm9yGAQgASgLMiMubWdtdC52MWFscGhhMS5Kb2JSdW5FdmVudFRhc2tFcnJvciIzChJKb2JSdW5TeW5jTWV0YWRhdGESDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJImQKE0pvYlJ1bkV2ZW50TWV0YWRhdGESOgoNc3luY19tZXRhZGF0YRgBIAEoCzIhLm1nbXQudjFhbHBoYTEuSm9iUnVuU3luY01ldGFkYXRhSABCEQoIbWV0YWRhdGESBbpIAggBIuwBCgtKb2JSdW5FdmVudBIKCgJpZBgBIAEoAxIMCgR0eXBlGAIgASgJEi4KCnN0YXJ0X3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCmNsb3NlX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjQKCG1ldGFkYXRhGAUgASgLMiIubWdtdC52MWFscGhhMS5Kb2JSdW5FdmVudE1ldGFkYXRhEi0KBXRhc2tzGAYgAygLMh4ubWdtdC52MWFscGhhMS5Kb2JSdW5FdmVudFRhc2siSgoWR2V0Sm9iUnVuRXZlbnRzUmVxdWVzdBISCgpqb2JfcnVuX2lkGAEgASgJEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBIl4KF0dldEpvYlJ1bkV2ZW50c1Jlc3BvbnNlEioKBmV2ZW50cxgBIAMoCzIaLm1nbXQudjFhbHBoYTEuSm9iUnVuRXZlbnQSFwoPaXNfcnVuX2NvbXBsZXRlGAIgASgIIkcKE0RlbGV0ZUpvYlJ1blJlcXVlc3QSEgoKam9iX3J1bl9pZBgBIAEoCRIcCgphY2NvdW50X2lkGAIgASgJQgi6SAVyA7ABASIWChREZWxldGVKb2JSdW5SZXNwb25zZSJKChZUZXJtaW5hdGVKb2JSdW5SZXF1ZXN0EhIKCmpvYl9ydW5faWQYASABKAkSHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiGQoXVGVybWluYXRlSm9iUnVuUmVzcG9uc2Ui8QEKGkdldEpvYlJ1bkxvZ3NTdHJlYW1SZXF1ZXN0EhIKCmpvYl9ydW5faWQYASABKAkSHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQESKAoGd2luZG93GAMgASgOMhgubWdtdC52MWFscGhhMS5Mb2dXaW5kb3cSEwoLc2hvdWxkX3RhaWwYBCABKAgSIwoNbWF4X2xvZ19saW5lcxgFIAEoA0IHukgEIgIoAUgAiAEBEisKCmxvZ19sZXZlbHMYBiADKA4yFy5tZ210LnYxYWxwaGExLkxvZ0xldmVsQhAKDl9tYXhfbG9nX2xpbmVzIugBChtHZXRKb2JSdW5Mb2dzU3RyZWFtUmVzcG9uc2USEAoIbG9nX2xpbmUYASABKAkSMgoJdGltZXN0YW1wGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBEkYKBmxhYmVscxgDIAMoCzI2Lm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1N0cmVhbVJlc3BvbnNlLkxhYmVsc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAFCDAoKX3RpbWVzdGFtcCLWAQoUR2V0Sm9iUnVuTG9nc1JlcXVlc3QSEgoKam9iX3J1bl9pZBgBIAEoCRIcCgphY2NvdW50X2lkGAIgASgJQgi6SAVyA7ABARIoCgZ3aW5kb3cYAyABKA4yGC5tZ210LnYxYWxwaGExLkxvZ1dpbmRvdxIjCg1tYXhfbG9nX2xpbmVzGAQgASgDQge6SAQiAigBSACIAQESKwoKbG9nX2xldmVscxgFIAMoDjIXLm1nbXQudjFhbHBoYTEuTG9nTGV2ZWxCEAoOX21heF9sb2dfbGluZXMisQIKFUdldEpvYlJ1bkxvZ3NSZXNwb25zZRI/Cglsb2dfbGluZXMYASADKAsyLC5tZ210LnYxYWxwaGExLkdldEpvYlJ1bkxvZ3NSZXNwb25zZS5Mb2dMaW5lGtYBCgdMb2dMaW5lEhAKCGxvZ19saW5lGAEgASgJEjIKCXRpbWVzdGFtcBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBARJICgZsYWJlbHMYAyADKAsyOC5tZ210LnYxYWxwaGExLkdldEpvYlJ1bkxvZ3NSZXNwb25zZS5Mb2dMaW5lLkxhYmVsc0VudHJ5Gi0KC0xhYmVsc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAFCDAoKX3RpbWVzdGFtcCJuChxTZXRKb2JXb3JrZmxvd09wdGlvbnNSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABARI4ChB3b3Jma2xvd19vcHRpb25zGAIgASgLMh4ubWdtdC52MWFscGhhMS5Xb3JrZmxvd09wdGlvbnMiQAodU2V0Sm9iV29ya2Zsb3dPcHRpb25zUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IiZgoYU2V0Sm9iU3luY09wdGlvbnNSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABARI0CgxzeW5jX29wdGlvbnMYAiABKAsyHi5tZ210LnYxYWxwaGExLkFjdGl2aXR5T3B0aW9ucyI8ChlTZXRKb2JTeW5jT3B0aW9uc1Jlc3BvbnNlEh8KA2pvYhgBIAEoCzISLm1nbXQudjFhbHBoYTEuSm9iIpECChpWYWxpZGF0ZUpvYk1hcHBpbmdzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIrCghtYXBwaW5ncxgCIAMoCzIZLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZxIfCg1jb25uZWN0aW9uX2lkGAMgASgJQgi6SAVyA7ABARJFChR2aXJ0dWFsX2ZvcmVpZ25fa2V5cxgEIAMoCzInLm1nbXQudjFhbHBoYTEuVmlydHVhbEZvcmVpZ25Db25zdHJhaW50EjEKCmpvYl9zb3VyY2UYBSABKAsyGC5tZ210LnYxYWxwaGExLkpvYlNvdXJjZUgAiAEBQg0KC19qb2Jfc291cmNlIqsHCgtDb2x1bW5FcnJvchIOCgZzY2hlbWEYASABKAkSDQoFdGFibGUYAiABKAkSDgoGY29sdW1uGAMgASgJEhIKBmVycm9ycxgEIAMoCUICGAESQwoNZXJyb3JfcmVwb3J0cxgFIAMoCzIsLm1nbXQudjFhbHBoYTEuQ29sdW1uRXJyb3IuQ29sdW1uRXJyb3JSZXBvcnQaXgoRQ29sdW1uRXJyb3JSZXBvcnQSOAoEY29kZRgBIAEoDjIqLm1nbXQudjFhbHBoYTEuQ29sdW1uRXJyb3IuQ29sdW1uRXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkiswUKD0NvbHVtbkVycm9yQ29kZRIhCh1DT0xVTU5fRVJST1JfQ09ERV9VTlNQRUNJRklFRBAAEikKJUNPTFVNTl9FUlJPUl9DT0RFX05PVF9GT1VORF9JTl9TT1VSQ0UQARIqCiZDT0xVTU5fRVJST1JfQ09ERV9OT1RfRk9VTkRfSU5fTUFQUElORxACEjoKNkNPTFVNTl9FUlJPUl9DT0RFX1JFUVVJUkVEX0NPTFVNTl9OT1RfRk9VTkRfSU5fTUFQUElORxADEj8KO0NPTFVNTl9FUlJPUl9DT0RFX1JFUVVJUkVEX0ZPUkVJR05fS0VZX05PVF9GT1VORF9JTl9NQVBQSU5HEAQSSwpHQ09MVU1OX0VSUk9SX0NPREVfVU5TVVBQT1JURURfQ0lSQ1VMQVJfREVQRU5ERU5DWV9BVF9MRUFTVF9PTkVfTlVMTEFCTEUQBRI8CjhDT0xVTU5fRVJST1JfQ09ERV9WRktfU09VUkNFX0NPTFVNTl9OT1RfRk9VTkRfSU5fTUFQUElORxAGEjsKN0NPTFVNTl9FUlJPUl9DT0RFX1ZGS19TT1VSQ0VfQ09MVU1OX05PVF9GT1VORF9JTl9TT1VSQ0UQBxI8CjhDT0xVTU5fRVJST1JfQ09ERV9WRktfVEFSR0VUX0NPTFVNTl9OT1RfRk9VTkRfSU5fTUFQUElORxAIEjsKN0NPTFVNTl9FUlJPUl9DT0RFX1ZGS19UQVJHRVRfQ09MVU1OX05PVF9GT1VORF9JTl9TT1VSQ0UQCRIyCi5DT0xVTU5fRVJST1JfQ09ERV9WRktfQ09MVU1OX0RBVEFUWVBFX01JU01BVENIEAoSMgouQ09MVU1OX0VSUk9SX0NPREVfVkZLX1NPVVJDRV9DT0xVTU5fTk9UX1VOSVFVRRALIpsDCg1Db2x1bW5XYXJuaW5nEg4KBnNjaGVtYRgBIAEoCRINCgV0YWJsZRgCIAEoCRIOCgZjb2x1bW4YAyABKAkSFAoId2FybmluZ3MYBSADKAlCAhgBEkkKD3dhcm5pbmdfcmVwb3J0cxgGIAMoCzIwLm1nbXQudjFhbHBoYTEuQ29sdW1uV2FybmluZy5Db2x1bW5XYXJuaW5nUmVwb3J0GmQKE0NvbHVtbldhcm5pbmdSZXBvcnQSPAoEY29kZRgBIAEoDjIuLm1nbXQudjFhbHBoYTEuQ29sdW1uV2FybmluZy5Db2x1bW5XYXJuaW5nQ29kZRIPCgdtZXNzYWdlGAIgASgJIpMBChFDb2x1bW5XYXJuaW5nQ29kZRIjCh9DT0xVTU5fV0FSTklOR19DT0RFX1VOU1BFQ0lGSUVEEAASKwonQ09MVU1OX1dBUk5JTkdfQ09ERV9OT1RfRk9VTkRfSU5fU09VUkNFEAESLAooQ09MVU1OX1dBUk5JTkdfQ09ERV9OT1RfRk9VTkRfSU5fTUFQUElORxACIokDCg1EYXRhYmFzZUVycm9yEhIKBmVycm9ycxgBIAMoCUICGAESRwoNZXJyb3JfcmVwb3J0cxgCIAMoCzIwLm1nbXQudjFhbHBoYTEuRGF0YWJhc2VFcnJvci5EYXRhYmFzZUVycm9yUmVwb3J0GmQKE0RhdGFiYXNlRXJyb3JSZXBvcnQSPAoEY29kZRgBIAEoDjIuLm1nbXQudjFhbHBoYTEuRGF0YWJhc2VFcnJvci5EYXRhYmFzZUVycm9yQ29kZRIPCgdtZXNzYWdlGAIgASgJIrQBChFEYXRhYmFzZUVycm9yQ29kZRIjCh9EQVRBQkFTRV9FUlJPUl9DT0RFX1VOU1BFQ0lGSUVEEAASTQpJREFUQUJBU0VfRVJST1JfQ09ERV9VTlNVUFBPUlRFRF9DSVJDVUxBUl9ERVBFTkRFTkNZX0FUX0xFQVNUX09ORV9OVUxMQUJMRRABEisKJ0RBVEFCQVNFX0VSUk9SX0NPREVfVkZLX0NPTFVNTl9NSVNNQVRDSBACIp4ECgpUYWJsZUVycm9yEg4KBnNjaGVtYRgBIAEoCRINCgV0YWJsZRgCIAEoCRJBCg1lcnJvcl9yZXBvcnRzGAMgAygLMioubWdtdC52MWFscGhhMS5UYWJsZUVycm9yLlRhYmxlRXJyb3JSZXBvcnQaWwoQVGFibGVFcnJvclJlcG9ydBI2CgRjb2RlGAEgASgOMigubWdtdC52MWFscGhhMS5UYWJsZUVycm9yLlRhYmxlRXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAki0AIKDlRhYmxlRXJyb3JDb2RlEiAKHFRBQkxFX0VSUk9SX0NPREVfVU5TUEVDSUZJRUQQABIuCipUQUJMRV9FUlJPUl9DT0RFX1RBQkxFX05PVF9GT1VORF9JTl9TT1VSQ0UQARI6CjZUQUJMRV9FUlJPUl9DT0RFX1ZGS19TT1VSQ0VfVEFCTEVfTk9UX0ZPVU5EX0lOX01BUFBJTkcQAhI5CjVUQUJMRV9FUlJPUl9DT0RFX1ZGS19TT1VSQ0VfVEFCTEVfTk9UX0ZPVU5EX0lOX1NPVVJDRRADEjoKNlRBQkxFX0VSUk9SX0NPREVfVkZLX1RBUkdFVF9UQUJMRV9OT1RfRk9VTkRfSU5fTUFQUElORxAEEjkKNVRBQkxFX0VSUk9SX0NPREVfVkZLX1RBUkdFVF9UQUJMRV9OT1RfRk9VTkRfSU5fU09VUkNFEAUi7wEKG1ZhbGlkYXRlSm9iTWFwcGluZ3NSZXNwb25zZRIxCg1jb2x1bW5fZXJyb3JzGAEgAygLMhoubWdtdC52MWFscGhhMS5Db2x1bW5FcnJvchI1Cg9kYXRhYmFzZV9lcnJvcnMYAiABKAsyHC5tZ210LnYxYWxwaGExLkRhdGFiYXNlRXJyb3ISNQoPY29sdW1uX3dhcm5pbmdzGAMgAygLMhwubWdtdC52MWFscGhhMS5Db2x1bW5XYXJuaW5nEi8KDHRhYmxlX2Vycm9ycxgEIAMoCzIZLm1nbXQudjFhbHBoYTEuVGFibGVFcnJvciJlChVWYWxpZGF0ZVNjaGVtYVJlcXVlc3QSKwoIbWFwcGluZ3MYASADKAsyGS5tZ210LnYxYWxwaGExLkpvYk1hcHBpbmcSHwoNY29ubmVjdGlvbl9pZBgCIAEoCUIIukgFcgOwAQEijAIKFlZhbGlkYXRlU2NoZW1hUmVzcG9uc2USNgoPbWlzc2luZ19jb2x1bW5zGAEgAygLMh0ubWdtdC52MWFscGhhMS5EYXRhYmFzZUNvbHVtbhI0Cg1leHRyYV9jb2x1bW5zGAIgAygLMh0ubWdtdC52MWFscGhhMS5EYXRhYmFzZUNvbHVtbhJDCg5taXNzaW5nX3RhYmxlcxgDIAMoCzIrLm1nbXQudjFhbHBoYTEuVmFsaWRhdGVTY2hlbWFSZXNwb25zZS5UYWJsZRIXCg9taXNzaW5nX3NjaGVtYXMYBCADKAkaJgoFVGFibGUSDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJIkMKEVZpcnR1YWxGb3JlaWduS2V5Eg4KBnNjaGVtYRgBIAEoCRINCgV0YWJsZRgCIAEoCRIPCgdjb2x1bW5zGAMgAygJIoEBChhWaXJ0dWFsRm9yZWlnbkNvbnN0cmFpbnQSDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEg8KB2NvbHVtbnMYAyADKAkSNQoLZm9yZWlnbl9rZXkYBCABKAsyIC5tZ210LnYxYWxwaGExLlZpcnR1YWxGb3JlaWduS2V5ImcKDVJ1bkNvbnRleHRLZXkSGwoKam9iX3J1bl9pZBgBIAEoCUIHukgEcgIQARIcCgtleHRlcm5hbF9pZBgCIAEoCUIHukgEcgIQARIbCgphY2NvdW50X2lkGAMgASgJQge6SARyAhABIkAKFEdldFJ1bkNvbnRleHRSZXF1ZXN0EigKAmlkGAEgASgLMhwubWdtdC52MWFscGhhMS5SdW5Db250ZXh0S2V5IiYKFUdldFJ1bkNvbnRleHRSZXNwb25zZRINCgV2YWx1ZRgBIAEoDCJPChRTZXRSdW5Db250ZXh0UmVxdWVzdBIoCgJpZBgBIAEoCzIcLm1nbXQudjFhbHBoYTEuUnVuQ29udGV4dEtleRINCgV2YWx1ZRgCIAEoDCIXChVTZXRSdW5Db250ZXh0UmVzcG9uc2UiUAoVU2V0UnVuQ29udGV4dHNSZXF1ZXN0EigKAmlkGAEgASgLMhwubWdtdC52MWFscGhhMS5SdW5Db250ZXh0S2V5Eg0KBXZhbHVlGAIgASgMIhgKFlNldFJ1bkNvbnRleHRzUmVzcG9uc2UivAIKB0pvYkhvb2sSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIOCgZqb2JfaWQYBCABKAkSLAoGY29uZmlnGAUgASgLMhwubWdtdC52MWFscGhhMS5Kb2JIb29rQ29uZmlnEhoKEmNyZWF0ZWRfYnlfdXNlcl9pZBgGIAEoCRIuCgpjcmVhdGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIaChJ1cGRhdGVkX2J5X3VzZXJfaWQYCCABKAkSLgoKdXBkYXRlZF9hdBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDwoHZW5hYmxlZBgKIAEoCBIbCghwcmlvcml0eRgLIAEoDUIJukgGKgQYZCgAIq8BCgpOZXdKb2JIb29rEicKBG5hbWUYASABKAlCGbpIFnIUMhJeW2EtejAtOS1dezMsMTAwfSQSHAoLZGVzY3JpcHRpb24YAiABKAlCB7pIBHICEAESLAoGY29uZmlnGAMgASgLMhwubWdtdC52MWFscGhhMS5Kb2JIb29rQ29uZmlnEg8KB2VuYWJsZWQYBCABKAgSGwoIcHJpb3JpdHkYBSABKA1CCbpIBioEGGQoACKIAwoNSm9iSG9va0NvbmZpZxI2CgNzcWwYBSABKAsyJy5tZ210LnYxYWxwaGExLkpvYkhvb2tDb25maWcuSm9iU3FsSG9va0gAGpUCCgpKb2JTcWxIb29rEhYKBXF1ZXJ5GAEgASgJQge6SARyAhABEh8KDWNvbm5lY3Rpb25faWQYAiABKAlCCLpIBXIDsAEBEj4KBnRpbWluZxgDIAEoCzIuLm1nbXQudjFhbHBoYTEuSm9iSG9va0NvbmZpZy5Kb2JTcWxIb29rLlRpbWluZxqNAQoGVGltaW5nEjcKCHByZV9zeW5jGAMgASgLMiMubWdtdC52MWFscGhhMS5Kb2JIb29rVGltaW5nUHJlU3luY0gAEjkKCXBvc3Rfc3luYxgEIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iSG9va1RpbWluZ1Bvc3RTeW5jSABCDwoGdGltaW5nEgW6SAIIAUIPCgZjb25maWcSBbpIAggBSgQIARACSgQIAhADSgQIAxAESgQIBBAFIhYKFEpvYkhvb2tUaW1pbmdQcmVTeW5jIhcKFUpvYkhvb2tUaW1pbmdQb3N0U3luYyIuChJHZXRKb2JIb29rc1JlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABASI8ChNHZXRKb2JIb29rc1Jlc3BvbnNlEiUKBWhvb2tzGAEgAygLMhYubWdtdC52MWFscGhhMS5Kb2JIb29rIikKEUdldEpvYkhvb2tSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABASI6ChJHZXRKb2JIb29rUmVzcG9uc2USJAoEaG9vaxgBIAEoCzIWLm1nbXQudjFhbHBoYTEuSm9iSG9vayJPChRDcmVhdGVKb2JIb29rUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSJwoEaG9vaxgCIAEoCzIZLm1nbXQudjFhbHBoYTEuTmV3Sm9iSG9vayI9ChVDcmVhdGVKb2JIb29rUmVzcG9uc2USJAoEaG9vaxgBIAEoCzIWLm1nbXQudjFhbHBoYTEuSm9iSG9vayIsChREZWxldGVKb2JIb29rUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiFwoVRGVsZXRlSm9iSG9va1Jlc3BvbnNlIj0KHUlzSm9iSG9va05hbWVBdmFpbGFibGVSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJIjYKHklzSm9iSG9va05hbWVBdmFpbGFibGVSZXNwb25zZRIUCgxpc19hdmFpbGFibGUYASABKAgizwEKFFVwZGF0ZUpvYkhvb2tSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABARInCgRuYW1lGAIgASgJQhm6SBZyFDISXlthLXowLTktXXszLDEwMH0kEhwKC2Rlc2NyaXB0aW9uGAMgASgJQge6SARyAhABEiwKBmNvbmZpZxgEIAEoCzIcLm1nbXQudjFhbHBoYTEuSm9iSG9va0NvbmZpZxIPCgdlbmFibGVkGAUgASgIEhsKCHByaW9yaXR5GAYgASgNQgm6SAYqBBhkKAAiPQoVVXBkYXRlSm9iSG9va1Jlc3BvbnNlEiQKBGhvb2sYASABKAsyFi5tZ210LnYxYWxwaGExLkpvYkhvb2siQQoYU2V0Sm9iSG9va0VuYWJsZWRSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABARIPCgdlbmFibGVkGAIgASgIIkEKGVNldEpvYkhvb2tFbmFibGVkUmVzcG9uc2USJAoEaG9vaxgBIAEoCzIWLm1nbXQudjFhbHBoYTEuSm9iSG9vayLPAQogR2V0QWN0aXZlSm9iSG9va3NCeVRpbWluZ1JlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABARJGCgZ0aW1pbmcYAiABKA4yNi5tZ210LnYxYWxwaGExLkdldEFjdGl2ZUpvYkhvb2tzQnlUaW1pbmdSZXF1ZXN0LlRpbWluZyJJCgZUaW1pbmcSFgoSVElNSU5HX1VOU1BFQ0lGSUVEEAASEgoOVElNSU5HX1BSRVNZTkMQARITCg9USU1JTkdfUE9TVFNZTkMQAiJKCiFHZXRBY3RpdmVKb2JIb29rc0J5VGltaW5nUmVzcG9uc2USJQoFaG9va3MYASADKAsyFi5tZ210LnYxYWxwaGExLkpvYkhvb2sqbwoJSm9iU3RhdHVzEhoKFkpPQl9TVEFUVVNfVU5TUEVDSUZJRUQQABIWChJKT0JfU1RBVFVTX0VOQUJMRUQQARIVChFKT0JfU1RBVFVTX1BBVVNFRBADEhcKE0pPQl9TVEFUVVNfRElTQUJMRUQQBCqnAQoOQWN0aXZpdHlTdGF0dXMSHwobQUNUSVZJVFlfU1RBVFVTX1VOU1BFQ0lGSUVEEAASHQoZQUNUSVZJVFlfU1RBVFVTX1NDSEVEVUxFRBABEhsKF0FDVElWSVRZX1NUQVRVU19TVEFSVEVEEAISHAoYQUNUSVZJVFlfU1RBVFVTX0NBTkNFTEVEEAMSGgoWQUNUSVZJVFlfU1RBVFVTX0ZBSUxFRBAEKpICCgxKb2JSdW5TdGF0dXMSHgoaSk9CX1JVTl9TVEFUVVNfVU5TUEVDSUZJRUQQABIaChZKT0JfUlVOX1NUQVRVU19QRU5ESU5HEAESGgoWSk9CX1JVTl9TVEFUVVNfUlVOTklORxACEhsKF0pPQl9SVU5fU1RBVFVTX0NPTVBMRVRFEAMSGAoUSk9CX1JVTl9TVEFUVVNfRVJST1IQBBIbChdKT0JfUlVOX1NUQVRVU19DQU5DRUxFRBAFEh0KGUpPQl9SVU5fU1RBVFVTX1RFUk1JTkFURUQQBhIZChVKT0JfUlVOX1NUQVRVU19GQUlMRUQQBxIcChhKT0JfUlVOX1NUQVRVU19USU1FRF9PVVQQCCp8CglMb2dXaW5kb3cSIgoeTE9HX1dJTkRPV19OT19USU1FX1VOU1BFQ0lGSUVEEAASGgoWTE9HX1dJTkRPV19GSUZURUVOX01JThABEhcKE0xPR19XSU5ET1dfT05FX0hPVVIQAhIWChJMT0dfV0lORE9XX09ORV9EQVkQAyp3CghMb2dMZXZlbBIZChVMT0dfTEVWRUxfVU5TUEVDSUZJRUQQABITCg9MT0dfTEVWRUxfREVCVUcQARISCg5MT0dfTEVWRUxfSU5GTxACEhIKDkxPR19MRVZFTF9XQVJOEAMSEwoPTE9HX0xFVkVMX0VSUk9SEAQytyAKCkpvYlNlcnZpY2USTQoHR2V0Sm9icxIdLm1nbXQudjFhbHBoYTEuR2V0Sm9ic1JlcXVlc3QaHi5tZ210LnYxYWxwaGExLkdldEpvYnNSZXNwb25zZSIDkAIBEkoKBkdldEpvYhIcLm1nbXQudjFhbHBoYTEuR2V0Sm9iUmVxdWVzdBodLm1nbXQudjFhbHBoYTEuR2V0Sm9iUmVzcG9uc2UiA5ACARJQCglDcmVhdGVKb2ISHy5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYlJlcXVlc3QaIC5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYlJlc3BvbnNlIgASUAoJRGVsZXRlSm9iEh8ubWdtdC52MWFscGhhMS5EZWxldGVKb2JSZXF1ZXN0GiAubWdtdC52MWFscGhhMS5EZWxldGVKb2JSZXNwb25zZSIAEm4KEklzSm9iTmFtZUF2YWlsYWJsZRIoLm1nbXQudjFhbHBoYTEuSXNKb2JOYW1lQXZhaWxhYmxlUmVxdWVzdBopLm1nbXQudjFhbHBoYTEuSXNKb2JOYW1lQXZhaWxhYmxlUmVzcG9uc2UiA5ACARJoChFVcGRhdGVKb2JTY2hlZHVsZRInLm1nbXQudjFhbHBoYTEuVXBkYXRlSm9iU2NoZWR1bGVSZXF1ZXN0GigubWdtdC52MWFscGhhMS5VcGRhdGVKb2JTY2hlZHVsZVJlc3BvbnNlIgASgAEKGVVwZGF0ZUpvYlNvdXJjZUNvbm5lY3Rpb24SLy5tZ210LnYxYWxwaGExLlVwZGF0ZUpvYlNvdXJjZUNvbm5lY3Rpb25SZXF1ZXN0GjAubWdtdC52MWFscGhhMS5VcGRhdGVKb2JTb3VyY2VDb25uZWN0aW9uUmVzcG9uc2UiABKVAQogU2V0Sm9iU291cmNlU3FsQ29ubmVjdGlvblN1YnNldHMSNi5tZ210LnYxYWxwaGExLlNldEpvYlNvdXJjZVNxbENvbm5lY3Rpb25TdWJzZXRzUmVxdWVzdBo3Lm1nbXQudjFhbHBoYTEuU2V0Sm9iU291cmNlU3FsQ29ubmVjdGlvblN1YnNldHNSZXNwb25zZSIAEo8BCh5VcGRhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb24SNC5tZ210LnYxYWxwaGExLlVwZGF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvblJlcXVlc3QaNS5tZ210LnYxYWxwaGExLlVwZGF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvblJlc3BvbnNlIgASjwEKHkRlbGV0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvbhI0Lm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uUmVxdWVzdBo1Lm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uUmVzcG9uc2UiABKSAQofQ3JlYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9ucxI1Lm1nbXQudjFhbHBoYTEuQ3JlYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uc1JlcXVlc3QaNi5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvbnNSZXNwb25zZSIAEk0KCFBhdXNlSm9iEh4ubWdtdC52MWFscGhhMS5QYXVzZUpvYlJlcXVlc3QaHy5tZ210LnYxYWxwaGExLlBhdXNlSm9iUmVzcG9uc2UiABJoChBHZXRKb2JSZWNlbnRSdW5zEiYubWdtdC52MWFscGhhMS5HZXRKb2JSZWNlbnRSdW5zUmVxdWVzdBonLm1nbXQudjFhbHBoYTEuR2V0Sm9iUmVjZW50UnVuc1Jlc3BvbnNlIgOQAgESYgoOR2V0Sm9iTmV4dFJ1bnMSJC5tZ210LnYxYWxwaGExLkdldEpvYk5leHRSdW5zUmVxdWVzdBolLm1nbXQudjFhbHBoYTEuR2V0Sm9iTmV4dFJ1bnNSZXNwb25zZSIDkAIBElwKDEdldEpvYlN0YXR1cxIiLm1nbXQudjFhbHBoYTEuR2V0Sm9iU3RhdHVzUmVxdWVzdBojLm1nbXQudjFhbHBoYTEuR2V0Sm9iU3RhdHVzUmVzcG9uc2UiA5ACARJiCg5HZXRKb2JTdGF0dXNlcxIkLm1nbXQudjFhbHBoYTEuR2V0Sm9iU3RhdHVzZXNSZXF1ZXN0GiUubWdtdC52MWFscGhhMS5HZXRKb2JTdGF0dXNlc1Jlc3BvbnNlIgOQAgESVgoKR2V0Sm9iUnVucxIgLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuc1JlcXVlc3QaIS5tZ210LnYxYWxwaGExLkdldEpvYlJ1bnNSZXNwb25zZSIDkAIBEmUKD0dldEpvYlJ1bkV2ZW50cxIlLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuRXZlbnRzUmVxdWVzdBomLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuRXZlbnRzUmVzcG9uc2UiA5ACARJTCglHZXRKb2JSdW4SHy5tZ210LnYxYWxwaGExLkdldEpvYlJ1blJlcXVlc3QaIC5tZ210LnYxYWxwaGExLkdldEpvYlJ1blJlc3BvbnNlIgOQAgESWQoMRGVsZXRlSm9iUnVuEiIubWdtdC52MWFscGhhMS5EZWxldGVKb2JSdW5SZXF1ZXN0GiMubWdtdC52MWFscGhhMS5EZWxldGVKb2JSdW5SZXNwb25zZSIAElkKDENyZWF0ZUpvYlJ1bhIiLm1nbXQudjFhbHBoYTEuQ3JlYXRlSm9iUnVuUmVxdWVzdBojLm1nbXQudjFhbHBoYTEuQ3JlYXRlSm9iUnVuUmVzcG9uc2UiABJZCgxDYW5jZWxKb2JSdW4SIi5tZ210LnYxYWxwaGExLkNhbmNlbEpvYlJ1blJlcXVlc3QaIy5tZ210LnYxYWxwaGExLkNhbmNlbEpvYlJ1blJlc3BvbnNlIgASYgoPVGVybWluYXRlSm9iUnVuEiUubWdtdC52MWFscGhhMS5UZXJtaW5hdGVKb2JSdW5SZXF1ZXN0GiYubWdtdC52MWFscGhhMS5UZXJtaW5hdGVKb2JSdW5SZXNwb25zZSIAEnAKE0dldEpvYlJ1bkxvZ3NTdHJlYW0SKS5tZ210LnYxYWxwaGExLkdldEpvYlJ1bkxvZ3NTdHJlYW1SZXF1ZXN0GioubWdtdC52MWFscGhhMS5HZXRKb2JSdW5Mb2dzU3RyZWFtUmVzcG9uc2UiADABElwKDUdldEpvYlJ1bkxvZ3MSIy5tZ210LnYxYWxwaGExLkdldEpvYlJ1bkxvZ3NSZXF1ZXN0GiQubWdtdC52MWFscGhhMS5HZXRKb2JSdW5Mb2dzUmVzcG9uc2UiABJ0ChVTZXRKb2JXb3JrZmxvd09wdGlvbnMSKy5tZ210LnYxYWxwaGExLlNldEpvYldvcmtmbG93T3B0aW9uc1JlcXVlc3QaLC5tZ210LnYxYWxwaGExLlNldEpvYldvcmtmbG93T3B0aW9uc1Jlc3BvbnNlIgASaAoRU2V0Sm9iU3luY09wdGlvbnMSJy5tZ210LnYxYWxwaGExLlNldEpvYlN5bmNPcHRpb25zUmVxdWVzdBooLm1nbXQudjFhbHBoYTEuU2V0Sm9iU3luY09wdGlvbnNSZXNwb25zZSIAEm4KE1ZhbGlkYXRlSm9iTWFwcGluZ3MSKS5tZ210LnYxYWxwaGExLlZhbGlkYXRlSm9iTWFwcGluZ3NSZXF1ZXN0GioubWdtdC52MWFscGhhMS5WYWxpZGF0ZUpvYk1hcHBpbmdzUmVzcG9uc2UiABJfCg5WYWxpZGF0ZVNjaGVtYRIkLm1nbXQudjFhbHBoYTEuVmFsaWRhdGVTY2hlbWFSZXF1ZXN0GiUubWdtdC52MWFscGhhMS5WYWxpZGF0ZVNjaGVtYVJlc3BvbnNlIgASXAoNR2V0UnVuQ29udGV4dBIjLm1nbXQudjFhbHBoYTEuR2V0UnVuQ29udGV4dFJlcXVlc3QaJC5tZ210LnYxYWxwaGExLkdldFJ1bkNvbnRleHRSZXNwb25zZSIAElwKDVNldFJ1bkNvbnRleHQSIy5tZ210LnYxYWxwaGExLlNldFJ1bkNvbnRleHRSZXF1ZXN0GiQubWdtdC52MWFscGhhMS5TZXRSdW5Db250ZXh0UmVzcG9uc2UiABJhCg5TZXRSdW5Db250ZXh0cxIkLm1nbXQudjFhbHBoYTEuU2V0UnVuQ29udGV4dHNSZXF1ZXN0GiUubWdtdC52MWFscGhhMS5TZXRSdW5Db250ZXh0c1Jlc3BvbnNlIgAoARJZCgtHZXRKb2JIb29rcxIhLm1nbXQudjFhbHBoYTEuR2V0Sm9iSG9va3NSZXF1ZXN0GiIubWdtdC52MWFscGhhMS5HZXRKb2JIb29rc1Jlc3BvbnNlIgOQAgESVgoKR2V0Sm9iSG9vaxIgLm1nbXQudjFhbHBoYTEuR2V0Sm9iSG9va1JlcXVlc3QaIS5tZ210LnYxYWxwaGExLkdldEpvYkhvb2tSZXNwb25zZSIDkAIBElwKDUNyZWF0ZUpvYkhvb2sSIy5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYkhvb2tSZXF1ZXN0GiQubWdtdC52MWFscGhhMS5DcmVhdGVKb2JIb29rUmVzcG9uc2UiABJcCg1EZWxldGVKb2JIb29rEiMubWdtdC52MWFscGhhMS5EZWxldGVKb2JIb29rUmVxdWVzdBokLm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iSG9va1Jlc3BvbnNlIgASdwoWSXNKb2JIb29rTmFtZUF2YWlsYWJsZRIsLm1nbXQudjFhbHBoYTEuSXNKb2JIb29rTmFtZUF2YWlsYWJsZVJlcXVlc3QaLS5tZ210LnYxYWxwaGExLklzSm9iSG9va05hbWVBdmFpbGFibGVSZXNwb25zZSIAElwKDVVwZGF0ZUpvYkhvb2sSIy5tZ210LnYxYWxwaGExLlVwZGF0ZUpvYkhvb2tSZXF1ZXN0GiQubWdtdC52MWFscGhhMS5VcGRhdGVKb2JIb29rUmVzcG9uc2UiABJoChFTZXRKb2JIb29rRW5hYmxlZBInLm1nbXQudjFhbHBoYTEuU2V0Sm9iSG9va0VuYWJsZWRSZXF1ZXN0GigubWdtdC52MWFscGhhMS5TZXRKb2JIb29rRW5hYmxlZFJlc3BvbnNlIgASgwEKGUdldEFjdGl2ZUpvYkhvb2tzQnlUaW1pbmcSLy5tZ210LnYxYWxwaGExLkdldEFjdGl2ZUpvYkhvb2tzQnlUaW1pbmdSZXF1ZXN0GjAubWdtdC52MWFscGhhMS5HZXRBY3RpdmVKb2JIb29rc0J5VGltaW5nUmVzcG9uc2UiA5ACAULEAQoRY29tLm1nbXQudjFhbHBoYTFCCEpvYlByb3RvUAFaUGdpdGh1Yi5jb20vbnVjbGV1c2Nsb3VkL25lb3N5bmMvYmFja2VuZC9nZW4vZ28vcHJvdG9zL21nbXQvdjFhbHBoYTE7bWdtdHYxYWxwaGExogIDTVhYqgINTWdtdC5WMWFscGhhMcoCDU1nbXRcVjFhbHBoYTHiAhlNZ210XFYxYWxwaGExXEdQQk1ldGFkYXRh6gIOTWdtdDo6VjFhbHBoYTFiBnByb3RvMw", [file_buf_validate_validate, file_google_protobuf_timestamp, file_mgmt_v1alpha1_connection_data, file_mgmt_v1alpha1_transformer]); /** * @generated from message mgmt.v1alpha1.GetJobsRequest diff --git a/worker/pkg/workflows/datasync/activities/sync/benthos-stream.go b/internal/benthos-stream/client.go similarity index 69% rename from worker/pkg/workflows/datasync/activities/sync/benthos-stream.go rename to internal/benthos-stream/client.go index fca029e264..d02f981b64 100644 --- a/worker/pkg/workflows/datasync/activities/sync/benthos-stream.go +++ b/internal/benthos-stream/client.go @@ -1,7 +1,9 @@ -package sync_activity +package benthosstream import ( "context" + "fmt" + "sync" "time" "github.com/redpanda-data/benthos/v4/public/service" @@ -32,23 +34,48 @@ func (b *BenthosStreamManager) NewBenthosStreamFromBuilder(streambldr *service.S } type BenthosStreamAdapter struct { + mu *sync.RWMutex Stream *service.Stream } func NewBenthosStreamAdapter(stream *service.Stream) *BenthosStreamAdapter { return &BenthosStreamAdapter{ Stream: stream, + mu: &sync.RWMutex{}, } } func (b *BenthosStreamAdapter) Run(ctx context.Context) error { - return b.Stream.Run(ctx) + b.mu.RLock() + stream := b.Stream + b.mu.RUnlock() + + if stream == nil { + return fmt.Errorf("benthos stream is nil during Run") + } + return stream.Run(ctx) } func (b *BenthosStreamAdapter) Stop(ctx context.Context) error { - return b.Stream.Stop(ctx) + b.mu.Lock() + stream := b.Stream + b.Stream = nil + b.mu.Unlock() + + if stream == nil { + return nil + } + return stream.Stop(ctx) } func (b *BenthosStreamAdapter) StopWithin(d time.Duration) error { - return b.Stream.StopWithin(d) + b.mu.Lock() + stream := b.Stream + b.Stream = nil + b.mu.Unlock() + + if stream == nil { + return nil + } + return stream.StopWithin(d) } diff --git a/internal/benthos/benthos-builder/benthos-builder.go b/internal/benthos/benthos-builder/benthos-builder.go index c6e2f12fd4..a15877bc93 100644 --- a/internal/benthos/benthos-builder/benthos-builder.go +++ b/internal/benthos/benthos-builder/benthos-builder.go @@ -203,7 +203,7 @@ type BenthosConfigManager struct { job *mgmtv1alpha1.Job sourceConnection *mgmtv1alpha1.Connection destinationConnections []*mgmtv1alpha1.Connection - workflowId string + jobRunId string } // Manages all necessary configuration parameters for creating @@ -212,7 +212,7 @@ type WorkerBenthosConfig struct { Job *mgmtv1alpha1.Job SourceConnection *mgmtv1alpha1.Connection DestinationConnections []*mgmtv1alpha1.Connection - WorkflowId string + JobRunId string MetricLabelKeyVals map[string]string Logger *slog.Logger Sqlmanagerclient sqlmanager.SqlManagerClient @@ -259,7 +259,7 @@ func NewWorkerBenthosConfigManager( job: config.Job, sourceConnection: config.SourceConnection, destinationConnections: config.DestinationConnections, - workflowId: config.WorkflowId, + jobRunId: config.JobRunId, }, nil } @@ -291,7 +291,7 @@ type CliBenthosConfig struct { DestinationConnection *mgmtv1alpha1.Connection SourceJobRunId *string // for use when AWS S3 is the source SyncConfigs []*tabledependency.RunConfig - WorkflowId string + JobRunId string MetricLabelKeyVals map[string]string Logger *slog.Logger Sqlmanagerclient sqlmanager.SqlManagerClient @@ -342,7 +342,7 @@ func NewCliBenthosConfigManager( job: config.Job, sourceConnection: config.SourceConnection, destinationConnections: []*mgmtv1alpha1.Connection{config.DestinationConnection}, - workflowId: config.WorkflowId, + jobRunId: config.JobRunId, }, nil } diff --git a/internal/benthos/benthos-builder/builders/aws-s3.go b/internal/benthos/benthos-builder/builders/aws-s3.go index ddfe3b2b32..cee21e3a7f 100644 --- a/internal/benthos/benthos-builder/builders/aws-s3.go +++ b/internal/benthos/benthos-builder/builders/aws-s3.go @@ -49,7 +49,7 @@ func (b *awsS3SyncBuilder) BuildDestinationConfig(ctx context.Context, params *b s3pathpieces = append( s3pathpieces, "workflows", - params.WorkflowId, + params.JobRunId, "activities", neosync_benthos.BuildBenthosTable(benthosConfig.TableSchema, benthosConfig.TableName), "data", diff --git a/internal/benthos/benthos-builder/builders/dynamodb.go b/internal/benthos/benthos-builder/builders/dynamodb.go index cb1e0c3991..240e2c8c8d 100644 --- a/internal/benthos/benthos-builder/builders/dynamodb.go +++ b/internal/benthos/benthos-builder/builders/dynamodb.go @@ -104,7 +104,7 @@ func (b *dyanmodbSyncBuilder) BuildSourceConfigs(ctx context.Context, params *bb map[string][]*bb_internal.ReferenceKey{}, map[string][]*bb_internal.ReferenceKey{}, params.Job.Id, - params.WorkflowId, + params.JobRunId, &neosync_redis.RedisConfig{}, tableMapping.Mappings, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, diff --git a/internal/benthos/benthos-builder/builders/gcp-cloud-storage.go b/internal/benthos/benthos-builder/builders/gcp-cloud-storage.go index 1f9b0769e6..7b147518aa 100644 --- a/internal/benthos/benthos-builder/builders/gcp-cloud-storage.go +++ b/internal/benthos/benthos-builder/builders/gcp-cloud-storage.go @@ -47,7 +47,7 @@ func (b *gcpCloudStorageSyncBuilder) BuildDestinationConfig(ctx context.Context, pathpieces = append( pathpieces, "workflows", - params.WorkflowId, + params.JobRunId, "activities", neosync_benthos.BuildBenthosTable(benthosConfig.TableSchema, benthosConfig.TableName), "data", diff --git a/internal/benthos/benthos-builder/builders/generate-ai.go b/internal/benthos/benthos-builder/builders/generate-ai.go index 71dd63a01b..0aeee289fe 100644 --- a/internal/benthos/benthos-builder/builders/generate-ai.go +++ b/internal/benthos/benthos-builder/builders/generate-ai.go @@ -64,7 +64,7 @@ func (b *generateAIBuilder) BuildSourceConfigs(ctx context.Context, params *bb_i if err != nil { return nil, err } - db, err := b.sqlmanagerclient.NewSqlConnection(ctx, connectionmanager.NewUniqueSession(connectionmanager.WithSessionGroup(params.WorkflowId)), constraintConnection, params.Logger) + db, err := b.sqlmanagerclient.NewSqlConnection(ctx, connectionmanager.NewUniqueSession(connectionmanager.WithSessionGroup(params.JobRunId)), constraintConnection, params.Logger) if err != nil { return nil, fmt.Errorf("unable to create new sql db: %w", err) } diff --git a/internal/benthos/benthos-builder/builders/generate.go b/internal/benthos/benthos-builder/builders/generate.go index ae72578cb8..2261990f2f 100644 --- a/internal/benthos/benthos-builder/builders/generate.go +++ b/internal/benthos/benthos-builder/builders/generate.go @@ -50,7 +50,7 @@ func (b *generateBuilder) BuildSourceConfigs(ctx context.Context, params *bb_int return nil, fmt.Errorf("unable to get connection by id: %w", err) } - db, err := b.sqlmanagerclient.NewSqlConnection(ctx, connectionmanager.NewUniqueSession(connectionmanager.WithSessionGroup(params.WorkflowId)), sourceConnection, logger) + db, err := b.sqlmanagerclient.NewSqlConnection(ctx, connectionmanager.NewUniqueSession(connectionmanager.WithSessionGroup(params.JobRunId)), sourceConnection, logger) if err != nil { return nil, fmt.Errorf("unable to create new sql db: %w", err) } diff --git a/internal/benthos/benthos-builder/builders/mongodb.go b/internal/benthos/benthos-builder/builders/mongodb.go index 2a983b896c..30b430083c 100644 --- a/internal/benthos/benthos-builder/builders/mongodb.go +++ b/internal/benthos/benthos-builder/builders/mongodb.go @@ -73,7 +73,7 @@ func (b *mongodbSyncBuilder) BuildSourceConfigs(ctx context.Context, params *bb_ map[string][]*bb_internal.ReferenceKey{}, map[string][]*bb_internal.ReferenceKey{}, params.Job.Id, - params.WorkflowId, + params.JobRunId, &neosync_redis.RedisConfig{}, tableMapping.Mappings, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, diff --git a/internal/benthos/benthos-builder/builders/sql.go b/internal/benthos/benthos-builder/builders/sql.go index aa062747b4..9b72d69f1c 100644 --- a/internal/benthos/benthos-builder/builders/sql.go +++ b/internal/benthos/benthos-builder/builders/sql.go @@ -71,7 +71,7 @@ func (b *sqlSyncBuilder) BuildSourceConfigs(ctx context.Context, params *bb_inte sourceTableOpts = groupSqlJobSourceOptionsByTable(sqlSourceOpts) } - db, err := b.sqlmanagerclient.NewSqlConnection(ctx, connectionmanager.NewUniqueSession(connectionmanager.WithSessionGroup(params.WorkflowId)), sourceConnection, logger) + db, err := b.sqlmanagerclient.NewSqlConnection(ctx, connectionmanager.NewUniqueSession(connectionmanager.WithSessionGroup(params.JobRunId)), sourceConnection, logger) if err != nil { return nil, fmt.Errorf("unable to create new sql db: %w", err) } @@ -132,7 +132,7 @@ func (b *sqlSyncBuilder) BuildSourceConfigs(ctx context.Context, params *bb_inte tableSubsetMap := buildTableSubsetMap(sourceTableOpts, groupedTableMapping) tableColMap := getTableColMapFromMappings(groupedMappings) - runConfigs, err := tabledependency.GetRunConfigs(filteredForeignKeysMap, tableSubsetMap, tableConstraints.PrimaryKeyConstraints, tableColMap) + runConfigs, err := tabledependency.GetRunConfigs(filteredForeignKeysMap, tableSubsetMap, tableConstraints.PrimaryKeyConstraints, tableColMap, tableConstraints.UniqueIndexes, tableConstraints.UniqueConstraints) if err != nil { return nil, err } @@ -154,7 +154,7 @@ func (b *sqlSyncBuilder) BuildSourceConfigs(ctx context.Context, params *bb_inte } } - configs, err := buildBenthosSqlSourceConfigResponses(logger, ctx, b.transformerclient, groupedTableMapping, runConfigs, sourceConnection.Id, tableRunTypeQueryMap, groupedColumnInfo, filteredForeignKeysMap, colTransformerMap, job.Id, params.WorkflowId, b.redisConfig, primaryKeyToForeignKeysMap) + configs, err := buildBenthosSqlSourceConfigResponses(logger, ctx, b.transformerclient, groupedTableMapping, runConfigs, sourceConnection.Id, tableRunTypeQueryMap, groupedColumnInfo, filteredForeignKeysMap, colTransformerMap, job.Id, params.JobRunId, b.redisConfig, primaryKeyToForeignKeysMap) if err != nil { return nil, fmt.Errorf("unable to build benthos sql source config responses: %w", err) } @@ -200,6 +200,7 @@ func buildBenthosSqlSourceConfigResponses( if !ok { return nil, fmt.Errorf("select query not found for table: %s runType: %s", config.Table(), config.RunType()) } + bc := &neosync_benthos.BenthosConfig{ StreamConfig: neosync_benthos.StreamConfig{ Input: &neosync_benthos.InputConfig{ @@ -207,7 +208,10 @@ func buildBenthosSqlSourceConfigResponses( PooledSqlRaw: &neosync_benthos.InputPooledSqlRaw{ ConnectionId: dsnConnectionId, - Query: query.Query, + Query: query.Query, + PagedQuery: query.PageQuery, + OrderByColumns: config.OrderByColumns(), + ExpectedTotalRows: &query.PageLimit, }, }, }, @@ -285,7 +289,7 @@ func (b *sqlSyncBuilder) BuildDestinationConfig(ctx context.Context, params *bb_ // lazy load if len(b.mergedSchemaColumnMap) == 0 { - sqlSchemaColMap := getSqlSchemaColumnMap(ctx, connectionmanager.NewUniqueSession(connectionmanager.WithSessionGroup(params.WorkflowId)), params.DestConnection, b.sqlSourceSchemaColumnInfoMap, b.sqlmanagerclient, params.Logger) + sqlSchemaColMap := getSqlSchemaColumnMap(ctx, connectionmanager.NewUniqueSession(connectionmanager.WithSessionGroup(params.JobRunId)), params.DestConnection, b.sqlSourceSchemaColumnInfoMap, b.sqlmanagerclient, params.Logger) b.mergedSchemaColumnMap = sqlSchemaColMap } if len(b.mergedSchemaColumnMap) == 0 { @@ -371,7 +375,7 @@ func (b *sqlSyncBuilder) BuildDestinationConfig(ctx context.Context, params *bb_ if b.redisConfig == nil { return nil, fmt.Errorf("missing redis config. this operation requires redis") } - hashedKey := neosync_benthos.HashBenthosCacheKey(params.Job.GetId(), params.WorkflowId, tableKey, col) + hashedKey := neosync_benthos.HashBenthosCacheKey(params.Job.GetId(), params.JobRunId, tableKey, col) config.Outputs = append(config.Outputs, neosync_benthos.Outputs{ RedisHashOutput: &neosync_benthos.RedisHashOutputConfig{ Url: b.redisConfig.Url, diff --git a/internal/benthos/benthos-builder/generate-benthos.go b/internal/benthos/benthos-builder/generate-benthos.go index 8c039843b3..78544fd45d 100644 --- a/internal/benthos/benthos-builder/generate-benthos.go +++ b/internal/benthos/benthos-builder/generate-benthos.go @@ -24,7 +24,7 @@ func (b *BenthosConfigManager) GenerateBenthosConfigs( sourceParams := &bb_internal.SourceParams{ Job: b.job, - WorkflowId: b.workflowId, + JobRunId: b.jobRunId, SourceConnection: b.sourceConnection, Logger: b.logger, } @@ -55,7 +55,7 @@ func (b *BenthosConfigManager) GenerateBenthosConfigs( destParams := &bb_internal.DestinationParams{ SourceConfig: sourceConfig, Job: b.job, - WorkflowId: b.workflowId, + JobRunId: b.jobRunId, DestinationOpts: destOpts, DestConnection: destConnection, Logger: b.logger, diff --git a/internal/benthos/benthos-builder/internal/types.go b/internal/benthos/benthos-builder/internal/types.go index ba06270826..7a5185d1bd 100644 --- a/internal/benthos/benthos-builder/internal/types.go +++ b/internal/benthos/benthos-builder/internal/types.go @@ -69,7 +69,7 @@ type BenthosBuilder interface { // SourceParams contains all parameters needed to build a source benthos configuration type SourceParams struct { Job *mgmtv1alpha1.Job - WorkflowId string + JobRunId string SourceConnection *mgmtv1alpha1.Connection Logger *slog.Logger } @@ -83,7 +83,7 @@ type ReferenceKey struct { type DestinationParams struct { SourceConfig *BenthosSourceConfig Job *mgmtv1alpha1.Job - WorkflowId string + JobRunId string DestinationOpts *mgmtv1alpha1.JobDestinationOptions DestConnection *mgmtv1alpha1.Connection Logger *slog.Logger diff --git a/internal/continuation-token/continuation-token.go b/internal/continuation-token/continuation-token.go new file mode 100644 index 0000000000..e19e797909 --- /dev/null +++ b/internal/continuation-token/continuation-token.go @@ -0,0 +1,52 @@ +package continuation_token + +import ( + "encoding/base64" + "encoding/json" + "fmt" +) + +func FromTokenString(tokenStr string) (*ContinuationToken, error) { + if tokenStr == "" { + return nil, nil + } + + bytes, err := base64.StdEncoding.DecodeString(tokenStr) + if err != nil { + return nil, fmt.Errorf("unable to decode continuation token: %w", err) + } + + var token ContinuationToken + if err := json.Unmarshal(bytes, &token); err != nil { + return nil, fmt.Errorf("unable to unmarshal continuation token: %w", err) + } + + return &token, nil +} + +type ContinuationToken struct { + Contents *Contents `json:"contents"` +} +type Contents struct { + LastReadOrderValues []any `json:"lastReadOrderValues"` +} + +func NewContents(lastReadOrderValues []any) *Contents { + return &Contents{ + LastReadOrderValues: lastReadOrderValues, + } +} + +func NewFromContents(contents *Contents) *ContinuationToken { + return &ContinuationToken{ + Contents: contents, + } +} + +func (c *ContinuationToken) String() string { + bytes, err := json.Marshal(c) + if err != nil { + return "" + } + return base64.StdEncoding.EncodeToString(bytes) +} diff --git a/internal/integration-tests/worker/workflow/datasync-workflow.go b/internal/integration-tests/worker/workflow/datasync-workflow.go index 9d84ca6e16..5e49479dc0 100644 --- a/internal/integration-tests/worker/workflow/datasync-workflow.go +++ b/internal/integration-tests/worker/workflow/datasync-workflow.go @@ -8,6 +8,7 @@ import ( tcneosyncapi "github.com/nucleuscloud/neosync/backend/pkg/integration-test" "github.com/nucleuscloud/neosync/backend/pkg/sqlconnect" sql_manager "github.com/nucleuscloud/neosync/backend/pkg/sqlmanager" + benthosstream "github.com/nucleuscloud/neosync/internal/benthos-stream" connectionmanager "github.com/nucleuscloud/neosync/internal/connection-manager" "github.com/nucleuscloud/neosync/internal/connection-manager/providers/mongoprovider" "github.com/nucleuscloud/neosync/internal/connection-manager/providers/sqlprovider" @@ -20,10 +21,10 @@ import ( jobhooks_by_timing_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/jobhooks-by-timing" posttablesync_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/post-table-sync" runsqlinittablestmts_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/run-sql-init-table-stmts" - sync_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/sync" syncactivityopts_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/sync-activity-opts" syncrediscleanup_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/sync-redis-clean-up" datasync_workflow "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/workflow" + tablesync_workflow_register "github.com/nucleuscloud/neosync/worker/pkg/workflows/tablesync/workflow/register" "github.com/redis/go-redis/v9" "github.com/stretchr/testify/require" "go.opentelemetry.io/otel/metric" @@ -108,7 +109,6 @@ func NewTestDataSyncWorkflowEnv( ) var activityMeter metric.Meter - syncActivity := sync_activity.New(connclient, jobclient, dbManagers.SqlConnManager, dbManagers.MongoConnManager, activityMeter, sync_activity.NewBenthosStreamManager()) retrieveActivityOpts := syncactivityopts_activity.New(jobclient) runSqlInitTableStatements := runsqlinittablestmts_activity.New(jobclient, connclient, dbManagers.SqlManager, workflowEnv.fakeEELicense) jobhookTimingActivity := jobhooks_by_timing_activity.New(jobclient, connclient, dbManagers.SqlManager, workflowEnv.fakeEELicense) @@ -117,7 +117,6 @@ func NewTestDataSyncWorkflowEnv( redisCleanUpActivity := syncrediscleanup_activity.New(workflowEnv.Redisclient) env.RegisterWorkflow(datasync_workflow.Workflow) - env.RegisterActivity(syncActivity.Sync) env.RegisterActivity(retrieveActivityOpts.RetrieveActivityOptions) env.RegisterActivity(runSqlInitTableStatements.RunSqlInitTableStatements) env.RegisterActivity(redisCleanUpActivity.DeleteRedisHash) @@ -125,6 +124,17 @@ func NewTestDataSyncWorkflowEnv( env.RegisterActivity(accountStatusActivity.CheckAccountStatus) env.RegisterActivity(jobhookTimingActivity.RunJobHooksByTiming) env.RegisterActivity(posttableSyncActivity.RunPostTableSync) + + tablesync_workflow_register.Register( + env, + connclient, + jobclient, + dbManagers.SqlConnManager, + dbManagers.MongoConnManager, + activityMeter, + benthosstream.NewBenthosStreamManager(), + ) + env.SetTestTimeout(600 * time.Second) workflowEnv.TestEnv = env diff --git a/python/src/neosync/mgmt/v1alpha1/connection_data_pb2.py b/python/src/neosync/mgmt/v1alpha1/connection_data_pb2.py index d4874b767e..1ef88920d3 100644 --- a/python/src/neosync/mgmt/v1alpha1/connection_data_pb2.py +++ b/python/src/neosync/mgmt/v1alpha1/connection_data_pb2.py @@ -26,7 +26,7 @@ from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#mgmt/v1alpha1/connection_data.proto\x12\rmgmt.v1alpha1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x16\n\x14PostgresStreamConfig\"\x13\n\x11MysqlStreamConfig\"\x19\n\x17\x41wsDynamoDBStreamConfig\"e\n\x11\x41wsS3StreamConfig\x12!\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x05jobId\x12\'\n\njob_run_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x08jobRunIdB\x04\n\x02id\"o\n\x1bGcpCloudStorageStreamConfig\x12!\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x05jobId\x12\'\n\njob_run_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x08jobRunIdB\x04\n\x02id\"\xb5\x03\n\x16\x43onnectionStreamConfig\x12\x42\n\tpg_config\x18\x01 \x01(\x0b\x32#.mgmt.v1alpha1.PostgresStreamConfigH\x00R\x08pgConfig\x12\x46\n\raws_s3_config\x18\x02 \x01(\x0b\x32 .mgmt.v1alpha1.AwsS3StreamConfigH\x00R\x0b\x61wsS3Config\x12\x45\n\x0cmysql_config\x18\x03 \x01(\x0b\x32 .mgmt.v1alpha1.MysqlStreamConfigH\x00R\x0bmysqlConfig\x12\x64\n\x17gcp_cloudstorage_config\x18\x04 \x01(\x0b\x32*.mgmt.v1alpha1.GcpCloudStorageStreamConfigH\x00R\x15gcpCloudstorageConfig\x12Q\n\x0f\x64ynamodb_config\x18\x05 \x01(\x0b\x32&.mgmt.v1alpha1.AwsDynamoDBStreamConfigH\x00R\x0e\x64ynamodbConfigB\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01\"\xc9\x01\n\x1eGetConnectionDataStreamRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12J\n\rstream_config\x18\x02 \x01(\x0b\x32%.mgmt.v1alpha1.ConnectionStreamConfigR\x0cstreamConfig\x12\x16\n\x06schema\x18\x03 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x04 \x01(\tR\x05table\"D\n\x1fGetConnectionDataStreamResponse\x12\x1b\n\trow_bytes\x18\x02 \x01(\x0cR\x08rowBytesJ\x04\x08\x01\x10\x02\"\x16\n\x14PostgresSchemaConfig\"\x13\n\x11MysqlSchemaConfig\"\x13\n\x11MssqlSchemaConfig\"e\n\x11\x41wsS3SchemaConfig\x12!\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x05jobId\x12\'\n\njob_run_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x08jobRunIdB\x04\n\x02id\"\x13\n\x11MongoSchemaConfig\"\x16\n\x14\x44ynamoDBSchemaConfig\"o\n\x1bGcpCloudStorageSchemaConfig\x12!\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x05jobId\x12\'\n\njob_run_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x08jobRunIdB\x04\n\x02id\"\xc0\x04\n\x16\x43onnectionSchemaConfig\x12\x42\n\tpg_config\x18\x01 \x01(\x0b\x32#.mgmt.v1alpha1.PostgresSchemaConfigH\x00R\x08pgConfig\x12\x46\n\raws_s3_config\x18\x02 \x01(\x0b\x32 .mgmt.v1alpha1.AwsS3SchemaConfigH\x00R\x0b\x61wsS3Config\x12\x45\n\x0cmysql_config\x18\x03 \x01(\x0b\x32 .mgmt.v1alpha1.MysqlSchemaConfigH\x00R\x0bmysqlConfig\x12\x45\n\x0cmongo_config\x18\x04 \x01(\x0b\x32 .mgmt.v1alpha1.MongoSchemaConfigH\x00R\x0bmongoConfig\x12\x64\n\x17gcp_cloudstorage_config\x18\x05 \x01(\x0b\x32*.mgmt.v1alpha1.GcpCloudStorageSchemaConfigH\x00R\x15gcpCloudstorageConfig\x12N\n\x0f\x64ynamodb_config\x18\x06 \x01(\x0b\x32#.mgmt.v1alpha1.DynamoDBSchemaConfigH\x00R\x0e\x64ynamodbConfig\x12\x45\n\x0cmssql_config\x18\x07 \x01(\x0b\x32 .mgmt.v1alpha1.MssqlSchemaConfigH\x00R\x0bmssqlConfigB\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01\"\xe0\x02\n\x0e\x44\x61tabaseColumn\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12\x16\n\x06\x63olumn\x18\x03 \x01(\tR\x06\x63olumn\x12\x1b\n\tdata_type\x18\x04 \x01(\tR\x08\x64\x61taType\x12\x1f\n\x0bis_nullable\x18\x05 \x01(\tR\nisNullable\x12*\n\x0e\x63olumn_default\x18\x06 \x01(\tH\x00R\rcolumnDefault\x88\x01\x01\x12*\n\x0egenerated_type\x18\x07 \x01(\tH\x01R\rgeneratedType\x88\x01\x01\x12\x34\n\x13identity_generation\x18\x08 \x01(\tH\x02R\x12identityGeneration\x88\x01\x01\x42\x11\n\x0f_column_defaultB\x11\n\x0f_generated_typeB\x16\n\x14_identity_generation\"\x97\x01\n\x1aGetConnectionSchemaRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12J\n\rschema_config\x18\x02 \x01(\x0b\x32%.mgmt.v1alpha1.ConnectionSchemaConfigR\x0cschemaConfig\"V\n\x1bGetConnectionSchemaResponse\x12\x37\n\x07schemas\x18\x01 \x03(\x0b\x32\x1d.mgmt.v1alpha1.DatabaseColumnR\x07schemas\"\x9a\x01\n\x1dGetConnectionSchemaMapRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12J\n\rschema_config\x18\x02 \x01(\x0b\x32%.mgmt.v1alpha1.ConnectionSchemaConfigR\x0cschemaConfig\"\xe7\x01\n\x1eGetConnectionSchemaMapResponse\x12[\n\nschema_map\x18\x01 \x03(\x0b\x32<.mgmt.v1alpha1.GetConnectionSchemaMapResponse.SchemaMapEntryR\tschemaMap\x1ah\n\x0eSchemaMapEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12@\n\x05value\x18\x02 \x01(\x0b\x32*.mgmt.v1alpha1.GetConnectionSchemaResponseR\x05value:\x02\x38\x01\"j\n\x1eGetConnectionSchemaMapsRequest\x12H\n\x08requests\x18\x01 \x03(\x0b\x32,.mgmt.v1alpha1.GetConnectionSchemaMapRequestR\x08requests\"\x95\x01\n\x1fGetConnectionSchemaMapsResponse\x12K\n\tresponses\x18\x01 \x03(\x0b\x32-.mgmt.v1alpha1.GetConnectionSchemaMapResponseR\tresponses\x12%\n\x0e\x63onnection_ids\x18\x02 \x03(\tR\rconnectionIds\"B\n\nForeignKey\x12\x14\n\x05table\x18\x01 \x01(\tR\x05table\x12\x18\n\x07\x63olumns\x18\x03 \x03(\tR\x07\x63olumnsJ\x04\x08\x02\x10\x03\"\x98\x01\n\x11\x46oreignConstraint\x12:\n\x0b\x66oreign_key\x18\x03 \x01(\x0b\x32\x19.mgmt.v1alpha1.ForeignKeyR\nforeignKey\x12\x18\n\x07\x63olumns\x18\x04 \x03(\tR\x07\x63olumns\x12!\n\x0cnot_nullable\x18\x05 \x03(\x08R\x0bnotNullableJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03\"]\n\x17\x46oreignConstraintTables\x12\x42\n\x0b\x63onstraints\x18\x01 \x03(\x0b\x32 .mgmt.v1alpha1.ForeignConstraintR\x0b\x63onstraints\"\x98\x01\n\x14InitStatementOptions\x12\x1f\n\x0binit_schema\x18\x01 \x01(\x08R\ninitSchema\x12\x34\n\x16truncate_before_insert\x18\x02 \x01(\x08R\x14truncateBeforeInsert\x12)\n\x10truncate_cascade\x18\x03 \x01(\x08R\x0ftruncateCascade\"\x92\x01\n\"GetConnectionInitStatementsRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12=\n\x07options\x18\x02 \x01(\x0b\x32#.mgmt.v1alpha1.InitStatementOptionsR\x07options\"L\n\x14SchemaInitStatements\x12\x14\n\x05label\x18\x01 \x01(\tR\x05label\x12\x1e\n\nstatements\x18\x02 \x03(\tR\nstatements\"\xa8\x04\n#GetConnectionInitStatementsResponse\x12\x83\x01\n\x15table_init_statements\x18\x01 \x03(\x0b\x32K.mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableInitStatementsEntryB\x02\x18\x01R\x13tableInitStatements\x12\x8b\x01\n\x19table_truncate_statements\x18\x02 \x03(\x0b\x32O.mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableTruncateStatementsEntryR\x17tableTruncateStatements\x12Y\n\x16schema_init_statements\x18\x03 \x03(\x0b\x32#.mgmt.v1alpha1.SchemaInitStatementsR\x14schemaInitStatements\x1a\x46\n\x18TableInitStatementsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x1aJ\n\x1cTableTruncateStatementsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"-\n\x11PrimaryConstraint\x12\x18\n\x07\x63olumns\x18\x01 \x03(\tR\x07\x63olumns\",\n\x10UniqueConstraint\x12\x18\n\x07\x63olumns\x18\x01 \x03(\tR\x07\x63olumns\"\xba\x02\n\x19GetAiGeneratedDataRequest\x12\x32\n\x10\x61i_connection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0e\x61iConnectionId\x12\x1f\n\x05\x63ount\x18\x02 \x01(\x03\x42\t\xbaH\x06\"\x04\x18\n(\x01R\x05\x63ount\x12&\n\nmodel_name\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\tmodelName\x12$\n\x0buser_prompt\x18\x04 \x01(\tH\x00R\nuserPrompt\x88\x01\x01\x12\x36\n\x12\x64\x61ta_connection_id\x18\x05 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x10\x64\x61taConnectionId\x12\x32\n\x05table\x18\x06 \x01(\x0b\x32\x1c.mgmt.v1alpha1.DatabaseTableR\x05tableB\x0e\n\x0c_user_prompt\"O\n\rDatabaseTable\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12\x1d\n\x05table\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\"O\n\x1aGetAiGeneratedDataResponse\x12\x31\n\x07records\x18\x01 \x03(\x0b\x32\x17.google.protobuf.StructR\x07records\"U\n$GetConnectionTableConstraintsRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\"V\n\x11UniqueConstraints\x12\x41\n\x0b\x63onstraints\x18\x01 \x03(\x0b\x32\x1f.mgmt.v1alpha1.UniqueConstraintR\x0b\x63onstraints\"\xfd\x05\n%GetConnectionTableConstraintsResponse\x12\x87\x01\n\x17\x66oreign_key_constraints\x18\x01 \x03(\x0b\x32O.mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntryR\x15\x66oreignKeyConstraints\x12\x87\x01\n\x17primary_key_constraints\x18\x02 \x03(\x0b\x32O.mgmt.v1alpha1.GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntryR\x15primaryKeyConstraints\x12z\n\x12unique_constraints\x18\x03 \x03(\x0b\x32K.mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueConstraintsEntryR\x11uniqueConstraints\x1ap\n\x1a\x46oreignKeyConstraintsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12<\n\x05value\x18\x02 \x01(\x0b\x32&.mgmt.v1alpha1.ForeignConstraintTablesR\x05value:\x02\x38\x01\x1aj\n\x1aPrimaryKeyConstraintsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32 .mgmt.v1alpha1.PrimaryConstraintR\x05value:\x02\x38\x01\x1a\x66\n\x16UniqueConstraintsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32 .mgmt.v1alpha1.UniqueConstraintsR\x05value:\x02\x38\x01\"\xc1\x01\n\x17GetTableRowCountRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12\x1f\n\x06schema\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12\x1d\n\x05table\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12&\n\x0cwhere_clause\x18\x04 \x01(\tH\x00R\x0bwhereClause\x88\x01\x01\x42\x0f\n\r_where_clause\"0\n\x18GetTableRowCountResponse\x12\x14\n\x05\x63ount\x18\x01 \x01(\x03R\x05\x63ount2\xe9\x07\n\x15\x43onnectionDataService\x12|\n\x17GetConnectionDataStream\x12-.mgmt.v1alpha1.GetConnectionDataStreamRequest\x1a..mgmt.v1alpha1.GetConnectionDataStreamResponse\"\x00\x30\x01\x12n\n\x13GetConnectionSchema\x12).mgmt.v1alpha1.GetConnectionSchemaRequest\x1a*.mgmt.v1alpha1.GetConnectionSchemaResponse\"\x00\x12w\n\x16GetConnectionSchemaMap\x12,.mgmt.v1alpha1.GetConnectionSchemaMapRequest\x1a-.mgmt.v1alpha1.GetConnectionSchemaMapResponse\"\x00\x12z\n\x17GetConnectionSchemaMaps\x12-.mgmt.v1alpha1.GetConnectionSchemaMapsRequest\x1a..mgmt.v1alpha1.GetConnectionSchemaMapsResponse\"\x00\x12\x8c\x01\n\x1dGetConnectionTableConstraints\x12\x33.mgmt.v1alpha1.GetConnectionTableConstraintsRequest\x1a\x34.mgmt.v1alpha1.GetConnectionTableConstraintsResponse\"\x00\x12\x86\x01\n\x1bGetConnectionInitStatements\x12\x31.mgmt.v1alpha1.GetConnectionInitStatementsRequest\x1a\x32.mgmt.v1alpha1.GetConnectionInitStatementsResponse\"\x00\x12k\n\x12GetAiGeneratedData\x12(.mgmt.v1alpha1.GetAiGeneratedDataRequest\x1a).mgmt.v1alpha1.GetAiGeneratedDataResponse\"\x00\x12h\n\x10GetTableRowCount\x12&.mgmt.v1alpha1.GetTableRowCountRequest\x1a\'.mgmt.v1alpha1.GetTableRowCountResponse\"\x03\x90\x02\x01\x42\xcf\x01\n\x11\x63om.mgmt.v1alpha1B\x13\x43onnectionDataProtoP\x01ZPgithub.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1;mgmtv1alpha1\xa2\x02\x03MXX\xaa\x02\rMgmt.V1alpha1\xca\x02\rMgmt\\V1alpha1\xe2\x02\x19Mgmt\\V1alpha1\\GPBMetadata\xea\x02\x0eMgmt::V1alpha1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#mgmt/v1alpha1/connection_data.proto\x12\rmgmt.v1alpha1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x16\n\x14PostgresStreamConfig\"\x13\n\x11MysqlStreamConfig\"\x19\n\x17\x41wsDynamoDBStreamConfig\"e\n\x11\x41wsS3StreamConfig\x12!\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x05jobId\x12\'\n\njob_run_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x08jobRunIdB\x04\n\x02id\"o\n\x1bGcpCloudStorageStreamConfig\x12!\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x05jobId\x12\'\n\njob_run_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x08jobRunIdB\x04\n\x02id\"\xb5\x03\n\x16\x43onnectionStreamConfig\x12\x42\n\tpg_config\x18\x01 \x01(\x0b\x32#.mgmt.v1alpha1.PostgresStreamConfigH\x00R\x08pgConfig\x12\x46\n\raws_s3_config\x18\x02 \x01(\x0b\x32 .mgmt.v1alpha1.AwsS3StreamConfigH\x00R\x0b\x61wsS3Config\x12\x45\n\x0cmysql_config\x18\x03 \x01(\x0b\x32 .mgmt.v1alpha1.MysqlStreamConfigH\x00R\x0bmysqlConfig\x12\x64\n\x17gcp_cloudstorage_config\x18\x04 \x01(\x0b\x32*.mgmt.v1alpha1.GcpCloudStorageStreamConfigH\x00R\x15gcpCloudstorageConfig\x12Q\n\x0f\x64ynamodb_config\x18\x05 \x01(\x0b\x32&.mgmt.v1alpha1.AwsDynamoDBStreamConfigH\x00R\x0e\x64ynamodbConfigB\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01\"\xc9\x01\n\x1eGetConnectionDataStreamRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12J\n\rstream_config\x18\x02 \x01(\x0b\x32%.mgmt.v1alpha1.ConnectionStreamConfigR\x0cstreamConfig\x12\x16\n\x06schema\x18\x03 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x04 \x01(\tR\x05table\"D\n\x1fGetConnectionDataStreamResponse\x12\x1b\n\trow_bytes\x18\x02 \x01(\x0cR\x08rowBytesJ\x04\x08\x01\x10\x02\"\x16\n\x14PostgresSchemaConfig\"\x13\n\x11MysqlSchemaConfig\"\x13\n\x11MssqlSchemaConfig\"e\n\x11\x41wsS3SchemaConfig\x12!\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x05jobId\x12\'\n\njob_run_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x08jobRunIdB\x04\n\x02id\"\x13\n\x11MongoSchemaConfig\"\x16\n\x14\x44ynamoDBSchemaConfig\"o\n\x1bGcpCloudStorageSchemaConfig\x12!\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x05jobId\x12\'\n\njob_run_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x08jobRunIdB\x04\n\x02id\"\xc0\x04\n\x16\x43onnectionSchemaConfig\x12\x42\n\tpg_config\x18\x01 \x01(\x0b\x32#.mgmt.v1alpha1.PostgresSchemaConfigH\x00R\x08pgConfig\x12\x46\n\raws_s3_config\x18\x02 \x01(\x0b\x32 .mgmt.v1alpha1.AwsS3SchemaConfigH\x00R\x0b\x61wsS3Config\x12\x45\n\x0cmysql_config\x18\x03 \x01(\x0b\x32 .mgmt.v1alpha1.MysqlSchemaConfigH\x00R\x0bmysqlConfig\x12\x45\n\x0cmongo_config\x18\x04 \x01(\x0b\x32 .mgmt.v1alpha1.MongoSchemaConfigH\x00R\x0bmongoConfig\x12\x64\n\x17gcp_cloudstorage_config\x18\x05 \x01(\x0b\x32*.mgmt.v1alpha1.GcpCloudStorageSchemaConfigH\x00R\x15gcpCloudstorageConfig\x12N\n\x0f\x64ynamodb_config\x18\x06 \x01(\x0b\x32#.mgmt.v1alpha1.DynamoDBSchemaConfigH\x00R\x0e\x64ynamodbConfig\x12\x45\n\x0cmssql_config\x18\x07 \x01(\x0b\x32 .mgmt.v1alpha1.MssqlSchemaConfigH\x00R\x0bmssqlConfigB\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01\"\xe0\x02\n\x0e\x44\x61tabaseColumn\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12\x16\n\x06\x63olumn\x18\x03 \x01(\tR\x06\x63olumn\x12\x1b\n\tdata_type\x18\x04 \x01(\tR\x08\x64\x61taType\x12\x1f\n\x0bis_nullable\x18\x05 \x01(\tR\nisNullable\x12*\n\x0e\x63olumn_default\x18\x06 \x01(\tH\x00R\rcolumnDefault\x88\x01\x01\x12*\n\x0egenerated_type\x18\x07 \x01(\tH\x01R\rgeneratedType\x88\x01\x01\x12\x34\n\x13identity_generation\x18\x08 \x01(\tH\x02R\x12identityGeneration\x88\x01\x01\x42\x11\n\x0f_column_defaultB\x11\n\x0f_generated_typeB\x16\n\x14_identity_generation\"\x97\x01\n\x1aGetConnectionSchemaRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12J\n\rschema_config\x18\x02 \x01(\x0b\x32%.mgmt.v1alpha1.ConnectionSchemaConfigR\x0cschemaConfig\"V\n\x1bGetConnectionSchemaResponse\x12\x37\n\x07schemas\x18\x01 \x03(\x0b\x32\x1d.mgmt.v1alpha1.DatabaseColumnR\x07schemas\"\x9a\x01\n\x1dGetConnectionSchemaMapRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12J\n\rschema_config\x18\x02 \x01(\x0b\x32%.mgmt.v1alpha1.ConnectionSchemaConfigR\x0cschemaConfig\"\xe7\x01\n\x1eGetConnectionSchemaMapResponse\x12[\n\nschema_map\x18\x01 \x03(\x0b\x32<.mgmt.v1alpha1.GetConnectionSchemaMapResponse.SchemaMapEntryR\tschemaMap\x1ah\n\x0eSchemaMapEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12@\n\x05value\x18\x02 \x01(\x0b\x32*.mgmt.v1alpha1.GetConnectionSchemaResponseR\x05value:\x02\x38\x01\"j\n\x1eGetConnectionSchemaMapsRequest\x12H\n\x08requests\x18\x01 \x03(\x0b\x32,.mgmt.v1alpha1.GetConnectionSchemaMapRequestR\x08requests\"\x95\x01\n\x1fGetConnectionSchemaMapsResponse\x12K\n\tresponses\x18\x01 \x03(\x0b\x32-.mgmt.v1alpha1.GetConnectionSchemaMapResponseR\tresponses\x12%\n\x0e\x63onnection_ids\x18\x02 \x03(\tR\rconnectionIds\"B\n\nForeignKey\x12\x14\n\x05table\x18\x01 \x01(\tR\x05table\x12\x18\n\x07\x63olumns\x18\x03 \x03(\tR\x07\x63olumnsJ\x04\x08\x02\x10\x03\"\x98\x01\n\x11\x46oreignConstraint\x12:\n\x0b\x66oreign_key\x18\x03 \x01(\x0b\x32\x19.mgmt.v1alpha1.ForeignKeyR\nforeignKey\x12\x18\n\x07\x63olumns\x18\x04 \x03(\tR\x07\x63olumns\x12!\n\x0cnot_nullable\x18\x05 \x03(\x08R\x0bnotNullableJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03\"]\n\x17\x46oreignConstraintTables\x12\x42\n\x0b\x63onstraints\x18\x01 \x03(\x0b\x32 .mgmt.v1alpha1.ForeignConstraintR\x0b\x63onstraints\"\x98\x01\n\x14InitStatementOptions\x12\x1f\n\x0binit_schema\x18\x01 \x01(\x08R\ninitSchema\x12\x34\n\x16truncate_before_insert\x18\x02 \x01(\x08R\x14truncateBeforeInsert\x12)\n\x10truncate_cascade\x18\x03 \x01(\x08R\x0ftruncateCascade\"\x92\x01\n\"GetConnectionInitStatementsRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12=\n\x07options\x18\x02 \x01(\x0b\x32#.mgmt.v1alpha1.InitStatementOptionsR\x07options\"L\n\x14SchemaInitStatements\x12\x14\n\x05label\x18\x01 \x01(\tR\x05label\x12\x1e\n\nstatements\x18\x02 \x03(\tR\nstatements\"\xa8\x04\n#GetConnectionInitStatementsResponse\x12\x83\x01\n\x15table_init_statements\x18\x01 \x03(\x0b\x32K.mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableInitStatementsEntryB\x02\x18\x01R\x13tableInitStatements\x12\x8b\x01\n\x19table_truncate_statements\x18\x02 \x03(\x0b\x32O.mgmt.v1alpha1.GetConnectionInitStatementsResponse.TableTruncateStatementsEntryR\x17tableTruncateStatements\x12Y\n\x16schema_init_statements\x18\x03 \x03(\x0b\x32#.mgmt.v1alpha1.SchemaInitStatementsR\x14schemaInitStatements\x1a\x46\n\x18TableInitStatementsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x1aJ\n\x1cTableTruncateStatementsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\"-\n\x11PrimaryConstraint\x12\x18\n\x07\x63olumns\x18\x01 \x03(\tR\x07\x63olumns\",\n\x10UniqueConstraint\x12\x18\n\x07\x63olumns\x18\x01 \x03(\tR\x07\x63olumns\"\xba\x02\n\x19GetAiGeneratedDataRequest\x12\x32\n\x10\x61i_connection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0e\x61iConnectionId\x12\x1f\n\x05\x63ount\x18\x02 \x01(\x03\x42\t\xbaH\x06\"\x04\x18\n(\x01R\x05\x63ount\x12&\n\nmodel_name\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\tmodelName\x12$\n\x0buser_prompt\x18\x04 \x01(\tH\x00R\nuserPrompt\x88\x01\x01\x12\x36\n\x12\x64\x61ta_connection_id\x18\x05 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x10\x64\x61taConnectionId\x12\x32\n\x05table\x18\x06 \x01(\x0b\x32\x1c.mgmt.v1alpha1.DatabaseTableR\x05tableB\x0e\n\x0c_user_prompt\"O\n\rDatabaseTable\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12\x1d\n\x05table\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\"O\n\x1aGetAiGeneratedDataResponse\x12\x31\n\x07records\x18\x01 \x03(\x0b\x32\x17.google.protobuf.StructR\x07records\"U\n$GetConnectionTableConstraintsRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\"V\n\x11UniqueConstraints\x12\x41\n\x0b\x63onstraints\x18\x01 \x03(\x0b\x32\x1f.mgmt.v1alpha1.UniqueConstraintR\x0b\x63onstraints\"E\n\rUniqueIndexes\x12\x34\n\x07indexes\x18\x01 \x03(\x0b\x32\x1a.mgmt.v1alpha1.UniqueIndexR\x07indexes\"\'\n\x0bUniqueIndex\x12\x18\n\x07\x63olumns\x18\x01 \x03(\tR\x07\x63olumns\"\xcd\x07\n%GetConnectionTableConstraintsResponse\x12\x87\x01\n\x17\x66oreign_key_constraints\x18\x01 \x03(\x0b\x32O.mgmt.v1alpha1.GetConnectionTableConstraintsResponse.ForeignKeyConstraintsEntryR\x15\x66oreignKeyConstraints\x12\x87\x01\n\x17primary_key_constraints\x18\x02 \x03(\x0b\x32O.mgmt.v1alpha1.GetConnectionTableConstraintsResponse.PrimaryKeyConstraintsEntryR\x15primaryKeyConstraints\x12z\n\x12unique_constraints\x18\x03 \x03(\x0b\x32K.mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueConstraintsEntryR\x11uniqueConstraints\x12n\n\x0eunique_indexes\x18\x04 \x03(\x0b\x32G.mgmt.v1alpha1.GetConnectionTableConstraintsResponse.UniqueIndexesEntryR\runiqueIndexes\x1ap\n\x1a\x46oreignKeyConstraintsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12<\n\x05value\x18\x02 \x01(\x0b\x32&.mgmt.v1alpha1.ForeignConstraintTablesR\x05value:\x02\x38\x01\x1aj\n\x1aPrimaryKeyConstraintsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32 .mgmt.v1alpha1.PrimaryConstraintR\x05value:\x02\x38\x01\x1a\x66\n\x16UniqueConstraintsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32 .mgmt.v1alpha1.UniqueConstraintsR\x05value:\x02\x38\x01\x1a^\n\x12UniqueIndexesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x32\n\x05value\x18\x02 \x01(\x0b\x32\x1c.mgmt.v1alpha1.UniqueIndexesR\x05value:\x02\x38\x01\"\xc1\x01\n\x17GetTableRowCountRequest\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12\x1f\n\x06schema\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12\x1d\n\x05table\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12&\n\x0cwhere_clause\x18\x04 \x01(\tH\x00R\x0bwhereClause\x88\x01\x01\x42\x0f\n\r_where_clause\"0\n\x18GetTableRowCountResponse\x12\x14\n\x05\x63ount\x18\x01 \x01(\x03R\x05\x63ount2\xe9\x07\n\x15\x43onnectionDataService\x12|\n\x17GetConnectionDataStream\x12-.mgmt.v1alpha1.GetConnectionDataStreamRequest\x1a..mgmt.v1alpha1.GetConnectionDataStreamResponse\"\x00\x30\x01\x12n\n\x13GetConnectionSchema\x12).mgmt.v1alpha1.GetConnectionSchemaRequest\x1a*.mgmt.v1alpha1.GetConnectionSchemaResponse\"\x00\x12w\n\x16GetConnectionSchemaMap\x12,.mgmt.v1alpha1.GetConnectionSchemaMapRequest\x1a-.mgmt.v1alpha1.GetConnectionSchemaMapResponse\"\x00\x12z\n\x17GetConnectionSchemaMaps\x12-.mgmt.v1alpha1.GetConnectionSchemaMapsRequest\x1a..mgmt.v1alpha1.GetConnectionSchemaMapsResponse\"\x00\x12\x8c\x01\n\x1dGetConnectionTableConstraints\x12\x33.mgmt.v1alpha1.GetConnectionTableConstraintsRequest\x1a\x34.mgmt.v1alpha1.GetConnectionTableConstraintsResponse\"\x00\x12\x86\x01\n\x1bGetConnectionInitStatements\x12\x31.mgmt.v1alpha1.GetConnectionInitStatementsRequest\x1a\x32.mgmt.v1alpha1.GetConnectionInitStatementsResponse\"\x00\x12k\n\x12GetAiGeneratedData\x12(.mgmt.v1alpha1.GetAiGeneratedDataRequest\x1a).mgmt.v1alpha1.GetAiGeneratedDataResponse\"\x00\x12h\n\x10GetTableRowCount\x12&.mgmt.v1alpha1.GetTableRowCountRequest\x1a\'.mgmt.v1alpha1.GetTableRowCountResponse\"\x03\x90\x02\x01\x42\xcf\x01\n\x11\x63om.mgmt.v1alpha1B\x13\x43onnectionDataProtoP\x01ZPgithub.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1;mgmtv1alpha1\xa2\x02\x03MXX\xaa\x02\rMgmt.V1alpha1\xca\x02\rMgmt\\V1alpha1\xe2\x02\x19Mgmt\\V1alpha1\\GPBMetadata\xea\x02\x0eMgmt::V1alpha1b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -90,6 +90,8 @@ _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_PRIMARYKEYCONSTRAINTSENTRY']._serialized_options = b'8\001' _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_UNIQUECONSTRAINTSENTRY']._loaded_options = None _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_UNIQUECONSTRAINTSENTRY']._serialized_options = b'8\001' + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_UNIQUEINDEXESENTRY']._loaded_options = None + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_UNIQUEINDEXESENTRY']._serialized_options = b'8\001' _globals['_GETTABLEROWCOUNTREQUEST'].fields_by_name['connection_id']._loaded_options = None _globals['_GETTABLEROWCOUNTREQUEST'].fields_by_name['connection_id']._serialized_options = b'\272H\005r\003\260\001\001' _globals['_GETTABLEROWCOUNTREQUEST'].fields_by_name['schema']._loaded_options = None @@ -178,18 +180,24 @@ _globals['_GETCONNECTIONTABLECONSTRAINTSREQUEST']._serialized_end=5181 _globals['_UNIQUECONSTRAINTS']._serialized_start=5183 _globals['_UNIQUECONSTRAINTS']._serialized_end=5269 - _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE']._serialized_start=5272 - _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE']._serialized_end=6037 - _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_FOREIGNKEYCONSTRAINTSENTRY']._serialized_start=5713 - _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_FOREIGNKEYCONSTRAINTSENTRY']._serialized_end=5825 - _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_PRIMARYKEYCONSTRAINTSENTRY']._serialized_start=5827 - _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_PRIMARYKEYCONSTRAINTSENTRY']._serialized_end=5933 - _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_UNIQUECONSTRAINTSENTRY']._serialized_start=5935 - _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_UNIQUECONSTRAINTSENTRY']._serialized_end=6037 - _globals['_GETTABLEROWCOUNTREQUEST']._serialized_start=6040 - _globals['_GETTABLEROWCOUNTREQUEST']._serialized_end=6233 - _globals['_GETTABLEROWCOUNTRESPONSE']._serialized_start=6235 - _globals['_GETTABLEROWCOUNTRESPONSE']._serialized_end=6283 - _globals['_CONNECTIONDATASERVICE']._serialized_start=6286 - _globals['_CONNECTIONDATASERVICE']._serialized_end=7287 + _globals['_UNIQUEINDEXES']._serialized_start=5271 + _globals['_UNIQUEINDEXES']._serialized_end=5340 + _globals['_UNIQUEINDEX']._serialized_start=5342 + _globals['_UNIQUEINDEX']._serialized_end=5381 + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE']._serialized_start=5384 + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE']._serialized_end=6357 + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_FOREIGNKEYCONSTRAINTSENTRY']._serialized_start=5937 + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_FOREIGNKEYCONSTRAINTSENTRY']._serialized_end=6049 + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_PRIMARYKEYCONSTRAINTSENTRY']._serialized_start=6051 + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_PRIMARYKEYCONSTRAINTSENTRY']._serialized_end=6157 + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_UNIQUECONSTRAINTSENTRY']._serialized_start=6159 + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_UNIQUECONSTRAINTSENTRY']._serialized_end=6261 + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_UNIQUEINDEXESENTRY']._serialized_start=6263 + _globals['_GETCONNECTIONTABLECONSTRAINTSRESPONSE_UNIQUEINDEXESENTRY']._serialized_end=6357 + _globals['_GETTABLEROWCOUNTREQUEST']._serialized_start=6360 + _globals['_GETTABLEROWCOUNTREQUEST']._serialized_end=6553 + _globals['_GETTABLEROWCOUNTRESPONSE']._serialized_start=6555 + _globals['_GETTABLEROWCOUNTRESPONSE']._serialized_end=6603 + _globals['_CONNECTIONDATASERVICE']._serialized_start=6606 + _globals['_CONNECTIONDATASERVICE']._serialized_end=7607 # @@protoc_insertion_point(module_scope) diff --git a/python/src/neosync/mgmt/v1alpha1/connection_data_pb2.pyi b/python/src/neosync/mgmt/v1alpha1/connection_data_pb2.pyi index 39ce7c822d..02bff5e0b7 100644 --- a/python/src/neosync/mgmt/v1alpha1/connection_data_pb2.pyi +++ b/python/src/neosync/mgmt/v1alpha1/connection_data_pb2.pyi @@ -318,8 +318,20 @@ class UniqueConstraints(_message.Message): constraints: _containers.RepeatedCompositeFieldContainer[UniqueConstraint] def __init__(self, constraints: _Optional[_Iterable[_Union[UniqueConstraint, _Mapping]]] = ...) -> None: ... +class UniqueIndexes(_message.Message): + __slots__ = ("indexes",) + INDEXES_FIELD_NUMBER: _ClassVar[int] + indexes: _containers.RepeatedCompositeFieldContainer[UniqueIndex] + def __init__(self, indexes: _Optional[_Iterable[_Union[UniqueIndex, _Mapping]]] = ...) -> None: ... + +class UniqueIndex(_message.Message): + __slots__ = ("columns",) + COLUMNS_FIELD_NUMBER: _ClassVar[int] + columns: _containers.RepeatedScalarFieldContainer[str] + def __init__(self, columns: _Optional[_Iterable[str]] = ...) -> None: ... + class GetConnectionTableConstraintsResponse(_message.Message): - __slots__ = ("foreign_key_constraints", "primary_key_constraints", "unique_constraints") + __slots__ = ("foreign_key_constraints", "primary_key_constraints", "unique_constraints", "unique_indexes") class ForeignKeyConstraintsEntry(_message.Message): __slots__ = ("key", "value") KEY_FIELD_NUMBER: _ClassVar[int] @@ -341,13 +353,22 @@ class GetConnectionTableConstraintsResponse(_message.Message): key: str value: UniqueConstraints def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[UniqueConstraints, _Mapping]] = ...) -> None: ... + class UniqueIndexesEntry(_message.Message): + __slots__ = ("key", "value") + KEY_FIELD_NUMBER: _ClassVar[int] + VALUE_FIELD_NUMBER: _ClassVar[int] + key: str + value: UniqueIndexes + def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[UniqueIndexes, _Mapping]] = ...) -> None: ... FOREIGN_KEY_CONSTRAINTS_FIELD_NUMBER: _ClassVar[int] PRIMARY_KEY_CONSTRAINTS_FIELD_NUMBER: _ClassVar[int] UNIQUE_CONSTRAINTS_FIELD_NUMBER: _ClassVar[int] + UNIQUE_INDEXES_FIELD_NUMBER: _ClassVar[int] foreign_key_constraints: _containers.MessageMap[str, ForeignConstraintTables] primary_key_constraints: _containers.MessageMap[str, PrimaryConstraint] unique_constraints: _containers.MessageMap[str, UniqueConstraints] - def __init__(self, foreign_key_constraints: _Optional[_Mapping[str, ForeignConstraintTables]] = ..., primary_key_constraints: _Optional[_Mapping[str, PrimaryConstraint]] = ..., unique_constraints: _Optional[_Mapping[str, UniqueConstraints]] = ...) -> None: ... + unique_indexes: _containers.MessageMap[str, UniqueIndexes] + def __init__(self, foreign_key_constraints: _Optional[_Mapping[str, ForeignConstraintTables]] = ..., primary_key_constraints: _Optional[_Mapping[str, PrimaryConstraint]] = ..., unique_constraints: _Optional[_Mapping[str, UniqueConstraints]] = ..., unique_indexes: _Optional[_Mapping[str, UniqueIndexes]] = ...) -> None: ... class GetTableRowCountRequest(_message.Message): __slots__ = ("connection_id", "schema", "table", "where_clause") diff --git a/python/src/neosync/mgmt/v1alpha1/job_pb2.py b/python/src/neosync/mgmt/v1alpha1/job_pb2.py index b4ba3ec8dc..66f6aafc7b 100644 --- a/python/src/neosync/mgmt/v1alpha1/job_pb2.py +++ b/python/src/neosync/mgmt/v1alpha1/job_pb2.py @@ -28,7 +28,7 @@ from mgmt.v1alpha1 import transformer_pb2 as mgmt_dot_v1alpha1_dot_transformer__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17mgmt/v1alpha1/job.proto\x12\rmgmt.v1alpha1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a#mgmt/v1alpha1/connection_data.proto\x1a\x1fmgmt/v1alpha1/transformer.proto\"9\n\x0eGetJobsRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"9\n\x0fGetJobsResponse\x12&\n\x04jobs\x18\x01 \x03(\x0b\x32\x12.mgmt.v1alpha1.JobR\x04jobs\"N\n\tJobSource\x12\x41\n\x07options\x18\x01 \x01(\x0b\x32\x1f.mgmt.v1alpha1.JobSourceOptionsB\x06\xbaH\x03\xc8\x01\x01R\x07options\"\xe9\x04\n\x10JobSourceOptions\x12L\n\x08postgres\x18\x01 \x01(\x0b\x32..mgmt.v1alpha1.PostgresSourceConnectionOptionsH\x00R\x08postgres\x12\x44\n\x06\x61ws_s3\x18\x02 \x01(\x0b\x32+.mgmt.v1alpha1.AwsS3SourceConnectionOptionsH\x00R\x05\x61wsS3\x12\x43\n\x05mysql\x18\x03 \x01(\x0b\x32+.mgmt.v1alpha1.MysqlSourceConnectionOptionsH\x00R\x05mysql\x12\x42\n\x08generate\x18\x04 \x01(\x0b\x32$.mgmt.v1alpha1.GenerateSourceOptionsH\x00R\x08generate\x12I\n\x0b\x61i_generate\x18\x05 \x01(\x0b\x32&.mgmt.v1alpha1.AiGenerateSourceOptionsH\x00R\naiGenerate\x12I\n\x07mongodb\x18\x06 \x01(\x0b\x32-.mgmt.v1alpha1.MongoDBSourceConnectionOptionsH\x00R\x07mongodb\x12L\n\x08\x64ynamodb\x18\x07 \x01(\x0b\x32..mgmt.v1alpha1.DynamoDBSourceConnectionOptionsH\x00R\x08\x64ynamodb\x12\x43\n\x05mssql\x18\x08 \x01(\x0b\x32+.mgmt.v1alpha1.MssqlSourceConnectionOptionsH\x00R\x05mssqlB\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01\"\x85\x01\n\x14\x43reateJobDestination\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12>\n\x07options\x18\x02 \x01(\x0b\x32$.mgmt.v1alpha1.JobDestinationOptionsR\x07options\"\x8f\x01\n\x0eJobDestination\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12>\n\x07options\x18\x02 \x01(\x0b\x32$.mgmt.v1alpha1.JobDestinationOptionsR\x07options\x12\x0e\n\x02id\x18\x03 \x01(\tR\x02id\"\xb6\x03\n\x17\x41iGenerateSourceOptions\x12\x32\n\x10\x61i_connection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0e\x61iConnectionId\x12O\n\x07schemas\x18\x02 \x03(\x0b\x32+.mgmt.v1alpha1.AiGenerateSourceSchemaOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x07schemas\x12\x44\n\x17\x66k_source_connection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x14\x66kSourceConnectionId\x88\x01\x01\x12&\n\nmodel_name\x18\x04 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\tmodelName\x12$\n\x0buser_prompt\x18\x05 \x01(\tH\x01R\nuserPrompt\x88\x01\x01\x12>\n\x13generate_batch_size\x18\x06 \x01(\x03\x42\t\xbaH\x06\"\x04\x18\x64(\x01H\x02R\x11generateBatchSize\x88\x01\x01\x42\x1a\n\x18_fk_source_connection_idB\x0e\n\x0c_user_promptB\x16\n\x14_generate_batch_size\"\x8d\x01\n\x1c\x41iGenerateSourceSchemaOption\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12L\n\x06tables\x18\x02 \x03(\x0b\x32*.mgmt.v1alpha1.AiGenerateSourceTableOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x06tables\"e\n\x1b\x41iGenerateSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12\'\n\trow_count\x18\x02 \x01(\x03\x42\n\xbaH\x07\"\x05\x18\xe8\x07(\x01R\x08rowCount\"\xce\x01\n\x15GenerateSourceOptions\x12M\n\x07schemas\x18\x01 \x03(\x0b\x32).mgmt.v1alpha1.GenerateSourceSchemaOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x07schemas\x12\x44\n\x17\x66k_source_connection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x14\x66kSourceConnectionId\x88\x01\x01\x42\x1a\n\x18_fk_source_connection_idJ\x04\x08\x02\x10\x03\"\x89\x01\n\x1aGenerateSourceSchemaOption\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12J\n\x06tables\x18\x02 \x03(\x0b\x32(.mgmt.v1alpha1.GenerateSourceTableOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x06tables\"`\n\x19GenerateSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12$\n\trow_count\x18\x02 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x01R\x08rowCount\"O\n\x1eMongoDBSourceConnectionOptions\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\"\xaf\x02\n\x1f\x44ynamoDBSourceConnectionOptions\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12@\n\x06tables\x18\x02 \x03(\x0b\x32(.mgmt.v1alpha1.DynamoDBSourceTableOptionR\x06tables\x12\x65\n\x13unmapped_transforms\x18\x03 \x01(\x0b\x32\x34.mgmt.v1alpha1.DynamoDBSourceUnmappedTransformConfigR\x12unmappedTransforms\x12\x34\n\x16\x65nable_consistent_read\x18\x04 \x01(\x08R\x14\x65nableConsistentRead\"\x8f\x02\n%DynamoDBSourceUnmappedTransformConfig\x12\x32\n\x01\x62\x18\x01 \x01(\x0b\x32$.mgmt.v1alpha1.JobMappingTransformerR\x01\x62\x12>\n\x07\x62oolean\x18\x02 \x01(\x0b\x32$.mgmt.v1alpha1.JobMappingTransformerR\x07\x62oolean\x12\x32\n\x01n\x18\x04 \x01(\x0b\x32$.mgmt.v1alpha1.JobMappingTransformerR\x01n\x12\x32\n\x01s\x18\x06 \x01(\x0b\x32$.mgmt.v1alpha1.JobMappingTransformerR\x01sJ\x04\x08\x03\x10\x04J\x04\x08\x05\x10\x06\"s\n\x19\x44ynamoDBSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12&\n\x0cwhere_clause\x18\x02 \x01(\tH\x00R\x0bwhereClause\x88\x01\x01\x42\x0f\n\r_where_clause\"\xaf\x08\n\x1fPostgresSourceConnectionOptions\x12\x43\n\x07schemas\x18\x02 \x03(\x0b\x32).mgmt.v1alpha1.PostgresSourceSchemaOptionR\x07schemas\x12-\n\rconnection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12H\n!subset_by_foreign_key_constraints\x18\x04 \x01(\x08R\x1dsubsetByForeignKeyConstraints\x12\x89\x01\n\x1cnew_column_addition_strategy\x18\x05 \x01(\x0b\x32H.mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategyR\x19newColumnAdditionStrategy\x12|\n\x17\x63olumn_removal_strategy\x18\x06 \x01(\x0b\x32\x44.mgmt.v1alpha1.PostgresSourceConnectionOptions.ColumnRemovalStrategyR\x15\x63olumnRemovalStrategy\x1a\x9b\x02\n\x19NewColumnAdditionStrategy\x12m\n\x08halt_job\x18\x01 \x01(\x0b\x32P.mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.HaltJobH\x00R\x07haltJob\x12m\n\x08\x61uto_map\x18\x02 \x01(\x0b\x32P.mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.AutoMapH\x00R\x07\x61utoMap\x1a\t\n\x07HaltJob\x1a\t\n\x07\x41utoMapB\n\n\x08strategy\x1a\x9f\x02\n\x15\x43olumnRemovalStrategy\x12i\n\x08halt_job\x18\x01 \x01(\x0b\x32L.mgmt.v1alpha1.PostgresSourceConnectionOptions.ColumnRemovalStrategy.HaltJobH\x00R\x07haltJob\x12u\n\x0c\x63ontinue_job\x18\x02 \x01(\x0b\x32P.mgmt.v1alpha1.PostgresSourceConnectionOptions.ColumnRemovalStrategy.ContinueJobH\x00R\x0b\x63ontinueJob\x1a\t\n\x07HaltJob\x1a\r\n\x0b\x43ontinueJobB\n\n\x08strategyJ\x04\x08\x01\x10\x02\"\x89\x01\n\x1aPostgresSourceSchemaOption\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12J\n\x06tables\x18\x02 \x03(\x0b\x32(.mgmt.v1alpha1.PostgresSourceTableOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x06tables\"s\n\x19PostgresSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12&\n\x0cwhere_clause\x18\x02 \x01(\tH\x00R\x0bwhereClause\x88\x01\x01\x42\x0f\n\r_where_clause\"\xae\x05\n\x1cMysqlSourceConnectionOptions\x12<\n\x1bhalt_on_new_column_addition\x18\x01 \x01(\x08R\x17haltOnNewColumnAddition\x12@\n\x07schemas\x18\x02 \x03(\x0b\x32&.mgmt.v1alpha1.MysqlSourceSchemaOptionR\x07schemas\x12-\n\rconnection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12H\n!subset_by_foreign_key_constraints\x18\x04 \x01(\x08R\x1dsubsetByForeignKeyConstraints\x12y\n\x17\x63olumn_removal_strategy\x18\x05 \x01(\x0b\x32\x41.mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategyR\x15\x63olumnRemovalStrategy\x1a\x99\x02\n\x15\x43olumnRemovalStrategy\x12\x66\n\x08halt_job\x18\x01 \x01(\x0b\x32I.mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategy.HaltJobH\x00R\x07haltJob\x12r\n\x0c\x63ontinue_job\x18\x02 \x01(\x0b\x32M.mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategy.ContinueJobH\x00R\x0b\x63ontinueJob\x1a\t\n\x07HaltJob\x1a\r\n\x0b\x43ontinueJobB\n\n\x08strategy\"\x83\x01\n\x17MysqlSourceSchemaOption\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12G\n\x06tables\x18\x02 \x03(\x0b\x32%.mgmt.v1alpha1.MysqlSourceTableOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x06tables\"p\n\x16MysqlSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12&\n\x0cwhere_clause\x18\x02 \x01(\tH\x00R\x0bwhereClause\x88\x01\x01\x42\x0f\n\r_where_clause\"\xae\x05\n\x1cMssqlSourceConnectionOptions\x12<\n\x1bhalt_on_new_column_addition\x18\x01 \x01(\x08R\x17haltOnNewColumnAddition\x12@\n\x07schemas\x18\x02 \x03(\x0b\x32&.mgmt.v1alpha1.MssqlSourceSchemaOptionR\x07schemas\x12-\n\rconnection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12H\n!subset_by_foreign_key_constraints\x18\x04 \x01(\x08R\x1dsubsetByForeignKeyConstraints\x12y\n\x17\x63olumn_removal_strategy\x18\x05 \x01(\x0b\x32\x41.mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategyR\x15\x63olumnRemovalStrategy\x1a\x99\x02\n\x15\x43olumnRemovalStrategy\x12\x66\n\x08halt_job\x18\x01 \x01(\x0b\x32I.mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy.HaltJobH\x00R\x07haltJob\x12r\n\x0c\x63ontinue_job\x18\x02 \x01(\x0b\x32M.mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy.ContinueJobH\x00R\x0b\x63ontinueJob\x1a\t\n\x07HaltJob\x1a\r\n\x0b\x43ontinueJobB\n\n\x08strategy\"\x83\x01\n\x17MssqlSourceSchemaOption\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12G\n\x06tables\x18\x02 \x03(\x0b\x32%.mgmt.v1alpha1.MssqlSourceTableOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x06tables\"p\n\x16MssqlSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12&\n\x0cwhere_clause\x18\x02 \x01(\tH\x00R\x0bwhereClause\x88\x01\x01\x42\x0f\n\r_where_clause\"M\n\x1c\x41wsS3SourceConnectionOptions\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\"\xcf\x05\n\x15JobDestinationOptions\x12`\n\x10postgres_options\x18\x01 \x01(\x0b\x32\x33.mgmt.v1alpha1.PostgresDestinationConnectionOptionsH\x00R\x0fpostgresOptions\x12X\n\x0e\x61ws_s3_options\x18\x02 \x01(\x0b\x32\x30.mgmt.v1alpha1.AwsS3DestinationConnectionOptionsH\x00R\x0c\x61wsS3Options\x12W\n\rmysql_options\x18\x03 \x01(\x0b\x32\x30.mgmt.v1alpha1.MysqlDestinationConnectionOptionsH\x00R\x0cmysqlOptions\x12]\n\x0fmongodb_options\x18\x04 \x01(\x0b\x32\x32.mgmt.v1alpha1.MongoDBDestinationConnectionOptionsH\x00R\x0emongodbOptions\x12v\n\x18gcp_cloudstorage_options\x18\x05 \x01(\x0b\x32:.mgmt.v1alpha1.GcpCloudStorageDestinationConnectionOptionsH\x00R\x16gcpCloudstorageOptions\x12`\n\x10\x64ynamodb_options\x18\x06 \x01(\x0b\x32\x33.mgmt.v1alpha1.DynamoDBDestinationConnectionOptionsH\x00R\x0f\x64ynamodbOptions\x12W\n\rmssql_options\x18\x07 \x01(\x0b\x32\x30.mgmt.v1alpha1.MssqlDestinationConnectionOptionsH\x00R\x0cmssqlOptionsB\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01\"%\n#MongoDBDestinationConnectionOptions\"-\n+GcpCloudStorageDestinationConnectionOptions\"}\n$DynamoDBDestinationConnectionOptions\x12U\n\x0etable_mappings\x18\x01 \x03(\x0b\x32..mgmt.v1alpha1.DynamoDBDestinationTableMappingR\rtableMappings\"q\n\x1f\x44ynamoDBDestinationTableMapping\x12!\n\x0csource_table\x18\x01 \x01(\tR\x0bsourceTable\x12+\n\x11\x64\x65stination_table\x18\x02 \x01(\tR\x10\x64\x65stinationTable\"\xa4\x03\n$PostgresDestinationConnectionOptions\x12Q\n\x0etruncate_table\x18\x01 \x01(\x0b\x32*.mgmt.v1alpha1.PostgresTruncateTableConfigR\rtruncateTable\x12*\n\x11init_table_schema\x18\x02 \x01(\x08R\x0finitTableSchema\x12H\n\x0bon_conflict\x18\x03 \x01(\x0b\x32\'.mgmt.v1alpha1.PostgresOnConflictConfigR\nonConflict\x12=\n\x1bskip_foreign_key_violations\x18\x04 \x01(\x08R\x18skipForeignKeyViolations\x12\x30\n\x05\x62\x61tch\x18\x05 \x01(\x0b\x32\x1a.mgmt.v1alpha1.BatchConfigR\x05\x62\x61tch\x12\x30\n\rmax_in_flight\x18\x06 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x0bmaxInFlight\x88\x01\x01\x42\x10\n\x0e_max_in_flight\"\xc8\x02\n\x18PostgresOnConflictConfig\x12!\n\ndo_nothing\x18\x01 \x01(\x08\x42\x02\x18\x01R\tdoNothing\x12_\n\x07nothing\x18\x02 \x01(\x0b\x32\x43.mgmt.v1alpha1.PostgresOnConflictConfig.PostgresOnConflictDoNothingH\x00R\x07nothing\x12Z\n\x06update\x18\x03 \x01(\x0b\x32@.mgmt.v1alpha1.PostgresOnConflictConfig.PostgresOnConflictUpdateH\x00R\x06update\x1a\x1d\n\x1bPostgresOnConflictDoNothing\x1a\x1a\n\x18PostgresOnConflictUpdateB\x11\n\x08strategy\x12\x05\xbaH\x02\x08\x00\"m\n\x1bPostgresTruncateTableConfig\x12\x34\n\x16truncate_before_insert\x18\x01 \x01(\x08R\x14truncateBeforeInsert\x12\x18\n\x07\x63\x61scade\x18\x02 \x01(\x08R\x07\x63\x61scade\"\x9b\x03\n!MysqlDestinationConnectionOptions\x12N\n\x0etruncate_table\x18\x01 \x01(\x0b\x32\'.mgmt.v1alpha1.MysqlTruncateTableConfigR\rtruncateTable\x12*\n\x11init_table_schema\x18\x02 \x01(\x08R\x0finitTableSchema\x12\x45\n\x0bon_conflict\x18\x03 \x01(\x0b\x32$.mgmt.v1alpha1.MysqlOnConflictConfigR\nonConflict\x12=\n\x1bskip_foreign_key_violations\x18\x04 \x01(\x08R\x18skipForeignKeyViolations\x12\x30\n\x05\x62\x61tch\x18\x05 \x01(\x0b\x32\x1a.mgmt.v1alpha1.BatchConfigR\x05\x62\x61tch\x12\x30\n\rmax_in_flight\x18\x06 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x0bmaxInFlight\x88\x01\x01\x42\x10\n\x0e_max_in_flight\"P\n\x18MysqlTruncateTableConfig\x12\x34\n\x16truncate_before_insert\x18\x01 \x01(\x08R\x14truncateBeforeInsert\"\xaf\x02\n\x15MysqlOnConflictConfig\x12\x1d\n\ndo_nothing\x18\x01 \x01(\x08R\tdoNothing\x12Y\n\x07nothing\x18\x02 \x01(\x0b\x32=.mgmt.v1alpha1.MysqlOnConflictConfig.MysqlOnConflictDoNothingH\x00R\x07nothing\x12T\n\x06update\x18\x03 \x01(\x0b\x32:.mgmt.v1alpha1.MysqlOnConflictConfig.MysqlOnConflictUpdateH\x00R\x06update\x1a\x1a\n\x18MysqlOnConflictDoNothing\x1a\x17\n\x15MysqlOnConflictUpdateB\x11\n\x08strategy\x12\x05\xbaH\x02\x08\x00\"\x9b\x03\n!MssqlDestinationConnectionOptions\x12N\n\x0etruncate_table\x18\x01 \x01(\x0b\x32\'.mgmt.v1alpha1.MssqlTruncateTableConfigR\rtruncateTable\x12*\n\x11init_table_schema\x18\x02 \x01(\x08R\x0finitTableSchema\x12\x45\n\x0bon_conflict\x18\x03 \x01(\x0b\x32$.mgmt.v1alpha1.MssqlOnConflictConfigR\nonConflict\x12=\n\x1bskip_foreign_key_violations\x18\x04 \x01(\x08R\x18skipForeignKeyViolations\x12\x30\n\x05\x62\x61tch\x18\x05 \x01(\x0b\x32\x1a.mgmt.v1alpha1.BatchConfigR\x05\x62\x61tch\x12\x30\n\rmax_in_flight\x18\x06 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x0bmaxInFlight\x88\x01\x01\x42\x10\n\x0e_max_in_flight\"P\n\x18MssqlTruncateTableConfig\x12\x34\n\x16truncate_before_insert\x18\x01 \x01(\x08R\x14truncateBeforeInsert\"6\n\x15MssqlOnConflictConfig\x12\x1d\n\ndo_nothing\x18\x01 \x01(\x08R\tdoNothing\"\xb9\x04\n!AwsS3DestinationConnectionOptions\x12\x62\n\rstorage_class\x18\x01 \x01(\x0e\x32=.mgmt.v1alpha1.AwsS3DestinationConnectionOptions.StorageClassR\x0cstorageClass\x12\x30\n\rmax_in_flight\x18\x02 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x0bmaxInFlight\x88\x01\x01\x12\x1d\n\x07timeout\x18\x03 \x01(\tH\x01R\x07timeout\x88\x01\x01\x12\x30\n\x05\x62\x61tch\x18\x04 \x01(\x0b\x32\x1a.mgmt.v1alpha1.BatchConfigR\x05\x62\x61tch\"\x8e\x02\n\x0cStorageClass\x12\x1d\n\x19STORAGE_CLASS_UNSPECIFIED\x10\x00\x12\x1a\n\x16STORAGE_CLASS_STANDARD\x10\x01\x12$\n STORAGE_CLASS_REDUCED_REDUNDANCY\x10\x02\x12\x19\n\x15STORAGE_CLASS_GLACIER\x10\x03\x12\x1d\n\x19STORAGE_CLASS_STANDARD_IA\x10\x04\x12\x1c\n\x18STORAGE_CLASS_ONEZONE_IA\x10\x05\x12%\n!STORAGE_CLASS_INTELLIGENT_TIERING\x10\x06\x12\x1e\n\x1aSTORAGE_CLASS_DEEP_ARCHIVE\x10\x07\x42\x10\n\x0e_max_in_flightB\n\n\x08_timeout\"Z\n\x0b\x42\x61tchConfig\x12\x19\n\x05\x63ount\x18\x01 \x01(\rH\x00R\x05\x63ount\x88\x01\x01\x12\x1b\n\x06period\x18\x02 \x01(\tH\x01R\x06period\x88\x01\x01\x42\x08\n\x06_countB\t\n\x07_period\"\xf2\x04\n\x10\x43reateJobRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x34\n\x08job_name\x18\x02 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x07jobName\x12(\n\rcron_schedule\x18\x03 \x01(\tH\x00R\x0c\x63ronSchedule\x88\x01\x01\x12\x35\n\x08mappings\x18\x04 \x03(\x0b\x32\x19.mgmt.v1alpha1.JobMappingR\x08mappings\x12\x30\n\x06source\x18\x05 \x01(\x0b\x32\x18.mgmt.v1alpha1.JobSourceR\x06source\x12G\n\x0c\x64\x65stinations\x18\x06 \x03(\x0b\x32#.mgmt.v1alpha1.CreateJobDestinationR\x0c\x64\x65stinations\x12(\n\x10initiate_job_run\x18\x07 \x01(\x08R\x0einitiateJobRun\x12I\n\x10workflow_options\x18\x08 \x01(\x0b\x32\x1e.mgmt.v1alpha1.WorkflowOptionsR\x0fworkflowOptions\x12\x41\n\x0csync_options\x18\t \x01(\x0b\x32\x1e.mgmt.v1alpha1.ActivityOptionsR\x0bsyncOptions\x12Y\n\x14virtual_foreign_keys\x18\n \x03(\x0b\x32\'.mgmt.v1alpha1.VirtualForeignConstraintR\x12virtualForeignKeysB\x10\n\x0e_cron_schedule\"q\n\x0fWorkflowOptions\x12$\n\x0brun_timeout\x18\x08 \x01(\x03H\x00R\nrunTimeout\x88\x01\x01\x42\x0e\n\x0c_run_timeoutJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08\"\x95\x02\n\x0f\x41\x63tivityOptions\x12G\n\x19schedule_to_close_timeout\x18\x01 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x01H\x00R\x16scheduleToCloseTimeout\x88\x01\x01\x12\x41\n\x16start_to_close_timeout\x18\x02 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x01H\x01R\x13startToCloseTimeout\x88\x01\x01\x12=\n\x0cretry_policy\x18\x03 \x01(\x0b\x32\x1a.mgmt.v1alpha1.RetryPolicyR\x0bretryPolicyB\x1c\n\x1a_schedule_to_close_timeoutB\x19\n\x17_start_to_close_timeout\"[\n\x0bRetryPolicy\x12\x37\n\x10maximum_attempts\x18\x01 \x01(\x05\x42\x07\xbaH\x04\x1a\x02(\x00H\x00R\x0fmaximumAttempts\x88\x01\x01\x42\x13\n\x11_maximum_attempts\"9\n\x11\x43reateJobResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"W\n\x15JobMappingTransformer\x12\x38\n\x06\x63onfig\x18\x03 \x01(\x0b\x32 .mgmt.v1alpha1.TransformerConfigR\x06\x63onfigJ\x04\x08\x01\x10\x02\"\xb5\x01\n\nJobMapping\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12\x1d\n\x05table\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12\x1f\n\x06\x63olumn\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06\x63olumn\x12\x46\n\x0btransformer\x18\x05 \x01(\x0b\x32$.mgmt.v1alpha1.JobMappingTransformerR\x0btransformer\")\n\rGetJobRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"6\n\x0eGetJobResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"p\n\x18UpdateJobScheduleRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12(\n\rcron_schedule\x18\x02 \x01(\tH\x00R\x0c\x63ronSchedule\x88\x01\x01\x42\x10\n\x0e_cron_schedule\"A\n\x19UpdateJobScheduleResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"c\n\x0fPauseJobRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x14\n\x05pause\x18\x02 \x01(\x08R\x05pause\x12\x17\n\x04note\x18\x03 \x01(\tH\x00R\x04note\x88\x01\x01\x42\x07\n\x05_note\"8\n\x10PauseJobResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"\x80\x02\n UpdateJobSourceConnectionRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x30\n\x06source\x18\x02 \x01(\x0b\x32\x18.mgmt.v1alpha1.JobSourceR\x06source\x12\x35\n\x08mappings\x18\x03 \x03(\x0b\x32\x19.mgmt.v1alpha1.JobMappingR\x08mappings\x12Y\n\x14virtual_foreign_keys\x18\x04 \x03(\x0b\x32\'.mgmt.v1alpha1.VirtualForeignConstraintR\x12virtualForeignKeys\"I\n!UpdateJobSourceConnectionResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"r\n\x1aPostgresSourceSchemaSubset\x12T\n\x10postgres_schemas\x18\x01 \x03(\x0b\x32).mgmt.v1alpha1.PostgresSourceSchemaOptionR\x0fpostgresSchemas\"f\n\x17MysqlSourceSchemaSubset\x12K\n\rmysql_schemas\x18\x01 \x03(\x0b\x32&.mgmt.v1alpha1.MysqlSourceSchemaOptionR\x0cmysqlSchemas\"^\n\x1a\x44ynamoDBSourceSchemaSubset\x12@\n\x06tables\x18\x01 \x03(\x0b\x32(.mgmt.v1alpha1.DynamoDBSourceTableOptionR\x06tables\"f\n\x17MssqlSourceSchemaSubset\x12K\n\rmssql_schemas\x18\x01 \x03(\x0b\x32&.mgmt.v1alpha1.MssqlSourceSchemaOptionR\x0cmssqlSchemas\"\xf8\x02\n\x18JobSourceSqlSubetSchemas\x12T\n\x0fpostgres_subset\x18\x02 \x01(\x0b\x32).mgmt.v1alpha1.PostgresSourceSchemaSubsetH\x00R\x0epostgresSubset\x12K\n\x0cmysql_subset\x18\x03 \x01(\x0b\x32&.mgmt.v1alpha1.MysqlSourceSchemaSubsetH\x00R\x0bmysqlSubset\x12T\n\x0f\x64ynamodb_subset\x18\x04 \x01(\x0b\x32).mgmt.v1alpha1.DynamoDBSourceSchemaSubsetH\x00R\x0e\x64ynamodbSubset\x12K\n\x0cmssql_subset\x18\x05 \x01(\x0b\x32&.mgmt.v1alpha1.MssqlSourceSchemaSubsetH\x00R\x0bmssqlSubsetB\x10\n\x07schemas\x12\x05\xbaH\x02\x08\x01J\x04\x08\x01\x10\x02\"\xd0\x01\n\'SetJobSourceSqlConnectionSubsetsRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x41\n\x07schemas\x18\x02 \x01(\x0b\x32\'.mgmt.v1alpha1.JobSourceSqlSubetSchemasR\x07schemas\x12H\n!subset_by_foreign_key_constraints\x18\x03 \x01(\x08R\x1dsubsetByForeignKeyConstraints\"P\n(SetJobSourceSqlConnectionSubsetsResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"\xde\x01\n%UpdateJobDestinationConnectionRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\x12-\n\rconnection_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12>\n\x07options\x18\x03 \x01(\x0b\x32$.mgmt.v1alpha1.JobDestinationOptionsR\x07options\x12%\n\x0e\x64\x65stination_id\x18\x04 \x01(\tR\rdestinationId\"N\n&UpdateJobDestinationConnectionResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"X\n%DeleteJobDestinationConnectionRequest\x12/\n\x0e\x64\x65stination_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\rdestinationId\"(\n&DeleteJobDestinationConnectionResponse\"\x92\x01\n&CreateJobDestinationConnectionsRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\x12G\n\x0c\x64\x65stinations\x18\x02 \x03(\x0b\x32#.mgmt.v1alpha1.CreateJobDestinationR\x0c\x64\x65stinations\"O\n\'CreateJobDestinationConnectionsResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\",\n\x10\x44\x65leteJobRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"\x13\n\x11\x44\x65leteJobResponse\"s\n\x19IsJobNameAvailableRequest\x12-\n\x04name\x18\x01 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x04name\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"?\n\x1aIsJobNameAvailableResponse\x12!\n\x0cis_available\x18\x01 \x01(\x08R\x0bisAvailable\"g\n\x11GetJobRunsRequest\x12!\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x05jobId\x12)\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\taccountIdB\x04\n\x02id\"F\n\x12GetJobRunsResponse\x12\x30\n\x08job_runs\x18\x01 \x03(\x0b\x32\x15.mgmt.v1alpha1.JobRunR\x07jobRuns\"Y\n\x10GetJobRunRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"C\n\x11GetJobRunResponse\x12.\n\x07job_run\x18\x01 \x01(\x0b\x32\x15.mgmt.v1alpha1.JobRunR\x06jobRun\"6\n\x13\x43reateJobRunRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\"\x16\n\x14\x43reateJobRunResponse\"\\\n\x13\x43\x61ncelJobRunRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"\x16\n\x14\x43\x61ncelJobRunResponse\"\xe9\x05\n\x03Job\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12+\n\x12\x63reated_by_user_id\x18\x02 \x01(\tR\x0f\x63reatedByUserId\x12\x39\n\ncreated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12+\n\x12updated_by_user_id\x18\x04 \x01(\tR\x0fupdatedByUserId\x12\x39\n\nupdated_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tupdatedAt\x12\x12\n\x04name\x18\x06 \x01(\tR\x04name\x12\x30\n\x06source\x18\x07 \x01(\x0b\x32\x18.mgmt.v1alpha1.JobSourceR\x06source\x12\x41\n\x0c\x64\x65stinations\x18\x08 \x03(\x0b\x32\x1d.mgmt.v1alpha1.JobDestinationR\x0c\x64\x65stinations\x12\x35\n\x08mappings\x18\t \x03(\x0b\x32\x19.mgmt.v1alpha1.JobMappingR\x08mappings\x12(\n\rcron_schedule\x18\n \x01(\tH\x00R\x0c\x63ronSchedule\x88\x01\x01\x12\x1d\n\naccount_id\x18\x0b \x01(\tR\taccountId\x12\x41\n\x0csync_options\x18\x0c \x01(\x0b\x32\x1e.mgmt.v1alpha1.ActivityOptionsR\x0bsyncOptions\x12I\n\x10workflow_options\x18\r \x01(\x0b\x32\x1e.mgmt.v1alpha1.WorkflowOptionsR\x0fworkflowOptions\x12Y\n\x14virtual_foreign_keys\x18\x0e \x03(\x0b\x32\'.mgmt.v1alpha1.VirtualForeignConstraintR\x12virtualForeignKeysB\x10\n\x0e_cron_schedule\"g\n\x0cJobRecentRun\x12\x39\n\nstart_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartTime\x12\x1c\n\njob_run_id\x18\x02 \x01(\tR\x08jobRunId\":\n\x17GetJobRecentRunsRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\"X\n\x18GetJobRecentRunsResponse\x12<\n\x0brecent_runs\x18\x01 \x03(\x0b\x32\x1b.mgmt.v1alpha1.JobRecentRunR\nrecentRuns\"O\n\x0bJobNextRuns\x12@\n\x0enext_run_times\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.TimestampR\x0cnextRunTimes\"8\n\x15GetJobNextRunsRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\"Q\n\x16GetJobNextRunsResponse\x12\x37\n\tnext_runs\x18\x01 \x01(\x0b\x32\x1a.mgmt.v1alpha1.JobNextRunsR\x08nextRuns\"6\n\x13GetJobStatusRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\"H\n\x14GetJobStatusResponse\x12\x30\n\x06status\x18\x01 \x01(\x0e\x32\x18.mgmt.v1alpha1.JobStatusR\x06status\"d\n\x0fJobStatusRecord\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\x12\x30\n\x06status\x18\x02 \x01(\x0e\x32\x18.mgmt.v1alpha1.JobStatusR\x06status\"@\n\x15GetJobStatusesRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"T\n\x16GetJobStatusesResponse\x12:\n\x08statuses\x18\x01 \x03(\x0b\x32\x1e.mgmt.v1alpha1.JobStatusRecordR\x08statuses\"+\n\x0f\x41\x63tivityFailure\x12\x18\n\x07message\x18\x01 \x01(\tR\x07message\"\xc6\x01\n\x0fPendingActivity\x12\x35\n\x06status\x18\x01 \x01(\x0e\x32\x1d.mgmt.v1alpha1.ActivityStatusR\x06status\x12#\n\ractivity_name\x18\x02 \x01(\tR\x0c\x61\x63tivityName\x12\x46\n\x0clast_failure\x18\x03 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ActivityFailureH\x00R\x0blastFailure\x88\x01\x01\x42\x0f\n\r_last_failure\"\xdd\x02\n\x06JobRun\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x15\n\x06job_id\x18\x02 \x01(\tR\x05jobId\x12\x12\n\x04name\x18\x03 \x01(\tR\x04name\x12\x33\n\x06status\x18\x04 \x01(\x0e\x32\x1b.mgmt.v1alpha1.JobRunStatusR\x06status\x12\x39\n\nstarted_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartedAt\x12\x42\n\x0c\x63ompleted_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00R\x0b\x63ompletedAt\x88\x01\x01\x12M\n\x12pending_activities\x18\x08 \x03(\x0b\x32\x1e.mgmt.v1alpha1.PendingActivityR\x11pendingActivitiesB\x0f\n\r_completed_atJ\x04\x08\x05\x10\x06\"Q\n\x14JobRunEventTaskError\x12\x18\n\x07message\x18\x01 \x01(\tR\x07message\x12\x1f\n\x0bretry_state\x18\x02 \x01(\tR\nretryState\"\xab\x01\n\x0fJobRunEventTask\x12\x0e\n\x02id\x18\x01 \x01(\x03R\x02id\x12\x12\n\x04type\x18\x02 \x01(\tR\x04type\x12\x39\n\nevent_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\teventTime\x12\x39\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.mgmt.v1alpha1.JobRunEventTaskErrorR\x05\x65rror\"B\n\x12JobRunSyncMetadata\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\"r\n\x13JobRunEventMetadata\x12H\n\rsync_metadata\x18\x01 \x01(\x0b\x32!.mgmt.v1alpha1.JobRunSyncMetadataH\x00R\x0csyncMetadataB\x11\n\x08metadata\x12\x05\xbaH\x02\x08\x01\"\x9d\x02\n\x0bJobRunEvent\x12\x0e\n\x02id\x18\x01 \x01(\x03R\x02id\x12\x12\n\x04type\x18\x02 \x01(\tR\x04type\x12\x39\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartTime\x12\x39\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcloseTime\x12>\n\x08metadata\x18\x05 \x01(\x0b\x32\".mgmt.v1alpha1.JobRunEventMetadataR\x08metadata\x12\x34\n\x05tasks\x18\x06 \x03(\x0b\x32\x1e.mgmt.v1alpha1.JobRunEventTaskR\x05tasks\"_\n\x16GetJobRunEventsRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"u\n\x17GetJobRunEventsResponse\x12\x32\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x1a.mgmt.v1alpha1.JobRunEventR\x06\x65vents\x12&\n\x0fis_run_complete\x18\x02 \x01(\x08R\risRunComplete\"\\\n\x13\x44\x65leteJobRunRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"\x16\n\x14\x44\x65leteJobRunResponse\"_\n\x16TerminateJobRunRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"\x19\n\x17TerminateJobRunResponse\"\xb2\x02\n\x1aGetJobRunLogsStreamRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x30\n\x06window\x18\x03 \x01(\x0e\x32\x18.mgmt.v1alpha1.LogWindowR\x06window\x12\x1f\n\x0bshould_tail\x18\x04 \x01(\x08R\nshouldTail\x12\x30\n\rmax_log_lines\x18\x05 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x01H\x00R\x0bmaxLogLines\x88\x01\x01\x12\x36\n\nlog_levels\x18\x06 \x03(\x0e\x32\x17.mgmt.v1alpha1.LogLevelR\tlogLevelsB\x10\n\x0e_max_log_lines\"\x90\x02\n\x1bGetJobRunLogsStreamResponse\x12\x19\n\x08log_line\x18\x01 \x01(\tR\x07logLine\x12=\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00R\ttimestamp\x88\x01\x01\x12N\n\x06labels\x18\x03 \x03(\x0b\x32\x36.mgmt.v1alpha1.GetJobRunLogsStreamResponse.LabelsEntryR\x06labels\x1a\x39\n\x0bLabelsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\x0c\n\n_timestamp\"\x8b\x02\n\x14GetJobRunLogsRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x30\n\x06window\x18\x03 \x01(\x0e\x32\x18.mgmt.v1alpha1.LogWindowR\x06window\x12\x30\n\rmax_log_lines\x18\x04 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x01H\x00R\x0bmaxLogLines\x88\x01\x01\x12\x36\n\nlog_levels\x18\x05 \x03(\x0e\x32\x17.mgmt.v1alpha1.LogLevelR\tlogLevelsB\x10\n\x0e_max_log_lines\"\xe3\x02\n\x15GetJobRunLogsResponse\x12I\n\tlog_lines\x18\x01 \x03(\x0b\x32,.mgmt.v1alpha1.GetJobRunLogsResponse.LogLineR\x08logLines\x1a\xfe\x01\n\x07LogLine\x12\x19\n\x08log_line\x18\x01 \x01(\tR\x07logLine\x12=\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00R\ttimestamp\x88\x01\x01\x12P\n\x06labels\x18\x03 \x03(\x0b\x32\x38.mgmt.v1alpha1.GetJobRunLogsResponse.LogLine.LabelsEntryR\x06labels\x1a\x39\n\x0bLabelsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\x0c\n\n_timestamp\"\x83\x01\n\x1cSetJobWorkflowOptionsRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12I\n\x10worfklow_options\x18\x02 \x01(\x0b\x32\x1e.mgmt.v1alpha1.WorkflowOptionsR\x0fworfklowOptions\"E\n\x1dSetJobWorkflowOptionsResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"w\n\x18SetJobSyncOptionsRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x41\n\x0csync_options\x18\x02 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ActivityOptionsR\x0bsyncOptions\"A\n\x19SetJobSyncOptionsResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"\xd3\x02\n\x1aValidateJobMappingsRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x35\n\x08mappings\x18\x02 \x03(\x0b\x32\x19.mgmt.v1alpha1.JobMappingR\x08mappings\x12-\n\rconnection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12Y\n\x14virtual_foreign_keys\x18\x04 \x03(\x0b\x32\'.mgmt.v1alpha1.VirtualForeignConstraintR\x12virtualForeignKeys\x12<\n\njob_source\x18\x05 \x01(\x0b\x32\x18.mgmt.v1alpha1.JobSourceH\x00R\tjobSource\x88\x01\x01\x42\r\n\x0b_job_source\"\xe7\x07\n\x0b\x43olumnError\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12\x16\n\x06\x63olumn\x18\x03 \x01(\tR\x06\x63olumn\x12\x1a\n\x06\x65rrors\x18\x04 \x03(\tB\x02\x18\x01R\x06\x65rrors\x12Q\n\rerror_reports\x18\x05 \x03(\x0b\x32,.mgmt.v1alpha1.ColumnError.ColumnErrorReportR\x0c\x65rrorReports\x1am\n\x11\x43olumnErrorReport\x12>\n\x04\x63ode\x18\x01 \x01(\x0e\x32*.mgmt.v1alpha1.ColumnError.ColumnErrorCodeR\x04\x63ode\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message\"\xb3\x05\n\x0f\x43olumnErrorCode\x12!\n\x1d\x43OLUMN_ERROR_CODE_UNSPECIFIED\x10\x00\x12)\n%COLUMN_ERROR_CODE_NOT_FOUND_IN_SOURCE\x10\x01\x12*\n&COLUMN_ERROR_CODE_NOT_FOUND_IN_MAPPING\x10\x02\x12:\n6COLUMN_ERROR_CODE_REQUIRED_COLUMN_NOT_FOUND_IN_MAPPING\x10\x03\x12?\n;COLUMN_ERROR_CODE_REQUIRED_FOREIGN_KEY_NOT_FOUND_IN_MAPPING\x10\x04\x12K\nGCOLUMN_ERROR_CODE_UNSUPPORTED_CIRCULAR_DEPENDENCY_AT_LEAST_ONE_NULLABLE\x10\x05\x12<\n8COLUMN_ERROR_CODE_VFK_SOURCE_COLUMN_NOT_FOUND_IN_MAPPING\x10\x06\x12;\n7COLUMN_ERROR_CODE_VFK_SOURCE_COLUMN_NOT_FOUND_IN_SOURCE\x10\x07\x12<\n8COLUMN_ERROR_CODE_VFK_TARGET_COLUMN_NOT_FOUND_IN_MAPPING\x10\x08\x12;\n7COLUMN_ERROR_CODE_VFK_TARGET_COLUMN_NOT_FOUND_IN_SOURCE\x10\t\x12\x32\n.COLUMN_ERROR_CODE_VFK_COLUMN_DATATYPE_MISMATCH\x10\n\x12\x32\n.COLUMN_ERROR_CODE_VFK_SOURCE_COLUMN_NOT_UNIQUE\x10\x0b\"\xdb\x03\n\rColumnWarning\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12\x16\n\x06\x63olumn\x18\x03 \x01(\tR\x06\x63olumn\x12\x1e\n\x08warnings\x18\x05 \x03(\tB\x02\x18\x01R\x08warnings\x12Y\n\x0fwarning_reports\x18\x06 \x03(\x0b\x32\x30.mgmt.v1alpha1.ColumnWarning.ColumnWarningReportR\x0ewarningReports\x1as\n\x13\x43olumnWarningReport\x12\x42\n\x04\x63ode\x18\x01 \x01(\x0e\x32..mgmt.v1alpha1.ColumnWarning.ColumnWarningCodeR\x04\x63ode\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message\"\x93\x01\n\x11\x43olumnWarningCode\x12#\n\x1f\x43OLUMN_WARNING_CODE_UNSPECIFIED\x10\x00\x12+\n\'COLUMN_WARNING_CODE_NOT_FOUND_IN_SOURCE\x10\x01\x12,\n(COLUMN_WARNING_CODE_NOT_FOUND_IN_MAPPING\x10\x02\"\xae\x03\n\rDatabaseError\x12\x1a\n\x06\x65rrors\x18\x01 \x03(\tB\x02\x18\x01R\x06\x65rrors\x12U\n\rerror_reports\x18\x02 \x03(\x0b\x32\x30.mgmt.v1alpha1.DatabaseError.DatabaseErrorReportR\x0c\x65rrorReports\x1as\n\x13\x44\x61tabaseErrorReport\x12\x42\n\x04\x63ode\x18\x01 \x01(\x0e\x32..mgmt.v1alpha1.DatabaseError.DatabaseErrorCodeR\x04\x63ode\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message\"\xb4\x01\n\x11\x44\x61tabaseErrorCode\x12#\n\x1f\x44\x41TABASE_ERROR_CODE_UNSPECIFIED\x10\x00\x12M\nIDATABASE_ERROR_CODE_UNSUPPORTED_CIRCULAR_DEPENDENCY_AT_LEAST_ONE_NULLABLE\x10\x01\x12+\n\'DATABASE_ERROR_CODE_VFK_COLUMN_MISMATCH\x10\x02\"\xca\x04\n\nTableError\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12O\n\rerror_reports\x18\x03 \x03(\x0b\x32*.mgmt.v1alpha1.TableError.TableErrorReportR\x0c\x65rrorReports\x1aj\n\x10TableErrorReport\x12<\n\x04\x63ode\x18\x01 \x01(\x0e\x32(.mgmt.v1alpha1.TableError.TableErrorCodeR\x04\x63ode\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message\"\xd0\x02\n\x0eTableErrorCode\x12 \n\x1cTABLE_ERROR_CODE_UNSPECIFIED\x10\x00\x12.\n*TABLE_ERROR_CODE_TABLE_NOT_FOUND_IN_SOURCE\x10\x01\x12:\n6TABLE_ERROR_CODE_VFK_SOURCE_TABLE_NOT_FOUND_IN_MAPPING\x10\x02\x12\x39\n5TABLE_ERROR_CODE_VFK_SOURCE_TABLE_NOT_FOUND_IN_SOURCE\x10\x03\x12:\n6TABLE_ERROR_CODE_VFK_TARGET_TABLE_NOT_FOUND_IN_MAPPING\x10\x04\x12\x39\n5TABLE_ERROR_CODE_VFK_TARGET_TABLE_NOT_FOUND_IN_SOURCE\x10\x05\"\xaa\x02\n\x1bValidateJobMappingsResponse\x12?\n\rcolumn_errors\x18\x01 \x03(\x0b\x32\x1a.mgmt.v1alpha1.ColumnErrorR\x0c\x63olumnErrors\x12\x45\n\x0f\x64\x61tabase_errors\x18\x02 \x01(\x0b\x32\x1c.mgmt.v1alpha1.DatabaseErrorR\x0e\x64\x61tabaseErrors\x12\x45\n\x0f\x63olumn_warnings\x18\x03 \x03(\x0b\x32\x1c.mgmt.v1alpha1.ColumnWarningR\x0e\x63olumnWarnings\x12<\n\x0ctable_errors\x18\x04 \x03(\x0b\x32\x19.mgmt.v1alpha1.TableErrorR\x0btableErrors\"}\n\x15ValidateSchemaRequest\x12\x35\n\x08mappings\x18\x01 \x03(\x0b\x32\x19.mgmt.v1alpha1.JobMappingR\x08mappings\x12-\n\rconnection_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\"\xd8\x02\n\x16ValidateSchemaResponse\x12\x46\n\x0fmissing_columns\x18\x01 \x03(\x0b\x32\x1d.mgmt.v1alpha1.DatabaseColumnR\x0emissingColumns\x12\x42\n\rextra_columns\x18\x02 \x03(\x0b\x32\x1d.mgmt.v1alpha1.DatabaseColumnR\x0c\x65xtraColumns\x12R\n\x0emissing_tables\x18\x03 \x03(\x0b\x32+.mgmt.v1alpha1.ValidateSchemaResponse.TableR\rmissingTables\x12\'\n\x0fmissing_schemas\x18\x04 \x03(\tR\x0emissingSchemas\x1a\x35\n\x05Table\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\"[\n\x11VirtualForeignKey\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12\x18\n\x07\x63olumns\x18\x03 \x03(\tR\x07\x63olumns\"\xa5\x01\n\x18VirtualForeignConstraint\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12\x18\n\x07\x63olumns\x18\x03 \x03(\tR\x07\x63olumns\x12\x41\n\x0b\x66oreign_key\x18\x04 \x01(\x0b\x32 .mgmt.v1alpha1.VirtualForeignKeyR\nforeignKey\"\x88\x01\n\rRunContextKey\x12%\n\njob_run_id\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x08jobRunId\x12(\n\x0b\x65xternal_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\nexternalId\x12&\n\naccount_id\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\taccountId\"D\n\x14GetRunContextRequest\x12,\n\x02id\x18\x01 \x01(\x0b\x32\x1c.mgmt.v1alpha1.RunContextKeyR\x02id\"-\n\x15GetRunContextResponse\x12\x14\n\x05value\x18\x01 \x01(\x0cR\x05value\"Z\n\x14SetRunContextRequest\x12,\n\x02id\x18\x01 \x01(\x0b\x32\x1c.mgmt.v1alpha1.RunContextKeyR\x02id\x12\x14\n\x05value\x18\x02 \x01(\x0cR\x05value\"\x17\n\x15SetRunContextResponse\"[\n\x15SetRunContextsRequest\x12,\n\x02id\x18\x01 \x01(\x0b\x32\x1c.mgmt.v1alpha1.RunContextKeyR\x02id\x12\x14\n\x05value\x18\x02 \x01(\x0cR\x05value\"\x18\n\x16SetRunContextsResponse\"\xad\x03\n\x07JobHook\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12 \n\x0b\x64\x65scription\x18\x03 \x01(\tR\x0b\x64\x65scription\x12\x15\n\x06job_id\x18\x04 \x01(\tR\x05jobId\x12\x34\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobHookConfigR\x06\x63onfig\x12+\n\x12\x63reated_by_user_id\x18\x06 \x01(\tR\x0f\x63reatedByUserId\x12\x39\n\ncreated_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12+\n\x12updated_by_user_id\x18\x08 \x01(\tR\x0fupdatedByUserId\x12\x39\n\nupdated_at\x18\t \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tupdatedAt\x12\x18\n\x07\x65nabled\x18\n \x01(\x08R\x07\x65nabled\x12%\n\x08priority\x18\x0b \x01(\rB\t\xbaH\x06*\x04\x18\x64(\x00R\x08priority\"\xdd\x01\n\nNewJobHook\x12-\n\x04name\x18\x01 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x04name\x12)\n\x0b\x64\x65scription\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x0b\x64\x65scription\x12\x34\n\x06\x63onfig\x18\x03 \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobHookConfigR\x06\x63onfig\x12\x18\n\x07\x65nabled\x18\x04 \x01(\x08R\x07\x65nabled\x12%\n\x08priority\x18\x05 \x01(\rB\t\xbaH\x06*\x04\x18\x64(\x00R\x08priority\"\xbd\x03\n\rJobHookConfig\x12;\n\x03sql\x18\x05 \x01(\x0b\x32\'.mgmt.v1alpha1.JobHookConfig.JobSqlHookH\x00R\x03sql\x1a\xc5\x02\n\nJobSqlHook\x12\x1d\n\x05query\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05query\x12-\n\rconnection_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12\x46\n\x06timing\x18\x03 \x01(\x0b\x32..mgmt.v1alpha1.JobHookConfig.JobSqlHook.TimingR\x06timing\x1a\xa0\x01\n\x06Timing\x12@\n\x08pre_sync\x18\x03 \x01(\x0b\x32#.mgmt.v1alpha1.JobHookTimingPreSyncH\x00R\x07preSync\x12\x43\n\tpost_sync\x18\x04 \x01(\x0b\x32$.mgmt.v1alpha1.JobHookTimingPostSyncH\x00R\x08postSyncB\x0f\n\x06timing\x12\x05\xbaH\x02\x08\x01\x42\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01J\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05\"\x16\n\x14JobHookTimingPreSync\"\x17\n\x15JobHookTimingPostSync\"5\n\x12GetJobHooksRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\"C\n\x13GetJobHooksResponse\x12,\n\x05hooks\x18\x01 \x03(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x05hooks\"-\n\x11GetJobHookRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"@\n\x12GetJobHookResponse\x12*\n\x04hook\x18\x01 \x01(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x04hook\"\\\n\x14\x43reateJobHookRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\x12-\n\x04hook\x18\x02 \x01(\x0b\x32\x19.mgmt.v1alpha1.NewJobHookR\x04hook\"C\n\x15\x43reateJobHookResponse\x12*\n\x04hook\x18\x01 \x01(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x04hook\"0\n\x14\x44\x65leteJobHookRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"\x17\n\x15\x44\x65leteJobHookResponse\"J\n\x1dIsJobHookNameAvailableRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\"C\n\x1eIsJobHookNameAvailableResponse\x12!\n\x0cis_available\x18\x01 \x01(\x08R\x0bisAvailable\"\x81\x02\n\x14UpdateJobHookRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12-\n\x04name\x18\x02 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x04name\x12)\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x0b\x64\x65scription\x12\x34\n\x06\x63onfig\x18\x04 \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobHookConfigR\x06\x63onfig\x12\x18\n\x07\x65nabled\x18\x05 \x01(\x08R\x07\x65nabled\x12%\n\x08priority\x18\x06 \x01(\rB\t\xbaH\x06*\x04\x18\x64(\x00R\x08priority\"C\n\x15UpdateJobHookResponse\x12*\n\x04hook\x18\x01 \x01(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x04hook\"N\n\x18SetJobHookEnabledRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x18\n\x07\x65nabled\x18\x02 \x01(\x08R\x07\x65nabled\"G\n\x19SetJobHookEnabledResponse\x12*\n\x04hook\x18\x01 \x01(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x04hook\"\xde\x01\n GetActiveJobHooksByTimingRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\x12N\n\x06timing\x18\x02 \x01(\x0e\x32\x36.mgmt.v1alpha1.GetActiveJobHooksByTimingRequest.TimingR\x06timing\"I\n\x06Timing\x12\x16\n\x12TIMING_UNSPECIFIED\x10\x00\x12\x12\n\x0eTIMING_PRESYNC\x10\x01\x12\x13\n\x0fTIMING_POSTSYNC\x10\x02\"Q\n!GetActiveJobHooksByTimingResponse\x12,\n\x05hooks\x18\x01 \x03(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x05hooks*o\n\tJobStatus\x12\x1a\n\x16JOB_STATUS_UNSPECIFIED\x10\x00\x12\x16\n\x12JOB_STATUS_ENABLED\x10\x01\x12\x15\n\x11JOB_STATUS_PAUSED\x10\x03\x12\x17\n\x13JOB_STATUS_DISABLED\x10\x04*\xa7\x01\n\x0e\x41\x63tivityStatus\x12\x1f\n\x1b\x41\x43TIVITY_STATUS_UNSPECIFIED\x10\x00\x12\x1d\n\x19\x41\x43TIVITY_STATUS_SCHEDULED\x10\x01\x12\x1b\n\x17\x41\x43TIVITY_STATUS_STARTED\x10\x02\x12\x1c\n\x18\x41\x43TIVITY_STATUS_CANCELED\x10\x03\x12\x1a\n\x16\x41\x43TIVITY_STATUS_FAILED\x10\x04*\x92\x02\n\x0cJobRunStatus\x12\x1e\n\x1aJOB_RUN_STATUS_UNSPECIFIED\x10\x00\x12\x1a\n\x16JOB_RUN_STATUS_PENDING\x10\x01\x12\x1a\n\x16JOB_RUN_STATUS_RUNNING\x10\x02\x12\x1b\n\x17JOB_RUN_STATUS_COMPLETE\x10\x03\x12\x18\n\x14JOB_RUN_STATUS_ERROR\x10\x04\x12\x1b\n\x17JOB_RUN_STATUS_CANCELED\x10\x05\x12\x1d\n\x19JOB_RUN_STATUS_TERMINATED\x10\x06\x12\x19\n\x15JOB_RUN_STATUS_FAILED\x10\x07\x12\x1c\n\x18JOB_RUN_STATUS_TIMED_OUT\x10\x08*|\n\tLogWindow\x12\"\n\x1eLOG_WINDOW_NO_TIME_UNSPECIFIED\x10\x00\x12\x1a\n\x16LOG_WINDOW_FIFTEEN_MIN\x10\x01\x12\x17\n\x13LOG_WINDOW_ONE_HOUR\x10\x02\x12\x16\n\x12LOG_WINDOW_ONE_DAY\x10\x03*w\n\x08LogLevel\x12\x19\n\x15LOG_LEVEL_UNSPECIFIED\x10\x00\x12\x13\n\x0fLOG_LEVEL_DEBUG\x10\x01\x12\x12\n\x0eLOG_LEVEL_INFO\x10\x02\x12\x12\n\x0eLOG_LEVEL_WARN\x10\x03\x12\x13\n\x0fLOG_LEVEL_ERROR\x10\x04\x32\xb7 \n\nJobService\x12M\n\x07GetJobs\x12\x1d.mgmt.v1alpha1.GetJobsRequest\x1a\x1e.mgmt.v1alpha1.GetJobsResponse\"\x03\x90\x02\x01\x12J\n\x06GetJob\x12\x1c.mgmt.v1alpha1.GetJobRequest\x1a\x1d.mgmt.v1alpha1.GetJobResponse\"\x03\x90\x02\x01\x12P\n\tCreateJob\x12\x1f.mgmt.v1alpha1.CreateJobRequest\x1a .mgmt.v1alpha1.CreateJobResponse\"\x00\x12P\n\tDeleteJob\x12\x1f.mgmt.v1alpha1.DeleteJobRequest\x1a .mgmt.v1alpha1.DeleteJobResponse\"\x00\x12n\n\x12IsJobNameAvailable\x12(.mgmt.v1alpha1.IsJobNameAvailableRequest\x1a).mgmt.v1alpha1.IsJobNameAvailableResponse\"\x03\x90\x02\x01\x12h\n\x11UpdateJobSchedule\x12\'.mgmt.v1alpha1.UpdateJobScheduleRequest\x1a(.mgmt.v1alpha1.UpdateJobScheduleResponse\"\x00\x12\x80\x01\n\x19UpdateJobSourceConnection\x12/.mgmt.v1alpha1.UpdateJobSourceConnectionRequest\x1a\x30.mgmt.v1alpha1.UpdateJobSourceConnectionResponse\"\x00\x12\x95\x01\n SetJobSourceSqlConnectionSubsets\x12\x36.mgmt.v1alpha1.SetJobSourceSqlConnectionSubsetsRequest\x1a\x37.mgmt.v1alpha1.SetJobSourceSqlConnectionSubsetsResponse\"\x00\x12\x8f\x01\n\x1eUpdateJobDestinationConnection\x12\x34.mgmt.v1alpha1.UpdateJobDestinationConnectionRequest\x1a\x35.mgmt.v1alpha1.UpdateJobDestinationConnectionResponse\"\x00\x12\x8f\x01\n\x1e\x44\x65leteJobDestinationConnection\x12\x34.mgmt.v1alpha1.DeleteJobDestinationConnectionRequest\x1a\x35.mgmt.v1alpha1.DeleteJobDestinationConnectionResponse\"\x00\x12\x92\x01\n\x1f\x43reateJobDestinationConnections\x12\x35.mgmt.v1alpha1.CreateJobDestinationConnectionsRequest\x1a\x36.mgmt.v1alpha1.CreateJobDestinationConnectionsResponse\"\x00\x12M\n\x08PauseJob\x12\x1e.mgmt.v1alpha1.PauseJobRequest\x1a\x1f.mgmt.v1alpha1.PauseJobResponse\"\x00\x12h\n\x10GetJobRecentRuns\x12&.mgmt.v1alpha1.GetJobRecentRunsRequest\x1a\'.mgmt.v1alpha1.GetJobRecentRunsResponse\"\x03\x90\x02\x01\x12\x62\n\x0eGetJobNextRuns\x12$.mgmt.v1alpha1.GetJobNextRunsRequest\x1a%.mgmt.v1alpha1.GetJobNextRunsResponse\"\x03\x90\x02\x01\x12\\\n\x0cGetJobStatus\x12\".mgmt.v1alpha1.GetJobStatusRequest\x1a#.mgmt.v1alpha1.GetJobStatusResponse\"\x03\x90\x02\x01\x12\x62\n\x0eGetJobStatuses\x12$.mgmt.v1alpha1.GetJobStatusesRequest\x1a%.mgmt.v1alpha1.GetJobStatusesResponse\"\x03\x90\x02\x01\x12V\n\nGetJobRuns\x12 .mgmt.v1alpha1.GetJobRunsRequest\x1a!.mgmt.v1alpha1.GetJobRunsResponse\"\x03\x90\x02\x01\x12\x65\n\x0fGetJobRunEvents\x12%.mgmt.v1alpha1.GetJobRunEventsRequest\x1a&.mgmt.v1alpha1.GetJobRunEventsResponse\"\x03\x90\x02\x01\x12S\n\tGetJobRun\x12\x1f.mgmt.v1alpha1.GetJobRunRequest\x1a .mgmt.v1alpha1.GetJobRunResponse\"\x03\x90\x02\x01\x12Y\n\x0c\x44\x65leteJobRun\x12\".mgmt.v1alpha1.DeleteJobRunRequest\x1a#.mgmt.v1alpha1.DeleteJobRunResponse\"\x00\x12Y\n\x0c\x43reateJobRun\x12\".mgmt.v1alpha1.CreateJobRunRequest\x1a#.mgmt.v1alpha1.CreateJobRunResponse\"\x00\x12Y\n\x0c\x43\x61ncelJobRun\x12\".mgmt.v1alpha1.CancelJobRunRequest\x1a#.mgmt.v1alpha1.CancelJobRunResponse\"\x00\x12\x62\n\x0fTerminateJobRun\x12%.mgmt.v1alpha1.TerminateJobRunRequest\x1a&.mgmt.v1alpha1.TerminateJobRunResponse\"\x00\x12p\n\x13GetJobRunLogsStream\x12).mgmt.v1alpha1.GetJobRunLogsStreamRequest\x1a*.mgmt.v1alpha1.GetJobRunLogsStreamResponse\"\x00\x30\x01\x12\\\n\rGetJobRunLogs\x12#.mgmt.v1alpha1.GetJobRunLogsRequest\x1a$.mgmt.v1alpha1.GetJobRunLogsResponse\"\x00\x12t\n\x15SetJobWorkflowOptions\x12+.mgmt.v1alpha1.SetJobWorkflowOptionsRequest\x1a,.mgmt.v1alpha1.SetJobWorkflowOptionsResponse\"\x00\x12h\n\x11SetJobSyncOptions\x12\'.mgmt.v1alpha1.SetJobSyncOptionsRequest\x1a(.mgmt.v1alpha1.SetJobSyncOptionsResponse\"\x00\x12n\n\x13ValidateJobMappings\x12).mgmt.v1alpha1.ValidateJobMappingsRequest\x1a*.mgmt.v1alpha1.ValidateJobMappingsResponse\"\x00\x12_\n\x0eValidateSchema\x12$.mgmt.v1alpha1.ValidateSchemaRequest\x1a%.mgmt.v1alpha1.ValidateSchemaResponse\"\x00\x12\\\n\rGetRunContext\x12#.mgmt.v1alpha1.GetRunContextRequest\x1a$.mgmt.v1alpha1.GetRunContextResponse\"\x00\x12\\\n\rSetRunContext\x12#.mgmt.v1alpha1.SetRunContextRequest\x1a$.mgmt.v1alpha1.SetRunContextResponse\"\x00\x12\x61\n\x0eSetRunContexts\x12$.mgmt.v1alpha1.SetRunContextsRequest\x1a%.mgmt.v1alpha1.SetRunContextsResponse\"\x00(\x01\x12Y\n\x0bGetJobHooks\x12!.mgmt.v1alpha1.GetJobHooksRequest\x1a\".mgmt.v1alpha1.GetJobHooksResponse\"\x03\x90\x02\x01\x12V\n\nGetJobHook\x12 .mgmt.v1alpha1.GetJobHookRequest\x1a!.mgmt.v1alpha1.GetJobHookResponse\"\x03\x90\x02\x01\x12\\\n\rCreateJobHook\x12#.mgmt.v1alpha1.CreateJobHookRequest\x1a$.mgmt.v1alpha1.CreateJobHookResponse\"\x00\x12\\\n\rDeleteJobHook\x12#.mgmt.v1alpha1.DeleteJobHookRequest\x1a$.mgmt.v1alpha1.DeleteJobHookResponse\"\x00\x12w\n\x16IsJobHookNameAvailable\x12,.mgmt.v1alpha1.IsJobHookNameAvailableRequest\x1a-.mgmt.v1alpha1.IsJobHookNameAvailableResponse\"\x00\x12\\\n\rUpdateJobHook\x12#.mgmt.v1alpha1.UpdateJobHookRequest\x1a$.mgmt.v1alpha1.UpdateJobHookResponse\"\x00\x12h\n\x11SetJobHookEnabled\x12\'.mgmt.v1alpha1.SetJobHookEnabledRequest\x1a(.mgmt.v1alpha1.SetJobHookEnabledResponse\"\x00\x12\x83\x01\n\x19GetActiveJobHooksByTiming\x12/.mgmt.v1alpha1.GetActiveJobHooksByTimingRequest\x1a\x30.mgmt.v1alpha1.GetActiveJobHooksByTimingResponse\"\x03\x90\x02\x01\x42\xc4\x01\n\x11\x63om.mgmt.v1alpha1B\x08JobProtoP\x01ZPgithub.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1;mgmtv1alpha1\xa2\x02\x03MXX\xaa\x02\rMgmt.V1alpha1\xca\x02\rMgmt\\V1alpha1\xe2\x02\x19Mgmt\\V1alpha1\\GPBMetadata\xea\x02\x0eMgmt::V1alpha1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17mgmt/v1alpha1/job.proto\x12\rmgmt.v1alpha1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a#mgmt/v1alpha1/connection_data.proto\x1a\x1fmgmt/v1alpha1/transformer.proto\"9\n\x0eGetJobsRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"9\n\x0fGetJobsResponse\x12&\n\x04jobs\x18\x01 \x03(\x0b\x32\x12.mgmt.v1alpha1.JobR\x04jobs\"N\n\tJobSource\x12\x41\n\x07options\x18\x01 \x01(\x0b\x32\x1f.mgmt.v1alpha1.JobSourceOptionsB\x06\xbaH\x03\xc8\x01\x01R\x07options\"\xe9\x04\n\x10JobSourceOptions\x12L\n\x08postgres\x18\x01 \x01(\x0b\x32..mgmt.v1alpha1.PostgresSourceConnectionOptionsH\x00R\x08postgres\x12\x44\n\x06\x61ws_s3\x18\x02 \x01(\x0b\x32+.mgmt.v1alpha1.AwsS3SourceConnectionOptionsH\x00R\x05\x61wsS3\x12\x43\n\x05mysql\x18\x03 \x01(\x0b\x32+.mgmt.v1alpha1.MysqlSourceConnectionOptionsH\x00R\x05mysql\x12\x42\n\x08generate\x18\x04 \x01(\x0b\x32$.mgmt.v1alpha1.GenerateSourceOptionsH\x00R\x08generate\x12I\n\x0b\x61i_generate\x18\x05 \x01(\x0b\x32&.mgmt.v1alpha1.AiGenerateSourceOptionsH\x00R\naiGenerate\x12I\n\x07mongodb\x18\x06 \x01(\x0b\x32-.mgmt.v1alpha1.MongoDBSourceConnectionOptionsH\x00R\x07mongodb\x12L\n\x08\x64ynamodb\x18\x07 \x01(\x0b\x32..mgmt.v1alpha1.DynamoDBSourceConnectionOptionsH\x00R\x08\x64ynamodb\x12\x43\n\x05mssql\x18\x08 \x01(\x0b\x32+.mgmt.v1alpha1.MssqlSourceConnectionOptionsH\x00R\x05mssqlB\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01\"\x85\x01\n\x14\x43reateJobDestination\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12>\n\x07options\x18\x02 \x01(\x0b\x32$.mgmt.v1alpha1.JobDestinationOptionsR\x07options\"\x8f\x01\n\x0eJobDestination\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12>\n\x07options\x18\x02 \x01(\x0b\x32$.mgmt.v1alpha1.JobDestinationOptionsR\x07options\x12\x0e\n\x02id\x18\x03 \x01(\tR\x02id\"\xb6\x03\n\x17\x41iGenerateSourceOptions\x12\x32\n\x10\x61i_connection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0e\x61iConnectionId\x12O\n\x07schemas\x18\x02 \x03(\x0b\x32+.mgmt.v1alpha1.AiGenerateSourceSchemaOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x07schemas\x12\x44\n\x17\x66k_source_connection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x14\x66kSourceConnectionId\x88\x01\x01\x12&\n\nmodel_name\x18\x04 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\tmodelName\x12$\n\x0buser_prompt\x18\x05 \x01(\tH\x01R\nuserPrompt\x88\x01\x01\x12>\n\x13generate_batch_size\x18\x06 \x01(\x03\x42\t\xbaH\x06\"\x04\x18\x64(\x01H\x02R\x11generateBatchSize\x88\x01\x01\x42\x1a\n\x18_fk_source_connection_idB\x0e\n\x0c_user_promptB\x16\n\x14_generate_batch_size\"\x8d\x01\n\x1c\x41iGenerateSourceSchemaOption\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12L\n\x06tables\x18\x02 \x03(\x0b\x32*.mgmt.v1alpha1.AiGenerateSourceTableOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x06tables\"e\n\x1b\x41iGenerateSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12\'\n\trow_count\x18\x02 \x01(\x03\x42\n\xbaH\x07\"\x05\x18\xe8\x07(\x01R\x08rowCount\"\xce\x01\n\x15GenerateSourceOptions\x12M\n\x07schemas\x18\x01 \x03(\x0b\x32).mgmt.v1alpha1.GenerateSourceSchemaOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x07schemas\x12\x44\n\x17\x66k_source_connection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x14\x66kSourceConnectionId\x88\x01\x01\x42\x1a\n\x18_fk_source_connection_idJ\x04\x08\x02\x10\x03\"\x89\x01\n\x1aGenerateSourceSchemaOption\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12J\n\x06tables\x18\x02 \x03(\x0b\x32(.mgmt.v1alpha1.GenerateSourceTableOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x06tables\"`\n\x19GenerateSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12$\n\trow_count\x18\x02 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x01R\x08rowCount\"O\n\x1eMongoDBSourceConnectionOptions\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\"\xaf\x02\n\x1f\x44ynamoDBSourceConnectionOptions\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12@\n\x06tables\x18\x02 \x03(\x0b\x32(.mgmt.v1alpha1.DynamoDBSourceTableOptionR\x06tables\x12\x65\n\x13unmapped_transforms\x18\x03 \x01(\x0b\x32\x34.mgmt.v1alpha1.DynamoDBSourceUnmappedTransformConfigR\x12unmappedTransforms\x12\x34\n\x16\x65nable_consistent_read\x18\x04 \x01(\x08R\x14\x65nableConsistentRead\"\x8f\x02\n%DynamoDBSourceUnmappedTransformConfig\x12\x32\n\x01\x62\x18\x01 \x01(\x0b\x32$.mgmt.v1alpha1.JobMappingTransformerR\x01\x62\x12>\n\x07\x62oolean\x18\x02 \x01(\x0b\x32$.mgmt.v1alpha1.JobMappingTransformerR\x07\x62oolean\x12\x32\n\x01n\x18\x04 \x01(\x0b\x32$.mgmt.v1alpha1.JobMappingTransformerR\x01n\x12\x32\n\x01s\x18\x06 \x01(\x0b\x32$.mgmt.v1alpha1.JobMappingTransformerR\x01sJ\x04\x08\x03\x10\x04J\x04\x08\x05\x10\x06\"s\n\x19\x44ynamoDBSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12&\n\x0cwhere_clause\x18\x02 \x01(\tH\x00R\x0bwhereClause\x88\x01\x01\x42\x0f\n\r_where_clause\"\xaf\x08\n\x1fPostgresSourceConnectionOptions\x12\x43\n\x07schemas\x18\x02 \x03(\x0b\x32).mgmt.v1alpha1.PostgresSourceSchemaOptionR\x07schemas\x12-\n\rconnection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12H\n!subset_by_foreign_key_constraints\x18\x04 \x01(\x08R\x1dsubsetByForeignKeyConstraints\x12\x89\x01\n\x1cnew_column_addition_strategy\x18\x05 \x01(\x0b\x32H.mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategyR\x19newColumnAdditionStrategy\x12|\n\x17\x63olumn_removal_strategy\x18\x06 \x01(\x0b\x32\x44.mgmt.v1alpha1.PostgresSourceConnectionOptions.ColumnRemovalStrategyR\x15\x63olumnRemovalStrategy\x1a\x9b\x02\n\x19NewColumnAdditionStrategy\x12m\n\x08halt_job\x18\x01 \x01(\x0b\x32P.mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.HaltJobH\x00R\x07haltJob\x12m\n\x08\x61uto_map\x18\x02 \x01(\x0b\x32P.mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.AutoMapH\x00R\x07\x61utoMap\x1a\t\n\x07HaltJob\x1a\t\n\x07\x41utoMapB\n\n\x08strategy\x1a\x9f\x02\n\x15\x43olumnRemovalStrategy\x12i\n\x08halt_job\x18\x01 \x01(\x0b\x32L.mgmt.v1alpha1.PostgresSourceConnectionOptions.ColumnRemovalStrategy.HaltJobH\x00R\x07haltJob\x12u\n\x0c\x63ontinue_job\x18\x02 \x01(\x0b\x32P.mgmt.v1alpha1.PostgresSourceConnectionOptions.ColumnRemovalStrategy.ContinueJobH\x00R\x0b\x63ontinueJob\x1a\t\n\x07HaltJob\x1a\r\n\x0b\x43ontinueJobB\n\n\x08strategyJ\x04\x08\x01\x10\x02\"\x89\x01\n\x1aPostgresSourceSchemaOption\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12J\n\x06tables\x18\x02 \x03(\x0b\x32(.mgmt.v1alpha1.PostgresSourceTableOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x06tables\"s\n\x19PostgresSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12&\n\x0cwhere_clause\x18\x02 \x01(\tH\x00R\x0bwhereClause\x88\x01\x01\x42\x0f\n\r_where_clause\"\xae\x05\n\x1cMysqlSourceConnectionOptions\x12<\n\x1bhalt_on_new_column_addition\x18\x01 \x01(\x08R\x17haltOnNewColumnAddition\x12@\n\x07schemas\x18\x02 \x03(\x0b\x32&.mgmt.v1alpha1.MysqlSourceSchemaOptionR\x07schemas\x12-\n\rconnection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12H\n!subset_by_foreign_key_constraints\x18\x04 \x01(\x08R\x1dsubsetByForeignKeyConstraints\x12y\n\x17\x63olumn_removal_strategy\x18\x05 \x01(\x0b\x32\x41.mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategyR\x15\x63olumnRemovalStrategy\x1a\x99\x02\n\x15\x43olumnRemovalStrategy\x12\x66\n\x08halt_job\x18\x01 \x01(\x0b\x32I.mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategy.HaltJobH\x00R\x07haltJob\x12r\n\x0c\x63ontinue_job\x18\x02 \x01(\x0b\x32M.mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategy.ContinueJobH\x00R\x0b\x63ontinueJob\x1a\t\n\x07HaltJob\x1a\r\n\x0b\x43ontinueJobB\n\n\x08strategy\"\x83\x01\n\x17MysqlSourceSchemaOption\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12G\n\x06tables\x18\x02 \x03(\x0b\x32%.mgmt.v1alpha1.MysqlSourceTableOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x06tables\"p\n\x16MysqlSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12&\n\x0cwhere_clause\x18\x02 \x01(\tH\x00R\x0bwhereClause\x88\x01\x01\x42\x0f\n\r_where_clause\"\xae\x05\n\x1cMssqlSourceConnectionOptions\x12<\n\x1bhalt_on_new_column_addition\x18\x01 \x01(\x08R\x17haltOnNewColumnAddition\x12@\n\x07schemas\x18\x02 \x03(\x0b\x32&.mgmt.v1alpha1.MssqlSourceSchemaOptionR\x07schemas\x12-\n\rconnection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12H\n!subset_by_foreign_key_constraints\x18\x04 \x01(\x08R\x1dsubsetByForeignKeyConstraints\x12y\n\x17\x63olumn_removal_strategy\x18\x05 \x01(\x0b\x32\x41.mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategyR\x15\x63olumnRemovalStrategy\x1a\x99\x02\n\x15\x43olumnRemovalStrategy\x12\x66\n\x08halt_job\x18\x01 \x01(\x0b\x32I.mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy.HaltJobH\x00R\x07haltJob\x12r\n\x0c\x63ontinue_job\x18\x02 \x01(\x0b\x32M.mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy.ContinueJobH\x00R\x0b\x63ontinueJob\x1a\t\n\x07HaltJob\x1a\r\n\x0b\x43ontinueJobB\n\n\x08strategy\"\x83\x01\n\x17MssqlSourceSchemaOption\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12G\n\x06tables\x18\x02 \x03(\x0b\x32%.mgmt.v1alpha1.MssqlSourceTableOptionB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x06tables\"p\n\x16MssqlSourceTableOption\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12&\n\x0cwhere_clause\x18\x02 \x01(\tH\x00R\x0bwhereClause\x88\x01\x01\x42\x0f\n\r_where_clause\"M\n\x1c\x41wsS3SourceConnectionOptions\x12-\n\rconnection_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\"\xcf\x05\n\x15JobDestinationOptions\x12`\n\x10postgres_options\x18\x01 \x01(\x0b\x32\x33.mgmt.v1alpha1.PostgresDestinationConnectionOptionsH\x00R\x0fpostgresOptions\x12X\n\x0e\x61ws_s3_options\x18\x02 \x01(\x0b\x32\x30.mgmt.v1alpha1.AwsS3DestinationConnectionOptionsH\x00R\x0c\x61wsS3Options\x12W\n\rmysql_options\x18\x03 \x01(\x0b\x32\x30.mgmt.v1alpha1.MysqlDestinationConnectionOptionsH\x00R\x0cmysqlOptions\x12]\n\x0fmongodb_options\x18\x04 \x01(\x0b\x32\x32.mgmt.v1alpha1.MongoDBDestinationConnectionOptionsH\x00R\x0emongodbOptions\x12v\n\x18gcp_cloudstorage_options\x18\x05 \x01(\x0b\x32:.mgmt.v1alpha1.GcpCloudStorageDestinationConnectionOptionsH\x00R\x16gcpCloudstorageOptions\x12`\n\x10\x64ynamodb_options\x18\x06 \x01(\x0b\x32\x33.mgmt.v1alpha1.DynamoDBDestinationConnectionOptionsH\x00R\x0f\x64ynamodbOptions\x12W\n\rmssql_options\x18\x07 \x01(\x0b\x32\x30.mgmt.v1alpha1.MssqlDestinationConnectionOptionsH\x00R\x0cmssqlOptionsB\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01\"%\n#MongoDBDestinationConnectionOptions\"-\n+GcpCloudStorageDestinationConnectionOptions\"}\n$DynamoDBDestinationConnectionOptions\x12U\n\x0etable_mappings\x18\x01 \x03(\x0b\x32..mgmt.v1alpha1.DynamoDBDestinationTableMappingR\rtableMappings\"q\n\x1f\x44ynamoDBDestinationTableMapping\x12!\n\x0csource_table\x18\x01 \x01(\tR\x0bsourceTable\x12+\n\x11\x64\x65stination_table\x18\x02 \x01(\tR\x10\x64\x65stinationTable\"\xa4\x03\n$PostgresDestinationConnectionOptions\x12Q\n\x0etruncate_table\x18\x01 \x01(\x0b\x32*.mgmt.v1alpha1.PostgresTruncateTableConfigR\rtruncateTable\x12*\n\x11init_table_schema\x18\x02 \x01(\x08R\x0finitTableSchema\x12H\n\x0bon_conflict\x18\x03 \x01(\x0b\x32\'.mgmt.v1alpha1.PostgresOnConflictConfigR\nonConflict\x12=\n\x1bskip_foreign_key_violations\x18\x04 \x01(\x08R\x18skipForeignKeyViolations\x12\x30\n\x05\x62\x61tch\x18\x05 \x01(\x0b\x32\x1a.mgmt.v1alpha1.BatchConfigR\x05\x62\x61tch\x12\x30\n\rmax_in_flight\x18\x06 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x0bmaxInFlight\x88\x01\x01\x42\x10\n\x0e_max_in_flight\"\xc8\x02\n\x18PostgresOnConflictConfig\x12!\n\ndo_nothing\x18\x01 \x01(\x08\x42\x02\x18\x01R\tdoNothing\x12_\n\x07nothing\x18\x02 \x01(\x0b\x32\x43.mgmt.v1alpha1.PostgresOnConflictConfig.PostgresOnConflictDoNothingH\x00R\x07nothing\x12Z\n\x06update\x18\x03 \x01(\x0b\x32@.mgmt.v1alpha1.PostgresOnConflictConfig.PostgresOnConflictUpdateH\x00R\x06update\x1a\x1d\n\x1bPostgresOnConflictDoNothing\x1a\x1a\n\x18PostgresOnConflictUpdateB\x11\n\x08strategy\x12\x05\xbaH\x02\x08\x00\"m\n\x1bPostgresTruncateTableConfig\x12\x34\n\x16truncate_before_insert\x18\x01 \x01(\x08R\x14truncateBeforeInsert\x12\x18\n\x07\x63\x61scade\x18\x02 \x01(\x08R\x07\x63\x61scade\"\x9b\x03\n!MysqlDestinationConnectionOptions\x12N\n\x0etruncate_table\x18\x01 \x01(\x0b\x32\'.mgmt.v1alpha1.MysqlTruncateTableConfigR\rtruncateTable\x12*\n\x11init_table_schema\x18\x02 \x01(\x08R\x0finitTableSchema\x12\x45\n\x0bon_conflict\x18\x03 \x01(\x0b\x32$.mgmt.v1alpha1.MysqlOnConflictConfigR\nonConflict\x12=\n\x1bskip_foreign_key_violations\x18\x04 \x01(\x08R\x18skipForeignKeyViolations\x12\x30\n\x05\x62\x61tch\x18\x05 \x01(\x0b\x32\x1a.mgmt.v1alpha1.BatchConfigR\x05\x62\x61tch\x12\x30\n\rmax_in_flight\x18\x06 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x0bmaxInFlight\x88\x01\x01\x42\x10\n\x0e_max_in_flight\"P\n\x18MysqlTruncateTableConfig\x12\x34\n\x16truncate_before_insert\x18\x01 \x01(\x08R\x14truncateBeforeInsert\"\xaf\x02\n\x15MysqlOnConflictConfig\x12\x1d\n\ndo_nothing\x18\x01 \x01(\x08R\tdoNothing\x12Y\n\x07nothing\x18\x02 \x01(\x0b\x32=.mgmt.v1alpha1.MysqlOnConflictConfig.MysqlOnConflictDoNothingH\x00R\x07nothing\x12T\n\x06update\x18\x03 \x01(\x0b\x32:.mgmt.v1alpha1.MysqlOnConflictConfig.MysqlOnConflictUpdateH\x00R\x06update\x1a\x1a\n\x18MysqlOnConflictDoNothing\x1a\x17\n\x15MysqlOnConflictUpdateB\x11\n\x08strategy\x12\x05\xbaH\x02\x08\x00\"\x9b\x03\n!MssqlDestinationConnectionOptions\x12N\n\x0etruncate_table\x18\x01 \x01(\x0b\x32\'.mgmt.v1alpha1.MssqlTruncateTableConfigR\rtruncateTable\x12*\n\x11init_table_schema\x18\x02 \x01(\x08R\x0finitTableSchema\x12\x45\n\x0bon_conflict\x18\x03 \x01(\x0b\x32$.mgmt.v1alpha1.MssqlOnConflictConfigR\nonConflict\x12=\n\x1bskip_foreign_key_violations\x18\x04 \x01(\x08R\x18skipForeignKeyViolations\x12\x30\n\x05\x62\x61tch\x18\x05 \x01(\x0b\x32\x1a.mgmt.v1alpha1.BatchConfigR\x05\x62\x61tch\x12\x30\n\rmax_in_flight\x18\x06 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x0bmaxInFlight\x88\x01\x01\x42\x10\n\x0e_max_in_flight\"P\n\x18MssqlTruncateTableConfig\x12\x34\n\x16truncate_before_insert\x18\x01 \x01(\x08R\x14truncateBeforeInsert\"6\n\x15MssqlOnConflictConfig\x12\x1d\n\ndo_nothing\x18\x01 \x01(\x08R\tdoNothing\"\xb9\x04\n!AwsS3DestinationConnectionOptions\x12\x62\n\rstorage_class\x18\x01 \x01(\x0e\x32=.mgmt.v1alpha1.AwsS3DestinationConnectionOptions.StorageClassR\x0cstorageClass\x12\x30\n\rmax_in_flight\x18\x02 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x0bmaxInFlight\x88\x01\x01\x12\x1d\n\x07timeout\x18\x03 \x01(\tH\x01R\x07timeout\x88\x01\x01\x12\x30\n\x05\x62\x61tch\x18\x04 \x01(\x0b\x32\x1a.mgmt.v1alpha1.BatchConfigR\x05\x62\x61tch\"\x8e\x02\n\x0cStorageClass\x12\x1d\n\x19STORAGE_CLASS_UNSPECIFIED\x10\x00\x12\x1a\n\x16STORAGE_CLASS_STANDARD\x10\x01\x12$\n STORAGE_CLASS_REDUCED_REDUNDANCY\x10\x02\x12\x19\n\x15STORAGE_CLASS_GLACIER\x10\x03\x12\x1d\n\x19STORAGE_CLASS_STANDARD_IA\x10\x04\x12\x1c\n\x18STORAGE_CLASS_ONEZONE_IA\x10\x05\x12%\n!STORAGE_CLASS_INTELLIGENT_TIERING\x10\x06\x12\x1e\n\x1aSTORAGE_CLASS_DEEP_ARCHIVE\x10\x07\x42\x10\n\x0e_max_in_flightB\n\n\x08_timeout\"Z\n\x0b\x42\x61tchConfig\x12\x19\n\x05\x63ount\x18\x01 \x01(\rH\x00R\x05\x63ount\x88\x01\x01\x12\x1b\n\x06period\x18\x02 \x01(\tH\x01R\x06period\x88\x01\x01\x42\x08\n\x06_countB\t\n\x07_period\"\x86\x05\n\x10\x43reateJobRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x34\n\x08job_name\x18\x02 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x07jobName\x12(\n\rcron_schedule\x18\x03 \x01(\tH\x00R\x0c\x63ronSchedule\x88\x01\x01\x12?\n\x08mappings\x18\x04 \x03(\x0b\x32\x19.mgmt.v1alpha1.JobMappingB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x08mappings\x12\x30\n\x06source\x18\x05 \x01(\x0b\x32\x18.mgmt.v1alpha1.JobSourceR\x06source\x12Q\n\x0c\x64\x65stinations\x18\x06 \x03(\x0b\x32#.mgmt.v1alpha1.CreateJobDestinationB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x0c\x64\x65stinations\x12(\n\x10initiate_job_run\x18\x07 \x01(\x08R\x0einitiateJobRun\x12I\n\x10workflow_options\x18\x08 \x01(\x0b\x32\x1e.mgmt.v1alpha1.WorkflowOptionsR\x0fworkflowOptions\x12\x41\n\x0csync_options\x18\t \x01(\x0b\x32\x1e.mgmt.v1alpha1.ActivityOptionsR\x0bsyncOptions\x12Y\n\x14virtual_foreign_keys\x18\n \x03(\x0b\x32\'.mgmt.v1alpha1.VirtualForeignConstraintR\x12virtualForeignKeysB\x10\n\x0e_cron_schedule\"q\n\x0fWorkflowOptions\x12$\n\x0brun_timeout\x18\x08 \x01(\x03H\x00R\nrunTimeout\x88\x01\x01\x42\x0e\n\x0c_run_timeoutJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08\"\x95\x02\n\x0f\x41\x63tivityOptions\x12G\n\x19schedule_to_close_timeout\x18\x01 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x01H\x00R\x16scheduleToCloseTimeout\x88\x01\x01\x12\x41\n\x16start_to_close_timeout\x18\x02 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x01H\x01R\x13startToCloseTimeout\x88\x01\x01\x12=\n\x0cretry_policy\x18\x03 \x01(\x0b\x32\x1a.mgmt.v1alpha1.RetryPolicyR\x0bretryPolicyB\x1c\n\x1a_schedule_to_close_timeoutB\x19\n\x17_start_to_close_timeout\"[\n\x0bRetryPolicy\x12\x37\n\x10maximum_attempts\x18\x01 \x01(\x05\x42\x07\xbaH\x04\x1a\x02(\x00H\x00R\x0fmaximumAttempts\x88\x01\x01\x42\x13\n\x11_maximum_attempts\"9\n\x11\x43reateJobResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"W\n\x15JobMappingTransformer\x12\x38\n\x06\x63onfig\x18\x03 \x01(\x0b\x32 .mgmt.v1alpha1.TransformerConfigR\x06\x63onfigJ\x04\x08\x01\x10\x02\"\xb5\x01\n\nJobMapping\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12\x1d\n\x05table\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12\x1f\n\x06\x63olumn\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06\x63olumn\x12\x46\n\x0btransformer\x18\x05 \x01(\x0b\x32$.mgmt.v1alpha1.JobMappingTransformerR\x0btransformer\")\n\rGetJobRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"6\n\x0eGetJobResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"p\n\x18UpdateJobScheduleRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12(\n\rcron_schedule\x18\x02 \x01(\tH\x00R\x0c\x63ronSchedule\x88\x01\x01\x42\x10\n\x0e_cron_schedule\"A\n\x19UpdateJobScheduleResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"c\n\x0fPauseJobRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x14\n\x05pause\x18\x02 \x01(\x08R\x05pause\x12\x17\n\x04note\x18\x03 \x01(\tH\x00R\x04note\x88\x01\x01\x42\x07\n\x05_note\"8\n\x10PauseJobResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"\x80\x02\n UpdateJobSourceConnectionRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x30\n\x06source\x18\x02 \x01(\x0b\x32\x18.mgmt.v1alpha1.JobSourceR\x06source\x12\x35\n\x08mappings\x18\x03 \x03(\x0b\x32\x19.mgmt.v1alpha1.JobMappingR\x08mappings\x12Y\n\x14virtual_foreign_keys\x18\x04 \x03(\x0b\x32\'.mgmt.v1alpha1.VirtualForeignConstraintR\x12virtualForeignKeys\"I\n!UpdateJobSourceConnectionResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"r\n\x1aPostgresSourceSchemaSubset\x12T\n\x10postgres_schemas\x18\x01 \x03(\x0b\x32).mgmt.v1alpha1.PostgresSourceSchemaOptionR\x0fpostgresSchemas\"f\n\x17MysqlSourceSchemaSubset\x12K\n\rmysql_schemas\x18\x01 \x03(\x0b\x32&.mgmt.v1alpha1.MysqlSourceSchemaOptionR\x0cmysqlSchemas\"^\n\x1a\x44ynamoDBSourceSchemaSubset\x12@\n\x06tables\x18\x01 \x03(\x0b\x32(.mgmt.v1alpha1.DynamoDBSourceTableOptionR\x06tables\"f\n\x17MssqlSourceSchemaSubset\x12K\n\rmssql_schemas\x18\x01 \x03(\x0b\x32&.mgmt.v1alpha1.MssqlSourceSchemaOptionR\x0cmssqlSchemas\"\xf8\x02\n\x18JobSourceSqlSubetSchemas\x12T\n\x0fpostgres_subset\x18\x02 \x01(\x0b\x32).mgmt.v1alpha1.PostgresSourceSchemaSubsetH\x00R\x0epostgresSubset\x12K\n\x0cmysql_subset\x18\x03 \x01(\x0b\x32&.mgmt.v1alpha1.MysqlSourceSchemaSubsetH\x00R\x0bmysqlSubset\x12T\n\x0f\x64ynamodb_subset\x18\x04 \x01(\x0b\x32).mgmt.v1alpha1.DynamoDBSourceSchemaSubsetH\x00R\x0e\x64ynamodbSubset\x12K\n\x0cmssql_subset\x18\x05 \x01(\x0b\x32&.mgmt.v1alpha1.MssqlSourceSchemaSubsetH\x00R\x0bmssqlSubsetB\x10\n\x07schemas\x12\x05\xbaH\x02\x08\x01J\x04\x08\x01\x10\x02\"\xd0\x01\n\'SetJobSourceSqlConnectionSubsetsRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x41\n\x07schemas\x18\x02 \x01(\x0b\x32\'.mgmt.v1alpha1.JobSourceSqlSubetSchemasR\x07schemas\x12H\n!subset_by_foreign_key_constraints\x18\x03 \x01(\x08R\x1dsubsetByForeignKeyConstraints\"P\n(SetJobSourceSqlConnectionSubsetsResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"\xde\x01\n%UpdateJobDestinationConnectionRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\x12-\n\rconnection_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12>\n\x07options\x18\x03 \x01(\x0b\x32$.mgmt.v1alpha1.JobDestinationOptionsR\x07options\x12%\n\x0e\x64\x65stination_id\x18\x04 \x01(\tR\rdestinationId\"N\n&UpdateJobDestinationConnectionResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"X\n%DeleteJobDestinationConnectionRequest\x12/\n\x0e\x64\x65stination_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\rdestinationId\"(\n&DeleteJobDestinationConnectionResponse\"\x9c\x01\n&CreateJobDestinationConnectionsRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\x12Q\n\x0c\x64\x65stinations\x18\x02 \x03(\x0b\x32#.mgmt.v1alpha1.CreateJobDestinationB\x08\xbaH\x05\x92\x01\x02\x08\x01R\x0c\x64\x65stinations\"O\n\'CreateJobDestinationConnectionsResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\",\n\x10\x44\x65leteJobRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"\x13\n\x11\x44\x65leteJobResponse\"s\n\x19IsJobNameAvailableRequest\x12-\n\x04name\x18\x01 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x04name\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"?\n\x1aIsJobNameAvailableResponse\x12!\n\x0cis_available\x18\x01 \x01(\x08R\x0bisAvailable\"g\n\x11GetJobRunsRequest\x12!\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x05jobId\x12)\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\taccountIdB\x04\n\x02id\"F\n\x12GetJobRunsResponse\x12\x30\n\x08job_runs\x18\x01 \x03(\x0b\x32\x15.mgmt.v1alpha1.JobRunR\x07jobRuns\"Y\n\x10GetJobRunRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"C\n\x11GetJobRunResponse\x12.\n\x07job_run\x18\x01 \x01(\x0b\x32\x15.mgmt.v1alpha1.JobRunR\x06jobRun\"6\n\x13\x43reateJobRunRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\"\x16\n\x14\x43reateJobRunResponse\"\\\n\x13\x43\x61ncelJobRunRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"\x16\n\x14\x43\x61ncelJobRunResponse\"\xe9\x05\n\x03Job\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12+\n\x12\x63reated_by_user_id\x18\x02 \x01(\tR\x0f\x63reatedByUserId\x12\x39\n\ncreated_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12+\n\x12updated_by_user_id\x18\x04 \x01(\tR\x0fupdatedByUserId\x12\x39\n\nupdated_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tupdatedAt\x12\x12\n\x04name\x18\x06 \x01(\tR\x04name\x12\x30\n\x06source\x18\x07 \x01(\x0b\x32\x18.mgmt.v1alpha1.JobSourceR\x06source\x12\x41\n\x0c\x64\x65stinations\x18\x08 \x03(\x0b\x32\x1d.mgmt.v1alpha1.JobDestinationR\x0c\x64\x65stinations\x12\x35\n\x08mappings\x18\t \x03(\x0b\x32\x19.mgmt.v1alpha1.JobMappingR\x08mappings\x12(\n\rcron_schedule\x18\n \x01(\tH\x00R\x0c\x63ronSchedule\x88\x01\x01\x12\x1d\n\naccount_id\x18\x0b \x01(\tR\taccountId\x12\x41\n\x0csync_options\x18\x0c \x01(\x0b\x32\x1e.mgmt.v1alpha1.ActivityOptionsR\x0bsyncOptions\x12I\n\x10workflow_options\x18\r \x01(\x0b\x32\x1e.mgmt.v1alpha1.WorkflowOptionsR\x0fworkflowOptions\x12Y\n\x14virtual_foreign_keys\x18\x0e \x03(\x0b\x32\'.mgmt.v1alpha1.VirtualForeignConstraintR\x12virtualForeignKeysB\x10\n\x0e_cron_schedule\"g\n\x0cJobRecentRun\x12\x39\n\nstart_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartTime\x12\x1c\n\njob_run_id\x18\x02 \x01(\tR\x08jobRunId\":\n\x17GetJobRecentRunsRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\"X\n\x18GetJobRecentRunsResponse\x12<\n\x0brecent_runs\x18\x01 \x03(\x0b\x32\x1b.mgmt.v1alpha1.JobRecentRunR\nrecentRuns\"O\n\x0bJobNextRuns\x12@\n\x0enext_run_times\x18\x01 \x03(\x0b\x32\x1a.google.protobuf.TimestampR\x0cnextRunTimes\"8\n\x15GetJobNextRunsRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\"Q\n\x16GetJobNextRunsResponse\x12\x37\n\tnext_runs\x18\x01 \x01(\x0b\x32\x1a.mgmt.v1alpha1.JobNextRunsR\x08nextRuns\"6\n\x13GetJobStatusRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\"H\n\x14GetJobStatusResponse\x12\x30\n\x06status\x18\x01 \x01(\x0e\x32\x18.mgmt.v1alpha1.JobStatusR\x06status\"d\n\x0fJobStatusRecord\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\x12\x30\n\x06status\x18\x02 \x01(\x0e\x32\x18.mgmt.v1alpha1.JobStatusR\x06status\"@\n\x15GetJobStatusesRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"T\n\x16GetJobStatusesResponse\x12:\n\x08statuses\x18\x01 \x03(\x0b\x32\x1e.mgmt.v1alpha1.JobStatusRecordR\x08statuses\"+\n\x0f\x41\x63tivityFailure\x12\x18\n\x07message\x18\x01 \x01(\tR\x07message\"\xc6\x01\n\x0fPendingActivity\x12\x35\n\x06status\x18\x01 \x01(\x0e\x32\x1d.mgmt.v1alpha1.ActivityStatusR\x06status\x12#\n\ractivity_name\x18\x02 \x01(\tR\x0c\x61\x63tivityName\x12\x46\n\x0clast_failure\x18\x03 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ActivityFailureH\x00R\x0blastFailure\x88\x01\x01\x42\x0f\n\r_last_failure\"\xdd\x02\n\x06JobRun\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x15\n\x06job_id\x18\x02 \x01(\tR\x05jobId\x12\x12\n\x04name\x18\x03 \x01(\tR\x04name\x12\x33\n\x06status\x18\x04 \x01(\x0e\x32\x1b.mgmt.v1alpha1.JobRunStatusR\x06status\x12\x39\n\nstarted_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartedAt\x12\x42\n\x0c\x63ompleted_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00R\x0b\x63ompletedAt\x88\x01\x01\x12M\n\x12pending_activities\x18\x08 \x03(\x0b\x32\x1e.mgmt.v1alpha1.PendingActivityR\x11pendingActivitiesB\x0f\n\r_completed_atJ\x04\x08\x05\x10\x06\"Q\n\x14JobRunEventTaskError\x12\x18\n\x07message\x18\x01 \x01(\tR\x07message\x12\x1f\n\x0bretry_state\x18\x02 \x01(\tR\nretryState\"\xab\x01\n\x0fJobRunEventTask\x12\x0e\n\x02id\x18\x01 \x01(\x03R\x02id\x12\x12\n\x04type\x18\x02 \x01(\tR\x04type\x12\x39\n\nevent_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\teventTime\x12\x39\n\x05\x65rror\x18\x04 \x01(\x0b\x32#.mgmt.v1alpha1.JobRunEventTaskErrorR\x05\x65rror\"B\n\x12JobRunSyncMetadata\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\"r\n\x13JobRunEventMetadata\x12H\n\rsync_metadata\x18\x01 \x01(\x0b\x32!.mgmt.v1alpha1.JobRunSyncMetadataH\x00R\x0csyncMetadataB\x11\n\x08metadata\x12\x05\xbaH\x02\x08\x01\"\x9d\x02\n\x0bJobRunEvent\x12\x0e\n\x02id\x18\x01 \x01(\x03R\x02id\x12\x12\n\x04type\x18\x02 \x01(\tR\x04type\x12\x39\n\nstart_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartTime\x12\x39\n\nclose_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcloseTime\x12>\n\x08metadata\x18\x05 \x01(\x0b\x32\".mgmt.v1alpha1.JobRunEventMetadataR\x08metadata\x12\x34\n\x05tasks\x18\x06 \x03(\x0b\x32\x1e.mgmt.v1alpha1.JobRunEventTaskR\x05tasks\"_\n\x16GetJobRunEventsRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"u\n\x17GetJobRunEventsResponse\x12\x32\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x1a.mgmt.v1alpha1.JobRunEventR\x06\x65vents\x12&\n\x0fis_run_complete\x18\x02 \x01(\x08R\risRunComplete\"\\\n\x13\x44\x65leteJobRunRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"\x16\n\x14\x44\x65leteJobRunResponse\"_\n\x16TerminateJobRunRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"\x19\n\x17TerminateJobRunResponse\"\xb2\x02\n\x1aGetJobRunLogsStreamRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x30\n\x06window\x18\x03 \x01(\x0e\x32\x18.mgmt.v1alpha1.LogWindowR\x06window\x12\x1f\n\x0bshould_tail\x18\x04 \x01(\x08R\nshouldTail\x12\x30\n\rmax_log_lines\x18\x05 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x01H\x00R\x0bmaxLogLines\x88\x01\x01\x12\x36\n\nlog_levels\x18\x06 \x03(\x0e\x32\x17.mgmt.v1alpha1.LogLevelR\tlogLevelsB\x10\n\x0e_max_log_lines\"\x90\x02\n\x1bGetJobRunLogsStreamResponse\x12\x19\n\x08log_line\x18\x01 \x01(\tR\x07logLine\x12=\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00R\ttimestamp\x88\x01\x01\x12N\n\x06labels\x18\x03 \x03(\x0b\x32\x36.mgmt.v1alpha1.GetJobRunLogsStreamResponse.LabelsEntryR\x06labels\x1a\x39\n\x0bLabelsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\x0c\n\n_timestamp\"\x8b\x02\n\x14GetJobRunLogsRequest\x12\x1c\n\njob_run_id\x18\x01 \x01(\tR\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x30\n\x06window\x18\x03 \x01(\x0e\x32\x18.mgmt.v1alpha1.LogWindowR\x06window\x12\x30\n\rmax_log_lines\x18\x04 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x01H\x00R\x0bmaxLogLines\x88\x01\x01\x12\x36\n\nlog_levels\x18\x05 \x03(\x0e\x32\x17.mgmt.v1alpha1.LogLevelR\tlogLevelsB\x10\n\x0e_max_log_lines\"\xe3\x02\n\x15GetJobRunLogsResponse\x12I\n\tlog_lines\x18\x01 \x03(\x0b\x32,.mgmt.v1alpha1.GetJobRunLogsResponse.LogLineR\x08logLines\x1a\xfe\x01\n\x07LogLine\x12\x19\n\x08log_line\x18\x01 \x01(\tR\x07logLine\x12=\n\ttimestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00R\ttimestamp\x88\x01\x01\x12P\n\x06labels\x18\x03 \x03(\x0b\x32\x38.mgmt.v1alpha1.GetJobRunLogsResponse.LogLine.LabelsEntryR\x06labels\x1a\x39\n\x0bLabelsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x02\x38\x01\x42\x0c\n\n_timestamp\"\x83\x01\n\x1cSetJobWorkflowOptionsRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12I\n\x10worfklow_options\x18\x02 \x01(\x0b\x32\x1e.mgmt.v1alpha1.WorkflowOptionsR\x0fworfklowOptions\"E\n\x1dSetJobWorkflowOptionsResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"w\n\x18SetJobSyncOptionsRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x41\n\x0csync_options\x18\x02 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ActivityOptionsR\x0bsyncOptions\"A\n\x19SetJobSyncOptionsResponse\x12$\n\x03job\x18\x01 \x01(\x0b\x32\x12.mgmt.v1alpha1.JobR\x03job\"\xd3\x02\n\x1aValidateJobMappingsRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x35\n\x08mappings\x18\x02 \x03(\x0b\x32\x19.mgmt.v1alpha1.JobMappingR\x08mappings\x12-\n\rconnection_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12Y\n\x14virtual_foreign_keys\x18\x04 \x03(\x0b\x32\'.mgmt.v1alpha1.VirtualForeignConstraintR\x12virtualForeignKeys\x12<\n\njob_source\x18\x05 \x01(\x0b\x32\x18.mgmt.v1alpha1.JobSourceH\x00R\tjobSource\x88\x01\x01\x42\r\n\x0b_job_source\"\xe7\x07\n\x0b\x43olumnError\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12\x16\n\x06\x63olumn\x18\x03 \x01(\tR\x06\x63olumn\x12\x1a\n\x06\x65rrors\x18\x04 \x03(\tB\x02\x18\x01R\x06\x65rrors\x12Q\n\rerror_reports\x18\x05 \x03(\x0b\x32,.mgmt.v1alpha1.ColumnError.ColumnErrorReportR\x0c\x65rrorReports\x1am\n\x11\x43olumnErrorReport\x12>\n\x04\x63ode\x18\x01 \x01(\x0e\x32*.mgmt.v1alpha1.ColumnError.ColumnErrorCodeR\x04\x63ode\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message\"\xb3\x05\n\x0f\x43olumnErrorCode\x12!\n\x1d\x43OLUMN_ERROR_CODE_UNSPECIFIED\x10\x00\x12)\n%COLUMN_ERROR_CODE_NOT_FOUND_IN_SOURCE\x10\x01\x12*\n&COLUMN_ERROR_CODE_NOT_FOUND_IN_MAPPING\x10\x02\x12:\n6COLUMN_ERROR_CODE_REQUIRED_COLUMN_NOT_FOUND_IN_MAPPING\x10\x03\x12?\n;COLUMN_ERROR_CODE_REQUIRED_FOREIGN_KEY_NOT_FOUND_IN_MAPPING\x10\x04\x12K\nGCOLUMN_ERROR_CODE_UNSUPPORTED_CIRCULAR_DEPENDENCY_AT_LEAST_ONE_NULLABLE\x10\x05\x12<\n8COLUMN_ERROR_CODE_VFK_SOURCE_COLUMN_NOT_FOUND_IN_MAPPING\x10\x06\x12;\n7COLUMN_ERROR_CODE_VFK_SOURCE_COLUMN_NOT_FOUND_IN_SOURCE\x10\x07\x12<\n8COLUMN_ERROR_CODE_VFK_TARGET_COLUMN_NOT_FOUND_IN_MAPPING\x10\x08\x12;\n7COLUMN_ERROR_CODE_VFK_TARGET_COLUMN_NOT_FOUND_IN_SOURCE\x10\t\x12\x32\n.COLUMN_ERROR_CODE_VFK_COLUMN_DATATYPE_MISMATCH\x10\n\x12\x32\n.COLUMN_ERROR_CODE_VFK_SOURCE_COLUMN_NOT_UNIQUE\x10\x0b\"\xdb\x03\n\rColumnWarning\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12\x16\n\x06\x63olumn\x18\x03 \x01(\tR\x06\x63olumn\x12\x1e\n\x08warnings\x18\x05 \x03(\tB\x02\x18\x01R\x08warnings\x12Y\n\x0fwarning_reports\x18\x06 \x03(\x0b\x32\x30.mgmt.v1alpha1.ColumnWarning.ColumnWarningReportR\x0ewarningReports\x1as\n\x13\x43olumnWarningReport\x12\x42\n\x04\x63ode\x18\x01 \x01(\x0e\x32..mgmt.v1alpha1.ColumnWarning.ColumnWarningCodeR\x04\x63ode\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message\"\x93\x01\n\x11\x43olumnWarningCode\x12#\n\x1f\x43OLUMN_WARNING_CODE_UNSPECIFIED\x10\x00\x12+\n\'COLUMN_WARNING_CODE_NOT_FOUND_IN_SOURCE\x10\x01\x12,\n(COLUMN_WARNING_CODE_NOT_FOUND_IN_MAPPING\x10\x02\"\xae\x03\n\rDatabaseError\x12\x1a\n\x06\x65rrors\x18\x01 \x03(\tB\x02\x18\x01R\x06\x65rrors\x12U\n\rerror_reports\x18\x02 \x03(\x0b\x32\x30.mgmt.v1alpha1.DatabaseError.DatabaseErrorReportR\x0c\x65rrorReports\x1as\n\x13\x44\x61tabaseErrorReport\x12\x42\n\x04\x63ode\x18\x01 \x01(\x0e\x32..mgmt.v1alpha1.DatabaseError.DatabaseErrorCodeR\x04\x63ode\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message\"\xb4\x01\n\x11\x44\x61tabaseErrorCode\x12#\n\x1f\x44\x41TABASE_ERROR_CODE_UNSPECIFIED\x10\x00\x12M\nIDATABASE_ERROR_CODE_UNSUPPORTED_CIRCULAR_DEPENDENCY_AT_LEAST_ONE_NULLABLE\x10\x01\x12+\n\'DATABASE_ERROR_CODE_VFK_COLUMN_MISMATCH\x10\x02\"\xca\x04\n\nTableError\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12O\n\rerror_reports\x18\x03 \x03(\x0b\x32*.mgmt.v1alpha1.TableError.TableErrorReportR\x0c\x65rrorReports\x1aj\n\x10TableErrorReport\x12<\n\x04\x63ode\x18\x01 \x01(\x0e\x32(.mgmt.v1alpha1.TableError.TableErrorCodeR\x04\x63ode\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message\"\xd0\x02\n\x0eTableErrorCode\x12 \n\x1cTABLE_ERROR_CODE_UNSPECIFIED\x10\x00\x12.\n*TABLE_ERROR_CODE_TABLE_NOT_FOUND_IN_SOURCE\x10\x01\x12:\n6TABLE_ERROR_CODE_VFK_SOURCE_TABLE_NOT_FOUND_IN_MAPPING\x10\x02\x12\x39\n5TABLE_ERROR_CODE_VFK_SOURCE_TABLE_NOT_FOUND_IN_SOURCE\x10\x03\x12:\n6TABLE_ERROR_CODE_VFK_TARGET_TABLE_NOT_FOUND_IN_MAPPING\x10\x04\x12\x39\n5TABLE_ERROR_CODE_VFK_TARGET_TABLE_NOT_FOUND_IN_SOURCE\x10\x05\"\xaa\x02\n\x1bValidateJobMappingsResponse\x12?\n\rcolumn_errors\x18\x01 \x03(\x0b\x32\x1a.mgmt.v1alpha1.ColumnErrorR\x0c\x63olumnErrors\x12\x45\n\x0f\x64\x61tabase_errors\x18\x02 \x01(\x0b\x32\x1c.mgmt.v1alpha1.DatabaseErrorR\x0e\x64\x61tabaseErrors\x12\x45\n\x0f\x63olumn_warnings\x18\x03 \x03(\x0b\x32\x1c.mgmt.v1alpha1.ColumnWarningR\x0e\x63olumnWarnings\x12<\n\x0ctable_errors\x18\x04 \x03(\x0b\x32\x19.mgmt.v1alpha1.TableErrorR\x0btableErrors\"}\n\x15ValidateSchemaRequest\x12\x35\n\x08mappings\x18\x01 \x03(\x0b\x32\x19.mgmt.v1alpha1.JobMappingR\x08mappings\x12-\n\rconnection_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\"\xd8\x02\n\x16ValidateSchemaResponse\x12\x46\n\x0fmissing_columns\x18\x01 \x03(\x0b\x32\x1d.mgmt.v1alpha1.DatabaseColumnR\x0emissingColumns\x12\x42\n\rextra_columns\x18\x02 \x03(\x0b\x32\x1d.mgmt.v1alpha1.DatabaseColumnR\x0c\x65xtraColumns\x12R\n\x0emissing_tables\x18\x03 \x03(\x0b\x32+.mgmt.v1alpha1.ValidateSchemaResponse.TableR\rmissingTables\x12\'\n\x0fmissing_schemas\x18\x04 \x03(\tR\x0emissingSchemas\x1a\x35\n\x05Table\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\"[\n\x11VirtualForeignKey\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12\x18\n\x07\x63olumns\x18\x03 \x03(\tR\x07\x63olumns\"\xa5\x01\n\x18VirtualForeignConstraint\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12\x18\n\x07\x63olumns\x18\x03 \x03(\tR\x07\x63olumns\x12\x41\n\x0b\x66oreign_key\x18\x04 \x01(\x0b\x32 .mgmt.v1alpha1.VirtualForeignKeyR\nforeignKey\"\x88\x01\n\rRunContextKey\x12%\n\njob_run_id\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x08jobRunId\x12(\n\x0b\x65xternal_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\nexternalId\x12&\n\naccount_id\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\taccountId\"D\n\x14GetRunContextRequest\x12,\n\x02id\x18\x01 \x01(\x0b\x32\x1c.mgmt.v1alpha1.RunContextKeyR\x02id\"-\n\x15GetRunContextResponse\x12\x14\n\x05value\x18\x01 \x01(\x0cR\x05value\"Z\n\x14SetRunContextRequest\x12,\n\x02id\x18\x01 \x01(\x0b\x32\x1c.mgmt.v1alpha1.RunContextKeyR\x02id\x12\x14\n\x05value\x18\x02 \x01(\x0cR\x05value\"\x17\n\x15SetRunContextResponse\"[\n\x15SetRunContextsRequest\x12,\n\x02id\x18\x01 \x01(\x0b\x32\x1c.mgmt.v1alpha1.RunContextKeyR\x02id\x12\x14\n\x05value\x18\x02 \x01(\x0cR\x05value\"\x18\n\x16SetRunContextsResponse\"\xad\x03\n\x07JobHook\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12 \n\x0b\x64\x65scription\x18\x03 \x01(\tR\x0b\x64\x65scription\x12\x15\n\x06job_id\x18\x04 \x01(\tR\x05jobId\x12\x34\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobHookConfigR\x06\x63onfig\x12+\n\x12\x63reated_by_user_id\x18\x06 \x01(\tR\x0f\x63reatedByUserId\x12\x39\n\ncreated_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12+\n\x12updated_by_user_id\x18\x08 \x01(\tR\x0fupdatedByUserId\x12\x39\n\nupdated_at\x18\t \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tupdatedAt\x12\x18\n\x07\x65nabled\x18\n \x01(\x08R\x07\x65nabled\x12%\n\x08priority\x18\x0b \x01(\rB\t\xbaH\x06*\x04\x18\x64(\x00R\x08priority\"\xdd\x01\n\nNewJobHook\x12-\n\x04name\x18\x01 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x04name\x12)\n\x0b\x64\x65scription\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x0b\x64\x65scription\x12\x34\n\x06\x63onfig\x18\x03 \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobHookConfigR\x06\x63onfig\x12\x18\n\x07\x65nabled\x18\x04 \x01(\x08R\x07\x65nabled\x12%\n\x08priority\x18\x05 \x01(\rB\t\xbaH\x06*\x04\x18\x64(\x00R\x08priority\"\xbd\x03\n\rJobHookConfig\x12;\n\x03sql\x18\x05 \x01(\x0b\x32\'.mgmt.v1alpha1.JobHookConfig.JobSqlHookH\x00R\x03sql\x1a\xc5\x02\n\nJobSqlHook\x12\x1d\n\x05query\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05query\x12-\n\rconnection_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x0c\x63onnectionId\x12\x46\n\x06timing\x18\x03 \x01(\x0b\x32..mgmt.v1alpha1.JobHookConfig.JobSqlHook.TimingR\x06timing\x1a\xa0\x01\n\x06Timing\x12@\n\x08pre_sync\x18\x03 \x01(\x0b\x32#.mgmt.v1alpha1.JobHookTimingPreSyncH\x00R\x07preSync\x12\x43\n\tpost_sync\x18\x04 \x01(\x0b\x32$.mgmt.v1alpha1.JobHookTimingPostSyncH\x00R\x08postSyncB\x0f\n\x06timing\x12\x05\xbaH\x02\x08\x01\x42\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01J\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05\"\x16\n\x14JobHookTimingPreSync\"\x17\n\x15JobHookTimingPostSync\"5\n\x12GetJobHooksRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\"C\n\x13GetJobHooksResponse\x12,\n\x05hooks\x18\x01 \x03(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x05hooks\"-\n\x11GetJobHookRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"@\n\x12GetJobHookResponse\x12*\n\x04hook\x18\x01 \x01(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x04hook\"\\\n\x14\x43reateJobHookRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\x12-\n\x04hook\x18\x02 \x01(\x0b\x32\x19.mgmt.v1alpha1.NewJobHookR\x04hook\"C\n\x15\x43reateJobHookResponse\x12*\n\x04hook\x18\x01 \x01(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x04hook\"0\n\x14\x44\x65leteJobHookRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"\x17\n\x15\x44\x65leteJobHookResponse\"J\n\x1dIsJobHookNameAvailableRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\"C\n\x1eIsJobHookNameAvailableResponse\x12!\n\x0cis_available\x18\x01 \x01(\x08R\x0bisAvailable\"\x81\x02\n\x14UpdateJobHookRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12-\n\x04name\x18\x02 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x04name\x12)\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x0b\x64\x65scription\x12\x34\n\x06\x63onfig\x18\x04 \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobHookConfigR\x06\x63onfig\x12\x18\n\x07\x65nabled\x18\x05 \x01(\x08R\x07\x65nabled\x12%\n\x08priority\x18\x06 \x01(\rB\t\xbaH\x06*\x04\x18\x64(\x00R\x08priority\"C\n\x15UpdateJobHookResponse\x12*\n\x04hook\x18\x01 \x01(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x04hook\"N\n\x18SetJobHookEnabledRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x18\n\x07\x65nabled\x18\x02 \x01(\x08R\x07\x65nabled\"G\n\x19SetJobHookEnabledResponse\x12*\n\x04hook\x18\x01 \x01(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x04hook\"\xde\x01\n GetActiveJobHooksByTimingRequest\x12\x1f\n\x06job_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x05jobId\x12N\n\x06timing\x18\x02 \x01(\x0e\x32\x36.mgmt.v1alpha1.GetActiveJobHooksByTimingRequest.TimingR\x06timing\"I\n\x06Timing\x12\x16\n\x12TIMING_UNSPECIFIED\x10\x00\x12\x12\n\x0eTIMING_PRESYNC\x10\x01\x12\x13\n\x0fTIMING_POSTSYNC\x10\x02\"Q\n!GetActiveJobHooksByTimingResponse\x12,\n\x05hooks\x18\x01 \x03(\x0b\x32\x16.mgmt.v1alpha1.JobHookR\x05hooks*o\n\tJobStatus\x12\x1a\n\x16JOB_STATUS_UNSPECIFIED\x10\x00\x12\x16\n\x12JOB_STATUS_ENABLED\x10\x01\x12\x15\n\x11JOB_STATUS_PAUSED\x10\x03\x12\x17\n\x13JOB_STATUS_DISABLED\x10\x04*\xa7\x01\n\x0e\x41\x63tivityStatus\x12\x1f\n\x1b\x41\x43TIVITY_STATUS_UNSPECIFIED\x10\x00\x12\x1d\n\x19\x41\x43TIVITY_STATUS_SCHEDULED\x10\x01\x12\x1b\n\x17\x41\x43TIVITY_STATUS_STARTED\x10\x02\x12\x1c\n\x18\x41\x43TIVITY_STATUS_CANCELED\x10\x03\x12\x1a\n\x16\x41\x43TIVITY_STATUS_FAILED\x10\x04*\x92\x02\n\x0cJobRunStatus\x12\x1e\n\x1aJOB_RUN_STATUS_UNSPECIFIED\x10\x00\x12\x1a\n\x16JOB_RUN_STATUS_PENDING\x10\x01\x12\x1a\n\x16JOB_RUN_STATUS_RUNNING\x10\x02\x12\x1b\n\x17JOB_RUN_STATUS_COMPLETE\x10\x03\x12\x18\n\x14JOB_RUN_STATUS_ERROR\x10\x04\x12\x1b\n\x17JOB_RUN_STATUS_CANCELED\x10\x05\x12\x1d\n\x19JOB_RUN_STATUS_TERMINATED\x10\x06\x12\x19\n\x15JOB_RUN_STATUS_FAILED\x10\x07\x12\x1c\n\x18JOB_RUN_STATUS_TIMED_OUT\x10\x08*|\n\tLogWindow\x12\"\n\x1eLOG_WINDOW_NO_TIME_UNSPECIFIED\x10\x00\x12\x1a\n\x16LOG_WINDOW_FIFTEEN_MIN\x10\x01\x12\x17\n\x13LOG_WINDOW_ONE_HOUR\x10\x02\x12\x16\n\x12LOG_WINDOW_ONE_DAY\x10\x03*w\n\x08LogLevel\x12\x19\n\x15LOG_LEVEL_UNSPECIFIED\x10\x00\x12\x13\n\x0fLOG_LEVEL_DEBUG\x10\x01\x12\x12\n\x0eLOG_LEVEL_INFO\x10\x02\x12\x12\n\x0eLOG_LEVEL_WARN\x10\x03\x12\x13\n\x0fLOG_LEVEL_ERROR\x10\x04\x32\xb7 \n\nJobService\x12M\n\x07GetJobs\x12\x1d.mgmt.v1alpha1.GetJobsRequest\x1a\x1e.mgmt.v1alpha1.GetJobsResponse\"\x03\x90\x02\x01\x12J\n\x06GetJob\x12\x1c.mgmt.v1alpha1.GetJobRequest\x1a\x1d.mgmt.v1alpha1.GetJobResponse\"\x03\x90\x02\x01\x12P\n\tCreateJob\x12\x1f.mgmt.v1alpha1.CreateJobRequest\x1a .mgmt.v1alpha1.CreateJobResponse\"\x00\x12P\n\tDeleteJob\x12\x1f.mgmt.v1alpha1.DeleteJobRequest\x1a .mgmt.v1alpha1.DeleteJobResponse\"\x00\x12n\n\x12IsJobNameAvailable\x12(.mgmt.v1alpha1.IsJobNameAvailableRequest\x1a).mgmt.v1alpha1.IsJobNameAvailableResponse\"\x03\x90\x02\x01\x12h\n\x11UpdateJobSchedule\x12\'.mgmt.v1alpha1.UpdateJobScheduleRequest\x1a(.mgmt.v1alpha1.UpdateJobScheduleResponse\"\x00\x12\x80\x01\n\x19UpdateJobSourceConnection\x12/.mgmt.v1alpha1.UpdateJobSourceConnectionRequest\x1a\x30.mgmt.v1alpha1.UpdateJobSourceConnectionResponse\"\x00\x12\x95\x01\n SetJobSourceSqlConnectionSubsets\x12\x36.mgmt.v1alpha1.SetJobSourceSqlConnectionSubsetsRequest\x1a\x37.mgmt.v1alpha1.SetJobSourceSqlConnectionSubsetsResponse\"\x00\x12\x8f\x01\n\x1eUpdateJobDestinationConnection\x12\x34.mgmt.v1alpha1.UpdateJobDestinationConnectionRequest\x1a\x35.mgmt.v1alpha1.UpdateJobDestinationConnectionResponse\"\x00\x12\x8f\x01\n\x1e\x44\x65leteJobDestinationConnection\x12\x34.mgmt.v1alpha1.DeleteJobDestinationConnectionRequest\x1a\x35.mgmt.v1alpha1.DeleteJobDestinationConnectionResponse\"\x00\x12\x92\x01\n\x1f\x43reateJobDestinationConnections\x12\x35.mgmt.v1alpha1.CreateJobDestinationConnectionsRequest\x1a\x36.mgmt.v1alpha1.CreateJobDestinationConnectionsResponse\"\x00\x12M\n\x08PauseJob\x12\x1e.mgmt.v1alpha1.PauseJobRequest\x1a\x1f.mgmt.v1alpha1.PauseJobResponse\"\x00\x12h\n\x10GetJobRecentRuns\x12&.mgmt.v1alpha1.GetJobRecentRunsRequest\x1a\'.mgmt.v1alpha1.GetJobRecentRunsResponse\"\x03\x90\x02\x01\x12\x62\n\x0eGetJobNextRuns\x12$.mgmt.v1alpha1.GetJobNextRunsRequest\x1a%.mgmt.v1alpha1.GetJobNextRunsResponse\"\x03\x90\x02\x01\x12\\\n\x0cGetJobStatus\x12\".mgmt.v1alpha1.GetJobStatusRequest\x1a#.mgmt.v1alpha1.GetJobStatusResponse\"\x03\x90\x02\x01\x12\x62\n\x0eGetJobStatuses\x12$.mgmt.v1alpha1.GetJobStatusesRequest\x1a%.mgmt.v1alpha1.GetJobStatusesResponse\"\x03\x90\x02\x01\x12V\n\nGetJobRuns\x12 .mgmt.v1alpha1.GetJobRunsRequest\x1a!.mgmt.v1alpha1.GetJobRunsResponse\"\x03\x90\x02\x01\x12\x65\n\x0fGetJobRunEvents\x12%.mgmt.v1alpha1.GetJobRunEventsRequest\x1a&.mgmt.v1alpha1.GetJobRunEventsResponse\"\x03\x90\x02\x01\x12S\n\tGetJobRun\x12\x1f.mgmt.v1alpha1.GetJobRunRequest\x1a .mgmt.v1alpha1.GetJobRunResponse\"\x03\x90\x02\x01\x12Y\n\x0c\x44\x65leteJobRun\x12\".mgmt.v1alpha1.DeleteJobRunRequest\x1a#.mgmt.v1alpha1.DeleteJobRunResponse\"\x00\x12Y\n\x0c\x43reateJobRun\x12\".mgmt.v1alpha1.CreateJobRunRequest\x1a#.mgmt.v1alpha1.CreateJobRunResponse\"\x00\x12Y\n\x0c\x43\x61ncelJobRun\x12\".mgmt.v1alpha1.CancelJobRunRequest\x1a#.mgmt.v1alpha1.CancelJobRunResponse\"\x00\x12\x62\n\x0fTerminateJobRun\x12%.mgmt.v1alpha1.TerminateJobRunRequest\x1a&.mgmt.v1alpha1.TerminateJobRunResponse\"\x00\x12p\n\x13GetJobRunLogsStream\x12).mgmt.v1alpha1.GetJobRunLogsStreamRequest\x1a*.mgmt.v1alpha1.GetJobRunLogsStreamResponse\"\x00\x30\x01\x12\\\n\rGetJobRunLogs\x12#.mgmt.v1alpha1.GetJobRunLogsRequest\x1a$.mgmt.v1alpha1.GetJobRunLogsResponse\"\x00\x12t\n\x15SetJobWorkflowOptions\x12+.mgmt.v1alpha1.SetJobWorkflowOptionsRequest\x1a,.mgmt.v1alpha1.SetJobWorkflowOptionsResponse\"\x00\x12h\n\x11SetJobSyncOptions\x12\'.mgmt.v1alpha1.SetJobSyncOptionsRequest\x1a(.mgmt.v1alpha1.SetJobSyncOptionsResponse\"\x00\x12n\n\x13ValidateJobMappings\x12).mgmt.v1alpha1.ValidateJobMappingsRequest\x1a*.mgmt.v1alpha1.ValidateJobMappingsResponse\"\x00\x12_\n\x0eValidateSchema\x12$.mgmt.v1alpha1.ValidateSchemaRequest\x1a%.mgmt.v1alpha1.ValidateSchemaResponse\"\x00\x12\\\n\rGetRunContext\x12#.mgmt.v1alpha1.GetRunContextRequest\x1a$.mgmt.v1alpha1.GetRunContextResponse\"\x00\x12\\\n\rSetRunContext\x12#.mgmt.v1alpha1.SetRunContextRequest\x1a$.mgmt.v1alpha1.SetRunContextResponse\"\x00\x12\x61\n\x0eSetRunContexts\x12$.mgmt.v1alpha1.SetRunContextsRequest\x1a%.mgmt.v1alpha1.SetRunContextsResponse\"\x00(\x01\x12Y\n\x0bGetJobHooks\x12!.mgmt.v1alpha1.GetJobHooksRequest\x1a\".mgmt.v1alpha1.GetJobHooksResponse\"\x03\x90\x02\x01\x12V\n\nGetJobHook\x12 .mgmt.v1alpha1.GetJobHookRequest\x1a!.mgmt.v1alpha1.GetJobHookResponse\"\x03\x90\x02\x01\x12\\\n\rCreateJobHook\x12#.mgmt.v1alpha1.CreateJobHookRequest\x1a$.mgmt.v1alpha1.CreateJobHookResponse\"\x00\x12\\\n\rDeleteJobHook\x12#.mgmt.v1alpha1.DeleteJobHookRequest\x1a$.mgmt.v1alpha1.DeleteJobHookResponse\"\x00\x12w\n\x16IsJobHookNameAvailable\x12,.mgmt.v1alpha1.IsJobHookNameAvailableRequest\x1a-.mgmt.v1alpha1.IsJobHookNameAvailableResponse\"\x00\x12\\\n\rUpdateJobHook\x12#.mgmt.v1alpha1.UpdateJobHookRequest\x1a$.mgmt.v1alpha1.UpdateJobHookResponse\"\x00\x12h\n\x11SetJobHookEnabled\x12\'.mgmt.v1alpha1.SetJobHookEnabledRequest\x1a(.mgmt.v1alpha1.SetJobHookEnabledResponse\"\x00\x12\x83\x01\n\x19GetActiveJobHooksByTiming\x12/.mgmt.v1alpha1.GetActiveJobHooksByTimingRequest\x1a\x30.mgmt.v1alpha1.GetActiveJobHooksByTimingResponse\"\x03\x90\x02\x01\x42\xc4\x01\n\x11\x63om.mgmt.v1alpha1B\x08JobProtoP\x01ZPgithub.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1;mgmtv1alpha1\xa2\x02\x03MXX\xaa\x02\rMgmt.V1alpha1\xca\x02\rMgmt\\V1alpha1\xe2\x02\x19Mgmt\\V1alpha1\\GPBMetadata\xea\x02\x0eMgmt::V1alpha1b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -128,6 +128,10 @@ _globals['_CREATEJOBREQUEST'].fields_by_name['account_id']._serialized_options = b'\272H\005r\003\260\001\001' _globals['_CREATEJOBREQUEST'].fields_by_name['job_name']._loaded_options = None _globals['_CREATEJOBREQUEST'].fields_by_name['job_name']._serialized_options = b'\272H\026r\0242\022^[a-z0-9-]{3,100}$' + _globals['_CREATEJOBREQUEST'].fields_by_name['mappings']._loaded_options = None + _globals['_CREATEJOBREQUEST'].fields_by_name['mappings']._serialized_options = b'\272H\005\222\001\002\010\001' + _globals['_CREATEJOBREQUEST'].fields_by_name['destinations']._loaded_options = None + _globals['_CREATEJOBREQUEST'].fields_by_name['destinations']._serialized_options = b'\272H\005\222\001\002\010\001' _globals['_ACTIVITYOPTIONS'].fields_by_name['schedule_to_close_timeout']._loaded_options = None _globals['_ACTIVITYOPTIONS'].fields_by_name['schedule_to_close_timeout']._serialized_options = b'\272H\004\"\002(\001' _globals['_ACTIVITYOPTIONS'].fields_by_name['start_to_close_timeout']._loaded_options = None @@ -160,6 +164,8 @@ _globals['_DELETEJOBDESTINATIONCONNECTIONREQUEST'].fields_by_name['destination_id']._serialized_options = b'\272H\005r\003\260\001\001' _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST'].fields_by_name['job_id']._loaded_options = None _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST'].fields_by_name['job_id']._serialized_options = b'\272H\005r\003\260\001\001' + _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST'].fields_by_name['destinations']._loaded_options = None + _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST'].fields_by_name['destinations']._serialized_options = b'\272H\005\222\001\002\010\001' _globals['_DELETEJOBREQUEST'].fields_by_name['id']._loaded_options = None _globals['_DELETEJOBREQUEST'].fields_by_name['id']._serialized_options = b'\272H\005r\003\260\001\001' _globals['_ISJOBNAMEAVAILABLEREQUEST'].fields_by_name['name']._loaded_options = None @@ -288,16 +294,16 @@ _globals['_JOBSERVICE'].methods_by_name['GetJobHook']._serialized_options = b'\220\002\001' _globals['_JOBSERVICE'].methods_by_name['GetActiveJobHooksByTiming']._loaded_options = None _globals['_JOBSERVICE'].methods_by_name['GetActiveJobHooksByTiming']._serialized_options = b'\220\002\001' - _globals['_JOBSTATUS']._serialized_start=27103 - _globals['_JOBSTATUS']._serialized_end=27214 - _globals['_ACTIVITYSTATUS']._serialized_start=27217 - _globals['_ACTIVITYSTATUS']._serialized_end=27384 - _globals['_JOBRUNSTATUS']._serialized_start=27387 - _globals['_JOBRUNSTATUS']._serialized_end=27661 - _globals['_LOGWINDOW']._serialized_start=27663 - _globals['_LOGWINDOW']._serialized_end=27787 - _globals['_LOGLEVEL']._serialized_start=27789 - _globals['_LOGLEVEL']._serialized_end=27908 + _globals['_JOBSTATUS']._serialized_start=27133 + _globals['_JOBSTATUS']._serialized_end=27244 + _globals['_ACTIVITYSTATUS']._serialized_start=27247 + _globals['_ACTIVITYSTATUS']._serialized_end=27414 + _globals['_JOBRUNSTATUS']._serialized_start=27417 + _globals['_JOBRUNSTATUS']._serialized_end=27691 + _globals['_LOGWINDOW']._serialized_start=27693 + _globals['_LOGWINDOW']._serialized_end=27817 + _globals['_LOGLEVEL']._serialized_start=27819 + _globals['_LOGLEVEL']._serialized_end=27938 _globals['_GETJOBSREQUEST']._serialized_start=174 _globals['_GETJOBSREQUEST']._serialized_end=231 _globals['_GETJOBSRESPONSE']._serialized_start=233 @@ -417,259 +423,259 @@ _globals['_BATCHCONFIG']._serialized_start=10312 _globals['_BATCHCONFIG']._serialized_end=10402 _globals['_CREATEJOBREQUEST']._serialized_start=10405 - _globals['_CREATEJOBREQUEST']._serialized_end=11031 - _globals['_WORKFLOWOPTIONS']._serialized_start=11033 - _globals['_WORKFLOWOPTIONS']._serialized_end=11146 - _globals['_ACTIVITYOPTIONS']._serialized_start=11149 - _globals['_ACTIVITYOPTIONS']._serialized_end=11426 - _globals['_RETRYPOLICY']._serialized_start=11428 - _globals['_RETRYPOLICY']._serialized_end=11519 - _globals['_CREATEJOBRESPONSE']._serialized_start=11521 - _globals['_CREATEJOBRESPONSE']._serialized_end=11578 - _globals['_JOBMAPPINGTRANSFORMER']._serialized_start=11580 - _globals['_JOBMAPPINGTRANSFORMER']._serialized_end=11667 - _globals['_JOBMAPPING']._serialized_start=11670 - _globals['_JOBMAPPING']._serialized_end=11851 - _globals['_GETJOBREQUEST']._serialized_start=11853 - _globals['_GETJOBREQUEST']._serialized_end=11894 - _globals['_GETJOBRESPONSE']._serialized_start=11896 - _globals['_GETJOBRESPONSE']._serialized_end=11950 - _globals['_UPDATEJOBSCHEDULEREQUEST']._serialized_start=11952 - _globals['_UPDATEJOBSCHEDULEREQUEST']._serialized_end=12064 - _globals['_UPDATEJOBSCHEDULERESPONSE']._serialized_start=12066 - _globals['_UPDATEJOBSCHEDULERESPONSE']._serialized_end=12131 - _globals['_PAUSEJOBREQUEST']._serialized_start=12133 - _globals['_PAUSEJOBREQUEST']._serialized_end=12232 - _globals['_PAUSEJOBRESPONSE']._serialized_start=12234 - _globals['_PAUSEJOBRESPONSE']._serialized_end=12290 - _globals['_UPDATEJOBSOURCECONNECTIONREQUEST']._serialized_start=12293 - _globals['_UPDATEJOBSOURCECONNECTIONREQUEST']._serialized_end=12549 - _globals['_UPDATEJOBSOURCECONNECTIONRESPONSE']._serialized_start=12551 - _globals['_UPDATEJOBSOURCECONNECTIONRESPONSE']._serialized_end=12624 - _globals['_POSTGRESSOURCESCHEMASUBSET']._serialized_start=12626 - _globals['_POSTGRESSOURCESCHEMASUBSET']._serialized_end=12740 - _globals['_MYSQLSOURCESCHEMASUBSET']._serialized_start=12742 - _globals['_MYSQLSOURCESCHEMASUBSET']._serialized_end=12844 - _globals['_DYNAMODBSOURCESCHEMASUBSET']._serialized_start=12846 - _globals['_DYNAMODBSOURCESCHEMASUBSET']._serialized_end=12940 - _globals['_MSSQLSOURCESCHEMASUBSET']._serialized_start=12942 - _globals['_MSSQLSOURCESCHEMASUBSET']._serialized_end=13044 - _globals['_JOBSOURCESQLSUBETSCHEMAS']._serialized_start=13047 - _globals['_JOBSOURCESQLSUBETSCHEMAS']._serialized_end=13423 - _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSREQUEST']._serialized_start=13426 - _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSREQUEST']._serialized_end=13634 - _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSRESPONSE']._serialized_start=13636 - _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSRESPONSE']._serialized_end=13716 - _globals['_UPDATEJOBDESTINATIONCONNECTIONREQUEST']._serialized_start=13719 - _globals['_UPDATEJOBDESTINATIONCONNECTIONREQUEST']._serialized_end=13941 - _globals['_UPDATEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_start=13943 - _globals['_UPDATEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_end=14021 - _globals['_DELETEJOBDESTINATIONCONNECTIONREQUEST']._serialized_start=14023 - _globals['_DELETEJOBDESTINATIONCONNECTIONREQUEST']._serialized_end=14111 - _globals['_DELETEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_start=14113 - _globals['_DELETEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_end=14153 - _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST']._serialized_start=14156 - _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST']._serialized_end=14302 - _globals['_CREATEJOBDESTINATIONCONNECTIONSRESPONSE']._serialized_start=14304 - _globals['_CREATEJOBDESTINATIONCONNECTIONSRESPONSE']._serialized_end=14383 - _globals['_DELETEJOBREQUEST']._serialized_start=14385 - _globals['_DELETEJOBREQUEST']._serialized_end=14429 - _globals['_DELETEJOBRESPONSE']._serialized_start=14431 - _globals['_DELETEJOBRESPONSE']._serialized_end=14450 - _globals['_ISJOBNAMEAVAILABLEREQUEST']._serialized_start=14452 - _globals['_ISJOBNAMEAVAILABLEREQUEST']._serialized_end=14567 - _globals['_ISJOBNAMEAVAILABLERESPONSE']._serialized_start=14569 - _globals['_ISJOBNAMEAVAILABLERESPONSE']._serialized_end=14632 - _globals['_GETJOBRUNSREQUEST']._serialized_start=14634 - _globals['_GETJOBRUNSREQUEST']._serialized_end=14737 - _globals['_GETJOBRUNSRESPONSE']._serialized_start=14739 - _globals['_GETJOBRUNSRESPONSE']._serialized_end=14809 - _globals['_GETJOBRUNREQUEST']._serialized_start=14811 - _globals['_GETJOBRUNREQUEST']._serialized_end=14900 - _globals['_GETJOBRUNRESPONSE']._serialized_start=14902 - _globals['_GETJOBRUNRESPONSE']._serialized_end=14969 - _globals['_CREATEJOBRUNREQUEST']._serialized_start=14971 - _globals['_CREATEJOBRUNREQUEST']._serialized_end=15025 - _globals['_CREATEJOBRUNRESPONSE']._serialized_start=15027 - _globals['_CREATEJOBRUNRESPONSE']._serialized_end=15049 - _globals['_CANCELJOBRUNREQUEST']._serialized_start=15051 - _globals['_CANCELJOBRUNREQUEST']._serialized_end=15143 - _globals['_CANCELJOBRUNRESPONSE']._serialized_start=15145 - _globals['_CANCELJOBRUNRESPONSE']._serialized_end=15167 - _globals['_JOB']._serialized_start=15170 - _globals['_JOB']._serialized_end=15915 - _globals['_JOBRECENTRUN']._serialized_start=15917 - _globals['_JOBRECENTRUN']._serialized_end=16020 - _globals['_GETJOBRECENTRUNSREQUEST']._serialized_start=16022 - _globals['_GETJOBRECENTRUNSREQUEST']._serialized_end=16080 - _globals['_GETJOBRECENTRUNSRESPONSE']._serialized_start=16082 - _globals['_GETJOBRECENTRUNSRESPONSE']._serialized_end=16170 - _globals['_JOBNEXTRUNS']._serialized_start=16172 - _globals['_JOBNEXTRUNS']._serialized_end=16251 - _globals['_GETJOBNEXTRUNSREQUEST']._serialized_start=16253 - _globals['_GETJOBNEXTRUNSREQUEST']._serialized_end=16309 - _globals['_GETJOBNEXTRUNSRESPONSE']._serialized_start=16311 - _globals['_GETJOBNEXTRUNSRESPONSE']._serialized_end=16392 - _globals['_GETJOBSTATUSREQUEST']._serialized_start=16394 - _globals['_GETJOBSTATUSREQUEST']._serialized_end=16448 - _globals['_GETJOBSTATUSRESPONSE']._serialized_start=16450 - _globals['_GETJOBSTATUSRESPONSE']._serialized_end=16522 - _globals['_JOBSTATUSRECORD']._serialized_start=16524 - _globals['_JOBSTATUSRECORD']._serialized_end=16624 - _globals['_GETJOBSTATUSESREQUEST']._serialized_start=16626 - _globals['_GETJOBSTATUSESREQUEST']._serialized_end=16690 - _globals['_GETJOBSTATUSESRESPONSE']._serialized_start=16692 - _globals['_GETJOBSTATUSESRESPONSE']._serialized_end=16776 - _globals['_ACTIVITYFAILURE']._serialized_start=16778 - _globals['_ACTIVITYFAILURE']._serialized_end=16821 - _globals['_PENDINGACTIVITY']._serialized_start=16824 - _globals['_PENDINGACTIVITY']._serialized_end=17022 - _globals['_JOBRUN']._serialized_start=17025 - _globals['_JOBRUN']._serialized_end=17374 - _globals['_JOBRUNEVENTTASKERROR']._serialized_start=17376 - _globals['_JOBRUNEVENTTASKERROR']._serialized_end=17457 - _globals['_JOBRUNEVENTTASK']._serialized_start=17460 - _globals['_JOBRUNEVENTTASK']._serialized_end=17631 - _globals['_JOBRUNSYNCMETADATA']._serialized_start=17633 - _globals['_JOBRUNSYNCMETADATA']._serialized_end=17699 - _globals['_JOBRUNEVENTMETADATA']._serialized_start=17701 - _globals['_JOBRUNEVENTMETADATA']._serialized_end=17815 - _globals['_JOBRUNEVENT']._serialized_start=17818 - _globals['_JOBRUNEVENT']._serialized_end=18103 - _globals['_GETJOBRUNEVENTSREQUEST']._serialized_start=18105 - _globals['_GETJOBRUNEVENTSREQUEST']._serialized_end=18200 - _globals['_GETJOBRUNEVENTSRESPONSE']._serialized_start=18202 - _globals['_GETJOBRUNEVENTSRESPONSE']._serialized_end=18319 - _globals['_DELETEJOBRUNREQUEST']._serialized_start=18321 - _globals['_DELETEJOBRUNREQUEST']._serialized_end=18413 - _globals['_DELETEJOBRUNRESPONSE']._serialized_start=18415 - _globals['_DELETEJOBRUNRESPONSE']._serialized_end=18437 - _globals['_TERMINATEJOBRUNREQUEST']._serialized_start=18439 - _globals['_TERMINATEJOBRUNREQUEST']._serialized_end=18534 - _globals['_TERMINATEJOBRUNRESPONSE']._serialized_start=18536 - _globals['_TERMINATEJOBRUNRESPONSE']._serialized_end=18561 - _globals['_GETJOBRUNLOGSSTREAMREQUEST']._serialized_start=18564 - _globals['_GETJOBRUNLOGSSTREAMREQUEST']._serialized_end=18870 - _globals['_GETJOBRUNLOGSSTREAMRESPONSE']._serialized_start=18873 - _globals['_GETJOBRUNLOGSSTREAMRESPONSE']._serialized_end=19145 - _globals['_GETJOBRUNLOGSSTREAMRESPONSE_LABELSENTRY']._serialized_start=19074 - _globals['_GETJOBRUNLOGSSTREAMRESPONSE_LABELSENTRY']._serialized_end=19131 - _globals['_GETJOBRUNLOGSREQUEST']._serialized_start=19148 - _globals['_GETJOBRUNLOGSREQUEST']._serialized_end=19415 - _globals['_GETJOBRUNLOGSRESPONSE']._serialized_start=19418 - _globals['_GETJOBRUNLOGSRESPONSE']._serialized_end=19773 - _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE']._serialized_start=19519 - _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE']._serialized_end=19773 - _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE_LABELSENTRY']._serialized_start=19074 - _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE_LABELSENTRY']._serialized_end=19131 - _globals['_SETJOBWORKFLOWOPTIONSREQUEST']._serialized_start=19776 - _globals['_SETJOBWORKFLOWOPTIONSREQUEST']._serialized_end=19907 - _globals['_SETJOBWORKFLOWOPTIONSRESPONSE']._serialized_start=19909 - _globals['_SETJOBWORKFLOWOPTIONSRESPONSE']._serialized_end=19978 - _globals['_SETJOBSYNCOPTIONSREQUEST']._serialized_start=19980 - _globals['_SETJOBSYNCOPTIONSREQUEST']._serialized_end=20099 - _globals['_SETJOBSYNCOPTIONSRESPONSE']._serialized_start=20101 - _globals['_SETJOBSYNCOPTIONSRESPONSE']._serialized_end=20166 - _globals['_VALIDATEJOBMAPPINGSREQUEST']._serialized_start=20169 - _globals['_VALIDATEJOBMAPPINGSREQUEST']._serialized_end=20508 - _globals['_COLUMNERROR']._serialized_start=20511 - _globals['_COLUMNERROR']._serialized_end=21510 - _globals['_COLUMNERROR_COLUMNERRORREPORT']._serialized_start=20707 - _globals['_COLUMNERROR_COLUMNERRORREPORT']._serialized_end=20816 - _globals['_COLUMNERROR_COLUMNERRORCODE']._serialized_start=20819 - _globals['_COLUMNERROR_COLUMNERRORCODE']._serialized_end=21510 - _globals['_COLUMNWARNING']._serialized_start=21513 - _globals['_COLUMNWARNING']._serialized_end=21988 - _globals['_COLUMNWARNING_COLUMNWARNINGREPORT']._serialized_start=21723 - _globals['_COLUMNWARNING_COLUMNWARNINGREPORT']._serialized_end=21838 - _globals['_COLUMNWARNING_COLUMNWARNINGCODE']._serialized_start=21841 - _globals['_COLUMNWARNING_COLUMNWARNINGCODE']._serialized_end=21988 - _globals['_DATABASEERROR']._serialized_start=21991 - _globals['_DATABASEERROR']._serialized_end=22421 - _globals['_DATABASEERROR_DATABASEERRORREPORT']._serialized_start=22123 - _globals['_DATABASEERROR_DATABASEERRORREPORT']._serialized_end=22238 - _globals['_DATABASEERROR_DATABASEERRORCODE']._serialized_start=22241 - _globals['_DATABASEERROR_DATABASEERRORCODE']._serialized_end=22421 - _globals['_TABLEERROR']._serialized_start=22424 - _globals['_TABLEERROR']._serialized_end=23010 - _globals['_TABLEERROR_TABLEERRORREPORT']._serialized_start=22565 - _globals['_TABLEERROR_TABLEERRORREPORT']._serialized_end=22671 - _globals['_TABLEERROR_TABLEERRORCODE']._serialized_start=22674 - _globals['_TABLEERROR_TABLEERRORCODE']._serialized_end=23010 - _globals['_VALIDATEJOBMAPPINGSRESPONSE']._serialized_start=23013 - _globals['_VALIDATEJOBMAPPINGSRESPONSE']._serialized_end=23311 - _globals['_VALIDATESCHEMAREQUEST']._serialized_start=23313 - _globals['_VALIDATESCHEMAREQUEST']._serialized_end=23438 - _globals['_VALIDATESCHEMARESPONSE']._serialized_start=23441 - _globals['_VALIDATESCHEMARESPONSE']._serialized_end=23785 - _globals['_VALIDATESCHEMARESPONSE_TABLE']._serialized_start=23732 - _globals['_VALIDATESCHEMARESPONSE_TABLE']._serialized_end=23785 - _globals['_VIRTUALFOREIGNKEY']._serialized_start=23787 - _globals['_VIRTUALFOREIGNKEY']._serialized_end=23878 - _globals['_VIRTUALFOREIGNCONSTRAINT']._serialized_start=23881 - _globals['_VIRTUALFOREIGNCONSTRAINT']._serialized_end=24046 - _globals['_RUNCONTEXTKEY']._serialized_start=24049 - _globals['_RUNCONTEXTKEY']._serialized_end=24185 - _globals['_GETRUNCONTEXTREQUEST']._serialized_start=24187 - _globals['_GETRUNCONTEXTREQUEST']._serialized_end=24255 - _globals['_GETRUNCONTEXTRESPONSE']._serialized_start=24257 - _globals['_GETRUNCONTEXTRESPONSE']._serialized_end=24302 - _globals['_SETRUNCONTEXTREQUEST']._serialized_start=24304 - _globals['_SETRUNCONTEXTREQUEST']._serialized_end=24394 - _globals['_SETRUNCONTEXTRESPONSE']._serialized_start=24396 - _globals['_SETRUNCONTEXTRESPONSE']._serialized_end=24419 - _globals['_SETRUNCONTEXTSREQUEST']._serialized_start=24421 - _globals['_SETRUNCONTEXTSREQUEST']._serialized_end=24512 - _globals['_SETRUNCONTEXTSRESPONSE']._serialized_start=24514 - _globals['_SETRUNCONTEXTSRESPONSE']._serialized_end=24538 - _globals['_JOBHOOK']._serialized_start=24541 - _globals['_JOBHOOK']._serialized_end=24970 - _globals['_NEWJOBHOOK']._serialized_start=24973 - _globals['_NEWJOBHOOK']._serialized_end=25194 - _globals['_JOBHOOKCONFIG']._serialized_start=25197 - _globals['_JOBHOOKCONFIG']._serialized_end=25642 - _globals['_JOBHOOKCONFIG_JOBSQLHOOK']._serialized_start=25276 - _globals['_JOBHOOKCONFIG_JOBSQLHOOK']._serialized_end=25601 - _globals['_JOBHOOKCONFIG_JOBSQLHOOK_TIMING']._serialized_start=25441 - _globals['_JOBHOOKCONFIG_JOBSQLHOOK_TIMING']._serialized_end=25601 - _globals['_JOBHOOKTIMINGPRESYNC']._serialized_start=25644 - _globals['_JOBHOOKTIMINGPRESYNC']._serialized_end=25666 - _globals['_JOBHOOKTIMINGPOSTSYNC']._serialized_start=25668 - _globals['_JOBHOOKTIMINGPOSTSYNC']._serialized_end=25691 - _globals['_GETJOBHOOKSREQUEST']._serialized_start=25693 - _globals['_GETJOBHOOKSREQUEST']._serialized_end=25746 - _globals['_GETJOBHOOKSRESPONSE']._serialized_start=25748 - _globals['_GETJOBHOOKSRESPONSE']._serialized_end=25815 - _globals['_GETJOBHOOKREQUEST']._serialized_start=25817 - _globals['_GETJOBHOOKREQUEST']._serialized_end=25862 - _globals['_GETJOBHOOKRESPONSE']._serialized_start=25864 - _globals['_GETJOBHOOKRESPONSE']._serialized_end=25928 - _globals['_CREATEJOBHOOKREQUEST']._serialized_start=25930 - _globals['_CREATEJOBHOOKREQUEST']._serialized_end=26022 - _globals['_CREATEJOBHOOKRESPONSE']._serialized_start=26024 - _globals['_CREATEJOBHOOKRESPONSE']._serialized_end=26091 - _globals['_DELETEJOBHOOKREQUEST']._serialized_start=26093 - _globals['_DELETEJOBHOOKREQUEST']._serialized_end=26141 - _globals['_DELETEJOBHOOKRESPONSE']._serialized_start=26143 - _globals['_DELETEJOBHOOKRESPONSE']._serialized_end=26166 - _globals['_ISJOBHOOKNAMEAVAILABLEREQUEST']._serialized_start=26168 - _globals['_ISJOBHOOKNAMEAVAILABLEREQUEST']._serialized_end=26242 - _globals['_ISJOBHOOKNAMEAVAILABLERESPONSE']._serialized_start=26244 - _globals['_ISJOBHOOKNAMEAVAILABLERESPONSE']._serialized_end=26311 - _globals['_UPDATEJOBHOOKREQUEST']._serialized_start=26314 - _globals['_UPDATEJOBHOOKREQUEST']._serialized_end=26571 - _globals['_UPDATEJOBHOOKRESPONSE']._serialized_start=26573 - _globals['_UPDATEJOBHOOKRESPONSE']._serialized_end=26640 - _globals['_SETJOBHOOKENABLEDREQUEST']._serialized_start=26642 - _globals['_SETJOBHOOKENABLEDREQUEST']._serialized_end=26720 - _globals['_SETJOBHOOKENABLEDRESPONSE']._serialized_start=26722 - _globals['_SETJOBHOOKENABLEDRESPONSE']._serialized_end=26793 - _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST']._serialized_start=26796 - _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST']._serialized_end=27018 - _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST_TIMING']._serialized_start=26945 - _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST_TIMING']._serialized_end=27018 - _globals['_GETACTIVEJOBHOOKSBYTIMINGRESPONSE']._serialized_start=27020 - _globals['_GETACTIVEJOBHOOKSBYTIMINGRESPONSE']._serialized_end=27101 - _globals['_JOBSERVICE']._serialized_start=27911 - _globals['_JOBSERVICE']._serialized_end=32062 + _globals['_CREATEJOBREQUEST']._serialized_end=11051 + _globals['_WORKFLOWOPTIONS']._serialized_start=11053 + _globals['_WORKFLOWOPTIONS']._serialized_end=11166 + _globals['_ACTIVITYOPTIONS']._serialized_start=11169 + _globals['_ACTIVITYOPTIONS']._serialized_end=11446 + _globals['_RETRYPOLICY']._serialized_start=11448 + _globals['_RETRYPOLICY']._serialized_end=11539 + _globals['_CREATEJOBRESPONSE']._serialized_start=11541 + _globals['_CREATEJOBRESPONSE']._serialized_end=11598 + _globals['_JOBMAPPINGTRANSFORMER']._serialized_start=11600 + _globals['_JOBMAPPINGTRANSFORMER']._serialized_end=11687 + _globals['_JOBMAPPING']._serialized_start=11690 + _globals['_JOBMAPPING']._serialized_end=11871 + _globals['_GETJOBREQUEST']._serialized_start=11873 + _globals['_GETJOBREQUEST']._serialized_end=11914 + _globals['_GETJOBRESPONSE']._serialized_start=11916 + _globals['_GETJOBRESPONSE']._serialized_end=11970 + _globals['_UPDATEJOBSCHEDULEREQUEST']._serialized_start=11972 + _globals['_UPDATEJOBSCHEDULEREQUEST']._serialized_end=12084 + _globals['_UPDATEJOBSCHEDULERESPONSE']._serialized_start=12086 + _globals['_UPDATEJOBSCHEDULERESPONSE']._serialized_end=12151 + _globals['_PAUSEJOBREQUEST']._serialized_start=12153 + _globals['_PAUSEJOBREQUEST']._serialized_end=12252 + _globals['_PAUSEJOBRESPONSE']._serialized_start=12254 + _globals['_PAUSEJOBRESPONSE']._serialized_end=12310 + _globals['_UPDATEJOBSOURCECONNECTIONREQUEST']._serialized_start=12313 + _globals['_UPDATEJOBSOURCECONNECTIONREQUEST']._serialized_end=12569 + _globals['_UPDATEJOBSOURCECONNECTIONRESPONSE']._serialized_start=12571 + _globals['_UPDATEJOBSOURCECONNECTIONRESPONSE']._serialized_end=12644 + _globals['_POSTGRESSOURCESCHEMASUBSET']._serialized_start=12646 + _globals['_POSTGRESSOURCESCHEMASUBSET']._serialized_end=12760 + _globals['_MYSQLSOURCESCHEMASUBSET']._serialized_start=12762 + _globals['_MYSQLSOURCESCHEMASUBSET']._serialized_end=12864 + _globals['_DYNAMODBSOURCESCHEMASUBSET']._serialized_start=12866 + _globals['_DYNAMODBSOURCESCHEMASUBSET']._serialized_end=12960 + _globals['_MSSQLSOURCESCHEMASUBSET']._serialized_start=12962 + _globals['_MSSQLSOURCESCHEMASUBSET']._serialized_end=13064 + _globals['_JOBSOURCESQLSUBETSCHEMAS']._serialized_start=13067 + _globals['_JOBSOURCESQLSUBETSCHEMAS']._serialized_end=13443 + _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSREQUEST']._serialized_start=13446 + _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSREQUEST']._serialized_end=13654 + _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSRESPONSE']._serialized_start=13656 + _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSRESPONSE']._serialized_end=13736 + _globals['_UPDATEJOBDESTINATIONCONNECTIONREQUEST']._serialized_start=13739 + _globals['_UPDATEJOBDESTINATIONCONNECTIONREQUEST']._serialized_end=13961 + _globals['_UPDATEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_start=13963 + _globals['_UPDATEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_end=14041 + _globals['_DELETEJOBDESTINATIONCONNECTIONREQUEST']._serialized_start=14043 + _globals['_DELETEJOBDESTINATIONCONNECTIONREQUEST']._serialized_end=14131 + _globals['_DELETEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_start=14133 + _globals['_DELETEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_end=14173 + _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST']._serialized_start=14176 + _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST']._serialized_end=14332 + _globals['_CREATEJOBDESTINATIONCONNECTIONSRESPONSE']._serialized_start=14334 + _globals['_CREATEJOBDESTINATIONCONNECTIONSRESPONSE']._serialized_end=14413 + _globals['_DELETEJOBREQUEST']._serialized_start=14415 + _globals['_DELETEJOBREQUEST']._serialized_end=14459 + _globals['_DELETEJOBRESPONSE']._serialized_start=14461 + _globals['_DELETEJOBRESPONSE']._serialized_end=14480 + _globals['_ISJOBNAMEAVAILABLEREQUEST']._serialized_start=14482 + _globals['_ISJOBNAMEAVAILABLEREQUEST']._serialized_end=14597 + _globals['_ISJOBNAMEAVAILABLERESPONSE']._serialized_start=14599 + _globals['_ISJOBNAMEAVAILABLERESPONSE']._serialized_end=14662 + _globals['_GETJOBRUNSREQUEST']._serialized_start=14664 + _globals['_GETJOBRUNSREQUEST']._serialized_end=14767 + _globals['_GETJOBRUNSRESPONSE']._serialized_start=14769 + _globals['_GETJOBRUNSRESPONSE']._serialized_end=14839 + _globals['_GETJOBRUNREQUEST']._serialized_start=14841 + _globals['_GETJOBRUNREQUEST']._serialized_end=14930 + _globals['_GETJOBRUNRESPONSE']._serialized_start=14932 + _globals['_GETJOBRUNRESPONSE']._serialized_end=14999 + _globals['_CREATEJOBRUNREQUEST']._serialized_start=15001 + _globals['_CREATEJOBRUNREQUEST']._serialized_end=15055 + _globals['_CREATEJOBRUNRESPONSE']._serialized_start=15057 + _globals['_CREATEJOBRUNRESPONSE']._serialized_end=15079 + _globals['_CANCELJOBRUNREQUEST']._serialized_start=15081 + _globals['_CANCELJOBRUNREQUEST']._serialized_end=15173 + _globals['_CANCELJOBRUNRESPONSE']._serialized_start=15175 + _globals['_CANCELJOBRUNRESPONSE']._serialized_end=15197 + _globals['_JOB']._serialized_start=15200 + _globals['_JOB']._serialized_end=15945 + _globals['_JOBRECENTRUN']._serialized_start=15947 + _globals['_JOBRECENTRUN']._serialized_end=16050 + _globals['_GETJOBRECENTRUNSREQUEST']._serialized_start=16052 + _globals['_GETJOBRECENTRUNSREQUEST']._serialized_end=16110 + _globals['_GETJOBRECENTRUNSRESPONSE']._serialized_start=16112 + _globals['_GETJOBRECENTRUNSRESPONSE']._serialized_end=16200 + _globals['_JOBNEXTRUNS']._serialized_start=16202 + _globals['_JOBNEXTRUNS']._serialized_end=16281 + _globals['_GETJOBNEXTRUNSREQUEST']._serialized_start=16283 + _globals['_GETJOBNEXTRUNSREQUEST']._serialized_end=16339 + _globals['_GETJOBNEXTRUNSRESPONSE']._serialized_start=16341 + _globals['_GETJOBNEXTRUNSRESPONSE']._serialized_end=16422 + _globals['_GETJOBSTATUSREQUEST']._serialized_start=16424 + _globals['_GETJOBSTATUSREQUEST']._serialized_end=16478 + _globals['_GETJOBSTATUSRESPONSE']._serialized_start=16480 + _globals['_GETJOBSTATUSRESPONSE']._serialized_end=16552 + _globals['_JOBSTATUSRECORD']._serialized_start=16554 + _globals['_JOBSTATUSRECORD']._serialized_end=16654 + _globals['_GETJOBSTATUSESREQUEST']._serialized_start=16656 + _globals['_GETJOBSTATUSESREQUEST']._serialized_end=16720 + _globals['_GETJOBSTATUSESRESPONSE']._serialized_start=16722 + _globals['_GETJOBSTATUSESRESPONSE']._serialized_end=16806 + _globals['_ACTIVITYFAILURE']._serialized_start=16808 + _globals['_ACTIVITYFAILURE']._serialized_end=16851 + _globals['_PENDINGACTIVITY']._serialized_start=16854 + _globals['_PENDINGACTIVITY']._serialized_end=17052 + _globals['_JOBRUN']._serialized_start=17055 + _globals['_JOBRUN']._serialized_end=17404 + _globals['_JOBRUNEVENTTASKERROR']._serialized_start=17406 + _globals['_JOBRUNEVENTTASKERROR']._serialized_end=17487 + _globals['_JOBRUNEVENTTASK']._serialized_start=17490 + _globals['_JOBRUNEVENTTASK']._serialized_end=17661 + _globals['_JOBRUNSYNCMETADATA']._serialized_start=17663 + _globals['_JOBRUNSYNCMETADATA']._serialized_end=17729 + _globals['_JOBRUNEVENTMETADATA']._serialized_start=17731 + _globals['_JOBRUNEVENTMETADATA']._serialized_end=17845 + _globals['_JOBRUNEVENT']._serialized_start=17848 + _globals['_JOBRUNEVENT']._serialized_end=18133 + _globals['_GETJOBRUNEVENTSREQUEST']._serialized_start=18135 + _globals['_GETJOBRUNEVENTSREQUEST']._serialized_end=18230 + _globals['_GETJOBRUNEVENTSRESPONSE']._serialized_start=18232 + _globals['_GETJOBRUNEVENTSRESPONSE']._serialized_end=18349 + _globals['_DELETEJOBRUNREQUEST']._serialized_start=18351 + _globals['_DELETEJOBRUNREQUEST']._serialized_end=18443 + _globals['_DELETEJOBRUNRESPONSE']._serialized_start=18445 + _globals['_DELETEJOBRUNRESPONSE']._serialized_end=18467 + _globals['_TERMINATEJOBRUNREQUEST']._serialized_start=18469 + _globals['_TERMINATEJOBRUNREQUEST']._serialized_end=18564 + _globals['_TERMINATEJOBRUNRESPONSE']._serialized_start=18566 + _globals['_TERMINATEJOBRUNRESPONSE']._serialized_end=18591 + _globals['_GETJOBRUNLOGSSTREAMREQUEST']._serialized_start=18594 + _globals['_GETJOBRUNLOGSSTREAMREQUEST']._serialized_end=18900 + _globals['_GETJOBRUNLOGSSTREAMRESPONSE']._serialized_start=18903 + _globals['_GETJOBRUNLOGSSTREAMRESPONSE']._serialized_end=19175 + _globals['_GETJOBRUNLOGSSTREAMRESPONSE_LABELSENTRY']._serialized_start=19104 + _globals['_GETJOBRUNLOGSSTREAMRESPONSE_LABELSENTRY']._serialized_end=19161 + _globals['_GETJOBRUNLOGSREQUEST']._serialized_start=19178 + _globals['_GETJOBRUNLOGSREQUEST']._serialized_end=19445 + _globals['_GETJOBRUNLOGSRESPONSE']._serialized_start=19448 + _globals['_GETJOBRUNLOGSRESPONSE']._serialized_end=19803 + _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE']._serialized_start=19549 + _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE']._serialized_end=19803 + _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE_LABELSENTRY']._serialized_start=19104 + _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE_LABELSENTRY']._serialized_end=19161 + _globals['_SETJOBWORKFLOWOPTIONSREQUEST']._serialized_start=19806 + _globals['_SETJOBWORKFLOWOPTIONSREQUEST']._serialized_end=19937 + _globals['_SETJOBWORKFLOWOPTIONSRESPONSE']._serialized_start=19939 + _globals['_SETJOBWORKFLOWOPTIONSRESPONSE']._serialized_end=20008 + _globals['_SETJOBSYNCOPTIONSREQUEST']._serialized_start=20010 + _globals['_SETJOBSYNCOPTIONSREQUEST']._serialized_end=20129 + _globals['_SETJOBSYNCOPTIONSRESPONSE']._serialized_start=20131 + _globals['_SETJOBSYNCOPTIONSRESPONSE']._serialized_end=20196 + _globals['_VALIDATEJOBMAPPINGSREQUEST']._serialized_start=20199 + _globals['_VALIDATEJOBMAPPINGSREQUEST']._serialized_end=20538 + _globals['_COLUMNERROR']._serialized_start=20541 + _globals['_COLUMNERROR']._serialized_end=21540 + _globals['_COLUMNERROR_COLUMNERRORREPORT']._serialized_start=20737 + _globals['_COLUMNERROR_COLUMNERRORREPORT']._serialized_end=20846 + _globals['_COLUMNERROR_COLUMNERRORCODE']._serialized_start=20849 + _globals['_COLUMNERROR_COLUMNERRORCODE']._serialized_end=21540 + _globals['_COLUMNWARNING']._serialized_start=21543 + _globals['_COLUMNWARNING']._serialized_end=22018 + _globals['_COLUMNWARNING_COLUMNWARNINGREPORT']._serialized_start=21753 + _globals['_COLUMNWARNING_COLUMNWARNINGREPORT']._serialized_end=21868 + _globals['_COLUMNWARNING_COLUMNWARNINGCODE']._serialized_start=21871 + _globals['_COLUMNWARNING_COLUMNWARNINGCODE']._serialized_end=22018 + _globals['_DATABASEERROR']._serialized_start=22021 + _globals['_DATABASEERROR']._serialized_end=22451 + _globals['_DATABASEERROR_DATABASEERRORREPORT']._serialized_start=22153 + _globals['_DATABASEERROR_DATABASEERRORREPORT']._serialized_end=22268 + _globals['_DATABASEERROR_DATABASEERRORCODE']._serialized_start=22271 + _globals['_DATABASEERROR_DATABASEERRORCODE']._serialized_end=22451 + _globals['_TABLEERROR']._serialized_start=22454 + _globals['_TABLEERROR']._serialized_end=23040 + _globals['_TABLEERROR_TABLEERRORREPORT']._serialized_start=22595 + _globals['_TABLEERROR_TABLEERRORREPORT']._serialized_end=22701 + _globals['_TABLEERROR_TABLEERRORCODE']._serialized_start=22704 + _globals['_TABLEERROR_TABLEERRORCODE']._serialized_end=23040 + _globals['_VALIDATEJOBMAPPINGSRESPONSE']._serialized_start=23043 + _globals['_VALIDATEJOBMAPPINGSRESPONSE']._serialized_end=23341 + _globals['_VALIDATESCHEMAREQUEST']._serialized_start=23343 + _globals['_VALIDATESCHEMAREQUEST']._serialized_end=23468 + _globals['_VALIDATESCHEMARESPONSE']._serialized_start=23471 + _globals['_VALIDATESCHEMARESPONSE']._serialized_end=23815 + _globals['_VALIDATESCHEMARESPONSE_TABLE']._serialized_start=23762 + _globals['_VALIDATESCHEMARESPONSE_TABLE']._serialized_end=23815 + _globals['_VIRTUALFOREIGNKEY']._serialized_start=23817 + _globals['_VIRTUALFOREIGNKEY']._serialized_end=23908 + _globals['_VIRTUALFOREIGNCONSTRAINT']._serialized_start=23911 + _globals['_VIRTUALFOREIGNCONSTRAINT']._serialized_end=24076 + _globals['_RUNCONTEXTKEY']._serialized_start=24079 + _globals['_RUNCONTEXTKEY']._serialized_end=24215 + _globals['_GETRUNCONTEXTREQUEST']._serialized_start=24217 + _globals['_GETRUNCONTEXTREQUEST']._serialized_end=24285 + _globals['_GETRUNCONTEXTRESPONSE']._serialized_start=24287 + _globals['_GETRUNCONTEXTRESPONSE']._serialized_end=24332 + _globals['_SETRUNCONTEXTREQUEST']._serialized_start=24334 + _globals['_SETRUNCONTEXTREQUEST']._serialized_end=24424 + _globals['_SETRUNCONTEXTRESPONSE']._serialized_start=24426 + _globals['_SETRUNCONTEXTRESPONSE']._serialized_end=24449 + _globals['_SETRUNCONTEXTSREQUEST']._serialized_start=24451 + _globals['_SETRUNCONTEXTSREQUEST']._serialized_end=24542 + _globals['_SETRUNCONTEXTSRESPONSE']._serialized_start=24544 + _globals['_SETRUNCONTEXTSRESPONSE']._serialized_end=24568 + _globals['_JOBHOOK']._serialized_start=24571 + _globals['_JOBHOOK']._serialized_end=25000 + _globals['_NEWJOBHOOK']._serialized_start=25003 + _globals['_NEWJOBHOOK']._serialized_end=25224 + _globals['_JOBHOOKCONFIG']._serialized_start=25227 + _globals['_JOBHOOKCONFIG']._serialized_end=25672 + _globals['_JOBHOOKCONFIG_JOBSQLHOOK']._serialized_start=25306 + _globals['_JOBHOOKCONFIG_JOBSQLHOOK']._serialized_end=25631 + _globals['_JOBHOOKCONFIG_JOBSQLHOOK_TIMING']._serialized_start=25471 + _globals['_JOBHOOKCONFIG_JOBSQLHOOK_TIMING']._serialized_end=25631 + _globals['_JOBHOOKTIMINGPRESYNC']._serialized_start=25674 + _globals['_JOBHOOKTIMINGPRESYNC']._serialized_end=25696 + _globals['_JOBHOOKTIMINGPOSTSYNC']._serialized_start=25698 + _globals['_JOBHOOKTIMINGPOSTSYNC']._serialized_end=25721 + _globals['_GETJOBHOOKSREQUEST']._serialized_start=25723 + _globals['_GETJOBHOOKSREQUEST']._serialized_end=25776 + _globals['_GETJOBHOOKSRESPONSE']._serialized_start=25778 + _globals['_GETJOBHOOKSRESPONSE']._serialized_end=25845 + _globals['_GETJOBHOOKREQUEST']._serialized_start=25847 + _globals['_GETJOBHOOKREQUEST']._serialized_end=25892 + _globals['_GETJOBHOOKRESPONSE']._serialized_start=25894 + _globals['_GETJOBHOOKRESPONSE']._serialized_end=25958 + _globals['_CREATEJOBHOOKREQUEST']._serialized_start=25960 + _globals['_CREATEJOBHOOKREQUEST']._serialized_end=26052 + _globals['_CREATEJOBHOOKRESPONSE']._serialized_start=26054 + _globals['_CREATEJOBHOOKRESPONSE']._serialized_end=26121 + _globals['_DELETEJOBHOOKREQUEST']._serialized_start=26123 + _globals['_DELETEJOBHOOKREQUEST']._serialized_end=26171 + _globals['_DELETEJOBHOOKRESPONSE']._serialized_start=26173 + _globals['_DELETEJOBHOOKRESPONSE']._serialized_end=26196 + _globals['_ISJOBHOOKNAMEAVAILABLEREQUEST']._serialized_start=26198 + _globals['_ISJOBHOOKNAMEAVAILABLEREQUEST']._serialized_end=26272 + _globals['_ISJOBHOOKNAMEAVAILABLERESPONSE']._serialized_start=26274 + _globals['_ISJOBHOOKNAMEAVAILABLERESPONSE']._serialized_end=26341 + _globals['_UPDATEJOBHOOKREQUEST']._serialized_start=26344 + _globals['_UPDATEJOBHOOKREQUEST']._serialized_end=26601 + _globals['_UPDATEJOBHOOKRESPONSE']._serialized_start=26603 + _globals['_UPDATEJOBHOOKRESPONSE']._serialized_end=26670 + _globals['_SETJOBHOOKENABLEDREQUEST']._serialized_start=26672 + _globals['_SETJOBHOOKENABLEDREQUEST']._serialized_end=26750 + _globals['_SETJOBHOOKENABLEDRESPONSE']._serialized_start=26752 + _globals['_SETJOBHOOKENABLEDRESPONSE']._serialized_end=26823 + _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST']._serialized_start=26826 + _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST']._serialized_end=27048 + _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST_TIMING']._serialized_start=26975 + _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST_TIMING']._serialized_end=27048 + _globals['_GETACTIVEJOBHOOKSBYTIMINGRESPONSE']._serialized_start=27050 + _globals['_GETACTIVEJOBHOOKSBYTIMINGRESPONSE']._serialized_end=27131 + _globals['_JOBSERVICE']._serialized_start=27941 + _globals['_JOBSERVICE']._serialized_end=32092 # @@protoc_insertion_point(module_scope) diff --git a/worker/internal/cmds/worker/serve/serve.go b/worker/internal/cmds/worker/serve/serve.go index 5219807b62..b066efa241 100644 --- a/worker/internal/cmds/worker/serve/serve.go +++ b/worker/internal/cmds/worker/serve/serve.go @@ -20,6 +20,7 @@ import ( neosynclogger "github.com/nucleuscloud/neosync/backend/pkg/logger" "github.com/nucleuscloud/neosync/backend/pkg/sqlconnect" sql_manager "github.com/nucleuscloud/neosync/backend/pkg/sqlmanager" + benthosstream "github.com/nucleuscloud/neosync/internal/benthos-stream" connectionmanager "github.com/nucleuscloud/neosync/internal/connection-manager" "github.com/nucleuscloud/neosync/internal/connection-manager/providers/mongoprovider" "github.com/nucleuscloud/neosync/internal/connection-manager/providers/sqlprovider" @@ -35,11 +36,11 @@ import ( posttablesync_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/post-table-sync" runsqlinittablestmts_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/run-sql-init-table-stmts" "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/shared" - sync_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/sync" syncactivityopts_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/sync-activity-opts" syncrediscleanup_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/sync-redis-clean-up" datasync_workflow "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/workflow" accounthook_workflow_register "github.com/nucleuscloud/neosync/worker/pkg/workflows/ee/account_hooks/workflow/register" + tablesync_workflow_register "github.com/nucleuscloud/neosync/worker/pkg/workflows/tablesync/workflow/register" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" @@ -320,14 +321,6 @@ func serve(ctx context.Context) error { otelconfig.IsEnabled, ) - syncActivity := sync_activity.New( - connclient, - jobclient, - sqlconnmanager, - mongoconnmanager, - syncActivityMeter, - sync_activity.NewBenthosStreamManager(), - ) retrieveActivityOpts := syncactivityopts_activity.New(jobclient) runSqlInitTableStatements := runsqlinittablestmts_activity.New(jobclient, connclient, sqlmanager, cascadelicense) accountStatusActivity := accountstatus_activity.New(userclient) @@ -336,7 +329,6 @@ func serve(ctx context.Context) error { redisCleanUpActivity := syncrediscleanup_activity.New(redisclient) w.RegisterWorkflow(datasync_workflow.Workflow) - w.RegisterActivity(syncActivity.Sync) w.RegisterActivity(retrieveActivityOpts.RetrieveActivityOptions) w.RegisterActivity(runSqlInitTableStatements.RunSqlInitTableStatements) w.RegisterActivity(redisCleanUpActivity.DeleteRedisHash) @@ -345,6 +337,16 @@ func serve(ctx context.Context) error { w.RegisterActivity(runPostTableSyncActivity.RunPostTableSync) w.RegisterActivity(jobhookByTimingActivity.RunJobHooksByTiming) + tablesync_workflow_register.Register( + w, + connclient, + jobclient, + sqlconnmanager, + mongoconnmanager, + syncActivityMeter, + benthosstream.NewBenthosStreamManager(), + ) + if cascadelicense.IsValid() { logger.Debug("ee license is valid, registering account hook activities") accounthook_workflow_register.Register(w, accounthookclient) diff --git a/worker/pkg/benthos/config.go b/worker/pkg/benthos/config.go index 163776f513..ef1a672de4 100644 --- a/worker/pkg/benthos/config.go +++ b/worker/pkg/benthos/config.go @@ -132,7 +132,10 @@ type Generate struct { type InputPooledSqlRaw struct { ConnectionId string `json:"connection_id" yaml:"connection_id"` Query string `json:"query" yaml:"query"` - ArgsMapping string `json:"args_mapping,omitempty" yaml:"args_mapping,omitempty"` + PagedQuery string `json:"paged_query,omitempty" yaml:"paged_query,omitempty"` + + ExpectedTotalRows *int `json:"expected_total_rows,omitempty" yaml:"expected_total_rows,omitempty"` + OrderByColumns []string `json:"order_by_columns,omitempty" yaml:"order_by_columns,omitempty"` } type PipelineConfig struct { diff --git a/worker/pkg/benthos/environment/environment.go b/worker/pkg/benthos/environment/environment.go index b65d105145..741705175a 100644 --- a/worker/pkg/benthos/environment/environment.go +++ b/worker/pkg/benthos/environment/environment.go @@ -6,6 +6,7 @@ import ( "log/slog" "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1/mgmtv1alpha1connect" + continuation_token "github.com/nucleuscloud/neosync/internal/continuation-token" neosync_benthos_defaulttransform "github.com/nucleuscloud/neosync/worker/pkg/benthos/default_transform" neosync_benthos_dynamodb "github.com/nucleuscloud/neosync/worker/pkg/benthos/dynamodb" neosync_benthos_error "github.com/nucleuscloud/neosync/worker/pkg/benthos/error" @@ -70,8 +71,10 @@ func WithBlobEnv(b *bloblang.Environment) Option { } type SqlConfig struct { - Provider neosync_benthos_sql.ConnectionProvider - IsRetry bool + Provider neosync_benthos_sql.ConnectionProvider + IsRetry bool + InputHasMorePages neosync_benthos_sql.OnHasMorePagesFn + InputContinuationToken *continuation_token.ContinuationToken } type MongoConfig struct { @@ -116,7 +119,7 @@ func NewWithEnvironment(env *service.Environment, logger *slog.Logger, opts ...O if err != nil { return nil, fmt.Errorf("unable to register pooled_sql_update output to benthos instance: %w", err) } - err = neosync_benthos_sql.RegisterPooledSqlRawInput(env, config.sqlConfig.Provider, config.stopChannel) + err = neosync_benthos_sql.RegisterPooledSqlRawInput(env, config.sqlConfig.Provider, config.stopChannel, config.sqlConfig.InputHasMorePages, config.sqlConfig.InputContinuationToken) if err != nil { return nil, fmt.Errorf("unable to register pooled_sql_raw input to benthos instance: %w", err) } diff --git a/worker/pkg/benthos/sql/input_sql_raw.go b/worker/pkg/benthos/sql/input_sql_raw.go index 1711b085f5..74ee8f922b 100644 --- a/worker/pkg/benthos/sql/input_sql_raw.go +++ b/worker/pkg/benthos/sql/input_sql_raw.go @@ -2,21 +2,17 @@ package neosync_benthos_sql import ( "context" - "crypto/sha256" "database/sql" "fmt" - "regexp" "sync" - "time" "github.com/Jeffail/shutdown" mysql_queries "github.com/nucleuscloud/neosync/backend/gen/go/db/dbschemas/mysql" - sqlmanager_shared "github.com/nucleuscloud/neosync/backend/pkg/sqlmanager/shared" + continuation_token "github.com/nucleuscloud/neosync/internal/continuation-token" database_record_mapper "github.com/nucleuscloud/neosync/internal/database-record-mapper" record_mapper_builder "github.com/nucleuscloud/neosync/internal/database-record-mapper/builder" neosync_benthos "github.com/nucleuscloud/neosync/worker/pkg/benthos" - "github.com/redpanda-data/benthos/v4/public/bloblang" "github.com/redpanda-data/benthos/v4/public/service" ) @@ -24,15 +20,24 @@ func sqlRawInputSpec() *service.ConfigSpec { return service.NewConfigSpec(). Field(service.NewStringField("connection_id")). Field(service.NewStringField("query")). - Field(service.NewBloblangField("args_mapping").Optional()) + Field(service.NewStringField("paged_query").Optional()). + Field(service.NewIntField("expected_total_rows").Optional()). + Field(service.NewStringListField("order_by_columns").Default([]string{})) } // Registers an input on a benthos environment called pooled_sql_raw -func RegisterPooledSqlRawInput(env *service.Environment, dbprovider ConnectionProvider, stopActivityChannel chan<- error) error { +func RegisterPooledSqlRawInput( + env *service.Environment, + dbprovider ConnectionProvider, + stopActivityChannel chan<- error, + onHasMorePages OnHasMorePagesFn, + continuationToken *continuation_token.ContinuationToken, +) error { return env.RegisterInput( - "pooled_sql_raw", sqlRawInputSpec(), + "pooled_sql_raw", + sqlRawInputSpec(), func(conf *service.ParsedConfig, mgr *service.Resources) (service.Input, error) { - input, err := newInput(conf, mgr, dbprovider, stopActivityChannel) + input, err := newInput(conf, mgr, dbprovider, stopActivityChannel, onHasMorePages, continuationToken) if err != nil { return nil, err } @@ -41,30 +46,42 @@ func RegisterPooledSqlRawInput(env *service.Environment, dbprovider ConnectionPr ) } +type OnHasMorePagesFn func(lastReadOrderValues []any) + type pooledInput struct { provider ConnectionProvider logger *service.Logger connectionId string driver string - argsMapping *bloblang.Executor - queryStatic string - - db mysql_queries.DBTX - dbMut sync.Mutex - tx *sql.Tx - rows *sql.Rows + queryStatic string + pagedQueryStatic *string + db mysql_queries.DBTX + dbMut sync.Mutex - cursorName string + rows *sql.Rows recordMapper record_mapper_builder.DatabaseRecordMapper[any] shutSig *shutdown.Signaller stopActivityChannel chan<- error + onHasMorePages OnHasMorePagesFn + expectedTotalRows *int + rowsRead int + orderByColumns []string + lastReadOrderValues []any + continuationToken *continuation_token.ContinuationToken } -func newInput(conf *service.ParsedConfig, mgr *service.Resources, dbprovider ConnectionProvider, channel chan<- error) (*pooledInput, error) { +func newInput( + conf *service.ParsedConfig, + mgr *service.Resources, + dbprovider ConnectionProvider, + channel chan<- error, + onHasMorePages OnHasMorePagesFn, + continuationToken *continuation_token.ContinuationToken, +) (*pooledInput, error) { connectionId, err := conf.FieldString("connection_id") if err != nil { return nil, err @@ -75,12 +92,27 @@ func newInput(conf *service.ParsedConfig, mgr *service.Resources, dbprovider Con return nil, err } - var argsMapping *bloblang.Executor - if conf.Contains("args_mapping") { - argsMapping, err = conf.FieldBloblang("args_mapping") + var pagedQueryStatic *string + if conf.Contains("paged_query") { + pquery, err := conf.FieldString("paged_query") + if err != nil { + return nil, err + } + pagedQueryStatic = &pquery + } + + var expectedTotalRows *int + if conf.Contains("expected_total_rows") { + totalRows, err := conf.FieldInt("expected_total_rows") if err != nil { return nil, err } + expectedTotalRows = &totalRows + } + + orderByColumns, err := conf.FieldStringList("order_by_columns") + if err != nil { + return nil, err } driver, err := dbprovider.GetDriver(connectionId) @@ -99,11 +131,15 @@ func newInput(conf *service.ParsedConfig, mgr *service.Resources, dbprovider Con connectionId: connectionId, driver: driver, queryStatic: queryStatic, - argsMapping: argsMapping, + pagedQueryStatic: pagedQueryStatic, provider: dbprovider, stopActivityChannel: channel, recordMapper: mapper, - cursorName: generateCursorName(connectionId, queryStatic), + onHasMorePages: onHasMorePages, + expectedTotalRows: expectedTotalRows, + orderByColumns: orderByColumns, + lastReadOrderValues: []any{}, + continuationToken: continuationToken, }, nil } @@ -125,59 +161,47 @@ func (s *pooledInput) Connect(ctx context.Context) error { s.db = db s.logger.Debug(fmt.Sprintf("connected to database %s", s.connectionId)) + query := s.queryStatic var args []any - if s.argsMapping != nil { - iargs, err := s.argsMapping.Query(nil) - if err != nil { - return err - } - var ok bool - if args, ok = iargs.([]any); !ok { - return fmt.Errorf("mapping returned non-array result: %T", iargs) + if s.pagedQueryStatic != nil && s.continuationToken != nil && s.expectedTotalRows != nil { + if len(s.orderByColumns) != len(s.continuationToken.Contents.LastReadOrderValues) { + columnMisMatchErr := fmt.Errorf("order by columns and last read order values must be the same length") + s.logger.Error(columnMisMatchErr.Error()) + s.stopActivityChannel <- columnMisMatchErr + return columnMisMatchErr } - } - - switch s.driver { - case sqlmanager_shared.PostgresDriver: - tx, err := db.BeginTx(ctx, &sql.TxOptions{ - ReadOnly: true, - }) - if err != nil { - return err - } - s.tx = tx - s.logger.Debug("transaction started") - cursorStmt := fmt.Sprintf("DECLARE %s CURSOR FOR %s", s.cursorName, s.queryStatic) - _, err = s.tx.ExecContext(ctx, cursorStmt, args...) - if err != nil { - if err := tx.Rollback(); err != nil { - s.logger.Error(fmt.Sprintf("error rolling back transaction: %s", err.Error())) + s.logger.Debug("using paged query") + query = *s.pagedQueryStatic + + // Build arguments for lexicographical ordering + // To retain this ordering, we need to build the args in a way that match the OR'd statements from the prepared query + // For lexi ordering the total number of args follows the algorithm: (n (n + 1)) / 2 where n is the number of order by columns + // For example, if we have 2 order by columns, we need 3 args: + // First OR condition: [id_value] + // Second OR condition: [id_value, name_value] + // Third OR condition: [id_value, name_value, email_value] + // And so on... + lastValues := s.continuationToken.Contents.LastReadOrderValues + for i := 0; i < len(s.orderByColumns); i++ { + // For each OR condition, add values up to and including current position + for j := 0; j <= i; j++ { + args = append(args, lastValues[j]) } - return err } + args = append(args, *s.expectedTotalRows) + } - s.logger.Debug(fmt.Sprintf("cursor declared: %s", s.cursorName)) - - err = s.fetchNextBatchFromCursor(ctx) - if err != nil { - if err := tx.Rollback(); err != nil { - s.logger.Error(fmt.Sprintf("error rolling back transaction: %s", err.Error())) - } - return err - } - default: - rows, err := db.QueryContext(ctx, s.queryStatic, args...) - if err != nil { - if neosync_benthos.IsCriticalError(err.Error()) { - s.logger.Error(fmt.Sprintf("Benthos input error - sending stop activity signal: %s ", err.Error())) - s.stopActivityChannel <- err - } - return err + rows, err := db.QueryContext(ctx, query, args...) + if err != nil { + if neosync_benthos.IsCriticalError(err.Error()) { + s.logger.Error(fmt.Sprintf("Benthos input error - sending stop activity signal: %s ", err.Error())) + s.stopActivityChannel <- err } - - s.rows = rows + return err } + s.rows = rows + s.rowsRead = 0 go func() { <-s.shutSig.HardStopChan() @@ -186,10 +210,6 @@ func (s *pooledInput) Connect(ctx context.Context) error { _ = s.rows.Close() s.rows = nil } - if s.tx != nil { - _ = s.tx.Rollback() - s.tx = nil - } // not closing the connection here as that is managed by an outside force s.db = nil s.dbMut.Unlock() @@ -199,61 +219,22 @@ func (s *pooledInput) Connect(ctx context.Context) error { return nil } -// fetchNextBatchFromCursor issues a FETCH command to retrieve the next batch of rows from the cursor. -func (s *pooledInput) fetchNextBatchFromCursor(ctx context.Context) error { - fetchStmt := fmt.Sprintf("FETCH FORWARD %d FROM %s", 100, s.cursorName) //nolint:gosec // cursor name is hashed and sanitized - rows, err := s.tx.QueryContext(ctx, fetchStmt) - if err != nil { - if neosync_benthos.IsCriticalError(err.Error()) { - s.logger.Error(fmt.Sprintf("Benthos input error - sending stop activity signal: %s ", err.Error())) - s.stopActivityChannel <- err - } - return err - } - // If no rows are returned, rows.Next() will be false. - s.rows = rows - return nil -} - -// allow only letters, numbers, and underscores. -var cursorNameRegex = regexp.MustCompile(`[^a-zA-Z0-9_]`) - -func sanitizeCursorName(s string) string { - return cursorNameRegex.ReplaceAllString(s, "") -} - -// generateCursorName generates a unique cursor name using the provided schema and table names. -// It also sanitizes the input to allow only alphanumeric characters and underscores. -func generateCursorName(connectionId, query string) string { - // Sanitize the connectionID for safe use in SQL identifiers. - // Remove hyphens from the UUID for compactness. - safeConnID := sanitizeCursorName(connectionId) - - // Create a short hash (first 8 hex digits) from the query string. - hash := sha256.Sum256([]byte(query)) - shortHash := fmt.Sprintf("%x", hash)[:8] - - // Use current timestamp in nanoseconds. - timestamp := time.Now().UnixNano() - - // Construct a candidate cursor name. - candidate := fmt.Sprintf("cur_%s_%s_%d", safeConnID, shortHash, timestamp) - - // PostgreSQL identifier limit is 63 characters. If candidate is longer, truncate. - if len(candidate) > 63 { - candidate = candidate[:63] - } - return candidate -} - func (s *pooledInput) Read(ctx context.Context) (*service.Message, service.AckFunc, error) { s.dbMut.Lock() defer s.dbMut.Unlock() - if s.db == nil || (s.driver == sqlmanager_shared.PostgresDriver && s.tx == nil) { + if s.db == nil { return nil, nil, service.ErrNotConnected } if s.rows == nil { + if s.expectedTotalRows != nil && s.onHasMorePages != nil && len(s.orderByColumns) > 0 { + // emit order by column values if ok + s.logger.Debug(fmt.Sprintf("rows read: %d, expected total rows: %d", s.rowsRead, *s.expectedTotalRows)) + if s.rowsRead >= *s.expectedTotalRows { + s.logger.Debug("emitting order by column values") + s.onHasMorePages(s.lastReadOrderValues) + } + } return nil, nil, service.ErrEndOfInput } if !s.rows.Next() { @@ -263,41 +244,45 @@ func (s *pooledInput) Read(ctx context.Context) (*service.Message, service.AckFu s.rows = nil return nil, nil, err } - if s.driver == sqlmanager_shared.PostgresDriver && s.tx != nil { - _ = s.rows.Close() - // Fetch next batch for Postgres - if err := s.fetchNextBatchFromCursor(ctx); err != nil { - _ = s.tx.Rollback() - return nil, nil, err - } - // Check if the new batch has rows - if s.rows == nil || !s.rows.Next() { - // No more rows; close cursor and commit transaction - _ = s.rows.Close() - s.rows = nil - _ = s.tx.Commit() - s.tx = nil - return nil, nil, service.ErrEndOfInput + // For non-Postgres drivers, simply close and return EndOfInput + _ = s.rows.Close() + s.rows = nil + if s.expectedTotalRows != nil && s.onHasMorePages != nil && len(s.orderByColumns) > 0 { + // emit order by column values if ok + s.logger.Debug(fmt.Sprintf("[ROW END] rows read: %d, expected total rows: %d", s.rowsRead, *s.expectedTotalRows)) + if s.rowsRead >= *s.expectedTotalRows { + s.logger.Debug("[ROW END] emitting order by column values") + s.onHasMorePages(s.lastReadOrderValues) } - } else { - // For non-Postgres drivers, simply close and return EndOfInput - _ = s.rows.Close() - s.rows = nil - return nil, nil, service.ErrEndOfInput } + return nil, nil, service.ErrEndOfInput } obj, err := s.recordMapper.MapRecord(s.rows) if err != nil { _ = s.rows.Close() s.rows = nil - if s.tx != nil { - _ = s.tx.Rollback() - s.tx = nil - } return nil, nil, err } + // store last order by columns values + lastReadOrderValues := make([]any, len(s.orderByColumns)) + for i, col := range s.orderByColumns { + val, ok := obj[col] + if !ok { + _ = s.rows.Close() + s.rows = nil + return nil, nil, fmt.Errorf("order by column %s not found", col) + } + lastReadOrderValues[i] = val + } + if len(lastReadOrderValues) > 0 { + s.logger.Debug(fmt.Sprintf("last read order values: %v", lastReadOrderValues)) + s.lastReadOrderValues = lastReadOrderValues + } + + s.rowsRead++ + msg := service.NewMessage(nil) msg.SetStructured(obj) return msg, emptyAck, nil @@ -313,7 +298,7 @@ func (s *pooledInput) Close(ctx context.Context) error { s.shutSig.TriggerHardStop() s.dbMut.Lock() - isNil := s.db == nil || (s.driver == sqlmanager_shared.PostgresDriver && s.tx == nil) + isNil := s.db == nil if isNil { s.dbMut.Unlock() return nil @@ -324,15 +309,6 @@ func (s *pooledInput) Close(ctx context.Context) error { s.rows = nil } - if s.tx != nil { - // Rollback the transaction to clean up resources if it's still active. - // For a read-only transaction, rollback is a safe way to end it. - if err := s.tx.Rollback(); err != nil { - s.logger.Error(fmt.Sprintf("error rolling back transaction on close: %s", err.Error())) - } - s.tx = nil - } - s.db = nil // not closing here since it's managed by the pool s.dbMut.Unlock() diff --git a/worker/pkg/benthos/sql/input_sql_raw_test.go b/worker/pkg/benthos/sql/input_sql_raw_test.go index 0c8127f53d..1f436002fb 100644 --- a/worker/pkg/benthos/sql/input_sql_raw_test.go +++ b/worker/pkg/benthos/sql/input_sql_raw_test.go @@ -21,7 +21,7 @@ args_mapping: 'root = [this.id]' selectConfig, err := spec.ParseYAML(conf, env) require.NoError(t, err) - selectInput, err := newInput(selectConfig, service.MockResources(), &fakeConnectionProvider{}, nil) + selectInput, err := newInput(selectConfig, service.MockResources(), &fakeConnectionProvider{}, nil, nil, nil) require.NoError(t, err) require.NoError(t, selectInput.Close(context.Background())) } diff --git a/worker/pkg/benthos/sql/output_sql_insert.go b/worker/pkg/benthos/sql/output_sql_insert.go index 906b4b5d77..8347cc3b70 100644 --- a/worker/pkg/benthos/sql/output_sql_insert.go +++ b/worker/pkg/benthos/sql/output_sql_insert.go @@ -24,7 +24,7 @@ func sqlInsertOutputSpec() *service.ConfigSpec { Field(service.NewBoolField("on_conflict_do_nothing").Optional().Default(false)). Field(service.NewBoolField("on_conflict_do_update").Optional().Default(false)). Field(service.NewBoolField("skip_foreign_key_violations").Optional().Default(false)). - Field(service.NewBoolField("truncate_on_retry").Optional().Default(false)). + Field(service.NewBoolField("truncate_on_retry").Optional().Default(false).Deprecated()). Field(service.NewBoolField("should_override_column_default").Optional().Default(false)). Field(service.NewIntField("max_in_flight").Default(64)). Field(service.NewBatchPolicyField("batching")). @@ -70,7 +70,6 @@ type pooledInsertOutput struct { table string onConflictDoNothing bool skipForeignKeyViolations bool - truncateOnRetry bool queryBuilder querybuilder.InsertQueryBuilder shutSig *shutdown.Signaller @@ -113,11 +112,6 @@ func newInsertOutput(conf *service.ParsedConfig, mgr *service.Resources, provide return nil, err } - truncateOnRetry, err := conf.FieldBool("truncate_on_retry") - if err != nil { - return nil, err - } - shouldOverrideColumnDefault, err := conf.FieldBool("should_override_column_default") if err != nil { return nil, err @@ -151,7 +145,7 @@ func newInsertOutput(conf *service.ParsedConfig, mgr *service.Resources, provide querybuilder.WithSuffix(suffix), } - if onConflictDoNothing { + if onConflictDoNothing || isRetry { options = append(options, querybuilder.WithOnConflictDoNothing()) } if onConflictDoUpdate { @@ -183,7 +177,6 @@ func newInsertOutput(conf *service.ParsedConfig, mgr *service.Resources, provide onConflictDoNothing: onConflictDoNothing, queryBuilder: builder, skipForeignKeyViolations: skipForeignKeyViolations, - truncateOnRetry: truncateOnRetry, isRetry: isRetry, } return output, nil @@ -203,18 +196,6 @@ func (s *pooledInsertOutput) Connect(ctx context.Context) error { } s.db = db - // truncate table on retry - if s.isRetry && s.truncateOnRetry && !s.onConflictDoNothing { - s.logger.Info("retry: truncating table before inserting") - query, err := querybuilder.BuildTruncateQuery(s.driver, fmt.Sprintf("%s.%s", s.schema, s.table)) - if err != nil { - return err - } - if _, err := s.db.ExecContext(ctx, query); err != nil { - return err - } - } - go func() { <-s.shutSig.HardStopChan() diff --git a/worker/pkg/query-builder2/querybuilder.go b/worker/pkg/query-builder2/querybuilder.go index 7fbb4c72a5..3e4101d29b 100644 --- a/worker/pkg/query-builder2/querybuilder.go +++ b/worker/pkg/query-builder2/querybuilder.go @@ -7,6 +7,9 @@ import ( "strings" "github.com/doug-martin/goqu/v9" + _ "github.com/doug-martin/goqu/v9/dialect/mysql" + _ "github.com/doug-martin/goqu/v9/dialect/postgres" + _ "github.com/doug-martin/goqu/v9/dialect/sqlserver" "github.com/doug-martin/goqu/v9/exp" "github.com/doug-martin/goqu/v9/sqlgen" sqlmanager_shared "github.com/nucleuscloud/neosync/backend/pkg/sqlmanager/shared" @@ -17,6 +20,7 @@ import ( const ( mysqlDialect = "custom-mysql-dialect" + pageLimit = 100_000 ) func init() { @@ -74,6 +78,7 @@ func (s set) contains(key string) bool { type QueryBuilder struct { tables map[string]*TableInfo whereConditions map[string][]WhereCondition + orderBy map[string][]string // schema.table -> column -> { column info } columnInfo map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow defaultSchema string @@ -88,6 +93,7 @@ func NewQueryBuilder(defaultSchema, driver string, subsetByForeignKeyConstraints return &QueryBuilder{ tables: make(map[string]*TableInfo), whereConditions: make(map[string][]WhereCondition), + orderBy: make(map[string][]string), defaultSchema: defaultSchema, driver: driver, subsetByForeignKeyConstraints: subsetByForeignKeyConstraints, @@ -103,10 +109,17 @@ func (qb *QueryBuilder) AddTable(table *TableInfo) { qb.tables[key] = table } +func (qb *QueryBuilder) AddOrderBy(schema, tableName string, orderBy []string) { + key := qb.getTableKey(schema, tableName) + qb.orderBy[key] = orderBy +} + func (qb *QueryBuilder) getDialect() goqu.DialectWrapper { switch qb.driver { case sqlmanager_shared.MysqlDriver: return goqu.Dialect(mysqlDialect) + case sqlmanager_shared.PostgresDriver: + return goqu.Dialect(sqlmanager_shared.GoquPostgresDriver) default: return goqu.Dialect(qb.driver) } @@ -122,27 +135,56 @@ func (qb *QueryBuilder) clearPathCache() { qb.pathCache = make(set) } -func (qb *QueryBuilder) BuildQuery(schema, tableName string) (sqlstatement string, args []any, isNotForeignKeySafeSubset bool, err error) { +func (qb *QueryBuilder) BuildQuery(schema, tableName string) (sqlstatement string, args []any, pagesql string, isNotForeignKeySafeSubset bool, err error) { key := qb.getTableKey(schema, tableName) table, ok := qb.tables[key] if !ok { - return "", nil, false, fmt.Errorf("table not found: %s", key) + return "", nil, "", false, fmt.Errorf("table not found: %s", key) } - query, notFkSafe, err := qb.buildFlattenedQuery(table) + query, pageQuery, notFkSafe, err := qb.buildFlattenedQuery(table) if query == nil { - return "", nil, false, fmt.Errorf("received no error, but query was nil for %s.%s", schema, tableName) + return "", nil, "", false, fmt.Errorf("received no error, but query was nil for %s.%s", schema, tableName) + } + if err != nil { + return "", nil, "", false, err } + + sql, args, err := query.Limit(pageLimit).ToSQL() if err != nil { - return "", nil, false, err + return "", nil, "", false, fmt.Errorf("unable to convery structured query to string for %s.%s: %w", schema, tableName, err) } - sql, args, err := query.ToSQL() + + pageSql, _, err := pageQuery.Limit(pageLimit).ToSQL() if err != nil { - return "", nil, false, fmt.Errorf("unable to convery structured query to string for %s.%s: %w", schema, tableName, err) + return "", nil, "", false, fmt.Errorf("unable to convery structured page query to string for %s.%s: %w", schema, tableName, err) + } + return sql, args, pageSql, notFkSafe, nil +} + +func (qb *QueryBuilder) buildPageQuery(schema, tableName string, query *goqu.SelectDataset, rootAlias string) *goqu.SelectDataset { + key := qb.getTableKey(schema, tableName) + orderBy := qb.orderBy[key] + if len(orderBy) > 0 { + // Build lexicographical ordering conditions + var conditions []exp.Expression + for i := 0; i < len(orderBy); i++ { + var subConditions []exp.Expression + // Add equality conditions for all columns before current + for j := 0; j < i; j++ { + // Hard coding the "?" = 0 here. Using prepared statements we just want goqu to correct calculate + // The parameter number as we fill in the real args later. + subConditions = append(subConditions, goqu.T(rootAlias).Col(orderBy[j]).Eq(goqu.L("?", 0))) + } + // Add greater than condition for current column + subConditions = append(subConditions, goqu.T(rootAlias).Col(orderBy[i]).Gt(goqu.L("?", 0))) + conditions = append(conditions, goqu.And(subConditions...)) + } + query = query.Where(goqu.Or(conditions...)) } - return sql, args, notFkSafe, nil + return query.Prepared(true) } -func (qb *QueryBuilder) buildFlattenedQuery(rootTable *TableInfo) (sql *goqu.SelectDataset, isNotForeignKeySafeSubset bool, err error) { +func (qb *QueryBuilder) buildFlattenedQuery(rootTable *TableInfo) (sql, pageSql *goqu.SelectDataset, isNotForeignKeySafeSubset bool, err error) { dialect := qb.getDialect() rootAlias := rootTable.Name rootAliasExpression := rootTable.GetIdentifierExpression().As(rootAlias) @@ -162,6 +204,15 @@ func (qb *QueryBuilder) buildFlattenedQuery(rootTable *TableInfo) (sql *goqu.Sel } } + // Add order by + if orderBy, ok := qb.orderBy[qb.getTableKey(rootTable.Schema, rootTable.Name)]; ok { + orderByExpressions := make([]exp.OrderedExpression, len(orderBy)) + for i, col := range orderBy { + orderByExpressions[i] = rootAliasExpression.Col(col).Asc() + } + query = query.Order(orderByExpressions...) + } + // Flatten and add necessary joins var notFkSafe bool if qb.subsetByForeignKeyConstraints && len(qb.whereConditions) > 0 { @@ -169,11 +220,14 @@ func (qb *QueryBuilder) buildFlattenedQuery(rootTable *TableInfo) (sql *goqu.Sel var err error query, notFkSafe, err = qb.addFlattenedJoins(query, rootTable, rootTable, rootAlias, joinedTables, "", false) if err != nil { - return nil, false, err + return nil, nil, false, err } } - return query, notFkSafe, nil + // build page query + pageQuery := qb.buildPageQuery(rootTable.Schema, rootTable.Name, query, rootAlias) + + return query, pageQuery, notFkSafe, nil } func (qb *QueryBuilder) addFlattenedJoins( diff --git a/worker/pkg/query-builder2/subset.go b/worker/pkg/query-builder2/subset.go index 84c0425141..7e8f43d524 100644 --- a/worker/pkg/query-builder2/subset.go +++ b/worker/pkg/query-builder2/subset.go @@ -45,15 +45,22 @@ func BuildSelectQueryMap( qb := NewQueryBuilderFromSchemaDefinition(groupedColumnInfo, tableDependencies, "public", driver, subsetByForeignKeyConstraints) for _, cfg := range runConfigs { - if cfg.RunType() != tabledependency.RunTypeInsert || cfg.WhereClause() == nil || *cfg.WhereClause() == "" { + if cfg.RunType() != tabledependency.RunTypeInsert { continue } + // add order by to query builder schema, table := splitTable(cfg.Table()) - qualifiedWhereCaluse, err := qb.qualifyWhereCondition(nil, table, *cfg.WhereClause()) - if err != nil { - return nil, err + if len(cfg.OrderByColumns()) > 0 { + qb.AddOrderBy(schema, table, cfg.OrderByColumns()) + } + // add where clause to query builder + if cfg.WhereClause() != nil && *cfg.WhereClause() != "" { + qualifiedWhereCaluse, err := qb.qualifyWhereCondition(nil, table, *cfg.WhereClause()) + if err != nil { + return nil, err + } + qb.AddWhereCondition(schema, table, qualifiedWhereCaluse) } - qb.AddWhereCondition(schema, table, qualifiedWhereCaluse) } querymap := map[string]map[tabledependency.RunType]*sqlmanager_shared.SelectQuery{} @@ -62,12 +69,14 @@ func BuildSelectQueryMap( querymap[cfg.Table()] = map[tabledependency.RunType]*sqlmanager_shared.SelectQuery{} } schema, table := splitTable(cfg.Table()) - query, _, isNotForeignKeySafe, err := qb.BuildQuery(schema, table) + query, _, pageQuery, isNotForeignKeySafe, err := qb.BuildQuery(schema, table) if err != nil { return nil, err } querymap[cfg.Table()][cfg.RunType()] = &sqlmanager_shared.SelectQuery{ Query: query, + PageQuery: pageQuery, + PageLimit: pageLimit, IsNotForeignKeySafeSubset: isNotForeignKeySafe, } } diff --git a/worker/pkg/workflows/datasync/activities/gen-benthos-configs/activity.go b/worker/pkg/workflows/datasync/activities/gen-benthos-configs/activity.go index 18c4064741..5ab9a59e20 100644 --- a/worker/pkg/workflows/datasync/activities/gen-benthos-configs/activity.go +++ b/worker/pkg/workflows/datasync/activities/gen-benthos-configs/activity.go @@ -14,7 +14,8 @@ import ( ) type GenerateBenthosConfigsRequest struct { - JobId string + JobId string + JobRunId string } type GenerateBenthosConfigsResponse struct { BenthosConfigs []*benthosbuilder.BenthosConfigResponse @@ -82,7 +83,7 @@ func (a *Activity) GenerateBenthosConfigs( a.connclient, a.transformerclient, req.JobId, - info.WorkflowExecution.ID, + req.JobRunId, info.WorkflowExecution.RunID, a.redisConfig, a.metricsEnabled, diff --git a/worker/pkg/workflows/datasync/activities/gen-benthos-configs/benthos-builder.go b/worker/pkg/workflows/datasync/activities/gen-benthos-configs/benthos-builder.go index c47fcc98b2..1348dc5cd7 100644 --- a/worker/pkg/workflows/datasync/activities/gen-benthos-configs/benthos-builder.go +++ b/worker/pkg/workflows/datasync/activities/gen-benthos-configs/benthos-builder.go @@ -30,9 +30,9 @@ type benthosBuilder struct { connclient mgmtv1alpha1connect.ConnectionServiceClient transformerclient mgmtv1alpha1connect.TransformersServiceClient - jobId string - workflowId string - runId string + jobId string + jobRunId string + runId string redisConfig *neosync_redis.RedisConfig @@ -46,7 +46,7 @@ func newBenthosBuilder( connclient mgmtv1alpha1connect.ConnectionServiceClient, transformerclient mgmtv1alpha1connect.TransformersServiceClient, - jobId, workflowId string, runId string, + jobId, jobRunId string, runId string, redisConfig *neosync_redis.RedisConfig, @@ -58,7 +58,7 @@ func newBenthosBuilder( connclient: connclient, transformerclient: transformerclient, jobId: jobId, - workflowId: workflowId, + jobRunId: jobRunId, runId: runId, redisConfig: redisConfig, metricsEnabled: metricsEnabled, @@ -98,7 +98,7 @@ func (b *benthosBuilder) GenerateBenthosConfigsNew( Job: job, SourceConnection: sourceConnection, DestinationConnections: destConnections, - WorkflowId: wfmetadata.WorkflowId, + JobRunId: b.jobRunId, Logger: slogger, Sqlmanagerclient: b.sqlmanagerclient, Transformerclient: b.transformerclient, @@ -120,6 +120,11 @@ func (b *benthosBuilder) GenerateBenthosConfigsNew( return nil, err } + err = b.setConnectionIdsRunContext(ctx, responses, job.GetAccountId()) + if err != nil { + return nil, fmt.Errorf("unable to set connection ids run context: %w", err) + } + // TODO move run context logic into benthos builder postTableSyncRunCtx := buildPostTableSyncRunCtx(responses, job.Destinations) err = b.setPostTableSyncRunCtx(ctx, postTableSyncRunCtx, job.GetAccountId()) @@ -137,6 +142,39 @@ func (b *benthosBuilder) GenerateBenthosConfigsNew( }, nil } +func (b *benthosBuilder) setConnectionIdsRunContext( + ctx context.Context, + responses []*benthosbuilder.BenthosConfigResponse, + accountId string, +) error { + connectionIds := map[string]struct{}{} + for _, config := range responses { + for _, dsn := range config.BenthosDsns { + connectionIds[dsn.ConnectionId] = struct{}{} + } + } + connectionIdsList := []string{} + for id := range connectionIds { + connectionIdsList = append(connectionIdsList, id) + } + bits, err := json.Marshal(connectionIdsList) + if err != nil { + return fmt.Errorf("failed to marshal connection ids: %w", err) + } + _, err = b.jobclient.SetRunContext(ctx, connect.NewRequest(&mgmtv1alpha1.SetRunContextRequest{ + Id: &mgmtv1alpha1.RunContextKey{ + JobRunId: b.jobRunId, + ExternalId: shared.GetConnectionIdsExternalId(), + AccountId: accountId, + }, + Value: bits, + })) + if err != nil { + return fmt.Errorf("failed to send connection ids run context: %w", err) + } + return nil +} + // this method modifies the input responses by nilling out the benthos config. it returns the same slice for convenience func (b *benthosBuilder) setRunContexts( ctx context.Context, @@ -152,7 +190,7 @@ func (b *benthosBuilder) setRunContexts( } err = rcstream.Send(&mgmtv1alpha1.SetRunContextsRequest{ Id: &mgmtv1alpha1.RunContextKey{ - JobRunId: b.workflowId, + JobRunId: b.jobRunId, ExternalId: shared.GetBenthosConfigExternalId(config.Name), AccountId: accountId, }, @@ -185,7 +223,7 @@ func (b *benthosBuilder) setPostTableSyncRunCtx( } err = rcstream.Send(&mgmtv1alpha1.SetRunContextsRequest{ Id: &mgmtv1alpha1.RunContextKey{ - JobRunId: b.workflowId, + JobRunId: b.jobRunId, ExternalId: shared.GetPostTableSyncConfigExternalId(name), AccountId: accountId, }, diff --git a/worker/pkg/workflows/datasync/activities/shared/shared.go b/worker/pkg/workflows/datasync/activities/shared/shared.go index ea79da00d8..238c6ffcdb 100644 --- a/worker/pkg/workflows/datasync/activities/shared/shared.go +++ b/worker/pkg/workflows/datasync/activities/shared/shared.go @@ -23,12 +23,17 @@ const ( runContext_ExternalId_BenthosConfig = "benthosconfig" runContext_ExternalId_PostTableSyncConfig = "posttablesync" + runContext_ExternalId_ConnectionIds = "tablesync-connectionids" ) func GetBenthosConfigExternalId(identifier string) string { return fmt.Sprintf("%s-%s", runContext_ExternalId_BenthosConfig, identifier) } +func GetConnectionIdsExternalId() string { + return runContext_ExternalId_ConnectionIds +} + func GetPostTableSyncConfigExternalId(identifier string) string { return fmt.Sprintf("%s-%s", runContext_ExternalId_PostTableSyncConfig, identifier) } diff --git a/worker/pkg/workflows/datasync/activities/sync/activity.go b/worker/pkg/workflows/datasync/activities/sync/activity.go deleted file mode 100644 index aefac23511..0000000000 --- a/worker/pkg/workflows/datasync/activities/sync/activity.go +++ /dev/null @@ -1,305 +0,0 @@ -package sync_activity - -import ( - "context" - "fmt" - "sync" - "time" - - "github.com/redpanda-data/benthos/v4/public/bloblang" - - temporallogger "github.com/nucleuscloud/neosync/worker/internal/temporal-logger" - neosync_benthos_mongodb "github.com/nucleuscloud/neosync/worker/pkg/benthos/mongodb" - neosync_benthos_sql "github.com/nucleuscloud/neosync/worker/pkg/benthos/sql" - - _ "github.com/nucleuscloud/neosync/internal/benthos/imports" - - "github.com/nucleuscloud/neosync/backend/pkg/metrics" - benthosbuilder_shared "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/shared" - connectionmanager "github.com/nucleuscloud/neosync/internal/connection-manager" - pool_mongo_provider "github.com/nucleuscloud/neosync/internal/connection-manager/pool/providers/mongo" - pool_sql_provider "github.com/nucleuscloud/neosync/internal/connection-manager/pool/providers/sql" - benthos_environment "github.com/nucleuscloud/neosync/worker/pkg/benthos/environment" - - mgmtv1alpha1 "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1" - "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1/mgmtv1alpha1connect" - "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/shared" - - "connectrpc.com/connect" - "go.opentelemetry.io/otel/metric" - - "go.temporal.io/sdk/activity" - "go.temporal.io/sdk/log" - - "golang.org/x/sync/errgroup" -) - -type SyncMetadata struct { - Schema string - Table string -} - -type SyncRequest struct { - // Deprecated - BenthosConfig string - BenthosDsns []*benthosbuilder_shared.BenthosDsn - // Identifier that is used in combination with the AccountId to retrieve the benthos config - Name string - AccountId string -} -type SyncResponse struct { - Schema string - Table string -} - -func New( - connclient mgmtv1alpha1connect.ConnectionServiceClient, - jobclient mgmtv1alpha1connect.JobServiceClient, - sqlconnmanager connectionmanager.Interface[neosync_benthos_sql.SqlDbtx], - mongoconnmanager connectionmanager.Interface[neosync_benthos_mongodb.MongoClient], - meter metric.Meter, - benthosStreamManager BenthosStreamManagerClient, -) *Activity { - return &Activity{ - connclient: connclient, - jobclient: jobclient, - sqlconnmanager: sqlconnmanager, - mongoconnmanager: mongoconnmanager, - meter: meter, - benthosStreamManager: benthosStreamManager, - } -} - -type Activity struct { - connclient mgmtv1alpha1connect.ConnectionServiceClient - jobclient mgmtv1alpha1connect.JobServiceClient - sqlconnmanager connectionmanager.Interface[neosync_benthos_sql.SqlDbtx] - mongoconnmanager connectionmanager.Interface[neosync_benthos_mongodb.MongoClient] - meter metric.Meter // optional - benthosStreamManager BenthosStreamManagerClient -} - -var ( - // Hack that locks the instanced bento stream builder build step that causes data races if done in parallel - streamBuilderMu sync.Mutex -) - -// Temporal activity that runs benthos and syncs a source connection to one or more destination connections -func (a *Activity) Sync(ctx context.Context, req *SyncRequest, metadata *SyncMetadata) (*SyncResponse, error) { - info := activity.GetInfo(ctx) - session := connectionmanager.NewUniqueSession(connectionmanager.WithSessionGroup(info.WorkflowExecution.ID)) - isRetry := info.Attempt > 1 - loggerKeyVals := []any{ - "metadata", metadata, - "WorkflowID", info.WorkflowExecution.ID, - "RunID", info.WorkflowExecution.RunID, - "activitySession", session.String(), - } - if req.AccountId != "" { - loggerKeyVals = append(loggerKeyVals, "accountId", req.AccountId) - } - logger := log.With(activity.GetLogger(ctx), loggerKeyVals...) - slogger := temporallogger.NewSlogger(logger) - - stopActivityChan := make(chan error, 3) - resultChan := make(chan error, 1) - benthosStreamMutex := sync.Mutex{} - var benthosStream BenthosStreamClient - go func() { - defer func() { - if r := recover(); r != nil { - slogger.Error("recovered from panic in sync activity heartbeat loop: %v", r) - } - }() - for { - select { - case activityErr := <-stopActivityChan: - logger.Info("received stop activity from benthos channel, cleaning up...") - resultChan <- activityErr - benthosStreamMutex.Lock() - if benthosStream != nil { - // this must be here because stream.Run(ctx) doesn't seem to fully obey a canceled context when - // a sink is in an error state. We want to explicitly call stop here because the workflow has been canceled. - err := benthosStream.StopWithin(1 * time.Millisecond) - if err != nil { - logger.Error(err.Error()) - } - } - benthosStreamMutex.Unlock() - return - case <-ctx.Done(): - logger.Info("received context done, cleaning up...") - resultChan <- fmt.Errorf("received context done signal") - - benthosStreamMutex.Lock() - if benthosStream != nil { - // this must be here because stream.Run(ctx) doesn't seem to fully obey a canceled context when - // a sink is in an error state. We want to explicitly call stop here because the workflow has been canceled. - err := benthosStream.StopWithin(1 * time.Millisecond) - if err != nil { - logger.Error(err.Error()) - } - } - benthosStreamMutex.Unlock() - return - case <-time.After(1 * time.Second): - activity.RecordHeartbeat(ctx) - } - } - }() - - var benthosConfig string - if req.AccountId != "" && req.Name != "" { - rcResp, err := a.jobclient.GetRunContext(ctx, connect.NewRequest(&mgmtv1alpha1.GetRunContextRequest{ - Id: &mgmtv1alpha1.RunContextKey{ - JobRunId: info.WorkflowExecution.ID, - ExternalId: shared.GetBenthosConfigExternalId(req.Name), - AccountId: req.AccountId, - }, - })) - if err != nil { - return nil, fmt.Errorf("unable to retrieve benthosconfig runcontext for %s.%s: %w", metadata.Schema, metadata.Table, err) - } - benthosConfig = string(rcResp.Msg.GetValue()) - } else if req.BenthosConfig != "" { - benthosConfig = req.BenthosConfig - } else { - return nil, fmt.Errorf("must provide means to retrieve benthos config either directly or via runcontext") - } - - defer func() { - logger.Debug("releasing session", "session", session.String()) - a.sqlconnmanager.ReleaseSession(session, slogger) - a.mongoconnmanager.ReleaseSession(session, slogger) - }() - - connections, err := getConnectionsFromBenthosDsns(ctx, a.connclient, req.BenthosDsns) - if err != nil { - return nil, err - } - connectionMap := map[string]*mgmtv1alpha1.Connection{} - for _, connection := range connections { - connectionMap[connection.Id] = connection - } - - // todo: add support for gcp cloud storage authentication - - getConnectionById := getConnectionByIdFn(connectionMap) - - benenv, err := benthos_environment.NewEnvironment( - slogger, - benthos_environment.WithMeter(a.meter), - benthos_environment.WithSqlConfig(&benthos_environment.SqlConfig{ - Provider: pool_sql_provider.NewConnectionProvider(a.sqlconnmanager, getConnectionById, session, slogger), - IsRetry: isRetry, - }), - benthos_environment.WithMongoConfig(&benthos_environment.MongoConfig{ - Provider: pool_mongo_provider.NewProvider(a.mongoconnmanager, getConnectionById, session, slogger), - }), - benthos_environment.WithStopChannel(stopActivityChan), - benthos_environment.WithBlobEnv(bloblang.NewEnvironment()), - ) - if err != nil { - return nil, fmt.Errorf("unable to instantiate benthos environment: %w", err) - } - - envKeyMap := map[string]string{} - envKeyMap[metrics.TemporalWorkflowIdEnvKey] = info.WorkflowExecution.ID - envKeyMap[metrics.TemporalRunIdEnvKey] = info.WorkflowExecution.RunID - envKeyMap[metrics.NeosyncDateEnvKey] = time.Now().UTC().Format(metrics.NeosyncDateFormat) - - streamBuilderMu.Lock() - streambldr := benenv.NewStreamBuilder() - streambldr.SetLogger(slogger.With( - "benthos", "true", - )) - - // This must come before SetYaml as otherwise it will not be invoked - streambldr.SetEnvVarLookupFunc(getEnvVarLookupFn(envKeyMap)) - - err = streambldr.SetYAML(benthosConfig) - if err != nil { - streamBuilderMu.Unlock() - return nil, fmt.Errorf("unable to convert benthos config to yaml for stream builder: %w", err) - } - - stream, err := a.benthosStreamManager.NewBenthosStreamFromBuilder(streambldr) - streamBuilderMu.Unlock() - if err != nil { - return nil, fmt.Errorf("unable to build benthos config: %w", err) - } - - benthosStreamMutex.Lock() - benthosStream = stream - benthosStreamMutex.Unlock() - go func() { - defer func() { - if r := recover(); r != nil { - slogger.Error("recovered from panic in benthos stream run: %v", r) - } - }() - err := stream.Run(ctx) - if err != nil { - resultChan <- fmt.Errorf("unable to run benthos stream: %w", err) - return - } - resultChan <- nil - }() - - err = <-resultChan - if err != nil { - return nil, fmt.Errorf("could not successfully complete sync activity: %w", err) - } - benthosStreamMutex.Lock() - benthosStream = nil - benthosStreamMutex.Unlock() - - logger.Info("sync complete") - return &SyncResponse{Schema: metadata.Schema, Table: metadata.Table}, nil -} - -func getConnectionByIdFn(connectionCache map[string]*mgmtv1alpha1.Connection) func(connectionId string) (connectionmanager.ConnectionInput, error) { - return func(connectionId string) (connectionmanager.ConnectionInput, error) { - connection, ok := connectionCache[connectionId] - if !ok { - return nil, fmt.Errorf("unable to find connection by id: %q", connectionId) - } - return connection, nil - } -} - -func getConnectionsFromBenthosDsns( - ctx context.Context, - connclient mgmtv1alpha1connect.ConnectionServiceClient, - dsns []*benthosbuilder_shared.BenthosDsn, -) ([]*mgmtv1alpha1.Connection, error) { - connections := make([]*mgmtv1alpha1.Connection, len(dsns)) - - errgrp, errctx := errgroup.WithContext(ctx) - for idx, bdns := range dsns { - idx := idx - bdns := bdns - errgrp.Go(func() error { - resp, err := connclient.GetConnection(errctx, connect.NewRequest(&mgmtv1alpha1.GetConnectionRequest{Id: bdns.ConnectionId})) - if err != nil { - return fmt.Errorf("failed to retrieve connection: %w", err) - } - connections[idx] = resp.Msg.Connection - return nil - }) - } - if err := errgrp.Wait(); err != nil { - return nil, fmt.Errorf("unable to retrieve all or some connections: %w", err) - } - return connections, nil -} - -func getEnvVarLookupFn(input map[string]string) func(key string) (string, bool) { - return func(key string) (string, bool) { - if input == nil { - return "", false - } - output, ok := input[key] - return output, ok - } -} diff --git a/worker/pkg/workflows/datasync/activities/sync/activity_test.go b/worker/pkg/workflows/datasync/activities/sync/activity_test.go deleted file mode 100644 index 3865d6ad10..0000000000 --- a/worker/pkg/workflows/datasync/activities/sync/activity_test.go +++ /dev/null @@ -1,467 +0,0 @@ -package sync_activity - -import ( - "context" - "errors" - "fmt" - "net/http" - "net/http/httptest" - "os" - "strings" - "testing" - - "connectrpc.com/connect" - "github.com/google/uuid" - mgmtv1alpha1 "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1" - "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1/mgmtv1alpha1connect" - "github.com/nucleuscloud/neosync/backend/pkg/sqlconnect" - connectionmanager "github.com/nucleuscloud/neosync/internal/connection-manager" - "github.com/nucleuscloud/neosync/internal/connection-manager/providers/mongoprovider" - "github.com/nucleuscloud/neosync/internal/connection-manager/providers/sqlprovider" - "github.com/nucleuscloud/neosync/internal/testutil" - "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/shared" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/metric" - metricsdk "go.opentelemetry.io/otel/sdk/metric" - "go.temporal.io/sdk/log" - "go.temporal.io/sdk/testsuite" -) - -func Test_Sync_RunContext_Success(t *testing.T) { - testSuite := &testsuite.WorkflowTestSuite{} - testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) - env := testSuite.NewTestActivityEnvironment() - - benthosStreamManager := NewBenthosStreamManager() - - mux := http.NewServeMux() - benthosConfig := strings.TrimSpace(` -input: - generate: - count: 1 - interval: "" - mapping: 'root = { "id": uuid_v4() }' -output: - label: "" - stdout: - codec: lines -`) - accountId := uuid.NewString() - - mux.Handle(mgmtv1alpha1connect.JobServiceGetRunContextProcedure, connect.NewUnaryHandler( - mgmtv1alpha1connect.JobServiceGetRunContextProcedure, - func(ctx context.Context, r *connect.Request[mgmtv1alpha1.GetRunContextRequest]) (*connect.Response[mgmtv1alpha1.GetRunContextResponse], error) { - if r.Msg.GetId().GetAccountId() == accountId && r.Msg.GetId().GetExternalId() == shared.GetBenthosConfigExternalId("test") { - return connect.NewResponse(&mgmtv1alpha1.GetRunContextResponse{ - Value: []byte(benthosConfig), - }), nil - } - return nil, errors.New("invalid test account id") - }, - )) - srv := startHTTPServer(t, mux) - - jobclient := mgmtv1alpha1connect.NewJobServiceClient(srv.Client(), srv.URL) - connclient := mgmtv1alpha1connect.NewConnectionServiceClient(srv.Client(), srv.URL) - sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) - mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) - var meter metric.Meter - - activity := New(connclient, jobclient, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) - - env.RegisterActivity(activity.Sync) - - val, err := env.ExecuteActivity(activity.Sync, &SyncRequest{ - AccountId: accountId, - Name: "test", - }, &SyncMetadata{Schema: "public", Table: "test"}) - require.NoError(t, err) - res := &SyncResponse{} - err = val.Get(res) - require.NoError(t, err) -} - -func Test_Sync_Run_No_BenthosConfig(t *testing.T) { - testSuite := &testsuite.WorkflowTestSuite{} - testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) - env := testSuite.NewTestActivityEnvironment() - - benthosStreamManager := NewBenthosStreamManager() - - activity := New(nil, nil, nil, nil, nil, benthosStreamManager) - - env.RegisterActivity(activity.Sync) - - val, err := env.ExecuteActivity(activity.Sync, &SyncRequest{}, &SyncMetadata{Schema: "public", Table: "test"}) - require.Error(t, err) - require.Nil(t, val) -} - -func Test_Sync_Run_Success(t *testing.T) { - testSuite := &testsuite.WorkflowTestSuite{} - testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) - env := testSuite.NewTestActivityEnvironment() - - sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) - mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) - var meter metric.Meter - - benthosStreamManager := NewBenthosStreamManager() - activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) - - env.RegisterActivity(activity.Sync) - - val, err := env.ExecuteActivity(activity.Sync, &SyncRequest{ - BenthosConfig: strings.TrimSpace(` -input: - generate: - count: 1 - interval: "" - mapping: 'root = { "id": uuid_v4() }' -output: - label: "" - stdout: - codec: lines -`), - }, &SyncMetadata{Schema: "public", Table: "test"}) - require.NoError(t, err) - res := &SyncResponse{} - err = val.Get(res) - require.NoError(t, err) -} - -func Test_Sync_Run_Metrics_Success(t *testing.T) { - testSuite := &testsuite.WorkflowTestSuite{} - testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) - env := testSuite.NewTestActivityEnvironment() - - meterProvider := metricsdk.NewMeterProvider() - meter := meterProvider.Meter("test") - benthosStreamManager := NewBenthosStreamManager() - sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) - mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) - activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) - - env.RegisterActivity(activity.Sync) - - val, err := env.ExecuteActivity(activity.Sync, &SyncRequest{ - BenthosConfig: strings.TrimSpace(` -input: - generate: - count: 1 - interval: "" - mapping: 'root = { "id": uuid_v4() }' -output: - label: "" - stdout: - codec: lines -metrics: - otel_collector: {} -`), - }, &SyncMetadata{Schema: "public", Table: "test"}) - require.NoError(t, err) - res := &SyncResponse{} - err = val.Get(res) - require.NoError(t, err) -} - -func Test_Sync_Fake_Mutation_Success(t *testing.T) { - testSuite := &testsuite.WorkflowTestSuite{} - testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) - env := testSuite.NewTestActivityEnvironment() - - benthosStreamManager := NewBenthosStreamManager() - sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) - mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) - var meter metric.Meter - activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) - env.RegisterActivity(activity.Sync) - - val, err := env.ExecuteActivity(activity.Sync, &SyncRequest{ - BenthosConfig: strings.TrimSpace(` -input: - generate: - count: 1 - interval: "" - mapping: 'root = { "name": "nick" }' -pipeline: - threads: 1 - processors: - - mutation: | - root.name = generate_first_name() -output: - label: "" - stdout: - codec: lines -`), - }, &SyncMetadata{Schema: "public", Table: "test"}) - require.NoError(t, err) - res := &SyncResponse{} - err = val.Get(res) - require.NoError(t, err) -} - -func Test_Sync_Run_Success_Javascript(t *testing.T) { - testSuite := &testsuite.WorkflowTestSuite{} - testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) - env := testSuite.NewTestActivityEnvironment() - - benthosStreamManager := NewBenthosStreamManager() - sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) - mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) - var meter metric.Meter - - activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) - env.RegisterActivity(activity.Sync) - - tmpFile, err := os.CreateTemp("", "test") - if err != nil { - t.Fatalf("Failed to create temp file: %v", err) - } - defer os.Remove(tmpFile.Name()) - - val, err := env.ExecuteActivity(activity.Sync, &SyncRequest{ - BenthosConfig: strings.TrimSpace(fmt.Sprintf(` -input: - generate: - mapping: root = {"name":"evis"} - interval: 1s - count: 1 -pipeline: - processors: - - neosync_javascript: - code: | - (() => { - function fn_name(value, input){ - var a = value + "test"; - return a }; - const input = benthos.v0_msg_as_structured(); - const output = { ...input }; - output["name"] = fn_name(input["name"], input); - benthos.v0_msg_set_structured(output); - })(); -output: - label: "" - file: - path: %s - codec: lines -`, tmpFile.Name())), - }, &SyncMetadata{Schema: "public", Table: "test"}) - assert.NoError(t, err) - res := &SyncResponse{} - err = val.Get(res) - assert.NoError(t, err) - - stdoutBytes, err := os.ReadFile(tmpFile.Name()) - if err != nil { - t.Fatalf("Failed to read from temp file: %v", err) - } - stringResult := string(stdoutBytes) - - returnValue := strings.TrimSpace(stringResult) // remove new line at the end of the stdout line - - assert.Equal(t, `{"name":"evistest"}`, returnValue) -} - -func Test_Sync_Run_Success_MutataionAndJavascript(t *testing.T) { - testSuite := &testsuite.WorkflowTestSuite{} - testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) - env := testSuite.NewTestActivityEnvironment() - benthosStreamManager := NewBenthosStreamManager() - sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) - mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) - var meter metric.Meter - activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) - env.RegisterActivity(activity.Sync) - - tmpFile, err := os.CreateTemp("", "test") - if err != nil { - t.Fatalf("Failed to create temp file: %v", err) - } - defer os.Remove(tmpFile.Name()) - - val, err := env.ExecuteActivity(activity.Sync, &SyncRequest{ - BenthosConfig: strings.TrimSpace(fmt.Sprintf(` -input: - generate: - mapping: root = {"name":"evis"} - interval: 1s - count: 1 -pipeline: - processors: - - mutation: - root.name = this.name.reverse() - - neosync_javascript: - code: | - (() => { - function fn1(value, input){ - var a = value + "test"; - return a }; - const input = benthos.v0_msg_as_structured(); - const output = { ...input }; - output["name"] = fn1(input["name"], input); - benthos.v0_msg_set_structured(output); - })(); -output: - label: "" - file: - path: %s - codec: lines - `, tmpFile.Name())), - }, &SyncMetadata{Schema: "public", Table: "test"}) - assert.NoError(t, err) - res := &SyncResponse{} - err = val.Get(res) - assert.NoError(t, err) - - stdoutBytes, err := os.ReadFile(tmpFile.Name()) - if err != nil { - t.Fatalf("Failed to read from temp file: %v", err) - } - stringResult := string(stdoutBytes) - - returnValue := strings.TrimSpace(stringResult) // remove new line at the end of the stdout line - - assert.Equal(t, `{"name":"sivetest"}`, returnValue) -} - -func Test_Sync_Run_Processor_Error(t *testing.T) { - testSuite := &testsuite.WorkflowTestSuite{} - testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) - env := testSuite.NewTestActivityEnvironment() - - benthosStreamManager := NewBenthosStreamManager() - sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) - mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) - var meter metric.Meter - activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) - - env.RegisterActivity(activity.Sync) - - _, err := env.ExecuteActivity(activity.Sync, &SyncRequest{ - BenthosConfig: strings.TrimSpace(` -input: - generate: - count: 1000 - interval: "" - mapping: 'root = { "name": "nick" }' -pipeline: - threads: 1 - processors: - - error: - error_msg: ${! error()} -output: - label: "" - stdout: - codec: lines -`), - }, &SyncMetadata{Schema: "public", Table: "test"}) - require.Error(t, err, "error was nil when it should be present") -} - -func Test_Sync_Run_Output_Error(t *testing.T) { - testSuite := &testsuite.WorkflowTestSuite{} - testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) - env := testSuite.NewTestActivityEnvironment() - - mockBenthosStreamManager := NewMockBenthosStreamManagerClient(t) - mockBenthosStream := NewMockBenthosStreamClient(t) - - sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) - mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) - var meter metric.Meter - activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, mockBenthosStreamManager) - - env.RegisterActivity(activity.Sync) - - mockBenthosStreamManager.On("NewBenthosStreamFromBuilder", mock.Anything).Return(mockBenthosStream, nil) - errmsg := "duplicate key value violates unique constraint" - mockBenthosStream.On("Run", mock.Anything).Return(errors.New(errmsg)) - mockBenthosStream.On("StopWithin", mock.Anything).Return(nil).Maybe() - - _, err := env.ExecuteActivity(activity.Sync, &SyncRequest{ - BenthosConfig: strings.TrimSpace(` -input: - generate: - count: 1000 - interval: "" - mapping: 'root = { "name": "nick" }' -pipeline: - threads: 1 - processors: [] -output: - label: "" - error: - error_msg: ${! meta("fallback_error")} -`), - }, &SyncMetadata{Schema: "public", Table: "test"}) - require.Error(t, err, "error was nil when it should be present") - require.Contains(t, err.Error(), "activity error") -} - -func Test_Sync_Run_BenthosError(t *testing.T) { - testSuite := &testsuite.WorkflowTestSuite{} - testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) - env := testSuite.NewTestActivityEnvironment() - - mockBenthosStreamManager := NewMockBenthosStreamManagerClient(t) - mockBenthosStream := NewMockBenthosStreamClient(t) - config := strings.TrimSpace(` -input: - generate: - count: 1000 - interval: "" - mapping: 'root = { "id": uuid_v4() }' -output: - label: "" - stdout: - codec: lines -`) - - mockBenthosStreamManager.On("NewBenthosStreamFromBuilder", mock.Anything).Return(mockBenthosStream, nil) - errmsg := "benthos error" - mockBenthosStream.On("Run", mock.Anything).Return(errors.New(errmsg)) - mockBenthosStream.On("StopWithin", mock.Anything).Return(nil).Maybe() - - sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) - mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) - var meter metric.Meter - - activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, mockBenthosStreamManager) - - env.RegisterActivity(activity.Sync) - _, err := env.ExecuteActivity(activity.Sync, &SyncRequest{ - BenthosConfig: config, - }, &SyncMetadata{Schema: "public", Table: "test"}) - require.Error(t, err) - require.Contains(t, err.Error(), errmsg) -} - -func Test_getEnvVarLookupFn(t *testing.T) { - fn := getEnvVarLookupFn(nil) - assert.NotNil(t, fn) - val, ok := fn("foo") - assert.False(t, ok) - assert.Empty(t, val) - - fn = getEnvVarLookupFn(map[string]string{"foo": "bar"}) - assert.NotNil(t, fn) - val, ok = fn("foo") - assert.True(t, ok) - assert.Equal(t, val, "bar") - - val, ok = fn("bar") - assert.False(t, ok) - assert.Empty(t, val) -} - -func startHTTPServer(tb testing.TB, h http.Handler) *httptest.Server { - tb.Helper() - srv := httptest.NewUnstartedServer(h) - srv.EnableHTTP2 = true - srv.Start() - tb.Cleanup(srv.Close) - return srv -} diff --git a/worker/pkg/workflows/datasync/activities/sync/mock_BenthosStreamClient.go b/worker/pkg/workflows/datasync/activities/sync/mock_BenthosStreamClient.go deleted file mode 100644 index 90b8e1467b..0000000000 --- a/worker/pkg/workflows/datasync/activities/sync/mock_BenthosStreamClient.go +++ /dev/null @@ -1,175 +0,0 @@ -// Code generated by mockery. DO NOT EDIT. - -package sync_activity - -import ( - context "context" - time "time" - - mock "github.com/stretchr/testify/mock" -) - -// MockBenthosStreamClient is an autogenerated mock type for the BenthosStreamClient type -type MockBenthosStreamClient struct { - mock.Mock -} - -type MockBenthosStreamClient_Expecter struct { - mock *mock.Mock -} - -func (_m *MockBenthosStreamClient) EXPECT() *MockBenthosStreamClient_Expecter { - return &MockBenthosStreamClient_Expecter{mock: &_m.Mock} -} - -// Run provides a mock function with given fields: ctx -func (_m *MockBenthosStreamClient) Run(ctx context.Context) error { - ret := _m.Called(ctx) - - if len(ret) == 0 { - panic("no return value specified for Run") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context) error); ok { - r0 = rf(ctx) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// MockBenthosStreamClient_Run_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Run' -type MockBenthosStreamClient_Run_Call struct { - *mock.Call -} - -// Run is a helper method to define mock.On call -// - ctx context.Context -func (_e *MockBenthosStreamClient_Expecter) Run(ctx interface{}) *MockBenthosStreamClient_Run_Call { - return &MockBenthosStreamClient_Run_Call{Call: _e.mock.On("Run", ctx)} -} - -func (_c *MockBenthosStreamClient_Run_Call) Run(run func(ctx context.Context)) *MockBenthosStreamClient_Run_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context)) - }) - return _c -} - -func (_c *MockBenthosStreamClient_Run_Call) Return(_a0 error) *MockBenthosStreamClient_Run_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockBenthosStreamClient_Run_Call) RunAndReturn(run func(context.Context) error) *MockBenthosStreamClient_Run_Call { - _c.Call.Return(run) - return _c -} - -// Stop provides a mock function with given fields: ctx -func (_m *MockBenthosStreamClient) Stop(ctx context.Context) error { - ret := _m.Called(ctx) - - if len(ret) == 0 { - panic("no return value specified for Stop") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context) error); ok { - r0 = rf(ctx) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// MockBenthosStreamClient_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop' -type MockBenthosStreamClient_Stop_Call struct { - *mock.Call -} - -// Stop is a helper method to define mock.On call -// - ctx context.Context -func (_e *MockBenthosStreamClient_Expecter) Stop(ctx interface{}) *MockBenthosStreamClient_Stop_Call { - return &MockBenthosStreamClient_Stop_Call{Call: _e.mock.On("Stop", ctx)} -} - -func (_c *MockBenthosStreamClient_Stop_Call) Run(run func(ctx context.Context)) *MockBenthosStreamClient_Stop_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context)) - }) - return _c -} - -func (_c *MockBenthosStreamClient_Stop_Call) Return(_a0 error) *MockBenthosStreamClient_Stop_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockBenthosStreamClient_Stop_Call) RunAndReturn(run func(context.Context) error) *MockBenthosStreamClient_Stop_Call { - _c.Call.Return(run) - return _c -} - -// StopWithin provides a mock function with given fields: d -func (_m *MockBenthosStreamClient) StopWithin(d time.Duration) error { - ret := _m.Called(d) - - if len(ret) == 0 { - panic("no return value specified for StopWithin") - } - - var r0 error - if rf, ok := ret.Get(0).(func(time.Duration) error); ok { - r0 = rf(d) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// MockBenthosStreamClient_StopWithin_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'StopWithin' -type MockBenthosStreamClient_StopWithin_Call struct { - *mock.Call -} - -// StopWithin is a helper method to define mock.On call -// - d time.Duration -func (_e *MockBenthosStreamClient_Expecter) StopWithin(d interface{}) *MockBenthosStreamClient_StopWithin_Call { - return &MockBenthosStreamClient_StopWithin_Call{Call: _e.mock.On("StopWithin", d)} -} - -func (_c *MockBenthosStreamClient_StopWithin_Call) Run(run func(d time.Duration)) *MockBenthosStreamClient_StopWithin_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(time.Duration)) - }) - return _c -} - -func (_c *MockBenthosStreamClient_StopWithin_Call) Return(_a0 error) *MockBenthosStreamClient_StopWithin_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockBenthosStreamClient_StopWithin_Call) RunAndReturn(run func(time.Duration) error) *MockBenthosStreamClient_StopWithin_Call { - _c.Call.Return(run) - return _c -} - -// NewMockBenthosStreamClient creates a new instance of MockBenthosStreamClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewMockBenthosStreamClient(t interface { - mock.TestingT - Cleanup(func()) -}) *MockBenthosStreamClient { - mock := &MockBenthosStreamClient{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/worker/pkg/workflows/datasync/activities/sync/mock_BenthosStreamManagerClient.go b/worker/pkg/workflows/datasync/activities/sync/mock_BenthosStreamManagerClient.go deleted file mode 100644 index 517422d97f..0000000000 --- a/worker/pkg/workflows/datasync/activities/sync/mock_BenthosStreamManagerClient.go +++ /dev/null @@ -1,93 +0,0 @@ -// Code generated by mockery. DO NOT EDIT. - -package sync_activity - -import ( - service "github.com/redpanda-data/benthos/v4/public/service" - mock "github.com/stretchr/testify/mock" -) - -// MockBenthosStreamManagerClient is an autogenerated mock type for the BenthosStreamManagerClient type -type MockBenthosStreamManagerClient struct { - mock.Mock -} - -type MockBenthosStreamManagerClient_Expecter struct { - mock *mock.Mock -} - -func (_m *MockBenthosStreamManagerClient) EXPECT() *MockBenthosStreamManagerClient_Expecter { - return &MockBenthosStreamManagerClient_Expecter{mock: &_m.Mock} -} - -// NewBenthosStreamFromBuilder provides a mock function with given fields: streambldr -func (_m *MockBenthosStreamManagerClient) NewBenthosStreamFromBuilder(streambldr *service.StreamBuilder) (BenthosStreamClient, error) { - ret := _m.Called(streambldr) - - if len(ret) == 0 { - panic("no return value specified for NewBenthosStreamFromBuilder") - } - - var r0 BenthosStreamClient - var r1 error - if rf, ok := ret.Get(0).(func(*service.StreamBuilder) (BenthosStreamClient, error)); ok { - return rf(streambldr) - } - if rf, ok := ret.Get(0).(func(*service.StreamBuilder) BenthosStreamClient); ok { - r0 = rf(streambldr) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(BenthosStreamClient) - } - } - - if rf, ok := ret.Get(1).(func(*service.StreamBuilder) error); ok { - r1 = rf(streambldr) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockBenthosStreamManagerClient_NewBenthosStreamFromBuilder_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewBenthosStreamFromBuilder' -type MockBenthosStreamManagerClient_NewBenthosStreamFromBuilder_Call struct { - *mock.Call -} - -// NewBenthosStreamFromBuilder is a helper method to define mock.On call -// - streambldr *service.StreamBuilder -func (_e *MockBenthosStreamManagerClient_Expecter) NewBenthosStreamFromBuilder(streambldr interface{}) *MockBenthosStreamManagerClient_NewBenthosStreamFromBuilder_Call { - return &MockBenthosStreamManagerClient_NewBenthosStreamFromBuilder_Call{Call: _e.mock.On("NewBenthosStreamFromBuilder", streambldr)} -} - -func (_c *MockBenthosStreamManagerClient_NewBenthosStreamFromBuilder_Call) Run(run func(streambldr *service.StreamBuilder)) *MockBenthosStreamManagerClient_NewBenthosStreamFromBuilder_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*service.StreamBuilder)) - }) - return _c -} - -func (_c *MockBenthosStreamManagerClient_NewBenthosStreamFromBuilder_Call) Return(_a0 BenthosStreamClient, _a1 error) *MockBenthosStreamManagerClient_NewBenthosStreamFromBuilder_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *MockBenthosStreamManagerClient_NewBenthosStreamFromBuilder_Call) RunAndReturn(run func(*service.StreamBuilder) (BenthosStreamClient, error)) *MockBenthosStreamManagerClient_NewBenthosStreamFromBuilder_Call { - _c.Call.Return(run) - return _c -} - -// NewMockBenthosStreamManagerClient creates a new instance of MockBenthosStreamManagerClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewMockBenthosStreamManagerClient(t interface { - mock.TestingT - Cleanup(func()) -}) *MockBenthosStreamManagerClient { - mock := &MockBenthosStreamManagerClient{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/worker/pkg/workflows/datasync/workflow/workflow.go b/worker/pkg/workflows/datasync/workflow/workflow.go index 86e7dc8604..8edb4cde19 100644 --- a/worker/pkg/workflows/datasync/workflow/workflow.go +++ b/worker/pkg/workflows/datasync/workflow/workflow.go @@ -4,7 +4,9 @@ import ( "context" "errors" "fmt" + "regexp" "slices" + "strings" "sync" "time" @@ -17,15 +19,15 @@ import ( jobhooks_by_timing_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/jobhooks-by-timing" posttablesync_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/post-table-sync" runsqlinittablestmts_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/run-sql-init-table-stmts" - sync_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/sync" syncactivityopts_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/sync-activity-opts" syncrediscleanup_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/sync-redis-clean-up" + sync_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/tablesync/activities/sync" + tablesync_workflow "github.com/nucleuscloud/neosync/worker/pkg/workflows/tablesync/workflow" "github.com/spf13/viper" "go.temporal.io/sdk/log" "go.temporal.io/sdk/temporal" "go.temporal.io/sdk/workflow" - "gopkg.in/yaml.v3" ) type WorkflowRequest struct { @@ -109,6 +111,7 @@ func Workflow(wfctx workflow.Context, req *WorkflowRequest) (*WorkflowResponse, return nil, fmt.Errorf("halting job run due to account in invalid state. Reason: %q: %w", reason, invalidAccountStatusError) } + info := workflow.GetInfo(ctx) var bcResp *genbenthosconfigs_activity.GenerateBenthosConfigsResponse logger.Info("scheduling GenerateBenthosConfigs for execution.") var genbenthosactivity *genbenthosconfigs_activity.Activity @@ -116,7 +119,8 @@ func Workflow(wfctx workflow.Context, req *WorkflowRequest) (*WorkflowResponse, withGenerateBenthosConfigsActivityOptions(ctx), genbenthosactivity.GenerateBenthosConfigs, &genbenthosconfigs_activity.GenerateBenthosConfigsRequest{ - JobId: req.JobId, + JobId: req.JobId, + JobRunId: info.WorkflowExecution.ID, }). Get(ctx, &bcResp) if err != nil { @@ -238,8 +242,8 @@ func Workflow(wfctx workflow.Context, req *WorkflowRequest) (*WorkflowResponse, future := invokeSync(bc, ctx, &started, &completed, logger, &bcResp.AccountId, actOptResp.SyncActivityOptions) inFlight++ workselector.AddFuture(future, func(f workflow.Future) { - var result sync_activity.SyncResponse - err := f.Get(ctx, &result) + var wfResult tablesync_workflow.TableSyncResponse + err := f.Get(ctx, &wfResult) inFlight-- completedCount++ if err != nil { @@ -513,45 +517,63 @@ func invokeSync( accountId *string, syncActivityOptions *workflow.ActivityOptions, ) workflow.Future { + info := workflow.GetInfo(ctx) metadata := getSyncMetadata(config) + _ = metadata future, settable := workflow.NewFuture(ctx) logger.Debug("triggering config sync") started.Store(config.Name, struct{}{}) workflow.GoNamed(ctx, config.Name, func(ctx workflow.Context) { - var benthosConfig string var accId string if accountId != nil && *accountId != "" { accId = *accountId - } else if config.Config != nil { - configbits, err := yaml.Marshal(config.Config) - if err != nil { - logger.Error("unable to marshal benthos config", "err", err) - settable.SetError(fmt.Errorf("unable to marshal benthos config: %w", err)) - return - } - benthosConfig = string(configbits) } - logger.Info("scheduling Sync for execution.") - var result sync_activity.SyncResponse - activity := sync_activity.Activity{} - err := workflow.ExecuteActivity( - workflow.WithActivityOptions(ctx, *syncActivityOptions), - activity.Sync, - &sync_activity.SyncRequest{BenthosConfig: benthosConfig, AccountId: accId, Name: config.Name, BenthosDsns: config.BenthosDsns}, metadata).Get(ctx, &result) + tsWf := &tablesync_workflow.Workflow{} + var wfResult tablesync_workflow.TableSyncResponse + + err := workflow.ExecuteChildWorkflow(workflow.WithChildOptions(ctx, workflow.ChildWorkflowOptions{ + WorkflowID: getChildWorkflowId(info.WorkflowExecution.ID, config.Name, workflow.Now(ctx)), + StaticSummary: fmt.Sprintf("Syncing %s.%s", config.TableSchema, config.TableName), + RetryPolicy: &temporal.RetryPolicy{ + MaximumAttempts: 1, + }, + }), tsWf.TableSync, &tablesync_workflow.TableSyncRequest{ + AccountId: accId, + Id: config.Name, + SyncActivityOptions: syncActivityOptions, + ContinuationToken: nil, + JobRunId: info.WorkflowExecution.ID, + TableSchema: config.TableSchema, + TableName: config.TableName, + }).Get(ctx, &wfResult) if err == nil { tn := neosync_benthos.BuildBenthosTable(config.TableSchema, config.TableName) err = updateCompletedMap(tn, completed, config.Columns) if err != nil { - settable.Set(result, err) + settable.Set(wfResult, err) } } - settable.Set(result, err) + settable.Set(wfResult, err) }) return future } +func getChildWorkflowId(jobRunId, configName string, now time.Time) string { + id := fmt.Sprintf("%s-%s-%d", jobRunId, sanitizeWorkflowID(strings.ToLower(configName)), now.UnixNano()) + if len(id) > 1000 { + id = id[:1000] + } + return id +} + +var invalidWorkflowIDChars = regexp.MustCompile(`[^a-zA-Z0-9_\-]`) + +func sanitizeWorkflowID(id string) string { + return invalidWorkflowIDChars.ReplaceAllString(id, "_") +} + func updateCompletedMap(tableName string, completed *sync.Map, columns []string) error { val, loaded := completed.Load(tableName) if loaded { diff --git a/worker/pkg/workflows/tablesync/activities/sync/activity.go b/worker/pkg/workflows/tablesync/activities/sync/activity.go new file mode 100644 index 0000000000..95d8e75506 --- /dev/null +++ b/worker/pkg/workflows/tablesync/activities/sync/activity.go @@ -0,0 +1,464 @@ +package sync_activity + +import ( + "context" + "encoding/json" + "fmt" + "iter" + "log/slog" + "maps" + "time" + + "connectrpc.com/connect" + mgmtv1alpha1 "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1" + "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1/mgmtv1alpha1connect" + "github.com/nucleuscloud/neosync/backend/pkg/metrics" + benthosstream "github.com/nucleuscloud/neosync/internal/benthos-stream" + connectionmanager "github.com/nucleuscloud/neosync/internal/connection-manager" + pool_mongo_provider "github.com/nucleuscloud/neosync/internal/connection-manager/pool/providers/mongo" + pool_sql_provider "github.com/nucleuscloud/neosync/internal/connection-manager/pool/providers/sql" + continuation_token "github.com/nucleuscloud/neosync/internal/continuation-token" + temporallogger "github.com/nucleuscloud/neosync/worker/internal/temporal-logger" + benthos_environment "github.com/nucleuscloud/neosync/worker/pkg/benthos/environment" + neosync_benthos_mongodb "github.com/nucleuscloud/neosync/worker/pkg/benthos/mongodb" + neosync_benthos_sql "github.com/nucleuscloud/neosync/worker/pkg/benthos/sql" + "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/shared" + "github.com/redpanda-data/benthos/v4/public/bloblang" + "github.com/redpanda-data/benthos/v4/public/service" + "go.opentelemetry.io/otel/metric" + "go.temporal.io/sdk/activity" + "go.temporal.io/sdk/log" + "golang.org/x/sync/errgroup" + + benthosbuilder_shared "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/shared" + _ "github.com/nucleuscloud/neosync/internal/benthos/imports" +) + +type Activity struct { + connclient mgmtv1alpha1connect.ConnectionServiceClient + jobclient mgmtv1alpha1connect.JobServiceClient + sqlconnmanager connectionmanager.Interface[neosync_benthos_sql.SqlDbtx] + mongoconnmanager connectionmanager.Interface[neosync_benthos_mongodb.MongoClient] + meter metric.Meter // optional + benthosStreamManager benthosstream.BenthosStreamManagerClient +} + +func New( + connclient mgmtv1alpha1connect.ConnectionServiceClient, + jobclient mgmtv1alpha1connect.JobServiceClient, + sqlconnmanager connectionmanager.Interface[neosync_benthos_sql.SqlDbtx], + mongoconnmanager connectionmanager.Interface[neosync_benthos_mongodb.MongoClient], + meter metric.Meter, + benthosStreamManager benthosstream.BenthosStreamManagerClient, +) *Activity { + return &Activity{ + connclient: connclient, + jobclient: jobclient, + sqlconnmanager: sqlconnmanager, + mongoconnmanager: mongoconnmanager, + meter: meter, + benthosStreamManager: benthosStreamManager, + } +} + +type SyncTableRequest struct { + Id string + AccountId string + JobRunId string + + ContinuationToken *string +} + +type SyncTableResponse struct { + ContinuationToken *string +} + +type SyncMetadata struct { + Schema string + Table string +} + +type SyncRequest struct { + // Deprecated + BenthosConfig string + BenthosDsns []*benthosbuilder_shared.BenthosDsn + // Identifier that is used in combination with the AccountId to retrieve the benthos config + Name string + AccountId string +} + +type SyncResponse struct { + Schema string + Table string +} + +// Deprecated +func (a *Activity) Sync(ctx context.Context, req *SyncRequest, metadata *SyncMetadata) (*SyncResponse, error) { + info := activity.GetInfo(ctx) + + _, err := a.SyncTable(ctx, &SyncTableRequest{ + Id: req.Name, + AccountId: req.AccountId, + JobRunId: info.WorkflowExecution.ID, + }, metadata) + if err != nil { + return nil, err + } + + return &SyncResponse{ + Schema: metadata.Schema, + Table: metadata.Table, + }, nil +} + +func (a *Activity) SyncTable(ctx context.Context, req *SyncTableRequest, metadata *SyncMetadata) (*SyncTableResponse, error) { + info := activity.GetInfo(ctx) + + session := connectionmanager.NewUniqueSession(connectionmanager.WithSessionGroup(req.JobRunId)) + loggerKeyVals := []any{ + "metadata", metadata, + "JobRunId", req.JobRunId, + "WorkflowID", info.WorkflowExecution.ID, + "RunID", info.WorkflowExecution.RunID, + "activitySession", session.String(), + "accountId", req.AccountId, + "hasContinuationToken", req.ContinuationToken != nil, + "id", req.Id, + } + logger := temporallogger.NewSlogger( + log.With( + activity.GetLogger(ctx), + loggerKeyVals..., + ), + ) + + stopActivityChan := make(chan error, 3) + syncResultChan := make(chan error, 1) + + var benthosStream benthosstream.BenthosStreamClient + + go monitorActivityHeartbeat(ctx, stopActivityChan, func(logMessage string, err error) { + handleStreamStop(benthosStream, syncResultChan, err, logMessage, logger) + }, logger) + + benthosConfig, err := a.getBenthosConfig(ctx, &mgmtv1alpha1.RunContextKey{ + JobRunId: req.JobRunId, + ExternalId: shared.GetBenthosConfigExternalId(req.Id), + AccountId: req.AccountId, + }, metadata) + if err != nil { + return nil, err + } + + defer func() { + logger.Debug("releasing session", "session", session.String()) + a.sqlconnmanager.ReleaseSession(session, logger) + a.mongoconnmanager.ReleaseSession(session, logger) + }() + + getConnectionById, err := a.getConnectionByIdFn(ctx, &mgmtv1alpha1.RunContextKey{ + JobRunId: req.JobRunId, + ExternalId: shared.GetConnectionIdsExternalId(), + AccountId: req.AccountId, + }, metadata) + if err != nil { + return nil, err + } + + var continuationTokenToReturn *string + hasMorePages := func(lastReadOrderValues []any) { + token := continuation_token.NewFromContents(continuation_token.NewContents(lastReadOrderValues)) + tokenStr := token.String() + continuationTokenToReturn = &tokenStr + } + + var continuationToken *continuation_token.ContinuationToken + if req.ContinuationToken != nil { + continuationToken, err = continuation_token.FromTokenString(*req.ContinuationToken) + if err != nil { + return nil, fmt.Errorf("unable to load continuation token: %w", err) + } + } + + bstream, err := a.getBenthosStream( + &info, + benthosConfig, + session, + stopActivityChan, + getConnectionById, + hasMorePages, + continuationToken, + logger, + ) + if err != nil { + return nil, fmt.Errorf("unable to get benthos stream: %w", err) + } + + benthosStream = bstream + + go runStream(benthosStream, ctx, syncResultChan, logger) + + err = <-syncResultChan + if err != nil { + return nil, fmt.Errorf("could not successfully complete sync activity: %w", err) + } + + logger.Info("sync complete") + return &SyncTableResponse{ + ContinuationToken: continuationTokenToReturn, + }, nil +} + +func (a *Activity) getConnectionByIdFn( + ctx context.Context, + rcKey *mgmtv1alpha1.RunContextKey, + metadata *SyncMetadata, +) (func(connectionId string) (connectionmanager.ConnectionInput, error), error) { + connectionIds, err := a.getConnectionIds(ctx, rcKey, metadata) + if err != nil { + return nil, err + } + + connections, err := a.getConnectionsFromConnectionIds(ctx, connectionIds) + if err != nil { + return nil, err + } + + return getConnectionByIdFn(maps.Collect(getDtoSeq(connections))), nil +} + +func monitorActivityHeartbeat( + ctx context.Context, + stopActivityChan <-chan error, + handleStreamStop func(logMessage string, err error), + logger *slog.Logger, +) { + defer func() { + if r := recover(); r != nil { + logger.Error("recovered from panic in sync activity heartbeat loop: %v", r) + } + }() + + heartbeatTicker := time.NewTicker(10 * time.Second) + defer heartbeatTicker.Stop() + + for { + select { + case activityErr := <-stopActivityChan: + handleStreamStop("received stop activity from benthos channel", activityErr) + return + + case <-ctx.Done(): + handleStreamStop("received context done signal", ctx.Err()) + return + + case <-heartbeatTicker.C: + activity.RecordHeartbeat(ctx) + } + } +} + +func handleStreamStop( + benthosStream benthosstream.BenthosStreamClient, + syncResultChan chan<- error, + err error, + logMessage string, + logger log.Logger, +) { + logger.Info(logMessage + ", cleaning up...") + syncResultChan <- err + + if benthosStream != nil { + // Stop stream explicitly since stream.Run(ctx) doesn't fully obey canceled context when sink is in error state + if stopErr := benthosStream.StopWithin(1 * time.Millisecond); stopErr != nil { + logger.Error(stopErr.Error()) + } + } +} + +func runStream( + stream benthosstream.BenthosStreamClient, + ctx context.Context, + syncResultChan chan<- error, + logger *slog.Logger, +) { + defer func() { + if r := recover(); r != nil { + err := fmt.Errorf("panic in benthos stream: %v", r) + logger.Error("recovered from panic", "error", err) + syncResultChan <- err // Send panic as error to channel + } + }() + if err := stream.Run(ctx); err != nil { + err = fmt.Errorf("unable to run benthos stream: %w", err) + logger.Error("stream run failed", "error", err) + syncResultChan <- err + return + } + + logger.Debug("stream completed successfully") + syncResultChan <- nil +} + +func (a *Activity) getBenthosStream( + info *activity.Info, + benthosConfig string, + session connectionmanager.SessionInterface, + stopActivityChan chan error, + getConnectionById func(connectionId string) (connectionmanager.ConnectionInput, error), + hasMorePages neosync_benthos_sql.OnHasMorePagesFn, + continuationToken *continuation_token.ContinuationToken, + logger *slog.Logger, +) (benthosstream.BenthosStreamClient, error) { + benenv, err := a.getBenthosEnvironment(logger, info.Attempt > 1, getConnectionById, session, stopActivityChan, hasMorePages, continuationToken) + if err != nil { + return nil, err + } + + envKeyMap := map[string]string{} + envKeyMap[metrics.TemporalWorkflowIdEnvKey] = info.WorkflowExecution.ID + envKeyMap[metrics.TemporalRunIdEnvKey] = info.WorkflowExecution.RunID + envKeyMap[metrics.NeosyncDateEnvKey] = time.Now().UTC().Format(metrics.NeosyncDateFormat) + + streambldr := benenv.NewStreamBuilder() + streambldr.SetLogger(logger.With( + "benthos", "true", + )) + + // This must come before SetYaml as otherwise it will not be invoked + streambldr.SetEnvVarLookupFunc(getEnvVarLookupFn(envKeyMap)) + + err = streambldr.SetYAML(benthosConfig) + if err != nil { + return nil, fmt.Errorf("unable to convert benthos config to yaml for stream builder: %w", err) + } + + stream, err := a.benthosStreamManager.NewBenthosStreamFromBuilder(streambldr) + if err != nil { + return nil, fmt.Errorf("unable to build benthos config: %w", err) + } + + return stream, nil +} + +func (a *Activity) getBenthosEnvironment( + logger *slog.Logger, + isRetry bool, + getConnectionById func(connectionId string) (connectionmanager.ConnectionInput, error), + session connectionmanager.SessionInterface, + stopActivityChan chan error, + hasMorePages neosync_benthos_sql.OnHasMorePagesFn, + continuationToken *continuation_token.ContinuationToken, +) (*service.Environment, error) { + benenv, err := benthos_environment.NewEnvironment( + logger, + benthos_environment.WithMeter(a.meter), + benthos_environment.WithSqlConfig(&benthos_environment.SqlConfig{ + Provider: pool_sql_provider.NewConnectionProvider(a.sqlconnmanager, getConnectionById, session, logger), + IsRetry: isRetry, + InputHasMorePages: hasMorePages, + InputContinuationToken: continuationToken, + }), + benthos_environment.WithMongoConfig(&benthos_environment.MongoConfig{ + Provider: pool_mongo_provider.NewProvider(a.mongoconnmanager, getConnectionById, session, logger), + }), + benthos_environment.WithStopChannel(stopActivityChan), + benthos_environment.WithBlobEnv(bloblang.NewEnvironment()), + ) + if err != nil { + return nil, fmt.Errorf("unable to instantiate benthos environment: %w", err) + } + return benenv, nil +} + +type DtoSeq interface { + GetId() string +} + +func getDtoSeq[T DtoSeq](dtos []T) iter.Seq2[string, T] { + return func(yield func(string, T) bool) { + for _, dto := range dtos { + if !yield(dto.GetId(), dto) { + return + } + } + } +} + +func (a *Activity) getBenthosConfig( + ctx context.Context, + req *mgmtv1alpha1.RunContextKey, + metadata *SyncMetadata, +) (string, error) { + rcResp, err := a.jobclient.GetRunContext(ctx, connect.NewRequest(&mgmtv1alpha1.GetRunContextRequest{ + Id: req, + })) + if err != nil { + return "", fmt.Errorf("unable to retrieve benthosconfig runcontext for %s.%s: %w", metadata.Schema, metadata.Table, err) + } + return string(rcResp.Msg.GetValue()), nil +} + +func (a *Activity) getConnectionIds( + ctx context.Context, + req *mgmtv1alpha1.RunContextKey, + metadata *SyncMetadata, +) ([]string, error) { + rcResp, err := a.jobclient.GetRunContext(ctx, connect.NewRequest(&mgmtv1alpha1.GetRunContextRequest{ + Id: req, + })) + if err != nil { + return nil, fmt.Errorf("unable to retrieve connection ids runcontext for %s.%s: %w", metadata.Schema, metadata.Table, err) + } + var connectionIds []string + err = json.Unmarshal(rcResp.Msg.GetValue(), &connectionIds) + if err != nil { + return nil, fmt.Errorf("unable to unmarshal connection ids: %w", err) + } + return connectionIds, nil +} + +func (a *Activity) getConnectionsFromConnectionIds( + ctx context.Context, + connectionIds []string, +) ([]*mgmtv1alpha1.Connection, error) { + connections := make([]*mgmtv1alpha1.Connection, len(connectionIds)) + + errgrp, errctx := errgroup.WithContext(ctx) + for idx, connectionId := range connectionIds { + idx := idx + connectionId := connectionId + errgrp.Go(func() error { + resp, err := a.connclient.GetConnection(errctx, connect.NewRequest(&mgmtv1alpha1.GetConnectionRequest{Id: connectionId})) + if err != nil { + return fmt.Errorf("failed to retrieve connection: %w", err) + } + connections[idx] = resp.Msg.Connection + return nil + }) + } + if err := errgrp.Wait(); err != nil { + return nil, fmt.Errorf("unable to retrieve all or some connections: %w", err) + } + return connections, nil +} + +func getConnectionByIdFn(connectionCache map[string]*mgmtv1alpha1.Connection) func(connectionId string) (connectionmanager.ConnectionInput, error) { + return func(connectionId string) (connectionmanager.ConnectionInput, error) { + connection, ok := connectionCache[connectionId] + if !ok { + return nil, fmt.Errorf("unable to find connection by id: %q", connectionId) + } + return connection, nil + } +} + +func getEnvVarLookupFn(input map[string]string) func(key string) (string, bool) { + return func(key string) (string, bool) { + if input == nil { + return "", false + } + output, ok := input[key] + return output, ok + } +} diff --git a/worker/pkg/workflows/tablesync/activities/sync/activity_test.go b/worker/pkg/workflows/tablesync/activities/sync/activity_test.go new file mode 100644 index 0000000000..735adb1c8d --- /dev/null +++ b/worker/pkg/workflows/tablesync/activities/sync/activity_test.go @@ -0,0 +1,469 @@ +package sync_activity + +// import ( +// "context" +// "errors" +// "fmt" +// "net/http" +// "net/http/httptest" +// "os" +// "strings" +// "testing" + +// "connectrpc.com/connect" +// "github.com/google/uuid" +// mgmtv1alpha1 "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1" +// "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1/mgmtv1alpha1connect" +// "github.com/nucleuscloud/neosync/backend/pkg/sqlconnect" +// connectionmanager "github.com/nucleuscloud/neosync/internal/connection-manager" +// "github.com/nucleuscloud/neosync/internal/connection-manager/providers/mongoprovider" +// "github.com/nucleuscloud/neosync/internal/connection-manager/providers/sqlprovider" +// "github.com/nucleuscloud/neosync/internal/testutil" +// benthosstream "github.com/nucleuscloud/neosync/worker/internal/benthos-stream" +// "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/shared" +// "github.com/stretchr/testify/assert" +// "github.com/stretchr/testify/mock" +// "github.com/stretchr/testify/require" +// "go.opentelemetry.io/otel/metric" +// metricsdk "go.opentelemetry.io/otel/sdk/metric" +// "go.temporal.io/sdk/log" +// "go.temporal.io/sdk/testsuite" +// ) + +// func Test_Sync_RunContext_Success(t *testing.T) { +// testSuite := &testsuite.WorkflowTestSuite{} +// testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) +// env := testSuite.NewTestActivityEnvironment() + +// benthosStreamManager := benthosstream.NewBenthosStreamManager() + +// mux := http.NewServeMux() +// benthosConfig := strings.TrimSpace(` +// input: +// generate: +// count: 1 +// interval: "" +// mapping: 'root = { "id": uuid_v4() }' +// output: +// label: "" +// stdout: +// codec: lines +// `) +// accountId := uuid.NewString() + +// mux.Handle(mgmtv1alpha1connect.JobServiceGetRunContextProcedure, connect.NewUnaryHandler( +// mgmtv1alpha1connect.JobServiceGetRunContextProcedure, +// func(ctx context.Context, r *connect.Request[mgmtv1alpha1.GetRunContextRequest]) (*connect.Response[mgmtv1alpha1.GetRunContextResponse], error) { +// if r.Msg.GetId().GetAccountId() == accountId && r.Msg.GetId().GetExternalId() == shared.GetBenthosConfigExternalId("test") { +// return connect.NewResponse(&mgmtv1alpha1.GetRunContextResponse{ +// Value: []byte(benthosConfig), +// }), nil +// } +// return nil, errors.New("invalid test account id") +// }, +// )) +// srv := startHTTPServer(t, mux) + +// jobclient := mgmtv1alpha1connect.NewJobServiceClient(srv.Client(), srv.URL) +// connclient := mgmtv1alpha1connect.NewConnectionServiceClient(srv.Client(), srv.URL) +// sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) +// mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) +// var meter metric.Meter + +// activity := New(connclient, jobclient, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) + +// env.RegisterActivity(activity.SyncTable) + +// val, err := env.ExecuteActivity(activity.SyncTable, &SyncRequest{ +// AccountId: accountId, +// Id: "test", +// JobRunId: "test", +// }, &SyncMetadata{Schema: "public", Table: "test"}) +// require.NoError(t, err) +// res := &SyncResponse{} +// err = val.Get(res) +// require.NoError(t, err) +// } + +// func Test_Sync_Run_No_BenthosConfig(t *testing.T) { +// testSuite := &testsuite.WorkflowTestSuite{} +// testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) +// env := testSuite.NewTestActivityEnvironment() + +// benthosStreamManager := benthosstream.NewBenthosStreamManager() + +// activity := New(nil, nil, nil, nil, nil, benthosStreamManager) + +// env.RegisterActivity(activity.SyncTable) + +// val, err := env.ExecuteActivity(activity.SyncTable, &SyncRequest{}, &SyncMetadata{Schema: "public", Table: "test"}) +// require.Error(t, err) +// require.Nil(t, val) +// } + +// func Test_Sync_Run_Success(t *testing.T) { +// testSuite := &testsuite.WorkflowTestSuite{} +// testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) +// env := testSuite.NewTestActivityEnvironment() + +// sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) +// mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) +// var meter metric.Meter + +// benthosStreamManager := benthosstream.NewBenthosStreamManager() +// activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) + +// env.RegisterActivity(activity.SyncTable) + +// val, err := env.ExecuteActivity(activity.SyncTable, &SyncRequest{ +// BenthosConfig: strings.TrimSpace(` +// input: +// generate: +// count: 1 +// interval: "" +// mapping: 'root = { "id": uuid_v4() }' +// output: +// label: "" +// stdout: +// codec: lines +// `), +// }, &SyncMetadata{Schema: "public", Table: "test"}) +// require.NoError(t, err) +// res := &SyncResponse{} +// err = val.Get(res) +// require.NoError(t, err) +// } + +// func Test_Sync_Run_Metrics_Success(t *testing.T) { +// testSuite := &testsuite.WorkflowTestSuite{} +// testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) +// env := testSuite.NewTestActivityEnvironment() + +// meterProvider := metricsdk.NewMeterProvider() +// meter := meterProvider.Meter("test") +// benthosStreamManager := benthosstream.NewBenthosStreamManager() +// sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) +// mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) +// activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) + +// env.RegisterActivity(activity.SyncTable) + +// val, err := env.ExecuteActivity(activity.SyncTable, &SyncRequest{ +// BenthosConfig: strings.TrimSpace(` +// input: +// generate: +// count: 1 +// interval: "" +// mapping: 'root = { "id": uuid_v4() }' +// output: +// label: "" +// stdout: +// codec: lines +// metrics: +// otel_collector: {} +// `), +// }, &SyncMetadata{Schema: "public", Table: "test"}) +// require.NoError(t, err) +// res := &SyncResponse{} +// err = val.Get(res) +// require.NoError(t, err) +// } + +// func Test_Sync_Fake_Mutation_Success(t *testing.T) { +// testSuite := &testsuite.WorkflowTestSuite{} +// testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) +// env := testSuite.NewTestActivityEnvironment() + +// benthosStreamManager := benthosstream.NewBenthosStreamManager() +// sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) +// mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) +// var meter metric.Meter +// activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) +// env.RegisterActivity(activity.SyncTable) + +// val, err := env.ExecuteActivity(activity.SyncTable, &SyncRequest{ +// BenthosConfig: strings.TrimSpace(` +// input: +// generate: +// count: 1 +// interval: "" +// mapping: 'root = { "name": "nick" }' +// pipeline: +// threads: 1 +// processors: +// - mutation: | +// root.name = generate_first_name() +// output: +// label: "" +// stdout: +// codec: lines +// `), +// }, &SyncMetadata{Schema: "public", Table: "test"}) +// require.NoError(t, err) +// res := &SyncResponse{} +// err = val.Get(res) +// require.NoError(t, err) +// } + +// func Test_Sync_Run_Success_Javascript(t *testing.T) { +// testSuite := &testsuite.WorkflowTestSuite{} +// testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) +// env := testSuite.NewTestActivityEnvironment() + +// benthosStreamManager := benthosstream.NewBenthosStreamManager() +// sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) +// mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) +// var meter metric.Meter + +// activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) +// env.RegisterActivity(activity.SyncTable) + +// tmpFile, err := os.CreateTemp("", "test") +// if err != nil { +// t.Fatalf("Failed to create temp file: %v", err) +// } +// defer os.Remove(tmpFile.Name()) + +// val, err := env.ExecuteActivity(activity.SyncTable, &SyncRequest{ +// BenthosConfig: strings.TrimSpace(fmt.Sprintf(` +// input: +// generate: +// mapping: root = {"name":"evis"} +// interval: 1s +// count: 1 +// pipeline: +// processors: +// - neosync_javascript: +// code: | +// (() => { +// function fn_name(value, input){ +// var a = value + "test"; +// return a }; +// const input = benthos.v0_msg_as_structured(); +// const output = { ...input }; +// output["name"] = fn_name(input["name"], input); +// benthos.v0_msg_set_structured(output); +// })(); +// output: +// label: "" +// file: +// path: %s +// codec: lines +// `, tmpFile.Name())), +// }, &SyncMetadata{Schema: "public", Table: "test"}) +// assert.NoError(t, err) +// res := &SyncResponse{} +// err = val.Get(res) +// assert.NoError(t, err) + +// stdoutBytes, err := os.ReadFile(tmpFile.Name()) +// if err != nil { +// t.Fatalf("Failed to read from temp file: %v", err) +// } +// stringResult := string(stdoutBytes) + +// returnValue := strings.TrimSpace(stringResult) // remove new line at the end of the stdout line + +// assert.Equal(t, `{"name":"evistest"}`, returnValue) +// } + +// func Test_Sync_Run_Success_MutataionAndJavascript(t *testing.T) { +// testSuite := &testsuite.WorkflowTestSuite{} +// testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) +// env := testSuite.NewTestActivityEnvironment() +// benthosStreamManager := benthosstream.NewBenthosStreamManager() +// sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) +// mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) +// var meter metric.Meter +// activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) +// env.RegisterActivity(activity.SyncTable) + +// tmpFile, err := os.CreateTemp("", "test") +// if err != nil { +// t.Fatalf("Failed to create temp file: %v", err) +// } +// defer os.Remove(tmpFile.Name()) + +// val, err := env.ExecuteActivity(activity.SyncTable, &SyncRequest{ +// BenthosConfig: strings.TrimSpace(fmt.Sprintf(` +// input: +// generate: +// mapping: root = {"name":"evis"} +// interval: 1s +// count: 1 +// pipeline: +// processors: +// - mutation: +// root.name = this.name.reverse() +// - neosync_javascript: +// code: | +// (() => { +// function fn1(value, input){ +// var a = value + "test"; +// return a }; +// const input = benthos.v0_msg_as_structured(); +// const output = { ...input }; +// output["name"] = fn1(input["name"], input); +// benthos.v0_msg_set_structured(output); +// })(); +// output: +// label: "" +// file: +// path: %s +// codec: lines +// `, tmpFile.Name())), +// }, &SyncMetadata{Schema: "public", Table: "test"}) +// assert.NoError(t, err) +// res := &SyncResponse{} +// err = val.Get(res) +// assert.NoError(t, err) + +// stdoutBytes, err := os.ReadFile(tmpFile.Name()) +// if err != nil { +// t.Fatalf("Failed to read from temp file: %v", err) +// } +// stringResult := string(stdoutBytes) + +// returnValue := strings.TrimSpace(stringResult) // remove new line at the end of the stdout line + +// assert.Equal(t, `{"name":"sivetest"}`, returnValue) +// } + +// func Test_Sync_Run_Processor_Error(t *testing.T) { +// testSuite := &testsuite.WorkflowTestSuite{} +// testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) +// env := testSuite.NewTestActivityEnvironment() + +// benthosStreamManager := benthosstream.NewBenthosStreamManager() +// sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) +// mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) +// var meter metric.Meter +// activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, benthosStreamManager) + +// env.RegisterActivity(activity.SyncTable) + +// _, err := env.ExecuteActivity(activity.SyncTable, &SyncRequest{ +// BenthosConfig: strings.TrimSpace(` +// input: +// generate: +// count: 1000 +// interval: "" +// mapping: 'root = { "name": "nick" }' +// pipeline: +// threads: 1 +// processors: +// - error: +// error_msg: ${! error()} +// output: +// label: "" +// stdout: +// codec: lines +// `), +// }, &SyncMetadata{Schema: "public", Table: "test"}) +// require.Error(t, err, "error was nil when it should be present") +// } + +// func Test_Sync_Run_Output_Error(t *testing.T) { +// testSuite := &testsuite.WorkflowTestSuite{} +// testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) +// env := testSuite.NewTestActivityEnvironment() + +// mockBenthosStreamManager := NewMockBenthosStreamManagerClient(t) +// mockBenthosStream := NewMockBenthosStreamClient(t) + +// sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) +// mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) +// var meter metric.Meter +// activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, mockBenthosStreamManager) + +// env.RegisterActivity(activity.SyncTable) + +// mockBenthosStreamManager.On("NewBenthosStreamFromBuilder", mock.Anything).Return(mockBenthosStream, nil) +// errmsg := "duplicate key value violates unique constraint" +// mockBenthosStream.On("Run", mock.Anything).Return(errors.New(errmsg)) +// mockBenthosStream.On("StopWithin", mock.Anything).Return(nil).Maybe() + +// _, err := env.ExecuteActivity(activity.SyncTable, &SyncRequest{ +// BenthosConfig: strings.TrimSpace(` +// input: +// generate: +// count: 1000 +// interval: "" +// mapping: 'root = { "name": "nick" }' +// pipeline: +// threads: 1 +// processors: [] +// output: +// label: "" +// error: +// error_msg: ${! meta("fallback_error")} +// `), +// }, &SyncMetadata{Schema: "public", Table: "test"}) +// require.Error(t, err, "error was nil when it should be present") +// require.Contains(t, err.Error(), "activity error") +// } + +// func Test_Sync_Run_BenthosError(t *testing.T) { +// testSuite := &testsuite.WorkflowTestSuite{} +// testSuite.SetLogger(log.NewStructuredLogger(testutil.GetConcurrentTestLogger(t))) +// env := testSuite.NewTestActivityEnvironment() + +// mockBenthosStreamManager := NewMockBenthosStreamManagerClient(t) +// mockBenthosStream := NewMockBenthosStreamClient(t) +// config := strings.TrimSpace(` +// input: +// generate: +// count: 1000 +// interval: "" +// mapping: 'root = { "id": uuid_v4() }' +// output: +// label: "" +// stdout: +// codec: lines +// `) + +// mockBenthosStreamManager.On("NewBenthosStreamFromBuilder", mock.Anything).Return(mockBenthosStream, nil) +// errmsg := "benthos error" +// mockBenthosStream.On("Run", mock.Anything).Return(errors.New(errmsg)) +// mockBenthosStream.On("StopWithin", mock.Anything).Return(nil).Maybe() + +// sqlconnmanager := connectionmanager.NewConnectionManager(sqlprovider.NewProvider(&sqlconnect.SqlOpenConnector{}), connectionmanager.WithCloseOnRelease()) +// mongoconnmanager := connectionmanager.NewConnectionManager(mongoprovider.NewProvider(), connectionmanager.WithCloseOnRelease()) +// var meter metric.Meter + +// activity := New(nil, nil, sqlconnmanager, mongoconnmanager, meter, mockBenthosStreamManager) + +// env.RegisterActivity(activity.SyncTable) +// _, err := env.ExecuteActivity(activity.SyncTable, &SyncRequest{ +// BenthosConfig: config, +// }, &SyncMetadata{Schema: "public", Table: "test"}) +// require.Error(t, err) +// require.Contains(t, err.Error(), errmsg) +// } + +// func Test_getEnvVarLookupFn(t *testing.T) { +// fn := getEnvVarLookupFn(nil) +// assert.NotNil(t, fn) +// val, ok := fn("foo") +// assert.False(t, ok) +// assert.Empty(t, val) + +// fn = getEnvVarLookupFn(map[string]string{"foo": "bar"}) +// assert.NotNil(t, fn) +// val, ok = fn("foo") +// assert.True(t, ok) +// assert.Equal(t, val, "bar") + +// val, ok = fn("bar") +// assert.False(t, ok) +// assert.Empty(t, val) +// } + +// func startHTTPServer(tb testing.TB, h http.Handler) *httptest.Server { +// tb.Helper() +// srv := httptest.NewUnstartedServer(h) +// srv.EnableHTTP2 = true +// srv.Start() +// tb.Cleanup(srv.Close) +// return srv +// } diff --git a/worker/pkg/workflows/tablesync/workflow/register/register.go b/worker/pkg/workflows/tablesync/workflow/register/register.go new file mode 100644 index 0000000000..d0e1ee9373 --- /dev/null +++ b/worker/pkg/workflows/tablesync/workflow/register/register.go @@ -0,0 +1,43 @@ +package tablesync_workflow_register + +import ( + "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1/mgmtv1alpha1connect" + benthosstream "github.com/nucleuscloud/neosync/internal/benthos-stream" + connectionmanager "github.com/nucleuscloud/neosync/internal/connection-manager" + neosync_benthos_mongodb "github.com/nucleuscloud/neosync/worker/pkg/benthos/mongodb" + neosync_benthos_sql "github.com/nucleuscloud/neosync/worker/pkg/benthos/sql" + sync_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/tablesync/activities/sync" + tablesync_workflow "github.com/nucleuscloud/neosync/worker/pkg/workflows/tablesync/workflow" + + "go.opentelemetry.io/otel/metric" +) + +type Worker interface { + RegisterWorkflow(workflow any) + RegisterActivity(activity any) +} + +func Register( + w Worker, + connclient mgmtv1alpha1connect.ConnectionServiceClient, + jobclient mgmtv1alpha1connect.JobServiceClient, + sqlconnmanager connectionmanager.Interface[neosync_benthos_sql.SqlDbtx], + mongoconnmanager connectionmanager.Interface[neosync_benthos_mongodb.MongoClient], + meter metric.Meter, // optional + benthosStreamManager benthosstream.BenthosStreamManagerClient, +) { + tsWf := tablesync_workflow.New() + w.RegisterWorkflow(tsWf.TableSync) + + syncActivity := sync_activity.New( + connclient, + jobclient, + sqlconnmanager, + mongoconnmanager, + meter, + benthosStreamManager, + ) + + w.RegisterActivity(syncActivity.Sync) + w.RegisterActivity(syncActivity.SyncTable) +} diff --git a/worker/pkg/workflows/tablesync/workflow/workflow.go b/worker/pkg/workflows/tablesync/workflow/workflow.go new file mode 100644 index 0000000000..44620f702a --- /dev/null +++ b/worker/pkg/workflows/tablesync/workflow/workflow.go @@ -0,0 +1,89 @@ +package tablesync_workflow + +import ( + sync_activity "github.com/nucleuscloud/neosync/worker/pkg/workflows/tablesync/activities/sync" + "go.temporal.io/sdk/log" + "go.temporal.io/sdk/workflow" +) + +type TableSyncRequest struct { + AccountId string + Id string + JobRunId string + ContinuationToken *string + + SyncActivityOptions *workflow.ActivityOptions + TableSchema string + TableName string +} + +type TableSyncResponse struct { + // Here to make it easier to see in UI and logs + Schema string + Table string +} + +type Workflow struct{} + +func New() *Workflow { + return &Workflow{} +} + +const MAX_ITERATIONS = 100 + +func (*Workflow) TableSync(ctx workflow.Context, req *TableSyncRequest) (*TableSyncResponse, error) { + logger := log.With( + workflow.GetLogger(ctx), + "accountId", req.AccountId, + "id", req.Id, + "isContinuation", req.ContinuationToken != nil, + ) + + var syncActivity *sync_activity.Activity + + continuationToken := req.ContinuationToken + var iterations int + + logger.Debug("starting table sync") + + for { + iterations++ + + var resp *sync_activity.SyncTableResponse + err := workflow.ExecuteActivity( + workflow.WithActivityOptions(ctx, *req.SyncActivityOptions), // todo: check sync activity options nil + syncActivity.SyncTable, + sync_activity.SyncTableRequest{ + Id: req.Id, + AccountId: req.AccountId, + JobRunId: req.JobRunId, + ContinuationToken: continuationToken, + }, + &sync_activity.SyncMetadata{ + Schema: req.TableSchema, + Table: req.TableName, + }, + ). + Get(ctx, &resp) + if err != nil { + return nil, err + } + continuationToken = resp.ContinuationToken + if continuationToken == nil { + logger.Debug("no continuation token, breaking") + break + } + if iterations >= MAX_ITERATIONS { + logger.Debug("max iterations reached, continuing as new") + newReq := *req + newReq.ContinuationToken = continuationToken + var wf *Workflow + return nil, workflow.NewContinueAsNewError(ctx, wf.TableSync, &newReq) + } + logger.Debug("continuing") + } + return &TableSyncResponse{ + Schema: req.TableSchema, + Table: req.TableName, + }, nil +}