diff --git a/backend/gen/go/protos/mgmt/v1alpha1/job.pb.go b/backend/gen/go/protos/mgmt/v1alpha1/job.pb.go index 79c7808906..c28eef4696 100644 --- a/backend/gen/go/protos/mgmt/v1alpha1/job.pb.go +++ b/backend/gen/go/protos/mgmt/v1alpha1/job.pb.go @@ -11351,23 +11351,1414 @@ type JobTypeConfig_JobTypeSync struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + // Specify job-wide schema change strategies that will be used to map data from the source to the destination. + // This acts as the default configuration for all schemas and tables unless overridden by a schema mapping at a lower level. + SchemaChange *JobTypeConfig_JobTypeSync_SchemaChange `protobuf:"bytes,1,opt,name=schema_change,json=schemaChange,proto3,oneof" json:"schema_change,omitempty"` + // Specify schema mappings that will be used to map data from the source to the destination + // This replaces the mappings field and is used to configure column transformers as well as re-wire destination schemas and tables. + SchemaMappings []*JobTypeConfig_JobTypeSync_SchemaMapping `protobuf:"bytes,2,rep,name=schema_mappings,json=schemaMappings,proto3" json:"schema_mappings,omitempty"` +} + +func (x *JobTypeConfig_JobTypeSync) Reset() { + *x = JobTypeConfig_JobTypeSync{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[182] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[182] + 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 JobTypeConfig_JobTypeSync.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0} +} + +func (x *JobTypeConfig_JobTypeSync) GetSchemaChange() *JobTypeConfig_JobTypeSync_SchemaChange { + if x != nil { + return x.SchemaChange + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync) GetSchemaMappings() []*JobTypeConfig_JobTypeSync_SchemaMapping { + if x != nil { + return x.SchemaMappings + } + return nil +} + +type JobTypeConfig_JobTypePiiDetect struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The configuration for data sampling + DataSampling *JobTypeConfig_JobTypePiiDetect_DataSampling `protobuf:"bytes,1,opt,name=data_sampling,json=dataSampling,proto3" json:"data_sampling,omitempty"` + // The configuration for filtering tables to scan + TableScanFilter *JobTypeConfig_JobTypePiiDetect_TableScanFilter `protobuf:"bytes,2,opt,name=table_scan_filter,json=tableScanFilter,proto3" json:"table_scan_filter,omitempty"` + // The user prompt to use for PII detection to help influence the LLM + UserPrompt *string `protobuf:"bytes,3,opt,name=user_prompt,json=userPrompt,proto3,oneof" json:"user_prompt,omitempty"` + // The configuration for incremental PII detection + Incremental *JobTypeConfig_JobTypePiiDetect_Incremental `protobuf:"bytes,4,opt,name=incremental,proto3,oneof" json:"incremental,omitempty"` +} + +func (x *JobTypeConfig_JobTypePiiDetect) Reset() { + *x = JobTypeConfig_JobTypePiiDetect{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[183] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypePiiDetect) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypePiiDetect) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypePiiDetect) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[183] + 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 JobTypeConfig_JobTypePiiDetect.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypePiiDetect) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 1} +} + +func (x *JobTypeConfig_JobTypePiiDetect) GetDataSampling() *JobTypeConfig_JobTypePiiDetect_DataSampling { + if x != nil { + return x.DataSampling + } + return nil +} + +func (x *JobTypeConfig_JobTypePiiDetect) GetTableScanFilter() *JobTypeConfig_JobTypePiiDetect_TableScanFilter { + if x != nil { + return x.TableScanFilter + } + return nil +} + +func (x *JobTypeConfig_JobTypePiiDetect) GetUserPrompt() string { + if x != nil && x.UserPrompt != nil { + return *x.UserPrompt + } + return "" +} + +func (x *JobTypeConfig_JobTypePiiDetect) GetIncremental() *JobTypeConfig_JobTypePiiDetect_Incremental { + if x != nil { + return x.Incremental + } + return nil +} + +// Configure how schemas, tables, and columns are handled during a job run. +// If anything is not defined, a system-defined fallback will be implemented. Further information can be found in the documentation. +type JobTypeConfig_JobTypeSync_SchemaChange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Configure how schemas are handled during a job run + SchemaStrategy *JobTypeConfig_JobTypeSync_SchemaStrategy `protobuf:"bytes,1,opt,name=schema_strategy,json=schemaStrategy,proto3,oneof" json:"schema_strategy,omitempty"` + // Configure how tables are handled during a job run + TableStrategy *JobTypeConfig_JobTypeSync_TableStrategy `protobuf:"bytes,2,opt,name=table_strategy,json=tableStrategy,proto3,oneof" json:"table_strategy,omitempty"` + // Configure how columns are handled during a job run + ColumnStrategy *JobTypeConfig_JobTypeSync_ColumnStrategy `protobuf:"bytes,3,opt,name=column_strategy,json=columnStrategy,proto3,oneof" json:"column_strategy,omitempty"` +} + +func (x *JobTypeConfig_JobTypeSync_SchemaChange) Reset() { + *x = JobTypeConfig_JobTypeSync_SchemaChange{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[184] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_SchemaChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_SchemaChange) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_SchemaChange) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[184] + 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 JobTypeConfig_JobTypeSync_SchemaChange.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_SchemaChange) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 0} +} + +func (x *JobTypeConfig_JobTypeSync_SchemaChange) GetSchemaStrategy() *JobTypeConfig_JobTypeSync_SchemaStrategy { + if x != nil { + return x.SchemaStrategy + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_SchemaChange) GetTableStrategy() *JobTypeConfig_JobTypeSync_TableStrategy { + if x != nil { + return x.TableStrategy + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_SchemaChange) GetColumnStrategy() *JobTypeConfig_JobTypeSync_ColumnStrategy { + if x != nil { + return x.ColumnStrategy + } + return nil +} + +// The strategy used to configure how schemas are handled during a job run +type JobTypeConfig_JobTypeSync_SchemaStrategy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Strategy: + // + // *JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas_ + // *JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas_ + Strategy isJobTypeConfig_JobTypeSync_SchemaStrategy_Strategy `protobuf_oneof:"strategy"` +} + +func (x *JobTypeConfig_JobTypeSync_SchemaStrategy) Reset() { + *x = JobTypeConfig_JobTypeSync_SchemaStrategy{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[185] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_SchemaStrategy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_SchemaStrategy) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_SchemaStrategy) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[185] + 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 JobTypeConfig_JobTypeSync_SchemaStrategy.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_SchemaStrategy) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 1} +} + +func (m *JobTypeConfig_JobTypeSync_SchemaStrategy) GetStrategy() isJobTypeConfig_JobTypeSync_SchemaStrategy_Strategy { + if m != nil { + return m.Strategy + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_SchemaStrategy) GetMapAllSchemas() *JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas_); ok { + return x.MapAllSchemas + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_SchemaStrategy) GetMapDefinedSchemas() *JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas_); ok { + return x.MapDefinedSchemas + } + return nil +} + +type isJobTypeConfig_JobTypeSync_SchemaStrategy_Strategy interface { + isJobTypeConfig_JobTypeSync_SchemaStrategy_Strategy() +} + +type JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas_ struct { + // When this strategy is configured, all schemas are mapped + MapAllSchemas *JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas `protobuf:"bytes,1,opt,name=map_all_schemas,json=mapAllSchemas,proto3,oneof"` +} + +type JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas_ struct { + // When this strategy is configured, only the schemas that are defined are mapped + MapDefinedSchemas *JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas `protobuf:"bytes,2,opt,name=map_defined_schemas,json=mapDefinedSchemas,proto3,oneof"` +} + +func (*JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas_) isJobTypeConfig_JobTypeSync_SchemaStrategy_Strategy() { +} + +func (*JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas_) isJobTypeConfig_JobTypeSync_SchemaStrategy_Strategy() { +} + +// The strategy used to configure how tables are handled during a job run +type JobTypeConfig_JobTypeSync_TableStrategy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Strategy: + // + // *JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables_ + // *JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables_ + Strategy isJobTypeConfig_JobTypeSync_TableStrategy_Strategy `protobuf_oneof:"strategy"` +} + +func (x *JobTypeConfig_JobTypeSync_TableStrategy) Reset() { + *x = JobTypeConfig_JobTypeSync_TableStrategy{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[186] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_TableStrategy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_TableStrategy) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_TableStrategy) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[186] + 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 JobTypeConfig_JobTypeSync_TableStrategy.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_TableStrategy) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 2} +} + +func (m *JobTypeConfig_JobTypeSync_TableStrategy) GetStrategy() isJobTypeConfig_JobTypeSync_TableStrategy_Strategy { + if m != nil { + return m.Strategy + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_TableStrategy) GetMapAllTables() *JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables_); ok { + return x.MapAllTables + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_TableStrategy) GetMapDefinedTables() *JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables_); ok { + return x.MapDefinedTables + } + return nil +} + +type isJobTypeConfig_JobTypeSync_TableStrategy_Strategy interface { + isJobTypeConfig_JobTypeSync_TableStrategy_Strategy() +} + +type JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables_ struct { + // When this strategy is configured, all tables are mapped + MapAllTables *JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables `protobuf:"bytes,1,opt,name=map_all_tables,json=mapAllTables,proto3,oneof"` +} + +type JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables_ struct { + // When this strategy is configured, only the tables that are defined are mapped + MapDefinedTables *JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables `protobuf:"bytes,2,opt,name=map_defined_tables,json=mapDefinedTables,proto3,oneof"` +} + +func (*JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables_) isJobTypeConfig_JobTypeSync_TableStrategy_Strategy() { +} + +func (*JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables_) isJobTypeConfig_JobTypeSync_TableStrategy_Strategy() { +} + +// The strategy used to configure how columns are handled during a job run +type JobTypeConfig_JobTypeSync_ColumnStrategy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Strategy: + // + // *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_ + // *JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns_ + Strategy isJobTypeConfig_JobTypeSync_ColumnStrategy_Strategy `protobuf_oneof:"strategy"` +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[187] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[187] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3} +} + +func (m *JobTypeConfig_JobTypeSync_ColumnStrategy) GetStrategy() isJobTypeConfig_JobTypeSync_ColumnStrategy_Strategy { + if m != nil { + return m.Strategy + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy) GetMapAllColumns() *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_); ok { + return x.MapAllColumns + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy) GetMapDefinedColumns() *JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns_); ok { + return x.MapDefinedColumns + } + return nil +} + +type isJobTypeConfig_JobTypeSync_ColumnStrategy_Strategy interface { + isJobTypeConfig_JobTypeSync_ColumnStrategy_Strategy() +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_ struct { + // 1. Map all columns + user-defined sub-strategies for each mismatch scenario + MapAllColumns *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns `protobuf:"bytes,1,opt,name=map_all_columns,json=mapAllColumns,proto3,oneof"` +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns_ struct { + // 2. Only map user-defined columns + sub-strategies for mismatch scenarios + MapDefinedColumns *JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns `protobuf:"bytes,2,opt,name=map_defined_columns,json=mapDefinedColumns,proto3,oneof"` +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_) isJobTypeConfig_JobTypeSync_ColumnStrategy_Strategy() { +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns_) isJobTypeConfig_JobTypeSync_ColumnStrategy_Strategy() { +} + +// Configuration for a specific schema mapping +type JobTypeConfig_JobTypeSync_SchemaMapping struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The database schema this mapping belongs to + Schema string `protobuf:"bytes,1,opt,name=schema,proto3" json:"schema,omitempty"` + // Optionally specify a destination schema that this mapping will go to + DestinationSchema *string `protobuf:"bytes,2,opt,name=destination_schema,json=destinationSchema,proto3,oneof" json:"destination_schema,omitempty"` + // The list of table mappings that will be used to map data from the source to the destination + TableMappings []*JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping `protobuf:"bytes,3,rep,name=table_mappings,json=tableMappings,proto3" json:"table_mappings,omitempty"` + // Optionally specify a table strategy. This will override the global table strategy for this schema + TableStrategy *JobTypeConfig_JobTypeSync_TableStrategy `protobuf:"bytes,4,opt,name=table_strategy,json=tableStrategy,proto3,oneof" json:"table_strategy,omitempty"` + // Optionally specify a column strategy. This will override the global column strategy for this schema + ColumnStrategy *JobTypeConfig_JobTypeSync_ColumnStrategy `protobuf:"bytes,5,opt,name=column_strategy,json=columnStrategy,proto3,oneof" json:"column_strategy,omitempty"` +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping) Reset() { + *x = JobTypeConfig_JobTypeSync_SchemaMapping{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[188] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_SchemaMapping) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[188] + 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 JobTypeConfig_JobTypeSync_SchemaMapping.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_SchemaMapping) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 4} +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping) GetSchema() string { + if x != nil { + return x.Schema + } + return "" +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping) GetDestinationSchema() string { + if x != nil && x.DestinationSchema != nil { + return *x.DestinationSchema + } + return "" +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping) GetTableMappings() []*JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping { + if x != nil { + return x.TableMappings + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping) GetTableStrategy() *JobTypeConfig_JobTypeSync_TableStrategy { + if x != nil { + return x.TableStrategy + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping) GetColumnStrategy() *JobTypeConfig_JobTypeSync_ColumnStrategy { + if x != nil { + return x.ColumnStrategy + } + return nil +} + +// When this strategy is configured, all schemas are mapped +type JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas) Reset() { + *x = JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[189] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[189] + 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 JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 1, 0} +} + +// When this strategy is configured, only the schemas that are defined are mapped +type JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas) Reset() { + *x = JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[190] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[190] + 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 JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 1, 1} +} + +// When this strategy is configured, all tables are mapped +type JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables) Reset() { + *x = JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[191] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[191] + 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 JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 2, 0} +} + +// When this strategy is configured, only the tables that are defined are mapped +type JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables) Reset() { + *x = JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[192] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[192] + 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 JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 2, 1} +} + +// ------------------------------------------------------------- +// 1. MapAllColumns +// ------------------------------------------------------------- +type JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // When a column is present in source but not mapped + ColumnInSourceNotMapped *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy `protobuf:"bytes,1,opt,name=column_in_source_not_mapped,json=columnInSourceNotMapped,proto3,oneof" json:"column_in_source_not_mapped,omitempty"` + // When a column is mapped but not in source + ColumnMappedNotInSource *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy `protobuf:"bytes,2,opt,name=column_mapped_not_in_source,json=columnMappedNotInSource,proto3,oneof" json:"column_mapped_not_in_source,omitempty"` + // When a column is in source + mapped, but missing in destination + ColumnInSourceMappedNotInDestination *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy `protobuf:"bytes,3,opt,name=column_in_source_mapped_not_in_destination,json=columnInSourceMappedNotInDestination,proto3,oneof" json:"column_in_source_mapped_not_in_destination,omitempty"` + // When a column is in the destination but not in source + ColumnInDestinationNoLongerInSource *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy `protobuf:"bytes,4,opt,name=column_in_destination_no_longer_in_source,json=columnInDestinationNoLongerInSource,proto3,oneof" json:"column_in_destination_no_longer_in_source,omitempty"` +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[193] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[193] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 0} +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns) GetColumnInSourceNotMapped() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy { + if x != nil { + return x.ColumnInSourceNotMapped + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns) GetColumnMappedNotInSource() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy { + if x != nil { + return x.ColumnMappedNotInSource + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns) GetColumnInSourceMappedNotInDestination() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy { + if x != nil { + return x.ColumnInSourceMappedNotInDestination + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns) GetColumnInDestinationNoLongerInSource() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy { + if x != nil { + return x.ColumnInDestinationNoLongerInSource + } + return nil +} + +// ------------------------------------------------------------- +// 2. MapDefinedColumns +// ------------------------------------------------------------- +type JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Mapped but missing in source + ColumnMappedNotInSource *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy `protobuf:"bytes,1,opt,name=column_mapped_not_in_source,json=columnMappedNotInSource,proto3,oneof" json:"column_mapped_not_in_source,omitempty"` + // In source + mapped, but missing in destination + ColumnInSourceMappedNotInDestination *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy `protobuf:"bytes,2,opt,name=column_in_source_mapped_not_in_destination,json=columnInSourceMappedNotInDestination,proto3,oneof" json:"column_in_source_mapped_not_in_destination,omitempty"` +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[194] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[194] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 1} +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns) GetColumnMappedNotInSource() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy { + if x != nil { + return x.ColumnMappedNotInSource + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns) GetColumnInSourceMappedNotInDestination() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy { + if x != nil { + return x.ColumnInSourceMappedNotInDestination + } + return nil +} + +// a) Column present in source, not mapped +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Strategy: + // + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough_ + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap_ + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt_ + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop_ + Strategy isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Strategy `protobuf_oneof:"strategy"` +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[195] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[195] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 2} +} + +func (m *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) GetStrategy() isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Strategy { + if m != nil { + return m.Strategy + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) GetPassthrough() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough_); ok { + return x.Passthrough + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) GetAutoMap() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap_); ok { + return x.AutoMap + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) GetHalt() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt_); ok { + return x.Halt + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) GetDrop() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop_); ok { + return x.Drop + } + return nil +} + +type isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Strategy interface { + isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Strategy() +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough_ struct { + Passthrough *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough `protobuf:"bytes,1,opt,name=passthrough,proto3,oneof"` +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap_ struct { + AutoMap *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap `protobuf:"bytes,2,opt,name=auto_map,json=autoMap,proto3,oneof"` +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt_ struct { + Halt *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt `protobuf:"bytes,3,opt,name=halt,proto3,oneof"` +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop_ struct { + Drop *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop `protobuf:"bytes,4,opt,name=drop,proto3,oneof"` +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Strategy() { +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Strategy() { +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Strategy() { +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Strategy() { +} + +// b) Column mapped, but not in source +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Strategy: + // + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue_ + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt_ + Strategy isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Strategy `protobuf_oneof:"strategy"` +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[196] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[196] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 3} +} + +func (m *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy) GetStrategy() isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Strategy { + if m != nil { + return m.Strategy + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy) GetContinue() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue_); ok { + return x.Continue + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy) GetHalt() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt_); ok { + return x.Halt + } + return nil +} + +type isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Strategy interface { + isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Strategy() +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue_ struct { + Continue *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue `protobuf:"bytes,1,opt,name=continue,proto3,oneof"` // e.g. treat as NULL or skip +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt_ struct { + Halt *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt `protobuf:"bytes,2,opt,name=halt,proto3,oneof"` // fail the job +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Strategy() { +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Strategy() { +} + +// c) Column in source + mapped, but missing in destination +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Strategy: + // + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue_ + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop_ + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt_ + Strategy isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Strategy `protobuf_oneof:"strategy"` +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[197] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[197] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 4} +} + +func (m *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy) GetStrategy() isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Strategy { + if m != nil { + return m.Strategy + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy) GetContinue() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue_); ok { + return x.Continue + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy) GetDrop() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop_); ok { + return x.Drop + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy) GetHalt() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt_); ok { + return x.Halt + } + return nil +} + +type isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Strategy interface { + isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Strategy() +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue_ struct { + // In your version, "Continue" = "if init_schema => create column, else skip" + Continue *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue `protobuf:"bytes,1,opt,name=continue,proto3,oneof"` +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop_ struct { + Drop *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop `protobuf:"bytes,2,opt,name=drop,proto3,oneof"` +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt_ struct { + Halt *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt `protobuf:"bytes,3,opt,name=halt,proto3,oneof"` +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Strategy() { +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Strategy() { +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Strategy() { +} + +// d) Column in destination, but not in source +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Strategy: + // + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue_ + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt_ + // *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap_ + Strategy isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Strategy `protobuf_oneof:"strategy"` +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[198] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[198] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 5} +} + +func (m *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy) GetStrategy() isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Strategy { + if m != nil { + return m.Strategy + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy) GetContinue() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue_); ok { + return x.Continue + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy) GetHalt() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt_); ok { + return x.Halt + } + return nil +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy) GetAutoMap() *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap { + if x, ok := x.GetStrategy().(*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap_); ok { + return x.AutoMap + } + return nil +} + +type isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Strategy interface { + isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Strategy() +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue_ struct { + // "Continue" => "if init_schema => drop column, else leave it alone" + Continue *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue `protobuf:"bytes,1,opt,name=continue,proto3,oneof"` +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt_ struct { + Halt *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt `protobuf:"bytes,2,opt,name=halt,proto3,oneof"` +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap_ struct { + AutoMap *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap `protobuf:"bytes,3,opt,name=auto_map,json=autoMap,proto3,oneof"` +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Strategy() { +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Strategy() { +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap_) isJobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Strategy() { +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[199] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[199] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 2, 0} +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[200] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[200] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 2, 1} +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[201] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[201] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 2, 2} +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[202] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[202] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 2, 3} +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[203] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[203] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 3, 0} +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (x *JobTypeConfig_JobTypeSync) Reset() { - *x = JobTypeConfig_JobTypeSync{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[182] +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[204] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *JobTypeConfig_JobTypeSync) String() string { +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt) String() string { return protoimpl.X.MessageStringOf(x) } -func (*JobTypeConfig_JobTypeSync) ProtoMessage() {} +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt) ProtoMessage() { +} -func (x *JobTypeConfig_JobTypeSync) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[182] +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[204] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11378,41 +12769,70 @@ func (x *JobTypeConfig_JobTypeSync) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use JobTypeConfig_JobTypeSync.ProtoReflect.Descriptor instead. -func (*JobTypeConfig_JobTypeSync) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0} +// Deprecated: Use JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 3, 1} } -type JobTypeConfig_JobTypePiiDetect struct { +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields +} - // The configuration for data sampling - DataSampling *JobTypeConfig_JobTypePiiDetect_DataSampling `protobuf:"bytes,1,opt,name=data_sampling,json=dataSampling,proto3" json:"data_sampling,omitempty"` - // The configuration for filtering tables to scan - TableScanFilter *JobTypeConfig_JobTypePiiDetect_TableScanFilter `protobuf:"bytes,2,opt,name=table_scan_filter,json=tableScanFilter,proto3" json:"table_scan_filter,omitempty"` - // The user prompt to use for PII detection to help influence the LLM - UserPrompt *string `protobuf:"bytes,3,opt,name=user_prompt,json=userPrompt,proto3,oneof" json:"user_prompt,omitempty"` - // The configuration for incremental PII detection - Incremental *JobTypeConfig_JobTypePiiDetect_Incremental `protobuf:"bytes,4,opt,name=incremental,proto3,oneof" json:"incremental,omitempty"` +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[205] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *JobTypeConfig_JobTypePiiDetect) Reset() { - *x = JobTypeConfig_JobTypePiiDetect{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[183] +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[205] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 4, 0} +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[206] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *JobTypeConfig_JobTypePiiDetect) String() string { +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop) String() string { return protoimpl.X.MessageStringOf(x) } -func (*JobTypeConfig_JobTypePiiDetect) ProtoMessage() {} +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop) ProtoMessage() { +} -func (x *JobTypeConfig_JobTypePiiDetect) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[183] +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[206] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11423,35 +12843,285 @@ func (x *JobTypeConfig_JobTypePiiDetect) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use JobTypeConfig_JobTypePiiDetect.ProtoReflect.Descriptor instead. -func (*JobTypeConfig_JobTypePiiDetect) Descriptor() ([]byte, []int) { - return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 1} +// Deprecated: Use JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 4, 1} } -func (x *JobTypeConfig_JobTypePiiDetect) GetDataSampling() *JobTypeConfig_JobTypePiiDetect_DataSampling { +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[207] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[207] if x != nil { - return x.DataSampling + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 4, 2} +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[208] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[208] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 5, 0} +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[209] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[209] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 5, 1} +} + +type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap) Reset() { + *x = JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[210] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap) ProtoMessage() { +} + +func (x *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[210] + 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 JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 3, 5, 2} +} + +// Configuration for a specific table mapping in a schema +type JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The database table this mapping belongs to + Table string `protobuf:"bytes,1,opt,name=table,proto3" json:"table,omitempty"` + // Optionally specify a destination table that this mapping will go to + DestinationTable *string `protobuf:"bytes,2,opt,name=destination_table,json=destinationTable,proto3,oneof" json:"destination_table,omitempty"` + // The list of column mappings that will be used to map data from the source to the destination + ColumnMappings []*JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping `protobuf:"bytes,3,rep,name=column_mappings,json=columnMappings,proto3" json:"column_mappings,omitempty"` + // Optionally specify a column strategy. This will override the global column strategy for this table + ColumnStrategy *JobTypeConfig_JobTypeSync_ColumnStrategy `protobuf:"bytes,4,opt,name=column_strategy,json=columnStrategy,proto3,oneof" json:"column_strategy,omitempty"` +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping) Reset() { + *x = JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[211] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[211] + 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 JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 4, 0} +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping) GetTable() string { + if x != nil { + return x.Table + } + return "" +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping) GetDestinationTable() string { + if x != nil && x.DestinationTable != nil { + return *x.DestinationTable + } + return "" +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping) GetColumnMappings() []*JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping { + if x != nil { + return x.ColumnMappings } return nil } -func (x *JobTypeConfig_JobTypePiiDetect) GetTableScanFilter() *JobTypeConfig_JobTypePiiDetect_TableScanFilter { +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping) GetColumnStrategy() *JobTypeConfig_JobTypeSync_ColumnStrategy { if x != nil { - return x.TableScanFilter + return x.ColumnStrategy } return nil } -func (x *JobTypeConfig_JobTypePiiDetect) GetUserPrompt() string { - if x != nil && x.UserPrompt != nil { - return *x.UserPrompt +// Configuration for a specific column mapping in a table +type JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The column this mapping belongs to + Column string `protobuf:"bytes,1,opt,name=column,proto3" json:"column,omitempty"` + // The transformer configuration that will be applied to each cell in the column + Transformer *TransformerConfig `protobuf:"bytes,2,opt,name=transformer,proto3,oneof" json:"transformer,omitempty"` +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping) Reset() { + *x = JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping{} + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[212] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping) ProtoMessage() {} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping) ProtoReflect() protoreflect.Message { + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[212] + 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 JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping.ProtoReflect.Descriptor instead. +func (*JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping) Descriptor() ([]byte, []int) { + return file_mgmt_v1alpha1_job_proto_rawDescGZIP(), []int{43, 0, 4, 0, 0} +} + +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping) GetColumn() string { + if x != nil { + return x.Column } return "" } -func (x *JobTypeConfig_JobTypePiiDetect) GetIncremental() *JobTypeConfig_JobTypePiiDetect_Incremental { +func (x *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping) GetTransformer() *TransformerConfig { if x != nil { - return x.Incremental + return x.Transformer } return nil } @@ -11468,7 +13138,7 @@ type JobTypeConfig_JobTypePiiDetect_Incremental struct { func (x *JobTypeConfig_JobTypePiiDetect_Incremental) Reset() { *x = JobTypeConfig_JobTypePiiDetect_Incremental{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[184] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[213] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11480,7 +13150,7 @@ func (x *JobTypeConfig_JobTypePiiDetect_Incremental) String() string { func (*JobTypeConfig_JobTypePiiDetect_Incremental) ProtoMessage() {} func (x *JobTypeConfig_JobTypePiiDetect_Incremental) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[184] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[213] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11515,7 +13185,7 @@ type JobTypeConfig_JobTypePiiDetect_DataSampling struct { func (x *JobTypeConfig_JobTypePiiDetect_DataSampling) Reset() { *x = JobTypeConfig_JobTypePiiDetect_DataSampling{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[185] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[214] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11527,7 +13197,7 @@ func (x *JobTypeConfig_JobTypePiiDetect_DataSampling) String() string { func (*JobTypeConfig_JobTypePiiDetect_DataSampling) ProtoMessage() {} func (x *JobTypeConfig_JobTypePiiDetect_DataSampling) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[185] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[214] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11566,7 +13236,7 @@ type JobTypeConfig_JobTypePiiDetect_TableScanFilter struct { func (x *JobTypeConfig_JobTypePiiDetect_TableScanFilter) Reset() { *x = JobTypeConfig_JobTypePiiDetect_TableScanFilter{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[186] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[215] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11578,7 +13248,7 @@ func (x *JobTypeConfig_JobTypePiiDetect_TableScanFilter) String() string { func (*JobTypeConfig_JobTypePiiDetect_TableScanFilter) ProtoMessage() {} func (x *JobTypeConfig_JobTypePiiDetect_TableScanFilter) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[186] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[215] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11659,7 +13329,7 @@ type JobTypeConfig_JobTypePiiDetect_IncludeAll struct { func (x *JobTypeConfig_JobTypePiiDetect_IncludeAll) Reset() { *x = JobTypeConfig_JobTypePiiDetect_IncludeAll{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[187] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[216] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11671,7 +13341,7 @@ func (x *JobTypeConfig_JobTypePiiDetect_IncludeAll) String() string { func (*JobTypeConfig_JobTypePiiDetect_IncludeAll) ProtoMessage() {} func (x *JobTypeConfig_JobTypePiiDetect_IncludeAll) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[187] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[216] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11701,7 +13371,7 @@ type JobTypeConfig_JobTypePiiDetect_TablePatterns struct { func (x *JobTypeConfig_JobTypePiiDetect_TablePatterns) Reset() { *x = JobTypeConfig_JobTypePiiDetect_TablePatterns{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[188] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[217] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11713,7 +13383,7 @@ func (x *JobTypeConfig_JobTypePiiDetect_TablePatterns) String() string { func (*JobTypeConfig_JobTypePiiDetect_TablePatterns) ProtoMessage() {} func (x *JobTypeConfig_JobTypePiiDetect_TablePatterns) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[188] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[217] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11757,7 +13427,7 @@ type JobTypeConfig_JobTypePiiDetect_TableIdentifier struct { func (x *JobTypeConfig_JobTypePiiDetect_TableIdentifier) Reset() { *x = JobTypeConfig_JobTypePiiDetect_TableIdentifier{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[189] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[218] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11769,7 +13439,7 @@ func (x *JobTypeConfig_JobTypePiiDetect_TableIdentifier) String() string { func (*JobTypeConfig_JobTypePiiDetect_TableIdentifier) ProtoMessage() {} func (x *JobTypeConfig_JobTypePiiDetect_TableIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[189] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[218] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11814,7 +13484,7 @@ type GetJobRunLogsResponse_LogLine struct { func (x *GetJobRunLogsResponse_LogLine) Reset() { *x = GetJobRunLogsResponse_LogLine{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[191] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[220] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11826,7 +13496,7 @@ func (x *GetJobRunLogsResponse_LogLine) String() string { func (*GetJobRunLogsResponse_LogLine) ProtoMessage() {} func (x *GetJobRunLogsResponse_LogLine) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[191] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[220] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11877,7 +13547,7 @@ type ColumnError_ColumnErrorReport struct { func (x *ColumnError_ColumnErrorReport) Reset() { *x = ColumnError_ColumnErrorReport{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[193] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[222] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11889,7 +13559,7 @@ func (x *ColumnError_ColumnErrorReport) String() string { func (*ColumnError_ColumnErrorReport) ProtoMessage() {} func (x *ColumnError_ColumnErrorReport) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[193] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[222] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11933,7 +13603,7 @@ type ColumnWarning_ColumnWarningReport struct { func (x *ColumnWarning_ColumnWarningReport) Reset() { *x = ColumnWarning_ColumnWarningReport{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[194] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[223] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11945,7 +13615,7 @@ func (x *ColumnWarning_ColumnWarningReport) String() string { func (*ColumnWarning_ColumnWarningReport) ProtoMessage() {} func (x *ColumnWarning_ColumnWarningReport) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[194] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[223] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11989,7 +13659,7 @@ type DatabaseError_DatabaseErrorReport struct { func (x *DatabaseError_DatabaseErrorReport) Reset() { *x = DatabaseError_DatabaseErrorReport{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[195] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[224] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12001,7 +13671,7 @@ func (x *DatabaseError_DatabaseErrorReport) String() string { func (*DatabaseError_DatabaseErrorReport) ProtoMessage() {} func (x *DatabaseError_DatabaseErrorReport) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[195] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[224] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12045,7 +13715,7 @@ type TableError_TableErrorReport struct { func (x *TableError_TableErrorReport) Reset() { *x = TableError_TableErrorReport{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[196] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[225] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12057,7 +13727,7 @@ func (x *TableError_TableErrorReport) String() string { func (*TableError_TableErrorReport) ProtoMessage() {} func (x *TableError_TableErrorReport) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[196] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[225] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12100,7 +13770,7 @@ type ValidateSchemaResponse_Table struct { func (x *ValidateSchemaResponse_Table) Reset() { *x = ValidateSchemaResponse_Table{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[197] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[226] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12112,7 +13782,7 @@ func (x *ValidateSchemaResponse_Table) String() string { func (*ValidateSchemaResponse_Table) ProtoMessage() {} func (x *ValidateSchemaResponse_Table) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[197] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[226] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12158,7 +13828,7 @@ type JobHookConfig_JobSqlHook struct { func (x *JobHookConfig_JobSqlHook) Reset() { *x = JobHookConfig_JobSqlHook{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[198] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[227] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12170,7 +13840,7 @@ func (x *JobHookConfig_JobSqlHook) String() string { func (*JobHookConfig_JobSqlHook) ProtoMessage() {} func (x *JobHookConfig_JobSqlHook) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[198] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[227] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12221,7 +13891,7 @@ type JobHookConfig_JobSqlHook_Timing struct { func (x *JobHookConfig_JobSqlHook_Timing) Reset() { *x = JobHookConfig_JobSqlHook_Timing{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[199] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[228] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12233,7 +13903,7 @@ func (x *JobHookConfig_JobSqlHook_Timing) String() string { func (*JobHookConfig_JobSqlHook_Timing) ProtoMessage() {} func (x *JobHookConfig_JobSqlHook_Timing) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[199] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[228] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12307,7 +13977,7 @@ type PiiDetectionReport_TableReport struct { func (x *PiiDetectionReport_TableReport) Reset() { *x = PiiDetectionReport_TableReport{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[200] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[229] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12319,7 +13989,7 @@ func (x *PiiDetectionReport_TableReport) String() string { func (*PiiDetectionReport_TableReport) ProtoMessage() {} func (x *PiiDetectionReport_TableReport) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[200] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[229] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12372,7 +14042,7 @@ type PiiDetectionReport_TableReport_ColumnReport struct { func (x *PiiDetectionReport_TableReport_ColumnReport) Reset() { *x = PiiDetectionReport_TableReport_ColumnReport{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[201] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[230] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12384,7 +14054,7 @@ func (x *PiiDetectionReport_TableReport_ColumnReport) String() string { func (*PiiDetectionReport_TableReport_ColumnReport) ProtoMessage() {} func (x *PiiDetectionReport_TableReport_ColumnReport) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[201] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[230] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12433,7 +14103,7 @@ type PiiDetectionReport_TableReport_ColumnReport_Regex struct { func (x *PiiDetectionReport_TableReport_ColumnReport_Regex) Reset() { *x = PiiDetectionReport_TableReport_ColumnReport_Regex{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[202] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[231] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12445,7 +14115,7 @@ func (x *PiiDetectionReport_TableReport_ColumnReport_Regex) String() string { func (*PiiDetectionReport_TableReport_ColumnReport_Regex) ProtoMessage() {} func (x *PiiDetectionReport_TableReport_ColumnReport_Regex) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[202] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[231] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12482,7 +14152,7 @@ type PiiDetectionReport_TableReport_ColumnReport_LLM struct { func (x *PiiDetectionReport_TableReport_ColumnReport_LLM) Reset() { *x = PiiDetectionReport_TableReport_ColumnReport_LLM{} - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[203] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[232] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12494,7 +14164,7 @@ func (x *PiiDetectionReport_TableReport_ColumnReport_LLM) String() string { func (*PiiDetectionReport_TableReport_ColumnReport_LLM) ProtoMessage() {} func (x *PiiDetectionReport_TableReport_ColumnReport_LLM) ProtoReflect() protoreflect.Message { - mi := &file_mgmt_v1alpha1_job_proto_msgTypes[203] + mi := &file_mgmt_v1alpha1_job_proto_msgTypes[232] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13247,7 +14917,7 @@ var file_mgmt_v1alpha1_job_proto_rawDesc = []byte{ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 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, 0x94, 0x08, 0x0a, 0x10, 0x43, + 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xf2, 0x06, 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, @@ -13289,1501 +14959,1845 @@ var file_mgmt_v1alpha1_job_proto_rawDesc = []byte{ 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, - 0x07, 0x6a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x3a, 0xd4, 0x02, 0xba, 0x48, - 0xd0, 0x02, 0x1a, 0x9f, 0x01, 0x0a, 0x1a, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x79, 0x6e, - 0x63, 0x12, 0x2f, 0x46, 0x6f, 0x72, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x6a, 0x6f, 0x62, 0x73, - 0x2c, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6d, - 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x1a, 0x50, 0x21, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6a, 0x6f, - 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6e, - 0x63, 0x29, 0x20, 0x3f, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, - 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x31, 0x20, 0x3a, 0x20, - 0x74, 0x72, 0x75, 0x65, 0x1a, 0xab, 0x01, 0x0a, 0x1e, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x66, - 0x6f, 0x72, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x33, 0x46, 0x6f, 0x72, 0x20, 0x73, 0x79, 0x6e, - 0x63, 0x20, 0x6a, 0x6f, 0x62, 0x73, 0x2c, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, - 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x1a, 0x54, 0x21, 0x68, - 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6a, 0x6f, - 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x29, 0x20, 0x3f, 0x20, 0x73, - 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x31, 0x20, 0x3a, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x22, 0xbd, 0x09, 0x0a, 0x0d, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x3e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x07, 0x6a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x3a, 0xb2, 0x01, 0xba, 0x48, + 0xae, 0x01, 0x1a, 0xab, 0x01, 0x0a, 0x1e, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, + 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x33, 0x46, 0x6f, 0x72, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x20, + 0x6a, 0x6f, 0x62, 0x73, 0x2c, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x1a, 0x54, 0x21, 0x68, 0x61, 0x73, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x29, 0x20, + 0x7c, 0x7c, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6a, 0x6f, 0x62, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x29, 0x20, 0x3f, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x31, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, + 0xdc, 0x35, 0x0a, 0x0d, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x3e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, + 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x00, 0x52, 0x04, 0x73, 0x79, 0x6e, + 0x63, 0x12, 0x4e, 0x0a, 0x0a, 0x70, 0x69, 0x69, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x09, 0x70, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x1a, 0xab, 0x2c, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, + 0x63, 0x12, 0x5f, 0x0a, 0x0d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, + 0x6e, 0x63, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, + 0x00, 0x52, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x5f, 0x0a, 0x0f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, + 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, + 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x52, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x73, 0x1a, 0xfb, 0x02, 0x0a, 0x0c, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x65, 0x0a, 0x0f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x73, + 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, + 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, + 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, 0x62, 0x0a, 0x0e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x01, 0x52, 0x0d, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, + 0x65, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, + 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x48, 0x02, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x12, 0x0a, + 0x10, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x1a, 0xb7, 0x02, 0x0a, 0x0e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x12, 0x6f, 0x0a, 0x0f, 0x6d, 0x61, 0x70, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, + 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, + 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x53, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x4d, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x7b, 0x0a, 0x13, 0x6d, 0x61, 0x70, 0x5f, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x4d, 0x61, 0x70, 0x44, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x48, 0x00, 0x52, + 0x11, 0x6d, 0x61, 0x70, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x1a, 0x0f, 0x0a, 0x0d, 0x4d, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x1a, 0x13, 0x0a, 0x11, 0x4d, 0x61, 0x70, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x42, 0x11, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x00, 0x1a, 0xac, 0x02, 0x0a, 0x0d, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x6b, 0x0a, + 0x0e, 0x6d, 0x61, 0x70, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x4d, 0x61, + 0x70, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61, + 0x70, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x77, 0x0a, 0x12, 0x6d, 0x61, + 0x70, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x4d, + 0x61, 0x70, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x48, + 0x00, 0x52, 0x10, 0x6d, 0x61, 0x70, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x1a, 0x0e, 0x0a, 0x0c, 0x4d, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x1a, 0x12, 0x0a, 0x10, 0x4d, 0x61, 0x70, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x64, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x00, 0x1a, 0x89, 0x1b, 0x0a, 0x0e, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x6f, 0x0a, + 0x0f, 0x6d, 0x61, 0x70, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, + 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, + 0x4d, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x48, 0x00, 0x52, + 0x0d, 0x6d, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x7b, + 0x0a, 0x13, 0x6d, 0x61, 0x70, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, + 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, + 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x2e, 0x4d, 0x61, 0x70, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x11, 0x6d, 0x61, 0x70, 0x44, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x1a, 0xea, 0x06, 0x0a, 0x0d, + 0x4d, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x9a, 0x01, + 0x0a, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x74, 0x4d, 0x61, + 0x70, 0x70, 0x65, 0x64, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x00, 0x52, 0x17, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, + 0x74, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x9a, 0x01, 0x0a, 0x1b, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, + 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x57, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, + 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0xc3, 0x01, 0x0a, 0x2a, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x70, + 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x64, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, + 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, + 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x44, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x48, 0x02, 0x52, 0x24, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x44, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0xbb, 0x01, + 0x0a, 0x29, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x65, + 0x72, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x5e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x48, 0x00, 0x52, 0x04, 0x73, - 0x79, 0x6e, 0x63, 0x12, 0x4e, 0x0a, 0x0a, 0x70, 0x69, 0x69, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x09, 0x70, 0x69, 0x69, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x1a, 0x0d, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, - 0x6e, 0x63, 0x1a, 0xf9, 0x07, 0x0a, 0x10, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, - 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x12, 0x5f, 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, + 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x49, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, + 0x74, 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x48, 0x03, 0x52, 0x23, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x44, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x4c, 0x6f, 0x6e, 0x67, 0x65, 0x72, + 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x6f, + 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x2d, 0x0a, 0x2b, 0x5f, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x64, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x2c, 0x0a, 0x2a, 0x5f, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x69, + 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0xc5, 0x03, 0x0a, 0x11, 0x4d, 0x61, 0x70, + 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x9a, + 0x01, 0x0a, 0x1b, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, + 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x00, 0x52, + 0x17, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x74, + 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0xc3, 0x01, 0x0a, 0x2a, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x64, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x64, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, + 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, + 0x74, 0x49, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x01, 0x52, 0x24, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, + 0x74, 0x49, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x6d, 0x61, 0x70, + 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x42, 0x2d, 0x0a, 0x2b, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x6f, + 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x1a, 0xc7, 0x04, 0x0a, 0x1f, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x53, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x12, 0x87, 0x01, 0x0a, 0x0b, 0x70, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, + 0x6f, 0x75, 0x67, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x63, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, + 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, + 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x48, + 0x00, 0x52, 0x0b, 0x70, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x12, 0x7c, + 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x5f, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, + 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x65, + 0x64, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x4d, 0x61, + 0x70, 0x48, 0x00, 0x52, 0x07, 0x61, 0x75, 0x74, 0x6f, 0x4d, 0x61, 0x70, 0x12, 0x72, 0x0a, 0x04, + 0x68, 0x61, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x5c, 0x2e, 0x6d, 0x67, 0x6d, + 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, + 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, + 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x2e, 0x48, 0x61, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, 0x6c, 0x74, + 0x12, 0x72, 0x0a, 0x04, 0x64, 0x72, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x5c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, - 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, - 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x69, 0x0a, 0x11, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x52, 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6d, - 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, - 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x88, 0x01, 0x01, 0x12, 0x60, 0x0a, 0x0b, 0x69, 0x6e, 0x63, - 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, + 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, + 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x53, + 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x44, 0x72, 0x6f, 0x70, 0x48, 0x00, 0x52, 0x04, + 0x64, 0x72, 0x6f, 0x70, 0x1a, 0x0d, 0x0a, 0x0b, 0x50, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, + 0x75, 0x67, 0x68, 0x1a, 0x09, 0x0a, 0x07, 0x41, 0x75, 0x74, 0x6f, 0x4d, 0x61, 0x70, 0x1a, 0x06, + 0x0a, 0x04, 0x48, 0x61, 0x6c, 0x74, 0x1a, 0x06, 0x0a, 0x04, 0x44, 0x72, 0x6f, 0x70, 0x42, 0x0a, + 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x1a, 0xb5, 0x02, 0x0a, 0x1f, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x49, 0x6e, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x7e, + 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x60, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, + 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, + 0x75, 0x65, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x12, 0x72, + 0x0a, 0x04, 0x68, 0x61, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x5c, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, + 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, + 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4d, 0x61, 0x70, 0x70, + 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x48, 0x61, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, + 0x6c, 0x74, 0x1a, 0x0a, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x1a, 0x06, + 0x0a, 0x04, 0x48, 0x61, 0x6c, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x1a, 0xe6, 0x03, 0x0a, 0x2c, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x49, 0x6e, + 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x12, 0x8b, 0x01, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x6d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, + 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x61, + 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x12, 0x7f, 0x0a, 0x04, 0x64, 0x72, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x69, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, + 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, + 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, 0x74, + 0x49, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x44, 0x72, 0x6f, 0x70, 0x48, 0x00, 0x52, 0x04, 0x64, 0x72, + 0x6f, 0x70, 0x12, 0x7f, 0x0a, 0x04, 0x68, 0x61, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x69, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, + 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x6f, + 0x74, 0x49, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x48, 0x61, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x04, 0x68, + 0x61, 0x6c, 0x74, 0x1a, 0x0a, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x1a, + 0x06, 0x0a, 0x04, 0x44, 0x72, 0x6f, 0x70, 0x1a, 0x06, 0x0a, 0x04, 0x48, 0x61, 0x6c, 0x74, 0x42, + 0x0a, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x1a, 0xdc, 0x03, 0x0a, 0x26, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x85, 0x01, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x67, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, + 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, + 0x75, 0x65, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x12, 0x79, + 0x0a, 0x04, 0x68, 0x61, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x63, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, + 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, + 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x44, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x48, 0x61, 0x6c, + 0x74, 0x48, 0x00, 0x52, 0x04, 0x68, 0x61, 0x6c, 0x74, 0x12, 0x83, 0x01, 0x0a, 0x08, 0x61, 0x75, + 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x66, 0x2e, 0x6d, + 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, + 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, + 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x49, 0x6e, 0x44, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x41, 0x75, 0x74, + 0x6f, 0x4d, 0x61, 0x70, 0x48, 0x00, 0x52, 0x07, 0x61, 0x75, 0x74, 0x6f, 0x4d, 0x61, 0x70, 0x1a, + 0x0a, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x1a, 0x06, 0x0a, 0x04, 0x48, + 0x61, 0x6c, 0x74, 0x1a, 0x09, 0x0a, 0x07, 0x41, 0x75, 0x74, 0x6f, 0x4d, 0x61, 0x70, 0x42, 0x0a, + 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x1a, 0xd4, 0x07, 0x0a, 0x0d, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 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, 0x32, 0x0a, 0x12, 0x64, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x88, 0x01, 0x01, 0x12, 0x6a, 0x0a, + 0x0e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x0d, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x62, 0x0a, 0x0e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x36, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x01, 0x52, 0x0d, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, 0x65, 0x0a, + 0x0f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, + 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, + 0x02, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x88, 0x01, 0x01, 0x1a, 0xf8, 0x03, 0x0a, 0x0c, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x05, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x7a, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x51, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, + 0x62, 0x54, 0x79, 0x70, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x65, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, + 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, + 0x65, 0x53, 0x79, 0x6e, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x48, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x53, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x1a, 0x89, 0x01, 0x0a, 0x0d, 0x43, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x06, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x47, 0x0a, 0x0b, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x18, 0x02, 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, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x1a, + 0xf9, 0x07, 0x0a, 0x10, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x12, 0x5f, 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, + 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, + 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, + 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x53, 0x61, 0x6d, + 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x69, 0x0a, 0x11, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, + 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, + 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, + 0x0f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x12, 0x24, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x50, 0x72, 0x6f, + 0x6d, 0x70, 0x74, 0x88, 0x01, 0x01, 0x12, 0x60, 0x0a, 0x0b, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6d, 0x67, + 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, + 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, + 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2e, 0x49, 0x6e, 0x63, 0x72, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x48, 0x01, 0x52, 0x0b, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x1a, 0x2c, 0x0a, 0x0b, 0x49, 0x6e, 0x63, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x2d, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0xaf, 0x02, 0x0a, 0x0f, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x63, 0x61, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x0b, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2e, 0x49, 0x6e, - 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x48, 0x01, 0x52, 0x0b, 0x69, 0x6e, 0x63, - 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x1a, 0x2c, 0x0a, 0x0b, 0x49, - 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x2d, 0x0a, 0x0c, 0x44, 0x61, 0x74, - 0x61, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, - 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0xaf, 0x02, 0x0a, 0x0f, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x53, 0x63, 0x61, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x5b, 0x0a, 0x0b, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x38, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x12, 0x57, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, + 0x57, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, + 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x48, 0x00, 0x52, + 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x0d, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, + 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x1a, 0x0c, 0x0a, 0x0a, 0x49, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x1a, 0x80, 0x01, 0x0a, 0x0d, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x12, 0x55, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x2e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x12, 0x57, 0x0a, 0x07, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, - 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, - 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x12, 0x57, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, - 0x48, 0x00, 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x0d, 0x0a, 0x04, 0x6d, - 0x6f, 0x64, 0x65, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x1a, 0x0c, 0x0a, 0x0a, 0x49, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x1a, 0x80, 0x01, 0x0a, 0x0d, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x73, 0x12, 0x55, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x1a, 0x51, 0x0a, 0x0f, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 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, 0x42, 0x0e, - 0x0a, 0x0c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x42, 0x0e, - 0x0a, 0x0c, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x42, 0x11, - 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, - 0x00, 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, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x1a, 0x51, 0x0a, 0x0f, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 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, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x42, 0x11, 0x0a, 0x08, 0x6a, + 0x6f, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x00, 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, 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, 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, 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, 0xb9, 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, + 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, 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, 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, 0x12, - 0x37, 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 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, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x07, 0x6a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 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, + 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, 0xb9, 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, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 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, 0x12, 0x37, 0x0a, 0x08, + 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 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, 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, + 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x6a, 0x6f, + 0x62, 0x54, 0x79, 0x70, 0x65, 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, + 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, 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, - 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, + 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, 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, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, + 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, 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, + 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, 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, + 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, 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, 0xa2, 0x06, 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, 0x12, 0x37, 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x6a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 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, 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, 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, + 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, 0xa2, 0x06, 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, 0x12, 0x37, 0x0a, 0x08, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x07, 0x6a, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, + 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, 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, + 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, 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, 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, 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, + 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, - 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, + 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, - 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, 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, + 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, 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, + 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, - 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, + 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, 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, 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, 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, 0x22, 0x6e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 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, 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, 0x5a, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22, - 0xee, 0x04, 0x0a, 0x12, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x45, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x1a, 0x90, 0x04, - 0x0a, 0x0b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 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, 0x54, 0x0a, 0x07, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6d, - 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x69, 0x69, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x73, 0x1a, 0xfc, 0x02, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x68, 0x0a, 0x0c, 0x72, 0x65, - 0x67, 0x65, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x40, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x67, - 0x65, 0x78, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x65, 0x67, 0x65, 0x78, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x62, 0x0a, 0x0a, 0x6c, 0x6c, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x4c, 0x4c, 0x4d, 0x48, 0x01, 0x52, 0x09, 0x6c, 0x6c, 0x6d, 0x52, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x88, 0x01, 0x01, 0x1a, 0x23, 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, - 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x1a, 0x41, 0x0a, - 0x03, 0x4c, 0x4c, 0x4d, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, - 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, - 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6c, 0x6c, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, - 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, 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, 0xb0, 0x21, 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, 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, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x05, 0x68, 0x6f, 0x6f, 0x6b, 0x73, + 0x22, 0x6e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 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, 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, 0x5a, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x39, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xee, 0x04, 0x0a, + 0x12, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x12, 0x45, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x1a, 0x90, 0x04, 0x0a, 0x0b, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 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, 0x54, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6d, 0x67, 0x6d, 0x74, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x1a, 0xfc, + 0x02, 0x0a, 0x0c, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x68, 0x0a, 0x0c, 0x72, 0x65, 0x67, 0x65, 0x78, + 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, + 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x69, + 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x48, + 0x00, 0x52, 0x0b, 0x72, 0x65, 0x67, 0x65, 0x78, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x62, 0x0a, 0x0a, 0x6c, 0x6c, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x4c, 0x4c, 0x4d, 0x48, 0x01, 0x52, 0x09, 0x6c, 0x6c, 0x6d, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x88, 0x01, 0x01, 0x1a, 0x23, 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x1a, 0x41, 0x0a, 0x03, 0x4c, 0x4c, + 0x4d, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, + 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0f, 0x0a, + 0x0d, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x6c, 0x6c, 0x6d, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 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, + 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, 0xb0, 0x21, 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, 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, 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, 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, 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, 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, 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, - 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, + 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, 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, 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, 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, + 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, + 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, 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, 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, + 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, + 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, + 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, 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, + 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, + 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, 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, + 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, + 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, 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, 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, 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, 0x12, 0x77, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x2e, 0x6d, 0x67, 0x6d, - 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, - 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, + 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, + 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, + 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, 0x12, 0x77, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x69, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 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, + 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x6d, 0x67, 0x6d, 0x74, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x69, 0x69, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 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 ( @@ -14799,7 +16813,7 @@ func file_mgmt_v1alpha1_job_proto_rawDescGZIP() []byte { } var file_mgmt_v1alpha1_job_proto_enumTypes = make([]protoimpl.EnumInfo, 11) -var file_mgmt_v1alpha1_job_proto_msgTypes = make([]protoimpl.MessageInfo, 204) +var file_mgmt_v1alpha1_job_proto_msgTypes = make([]protoimpl.MessageInfo, 233) var file_mgmt_v1alpha1_job_proto_goTypes = []any{ (JobStatus)(0), // 0: mgmt.v1alpha1.JobStatus (ActivityStatus)(0), // 1: mgmt.v1alpha1.ActivityStatus @@ -14974,51 +16988,80 @@ var file_mgmt_v1alpha1_job_proto_goTypes = []any{ (*PostgresSourceConnectionOptions_ColumnRemovalStrategy)(nil), // 170: mgmt.v1alpha1.PostgresSourceConnectionOptions.ColumnRemovalStrategy (*PostgresSourceConnectionOptions_NewColumnAdditionStrategy_HaltJob)(nil), // 171: mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.HaltJob (*PostgresSourceConnectionOptions_NewColumnAdditionStrategy_AutoMap)(nil), // 172: mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.AutoMap - (*PostgresSourceConnectionOptions_NewColumnAdditionStrategy_Passthrough)(nil), // 173: mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.Passthrough - (*PostgresSourceConnectionOptions_ColumnRemovalStrategy_HaltJob)(nil), // 174: mgmt.v1alpha1.PostgresSourceConnectionOptions.ColumnRemovalStrategy.HaltJob - (*PostgresSourceConnectionOptions_ColumnRemovalStrategy_ContinueJob)(nil), // 175: mgmt.v1alpha1.PostgresSourceConnectionOptions.ColumnRemovalStrategy.ContinueJob - (*MysqlSourceConnectionOptions_ColumnRemovalStrategy)(nil), // 176: mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategy - (*MysqlSourceConnectionOptions_NewColumnAdditionStrategy)(nil), // 177: mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy - (*MysqlSourceConnectionOptions_ColumnRemovalStrategy_HaltJob)(nil), // 178: mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategy.HaltJob - (*MysqlSourceConnectionOptions_ColumnRemovalStrategy_ContinueJob)(nil), // 179: mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategy.ContinueJob - (*MysqlSourceConnectionOptions_NewColumnAdditionStrategy_HaltJob)(nil), // 180: mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.HaltJob - (*MysqlSourceConnectionOptions_NewColumnAdditionStrategy_AutoMap)(nil), // 181: mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.AutoMap - (*MysqlSourceConnectionOptions_NewColumnAdditionStrategy_Passthrough)(nil), // 182: mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.Passthrough - (*MssqlSourceConnectionOptions_ColumnRemovalStrategy)(nil), // 183: mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy - (*MssqlSourceConnectionOptions_NewColumnAdditionStrategy)(nil), // 184: mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy - (*MssqlSourceConnectionOptions_ColumnRemovalStrategy_HaltJob)(nil), // 185: mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy.HaltJob - (*MssqlSourceConnectionOptions_ColumnRemovalStrategy_ContinueJob)(nil), // 186: mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy.ContinueJob - (*MssqlSourceConnectionOptions_NewColumnAdditionStrategy_HaltJob)(nil), // 187: mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.HaltJob - (*MssqlSourceConnectionOptions_NewColumnAdditionStrategy_Passthrough)(nil), // 188: mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.Passthrough - (*PostgresOnConflictConfig_PostgresOnConflictDoNothing)(nil), // 189: mgmt.v1alpha1.PostgresOnConflictConfig.PostgresOnConflictDoNothing - (*PostgresOnConflictConfig_PostgresOnConflictUpdate)(nil), // 190: mgmt.v1alpha1.PostgresOnConflictConfig.PostgresOnConflictUpdate - (*MysqlOnConflictConfig_MysqlOnConflictDoNothing)(nil), // 191: mgmt.v1alpha1.MysqlOnConflictConfig.MysqlOnConflictDoNothing - (*MysqlOnConflictConfig_MysqlOnConflictUpdate)(nil), // 192: mgmt.v1alpha1.MysqlOnConflictConfig.MysqlOnConflictUpdate - (*JobTypeConfig_JobTypeSync)(nil), // 193: mgmt.v1alpha1.JobTypeConfig.JobTypeSync - (*JobTypeConfig_JobTypePiiDetect)(nil), // 194: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect - (*JobTypeConfig_JobTypePiiDetect_Incremental)(nil), // 195: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.Incremental - (*JobTypeConfig_JobTypePiiDetect_DataSampling)(nil), // 196: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.DataSampling - (*JobTypeConfig_JobTypePiiDetect_TableScanFilter)(nil), // 197: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilter - (*JobTypeConfig_JobTypePiiDetect_IncludeAll)(nil), // 198: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.IncludeAll - (*JobTypeConfig_JobTypePiiDetect_TablePatterns)(nil), // 199: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatterns - (*JobTypeConfig_JobTypePiiDetect_TableIdentifier)(nil), // 200: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableIdentifier - nil, // 201: mgmt.v1alpha1.GetJobRunLogsStreamResponse.LabelsEntry - (*GetJobRunLogsResponse_LogLine)(nil), // 202: mgmt.v1alpha1.GetJobRunLogsResponse.LogLine - nil, // 203: mgmt.v1alpha1.GetJobRunLogsResponse.LogLine.LabelsEntry - (*ColumnError_ColumnErrorReport)(nil), // 204: mgmt.v1alpha1.ColumnError.ColumnErrorReport - (*ColumnWarning_ColumnWarningReport)(nil), // 205: mgmt.v1alpha1.ColumnWarning.ColumnWarningReport - (*DatabaseError_DatabaseErrorReport)(nil), // 206: mgmt.v1alpha1.DatabaseError.DatabaseErrorReport - (*TableError_TableErrorReport)(nil), // 207: mgmt.v1alpha1.TableError.TableErrorReport - (*ValidateSchemaResponse_Table)(nil), // 208: mgmt.v1alpha1.ValidateSchemaResponse.Table - (*JobHookConfig_JobSqlHook)(nil), // 209: mgmt.v1alpha1.JobHookConfig.JobSqlHook - (*JobHookConfig_JobSqlHook_Timing)(nil), // 210: mgmt.v1alpha1.JobHookConfig.JobSqlHook.Timing - (*PiiDetectionReport_TableReport)(nil), // 211: mgmt.v1alpha1.PiiDetectionReport.TableReport - (*PiiDetectionReport_TableReport_ColumnReport)(nil), // 212: mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport - (*PiiDetectionReport_TableReport_ColumnReport_Regex)(nil), // 213: mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.Regex - (*PiiDetectionReport_TableReport_ColumnReport_LLM)(nil), // 214: mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.LLM - (*TransformerConfig)(nil), // 215: mgmt.v1alpha1.TransformerConfig - (*timestamppb.Timestamp)(nil), // 216: google.protobuf.Timestamp - (*DatabaseColumn)(nil), // 217: mgmt.v1alpha1.DatabaseColumn + (*PostgresSourceConnectionOptions_NewColumnAdditionStrategy_Passthrough)(nil), // 173: mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.Passthrough + (*PostgresSourceConnectionOptions_ColumnRemovalStrategy_HaltJob)(nil), // 174: mgmt.v1alpha1.PostgresSourceConnectionOptions.ColumnRemovalStrategy.HaltJob + (*PostgresSourceConnectionOptions_ColumnRemovalStrategy_ContinueJob)(nil), // 175: mgmt.v1alpha1.PostgresSourceConnectionOptions.ColumnRemovalStrategy.ContinueJob + (*MysqlSourceConnectionOptions_ColumnRemovalStrategy)(nil), // 176: mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategy + (*MysqlSourceConnectionOptions_NewColumnAdditionStrategy)(nil), // 177: mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy + (*MysqlSourceConnectionOptions_ColumnRemovalStrategy_HaltJob)(nil), // 178: mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategy.HaltJob + (*MysqlSourceConnectionOptions_ColumnRemovalStrategy_ContinueJob)(nil), // 179: mgmt.v1alpha1.MysqlSourceConnectionOptions.ColumnRemovalStrategy.ContinueJob + (*MysqlSourceConnectionOptions_NewColumnAdditionStrategy_HaltJob)(nil), // 180: mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.HaltJob + (*MysqlSourceConnectionOptions_NewColumnAdditionStrategy_AutoMap)(nil), // 181: mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.AutoMap + (*MysqlSourceConnectionOptions_NewColumnAdditionStrategy_Passthrough)(nil), // 182: mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.Passthrough + (*MssqlSourceConnectionOptions_ColumnRemovalStrategy)(nil), // 183: mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy + (*MssqlSourceConnectionOptions_NewColumnAdditionStrategy)(nil), // 184: mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy + (*MssqlSourceConnectionOptions_ColumnRemovalStrategy_HaltJob)(nil), // 185: mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy.HaltJob + (*MssqlSourceConnectionOptions_ColumnRemovalStrategy_ContinueJob)(nil), // 186: mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy.ContinueJob + (*MssqlSourceConnectionOptions_NewColumnAdditionStrategy_HaltJob)(nil), // 187: mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.HaltJob + (*MssqlSourceConnectionOptions_NewColumnAdditionStrategy_Passthrough)(nil), // 188: mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.Passthrough + (*PostgresOnConflictConfig_PostgresOnConflictDoNothing)(nil), // 189: mgmt.v1alpha1.PostgresOnConflictConfig.PostgresOnConflictDoNothing + (*PostgresOnConflictConfig_PostgresOnConflictUpdate)(nil), // 190: mgmt.v1alpha1.PostgresOnConflictConfig.PostgresOnConflictUpdate + (*MysqlOnConflictConfig_MysqlOnConflictDoNothing)(nil), // 191: mgmt.v1alpha1.MysqlOnConflictConfig.MysqlOnConflictDoNothing + (*MysqlOnConflictConfig_MysqlOnConflictUpdate)(nil), // 192: mgmt.v1alpha1.MysqlOnConflictConfig.MysqlOnConflictUpdate + (*JobTypeConfig_JobTypeSync)(nil), // 193: mgmt.v1alpha1.JobTypeConfig.JobTypeSync + (*JobTypeConfig_JobTypePiiDetect)(nil), // 194: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect + (*JobTypeConfig_JobTypeSync_SchemaChange)(nil), // 195: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange + (*JobTypeConfig_JobTypeSync_SchemaStrategy)(nil), // 196: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy + (*JobTypeConfig_JobTypeSync_TableStrategy)(nil), // 197: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy + (*JobTypeConfig_JobTypeSync_ColumnStrategy)(nil), // 198: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy + (*JobTypeConfig_JobTypeSync_SchemaMapping)(nil), // 199: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping + (*JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas)(nil), // 200: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas + (*JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas)(nil), // 201: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas + (*JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables)(nil), // 202: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables + (*JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables)(nil), // 203: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables + (*JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns)(nil), // 204: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns + (*JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns)(nil), // 205: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy)(nil), // 206: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy)(nil), // 207: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy)(nil), // 208: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy)(nil), // 209: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough)(nil), // 210: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap)(nil), // 211: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt)(nil), // 212: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop)(nil), // 213: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue)(nil), // 214: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt)(nil), // 215: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue)(nil), // 216: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop)(nil), // 217: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt)(nil), // 218: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue)(nil), // 219: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt)(nil), // 220: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap)(nil), // 221: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap + (*JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping)(nil), // 222: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping + (*JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping)(nil), // 223: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping + (*JobTypeConfig_JobTypePiiDetect_Incremental)(nil), // 224: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.Incremental + (*JobTypeConfig_JobTypePiiDetect_DataSampling)(nil), // 225: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.DataSampling + (*JobTypeConfig_JobTypePiiDetect_TableScanFilter)(nil), // 226: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilter + (*JobTypeConfig_JobTypePiiDetect_IncludeAll)(nil), // 227: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.IncludeAll + (*JobTypeConfig_JobTypePiiDetect_TablePatterns)(nil), // 228: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatterns + (*JobTypeConfig_JobTypePiiDetect_TableIdentifier)(nil), // 229: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableIdentifier + nil, // 230: mgmt.v1alpha1.GetJobRunLogsStreamResponse.LabelsEntry + (*GetJobRunLogsResponse_LogLine)(nil), // 231: mgmt.v1alpha1.GetJobRunLogsResponse.LogLine + nil, // 232: mgmt.v1alpha1.GetJobRunLogsResponse.LogLine.LabelsEntry + (*ColumnError_ColumnErrorReport)(nil), // 233: mgmt.v1alpha1.ColumnError.ColumnErrorReport + (*ColumnWarning_ColumnWarningReport)(nil), // 234: mgmt.v1alpha1.ColumnWarning.ColumnWarningReport + (*DatabaseError_DatabaseErrorReport)(nil), // 235: mgmt.v1alpha1.DatabaseError.DatabaseErrorReport + (*TableError_TableErrorReport)(nil), // 236: mgmt.v1alpha1.TableError.TableErrorReport + (*ValidateSchemaResponse_Table)(nil), // 237: mgmt.v1alpha1.ValidateSchemaResponse.Table + (*JobHookConfig_JobSqlHook)(nil), // 238: mgmt.v1alpha1.JobHookConfig.JobSqlHook + (*JobHookConfig_JobSqlHook_Timing)(nil), // 239: mgmt.v1alpha1.JobHookConfig.JobSqlHook.Timing + (*PiiDetectionReport_TableReport)(nil), // 240: mgmt.v1alpha1.PiiDetectionReport.TableReport + (*PiiDetectionReport_TableReport_ColumnReport)(nil), // 241: mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport + (*PiiDetectionReport_TableReport_ColumnReport_Regex)(nil), // 242: mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.Regex + (*PiiDetectionReport_TableReport_ColumnReport_LLM)(nil), // 243: mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.LLM + (*TransformerConfig)(nil), // 244: mgmt.v1alpha1.TransformerConfig + (*timestamppb.Timestamp)(nil), // 245: google.protobuf.Timestamp + (*DatabaseColumn)(nil), // 246: mgmt.v1alpha1.DatabaseColumn } var file_mgmt_v1alpha1_job_proto_depIdxs = []int32{ 94, // 0: mgmt.v1alpha1.GetJobsResponse.jobs:type_name -> mgmt.v1alpha1.Job @@ -15089,7 +17132,7 @@ var file_mgmt_v1alpha1_job_proto_depIdxs = []int32{ 194, // 65: mgmt.v1alpha1.JobTypeConfig.pii_detect:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect 57, // 66: mgmt.v1alpha1.ActivityOptions.retry_policy:type_name -> mgmt.v1alpha1.RetryPolicy 94, // 67: mgmt.v1alpha1.CreateJobResponse.job:type_name -> mgmt.v1alpha1.Job - 215, // 68: mgmt.v1alpha1.JobMappingTransformer.config:type_name -> mgmt.v1alpha1.TransformerConfig + 244, // 68: mgmt.v1alpha1.JobMappingTransformer.config:type_name -> mgmt.v1alpha1.TransformerConfig 59, // 69: mgmt.v1alpha1.JobMapping.transformer:type_name -> mgmt.v1alpha1.JobMappingTransformer 94, // 70: mgmt.v1alpha1.GetJobResponse.job:type_name -> mgmt.v1alpha1.Job 94, // 71: mgmt.v1alpha1.UpdateJobScheduleResponse.job:type_name -> mgmt.v1alpha1.Job @@ -15115,8 +17158,8 @@ var file_mgmt_v1alpha1_job_proto_depIdxs = []int32{ 94, // 91: mgmt.v1alpha1.CreateJobDestinationConnectionsResponse.job:type_name -> mgmt.v1alpha1.Job 108, // 92: mgmt.v1alpha1.GetJobRunsResponse.job_runs:type_name -> mgmt.v1alpha1.JobRun 108, // 93: mgmt.v1alpha1.GetJobRunResponse.job_run:type_name -> mgmt.v1alpha1.JobRun - 216, // 94: mgmt.v1alpha1.Job.created_at:type_name -> google.protobuf.Timestamp - 216, // 95: mgmt.v1alpha1.Job.updated_at:type_name -> google.protobuf.Timestamp + 245, // 94: mgmt.v1alpha1.Job.created_at:type_name -> google.protobuf.Timestamp + 245, // 95: mgmt.v1alpha1.Job.updated_at:type_name -> google.protobuf.Timestamp 13, // 96: mgmt.v1alpha1.Job.source:type_name -> mgmt.v1alpha1.JobSource 16, // 97: mgmt.v1alpha1.Job.destinations:type_name -> mgmt.v1alpha1.JobDestination 60, // 98: mgmt.v1alpha1.Job.mappings:type_name -> mgmt.v1alpha1.JobMapping @@ -15124,9 +17167,9 @@ var file_mgmt_v1alpha1_job_proto_depIdxs = []int32{ 55, // 100: mgmt.v1alpha1.Job.workflow_options:type_name -> mgmt.v1alpha1.WorkflowOptions 137, // 101: mgmt.v1alpha1.Job.virtual_foreign_keys:type_name -> mgmt.v1alpha1.VirtualForeignConstraint 54, // 102: mgmt.v1alpha1.Job.job_type:type_name -> mgmt.v1alpha1.JobTypeConfig - 216, // 103: mgmt.v1alpha1.JobRecentRun.start_time:type_name -> google.protobuf.Timestamp + 245, // 103: mgmt.v1alpha1.JobRecentRun.start_time:type_name -> google.protobuf.Timestamp 95, // 104: mgmt.v1alpha1.GetJobRecentRunsResponse.recent_runs:type_name -> mgmt.v1alpha1.JobRecentRun - 216, // 105: mgmt.v1alpha1.JobNextRuns.next_run_times:type_name -> google.protobuf.Timestamp + 245, // 105: mgmt.v1alpha1.JobNextRuns.next_run_times:type_name -> google.protobuf.Timestamp 98, // 106: mgmt.v1alpha1.GetJobNextRunsResponse.next_runs:type_name -> mgmt.v1alpha1.JobNextRuns 0, // 107: mgmt.v1alpha1.GetJobStatusResponse.status:type_name -> mgmt.v1alpha1.JobStatus 0, // 108: mgmt.v1alpha1.JobStatusRecord.status:type_name -> mgmt.v1alpha1.JobStatus @@ -15134,24 +17177,24 @@ var file_mgmt_v1alpha1_job_proto_depIdxs = []int32{ 1, // 110: mgmt.v1alpha1.PendingActivity.status:type_name -> mgmt.v1alpha1.ActivityStatus 106, // 111: mgmt.v1alpha1.PendingActivity.last_failure:type_name -> mgmt.v1alpha1.ActivityFailure 2, // 112: mgmt.v1alpha1.JobRun.status:type_name -> mgmt.v1alpha1.JobRunStatus - 216, // 113: mgmt.v1alpha1.JobRun.started_at:type_name -> google.protobuf.Timestamp - 216, // 114: mgmt.v1alpha1.JobRun.completed_at:type_name -> google.protobuf.Timestamp + 245, // 113: mgmt.v1alpha1.JobRun.started_at:type_name -> google.protobuf.Timestamp + 245, // 114: mgmt.v1alpha1.JobRun.completed_at:type_name -> google.protobuf.Timestamp 107, // 115: mgmt.v1alpha1.JobRun.pending_activities:type_name -> mgmt.v1alpha1.PendingActivity - 216, // 116: mgmt.v1alpha1.JobRunEventTask.event_time:type_name -> google.protobuf.Timestamp + 245, // 116: mgmt.v1alpha1.JobRunEventTask.event_time:type_name -> google.protobuf.Timestamp 109, // 117: mgmt.v1alpha1.JobRunEventTask.error:type_name -> mgmt.v1alpha1.JobRunEventTaskError 111, // 118: mgmt.v1alpha1.JobRunEventMetadata.sync_metadata:type_name -> mgmt.v1alpha1.JobRunSyncMetadata - 216, // 119: mgmt.v1alpha1.JobRunEvent.start_time:type_name -> google.protobuf.Timestamp - 216, // 120: mgmt.v1alpha1.JobRunEvent.close_time:type_name -> google.protobuf.Timestamp + 245, // 119: mgmt.v1alpha1.JobRunEvent.start_time:type_name -> google.protobuf.Timestamp + 245, // 120: mgmt.v1alpha1.JobRunEvent.close_time:type_name -> google.protobuf.Timestamp 112, // 121: mgmt.v1alpha1.JobRunEvent.metadata:type_name -> mgmt.v1alpha1.JobRunEventMetadata 110, // 122: mgmt.v1alpha1.JobRunEvent.tasks:type_name -> mgmt.v1alpha1.JobRunEventTask 113, // 123: mgmt.v1alpha1.GetJobRunEventsResponse.events:type_name -> mgmt.v1alpha1.JobRunEvent 3, // 124: mgmt.v1alpha1.GetJobRunLogsStreamRequest.window:type_name -> mgmt.v1alpha1.LogWindow 4, // 125: mgmt.v1alpha1.GetJobRunLogsStreamRequest.log_levels:type_name -> mgmt.v1alpha1.LogLevel - 216, // 126: mgmt.v1alpha1.GetJobRunLogsStreamResponse.timestamp:type_name -> google.protobuf.Timestamp - 201, // 127: mgmt.v1alpha1.GetJobRunLogsStreamResponse.labels:type_name -> mgmt.v1alpha1.GetJobRunLogsStreamResponse.LabelsEntry + 245, // 126: mgmt.v1alpha1.GetJobRunLogsStreamResponse.timestamp:type_name -> google.protobuf.Timestamp + 230, // 127: mgmt.v1alpha1.GetJobRunLogsStreamResponse.labels:type_name -> mgmt.v1alpha1.GetJobRunLogsStreamResponse.LabelsEntry 3, // 128: mgmt.v1alpha1.GetJobRunLogsRequest.window:type_name -> mgmt.v1alpha1.LogWindow 4, // 129: mgmt.v1alpha1.GetJobRunLogsRequest.log_levels:type_name -> mgmt.v1alpha1.LogLevel - 202, // 130: mgmt.v1alpha1.GetJobRunLogsResponse.log_lines:type_name -> mgmt.v1alpha1.GetJobRunLogsResponse.LogLine + 231, // 130: mgmt.v1alpha1.GetJobRunLogsResponse.log_lines:type_name -> mgmt.v1alpha1.GetJobRunLogsResponse.LogLine 55, // 131: mgmt.v1alpha1.SetJobWorkflowOptionsRequest.worfklow_options:type_name -> mgmt.v1alpha1.WorkflowOptions 94, // 132: mgmt.v1alpha1.SetJobWorkflowOptionsResponse.job:type_name -> mgmt.v1alpha1.Job 56, // 133: mgmt.v1alpha1.SetJobSyncOptionsRequest.sync_options:type_name -> mgmt.v1alpha1.ActivityOptions @@ -15159,27 +17202,27 @@ var file_mgmt_v1alpha1_job_proto_depIdxs = []int32{ 60, // 135: mgmt.v1alpha1.ValidateJobMappingsRequest.mappings:type_name -> mgmt.v1alpha1.JobMapping 137, // 136: mgmt.v1alpha1.ValidateJobMappingsRequest.virtual_foreign_keys:type_name -> mgmt.v1alpha1.VirtualForeignConstraint 13, // 137: mgmt.v1alpha1.ValidateJobMappingsRequest.job_source:type_name -> mgmt.v1alpha1.JobSource - 204, // 138: mgmt.v1alpha1.ColumnError.error_reports:type_name -> mgmt.v1alpha1.ColumnError.ColumnErrorReport - 205, // 139: mgmt.v1alpha1.ColumnWarning.warning_reports:type_name -> mgmt.v1alpha1.ColumnWarning.ColumnWarningReport - 206, // 140: mgmt.v1alpha1.DatabaseError.error_reports:type_name -> mgmt.v1alpha1.DatabaseError.DatabaseErrorReport - 207, // 141: mgmt.v1alpha1.TableError.error_reports:type_name -> mgmt.v1alpha1.TableError.TableErrorReport + 233, // 138: mgmt.v1alpha1.ColumnError.error_reports:type_name -> mgmt.v1alpha1.ColumnError.ColumnErrorReport + 234, // 139: mgmt.v1alpha1.ColumnWarning.warning_reports:type_name -> mgmt.v1alpha1.ColumnWarning.ColumnWarningReport + 235, // 140: mgmt.v1alpha1.DatabaseError.error_reports:type_name -> mgmt.v1alpha1.DatabaseError.DatabaseErrorReport + 236, // 141: mgmt.v1alpha1.TableError.error_reports:type_name -> mgmt.v1alpha1.TableError.TableErrorReport 129, // 142: mgmt.v1alpha1.ValidateJobMappingsResponse.column_errors:type_name -> mgmt.v1alpha1.ColumnError 131, // 143: mgmt.v1alpha1.ValidateJobMappingsResponse.database_errors:type_name -> mgmt.v1alpha1.DatabaseError 130, // 144: mgmt.v1alpha1.ValidateJobMappingsResponse.column_warnings:type_name -> mgmt.v1alpha1.ColumnWarning 132, // 145: mgmt.v1alpha1.ValidateJobMappingsResponse.table_errors:type_name -> mgmt.v1alpha1.TableError 60, // 146: mgmt.v1alpha1.ValidateSchemaRequest.mappings:type_name -> mgmt.v1alpha1.JobMapping - 217, // 147: mgmt.v1alpha1.ValidateSchemaResponse.missing_columns:type_name -> mgmt.v1alpha1.DatabaseColumn - 217, // 148: mgmt.v1alpha1.ValidateSchemaResponse.extra_columns:type_name -> mgmt.v1alpha1.DatabaseColumn - 208, // 149: mgmt.v1alpha1.ValidateSchemaResponse.missing_tables:type_name -> mgmt.v1alpha1.ValidateSchemaResponse.Table + 246, // 147: mgmt.v1alpha1.ValidateSchemaResponse.missing_columns:type_name -> mgmt.v1alpha1.DatabaseColumn + 246, // 148: mgmt.v1alpha1.ValidateSchemaResponse.extra_columns:type_name -> mgmt.v1alpha1.DatabaseColumn + 237, // 149: mgmt.v1alpha1.ValidateSchemaResponse.missing_tables:type_name -> mgmt.v1alpha1.ValidateSchemaResponse.Table 136, // 150: mgmt.v1alpha1.VirtualForeignConstraint.foreign_key:type_name -> mgmt.v1alpha1.VirtualForeignKey 138, // 151: mgmt.v1alpha1.GetRunContextRequest.id:type_name -> mgmt.v1alpha1.RunContextKey 138, // 152: mgmt.v1alpha1.SetRunContextRequest.id:type_name -> mgmt.v1alpha1.RunContextKey 138, // 153: mgmt.v1alpha1.SetRunContextsRequest.id:type_name -> mgmt.v1alpha1.RunContextKey 147, // 154: mgmt.v1alpha1.JobHook.config:type_name -> mgmt.v1alpha1.JobHookConfig - 216, // 155: mgmt.v1alpha1.JobHook.created_at:type_name -> google.protobuf.Timestamp - 216, // 156: mgmt.v1alpha1.JobHook.updated_at:type_name -> google.protobuf.Timestamp + 245, // 155: mgmt.v1alpha1.JobHook.created_at:type_name -> google.protobuf.Timestamp + 245, // 156: mgmt.v1alpha1.JobHook.updated_at:type_name -> google.protobuf.Timestamp 147, // 157: mgmt.v1alpha1.NewJobHook.config:type_name -> mgmt.v1alpha1.JobHookConfig - 209, // 158: mgmt.v1alpha1.JobHookConfig.sql:type_name -> mgmt.v1alpha1.JobHookConfig.JobSqlHook + 238, // 158: mgmt.v1alpha1.JobHookConfig.sql:type_name -> mgmt.v1alpha1.JobHookConfig.JobSqlHook 145, // 159: mgmt.v1alpha1.GetJobHooksResponse.hooks:type_name -> mgmt.v1alpha1.JobHook 145, // 160: mgmt.v1alpha1.GetJobHookResponse.hook:type_name -> mgmt.v1alpha1.JobHook 146, // 161: mgmt.v1alpha1.CreateJobHookRequest.hook:type_name -> mgmt.v1alpha1.NewJobHook @@ -15190,7 +17233,7 @@ var file_mgmt_v1alpha1_job_proto_depIdxs = []int32{ 10, // 166: mgmt.v1alpha1.GetActiveJobHooksByTimingRequest.timing:type_name -> mgmt.v1alpha1.GetActiveJobHooksByTimingRequest.Timing 145, // 167: mgmt.v1alpha1.GetActiveJobHooksByTimingResponse.hooks:type_name -> mgmt.v1alpha1.JobHook 168, // 168: mgmt.v1alpha1.GetPiiDetectionReportResponse.report:type_name -> mgmt.v1alpha1.PiiDetectionReport - 211, // 169: mgmt.v1alpha1.PiiDetectionReport.tables:type_name -> mgmt.v1alpha1.PiiDetectionReport.TableReport + 240, // 169: mgmt.v1alpha1.PiiDetectionReport.tables:type_name -> mgmt.v1alpha1.PiiDetectionReport.TableReport 171, // 170: mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.halt_job:type_name -> mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.HaltJob 172, // 171: mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.auto_map:type_name -> mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.AutoMap 173, // 172: mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.passthrough:type_name -> mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.Passthrough @@ -15205,112 +17248,147 @@ var file_mgmt_v1alpha1_job_proto_depIdxs = []int32{ 186, // 181: mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy.continue_job:type_name -> mgmt.v1alpha1.MssqlSourceConnectionOptions.ColumnRemovalStrategy.ContinueJob 187, // 182: mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.halt_job:type_name -> mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.HaltJob 188, // 183: mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.passthrough:type_name -> mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.Passthrough - 196, // 184: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.data_sampling:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.DataSampling - 197, // 185: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.table_scan_filter:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilter - 195, // 186: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.incremental:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.Incremental - 198, // 187: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilter.include_all:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.IncludeAll - 199, // 188: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilter.include:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatterns - 199, // 189: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilter.exclude:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatterns - 200, // 190: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatterns.tables:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableIdentifier - 216, // 191: mgmt.v1alpha1.GetJobRunLogsResponse.LogLine.timestamp:type_name -> google.protobuf.Timestamp - 203, // 192: mgmt.v1alpha1.GetJobRunLogsResponse.LogLine.labels:type_name -> mgmt.v1alpha1.GetJobRunLogsResponse.LogLine.LabelsEntry - 6, // 193: mgmt.v1alpha1.ColumnError.ColumnErrorReport.code:type_name -> mgmt.v1alpha1.ColumnError.ColumnErrorCode - 7, // 194: mgmt.v1alpha1.ColumnWarning.ColumnWarningReport.code:type_name -> mgmt.v1alpha1.ColumnWarning.ColumnWarningCode - 8, // 195: mgmt.v1alpha1.DatabaseError.DatabaseErrorReport.code:type_name -> mgmt.v1alpha1.DatabaseError.DatabaseErrorCode - 9, // 196: mgmt.v1alpha1.TableError.TableErrorReport.code:type_name -> mgmt.v1alpha1.TableError.TableErrorCode - 210, // 197: mgmt.v1alpha1.JobHookConfig.JobSqlHook.timing:type_name -> mgmt.v1alpha1.JobHookConfig.JobSqlHook.Timing - 148, // 198: mgmt.v1alpha1.JobHookConfig.JobSqlHook.Timing.pre_sync:type_name -> mgmt.v1alpha1.JobHookTimingPreSync - 149, // 199: mgmt.v1alpha1.JobHookConfig.JobSqlHook.Timing.post_sync:type_name -> mgmt.v1alpha1.JobHookTimingPostSync - 212, // 200: mgmt.v1alpha1.PiiDetectionReport.TableReport.columns:type_name -> mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport - 213, // 201: mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.regex_report:type_name -> mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.Regex - 214, // 202: mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.llm_report:type_name -> mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.LLM - 11, // 203: mgmt.v1alpha1.JobService.GetJobs:input_type -> mgmt.v1alpha1.GetJobsRequest - 61, // 204: mgmt.v1alpha1.JobService.GetJob:input_type -> mgmt.v1alpha1.GetJobRequest - 53, // 205: mgmt.v1alpha1.JobService.CreateJob:input_type -> mgmt.v1alpha1.CreateJobRequest - 82, // 206: mgmt.v1alpha1.JobService.DeleteJob:input_type -> mgmt.v1alpha1.DeleteJobRequest - 84, // 207: mgmt.v1alpha1.JobService.IsJobNameAvailable:input_type -> mgmt.v1alpha1.IsJobNameAvailableRequest - 63, // 208: mgmt.v1alpha1.JobService.UpdateJobSchedule:input_type -> mgmt.v1alpha1.UpdateJobScheduleRequest - 67, // 209: mgmt.v1alpha1.JobService.UpdateJobSourceConnection:input_type -> mgmt.v1alpha1.UpdateJobSourceConnectionRequest - 74, // 210: mgmt.v1alpha1.JobService.SetJobSourceSqlConnectionSubsets:input_type -> mgmt.v1alpha1.SetJobSourceSqlConnectionSubsetsRequest - 76, // 211: mgmt.v1alpha1.JobService.UpdateJobDestinationConnection:input_type -> mgmt.v1alpha1.UpdateJobDestinationConnectionRequest - 78, // 212: mgmt.v1alpha1.JobService.DeleteJobDestinationConnection:input_type -> mgmt.v1alpha1.DeleteJobDestinationConnectionRequest - 80, // 213: mgmt.v1alpha1.JobService.CreateJobDestinationConnections:input_type -> mgmt.v1alpha1.CreateJobDestinationConnectionsRequest - 65, // 214: mgmt.v1alpha1.JobService.PauseJob:input_type -> mgmt.v1alpha1.PauseJobRequest - 96, // 215: mgmt.v1alpha1.JobService.GetJobRecentRuns:input_type -> mgmt.v1alpha1.GetJobRecentRunsRequest - 99, // 216: mgmt.v1alpha1.JobService.GetJobNextRuns:input_type -> mgmt.v1alpha1.GetJobNextRunsRequest - 101, // 217: mgmt.v1alpha1.JobService.GetJobStatus:input_type -> mgmt.v1alpha1.GetJobStatusRequest - 104, // 218: mgmt.v1alpha1.JobService.GetJobStatuses:input_type -> mgmt.v1alpha1.GetJobStatusesRequest - 86, // 219: mgmt.v1alpha1.JobService.GetJobRuns:input_type -> mgmt.v1alpha1.GetJobRunsRequest - 114, // 220: mgmt.v1alpha1.JobService.GetJobRunEvents:input_type -> mgmt.v1alpha1.GetJobRunEventsRequest - 88, // 221: mgmt.v1alpha1.JobService.GetJobRun:input_type -> mgmt.v1alpha1.GetJobRunRequest - 116, // 222: mgmt.v1alpha1.JobService.DeleteJobRun:input_type -> mgmt.v1alpha1.DeleteJobRunRequest - 90, // 223: mgmt.v1alpha1.JobService.CreateJobRun:input_type -> mgmt.v1alpha1.CreateJobRunRequest - 92, // 224: mgmt.v1alpha1.JobService.CancelJobRun:input_type -> mgmt.v1alpha1.CancelJobRunRequest - 118, // 225: mgmt.v1alpha1.JobService.TerminateJobRun:input_type -> mgmt.v1alpha1.TerminateJobRunRequest - 120, // 226: mgmt.v1alpha1.JobService.GetJobRunLogsStream:input_type -> mgmt.v1alpha1.GetJobRunLogsStreamRequest - 122, // 227: mgmt.v1alpha1.JobService.GetJobRunLogs:input_type -> mgmt.v1alpha1.GetJobRunLogsRequest - 124, // 228: mgmt.v1alpha1.JobService.SetJobWorkflowOptions:input_type -> mgmt.v1alpha1.SetJobWorkflowOptionsRequest - 126, // 229: mgmt.v1alpha1.JobService.SetJobSyncOptions:input_type -> mgmt.v1alpha1.SetJobSyncOptionsRequest - 128, // 230: mgmt.v1alpha1.JobService.ValidateJobMappings:input_type -> mgmt.v1alpha1.ValidateJobMappingsRequest - 134, // 231: mgmt.v1alpha1.JobService.ValidateSchema:input_type -> mgmt.v1alpha1.ValidateSchemaRequest - 139, // 232: mgmt.v1alpha1.JobService.GetRunContext:input_type -> mgmt.v1alpha1.GetRunContextRequest - 141, // 233: mgmt.v1alpha1.JobService.SetRunContext:input_type -> mgmt.v1alpha1.SetRunContextRequest - 143, // 234: mgmt.v1alpha1.JobService.SetRunContexts:input_type -> mgmt.v1alpha1.SetRunContextsRequest - 150, // 235: mgmt.v1alpha1.JobService.GetJobHooks:input_type -> mgmt.v1alpha1.GetJobHooksRequest - 152, // 236: mgmt.v1alpha1.JobService.GetJobHook:input_type -> mgmt.v1alpha1.GetJobHookRequest - 154, // 237: mgmt.v1alpha1.JobService.CreateJobHook:input_type -> mgmt.v1alpha1.CreateJobHookRequest - 156, // 238: mgmt.v1alpha1.JobService.DeleteJobHook:input_type -> mgmt.v1alpha1.DeleteJobHookRequest - 158, // 239: mgmt.v1alpha1.JobService.IsJobHookNameAvailable:input_type -> mgmt.v1alpha1.IsJobHookNameAvailableRequest - 160, // 240: mgmt.v1alpha1.JobService.UpdateJobHook:input_type -> mgmt.v1alpha1.UpdateJobHookRequest - 162, // 241: mgmt.v1alpha1.JobService.SetJobHookEnabled:input_type -> mgmt.v1alpha1.SetJobHookEnabledRequest - 164, // 242: mgmt.v1alpha1.JobService.GetActiveJobHooksByTiming:input_type -> mgmt.v1alpha1.GetActiveJobHooksByTimingRequest - 166, // 243: mgmt.v1alpha1.JobService.GetPiiDetectionReport:input_type -> mgmt.v1alpha1.GetPiiDetectionReportRequest - 12, // 244: mgmt.v1alpha1.JobService.GetJobs:output_type -> mgmt.v1alpha1.GetJobsResponse - 62, // 245: mgmt.v1alpha1.JobService.GetJob:output_type -> mgmt.v1alpha1.GetJobResponse - 58, // 246: mgmt.v1alpha1.JobService.CreateJob:output_type -> mgmt.v1alpha1.CreateJobResponse - 83, // 247: mgmt.v1alpha1.JobService.DeleteJob:output_type -> mgmt.v1alpha1.DeleteJobResponse - 85, // 248: mgmt.v1alpha1.JobService.IsJobNameAvailable:output_type -> mgmt.v1alpha1.IsJobNameAvailableResponse - 64, // 249: mgmt.v1alpha1.JobService.UpdateJobSchedule:output_type -> mgmt.v1alpha1.UpdateJobScheduleResponse - 68, // 250: mgmt.v1alpha1.JobService.UpdateJobSourceConnection:output_type -> mgmt.v1alpha1.UpdateJobSourceConnectionResponse - 75, // 251: mgmt.v1alpha1.JobService.SetJobSourceSqlConnectionSubsets:output_type -> mgmt.v1alpha1.SetJobSourceSqlConnectionSubsetsResponse - 77, // 252: mgmt.v1alpha1.JobService.UpdateJobDestinationConnection:output_type -> mgmt.v1alpha1.UpdateJobDestinationConnectionResponse - 79, // 253: mgmt.v1alpha1.JobService.DeleteJobDestinationConnection:output_type -> mgmt.v1alpha1.DeleteJobDestinationConnectionResponse - 81, // 254: mgmt.v1alpha1.JobService.CreateJobDestinationConnections:output_type -> mgmt.v1alpha1.CreateJobDestinationConnectionsResponse - 66, // 255: mgmt.v1alpha1.JobService.PauseJob:output_type -> mgmt.v1alpha1.PauseJobResponse - 97, // 256: mgmt.v1alpha1.JobService.GetJobRecentRuns:output_type -> mgmt.v1alpha1.GetJobRecentRunsResponse - 100, // 257: mgmt.v1alpha1.JobService.GetJobNextRuns:output_type -> mgmt.v1alpha1.GetJobNextRunsResponse - 102, // 258: mgmt.v1alpha1.JobService.GetJobStatus:output_type -> mgmt.v1alpha1.GetJobStatusResponse - 105, // 259: mgmt.v1alpha1.JobService.GetJobStatuses:output_type -> mgmt.v1alpha1.GetJobStatusesResponse - 87, // 260: mgmt.v1alpha1.JobService.GetJobRuns:output_type -> mgmt.v1alpha1.GetJobRunsResponse - 115, // 261: mgmt.v1alpha1.JobService.GetJobRunEvents:output_type -> mgmt.v1alpha1.GetJobRunEventsResponse - 89, // 262: mgmt.v1alpha1.JobService.GetJobRun:output_type -> mgmt.v1alpha1.GetJobRunResponse - 117, // 263: mgmt.v1alpha1.JobService.DeleteJobRun:output_type -> mgmt.v1alpha1.DeleteJobRunResponse - 91, // 264: mgmt.v1alpha1.JobService.CreateJobRun:output_type -> mgmt.v1alpha1.CreateJobRunResponse - 93, // 265: mgmt.v1alpha1.JobService.CancelJobRun:output_type -> mgmt.v1alpha1.CancelJobRunResponse - 119, // 266: mgmt.v1alpha1.JobService.TerminateJobRun:output_type -> mgmt.v1alpha1.TerminateJobRunResponse - 121, // 267: mgmt.v1alpha1.JobService.GetJobRunLogsStream:output_type -> mgmt.v1alpha1.GetJobRunLogsStreamResponse - 123, // 268: mgmt.v1alpha1.JobService.GetJobRunLogs:output_type -> mgmt.v1alpha1.GetJobRunLogsResponse - 125, // 269: mgmt.v1alpha1.JobService.SetJobWorkflowOptions:output_type -> mgmt.v1alpha1.SetJobWorkflowOptionsResponse - 127, // 270: mgmt.v1alpha1.JobService.SetJobSyncOptions:output_type -> mgmt.v1alpha1.SetJobSyncOptionsResponse - 133, // 271: mgmt.v1alpha1.JobService.ValidateJobMappings:output_type -> mgmt.v1alpha1.ValidateJobMappingsResponse - 135, // 272: mgmt.v1alpha1.JobService.ValidateSchema:output_type -> mgmt.v1alpha1.ValidateSchemaResponse - 140, // 273: mgmt.v1alpha1.JobService.GetRunContext:output_type -> mgmt.v1alpha1.GetRunContextResponse - 142, // 274: mgmt.v1alpha1.JobService.SetRunContext:output_type -> mgmt.v1alpha1.SetRunContextResponse - 144, // 275: mgmt.v1alpha1.JobService.SetRunContexts:output_type -> mgmt.v1alpha1.SetRunContextsResponse - 151, // 276: mgmt.v1alpha1.JobService.GetJobHooks:output_type -> mgmt.v1alpha1.GetJobHooksResponse - 153, // 277: mgmt.v1alpha1.JobService.GetJobHook:output_type -> mgmt.v1alpha1.GetJobHookResponse - 155, // 278: mgmt.v1alpha1.JobService.CreateJobHook:output_type -> mgmt.v1alpha1.CreateJobHookResponse - 157, // 279: mgmt.v1alpha1.JobService.DeleteJobHook:output_type -> mgmt.v1alpha1.DeleteJobHookResponse - 159, // 280: mgmt.v1alpha1.JobService.IsJobHookNameAvailable:output_type -> mgmt.v1alpha1.IsJobHookNameAvailableResponse - 161, // 281: mgmt.v1alpha1.JobService.UpdateJobHook:output_type -> mgmt.v1alpha1.UpdateJobHookResponse - 163, // 282: mgmt.v1alpha1.JobService.SetJobHookEnabled:output_type -> mgmt.v1alpha1.SetJobHookEnabledResponse - 165, // 283: mgmt.v1alpha1.JobService.GetActiveJobHooksByTiming:output_type -> mgmt.v1alpha1.GetActiveJobHooksByTimingResponse - 167, // 284: mgmt.v1alpha1.JobService.GetPiiDetectionReport:output_type -> mgmt.v1alpha1.GetPiiDetectionReportResponse - 244, // [244:285] is the sub-list for method output_type - 203, // [203:244] is the sub-list for method input_type - 203, // [203:203] is the sub-list for extension type_name - 203, // [203:203] is the sub-list for extension extendee - 0, // [0:203] is the sub-list for field type_name + 195, // 184: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.schema_change:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange + 199, // 185: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.schema_mappings:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping + 225, // 186: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.data_sampling:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.DataSampling + 226, // 187: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.table_scan_filter:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilter + 224, // 188: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.incremental:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.Incremental + 196, // 189: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange.schema_strategy:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy + 197, // 190: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange.table_strategy:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy + 198, // 191: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange.column_strategy:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy + 200, // 192: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.map_all_schemas:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas + 201, // 193: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.map_defined_schemas:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas + 202, // 194: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.map_all_tables:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables + 203, // 195: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.map_defined_tables:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables + 204, // 196: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.map_all_columns:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns + 205, // 197: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.map_defined_columns:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns + 222, // 198: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.table_mappings:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping + 197, // 199: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.table_strategy:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy + 198, // 200: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.column_strategy:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy + 206, // 201: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns.column_in_source_not_mapped:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy + 207, // 202: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns.column_mapped_not_in_source:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy + 208, // 203: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns.column_in_source_mapped_not_in_destination:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy + 209, // 204: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns.column_in_destination_no_longer_in_source:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy + 207, // 205: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns.column_mapped_not_in_source:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy + 208, // 206: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns.column_in_source_mapped_not_in_destination:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy + 210, // 207: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.passthrough:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough + 211, // 208: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.auto_map:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap + 212, // 209: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.halt:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt + 213, // 210: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.drop:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop + 214, // 211: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.continue:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue + 215, // 212: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.halt:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt + 216, // 213: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.continue:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue + 217, // 214: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.drop:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop + 218, // 215: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.halt:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt + 219, // 216: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.continue:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue + 220, // 217: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.halt:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt + 221, // 218: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.auto_map:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap + 223, // 219: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.column_mappings:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping + 198, // 220: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.column_strategy:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy + 244, // 221: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping.transformer:type_name -> mgmt.v1alpha1.TransformerConfig + 227, // 222: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilter.include_all:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.IncludeAll + 228, // 223: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilter.include:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatterns + 228, // 224: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilter.exclude:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatterns + 229, // 225: mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatterns.tables:type_name -> mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableIdentifier + 245, // 226: mgmt.v1alpha1.GetJobRunLogsResponse.LogLine.timestamp:type_name -> google.protobuf.Timestamp + 232, // 227: mgmt.v1alpha1.GetJobRunLogsResponse.LogLine.labels:type_name -> mgmt.v1alpha1.GetJobRunLogsResponse.LogLine.LabelsEntry + 6, // 228: mgmt.v1alpha1.ColumnError.ColumnErrorReport.code:type_name -> mgmt.v1alpha1.ColumnError.ColumnErrorCode + 7, // 229: mgmt.v1alpha1.ColumnWarning.ColumnWarningReport.code:type_name -> mgmt.v1alpha1.ColumnWarning.ColumnWarningCode + 8, // 230: mgmt.v1alpha1.DatabaseError.DatabaseErrorReport.code:type_name -> mgmt.v1alpha1.DatabaseError.DatabaseErrorCode + 9, // 231: mgmt.v1alpha1.TableError.TableErrorReport.code:type_name -> mgmt.v1alpha1.TableError.TableErrorCode + 239, // 232: mgmt.v1alpha1.JobHookConfig.JobSqlHook.timing:type_name -> mgmt.v1alpha1.JobHookConfig.JobSqlHook.Timing + 148, // 233: mgmt.v1alpha1.JobHookConfig.JobSqlHook.Timing.pre_sync:type_name -> mgmt.v1alpha1.JobHookTimingPreSync + 149, // 234: mgmt.v1alpha1.JobHookConfig.JobSqlHook.Timing.post_sync:type_name -> mgmt.v1alpha1.JobHookTimingPostSync + 241, // 235: mgmt.v1alpha1.PiiDetectionReport.TableReport.columns:type_name -> mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport + 242, // 236: mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.regex_report:type_name -> mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.Regex + 243, // 237: mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.llm_report:type_name -> mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.LLM + 11, // 238: mgmt.v1alpha1.JobService.GetJobs:input_type -> mgmt.v1alpha1.GetJobsRequest + 61, // 239: mgmt.v1alpha1.JobService.GetJob:input_type -> mgmt.v1alpha1.GetJobRequest + 53, // 240: mgmt.v1alpha1.JobService.CreateJob:input_type -> mgmt.v1alpha1.CreateJobRequest + 82, // 241: mgmt.v1alpha1.JobService.DeleteJob:input_type -> mgmt.v1alpha1.DeleteJobRequest + 84, // 242: mgmt.v1alpha1.JobService.IsJobNameAvailable:input_type -> mgmt.v1alpha1.IsJobNameAvailableRequest + 63, // 243: mgmt.v1alpha1.JobService.UpdateJobSchedule:input_type -> mgmt.v1alpha1.UpdateJobScheduleRequest + 67, // 244: mgmt.v1alpha1.JobService.UpdateJobSourceConnection:input_type -> mgmt.v1alpha1.UpdateJobSourceConnectionRequest + 74, // 245: mgmt.v1alpha1.JobService.SetJobSourceSqlConnectionSubsets:input_type -> mgmt.v1alpha1.SetJobSourceSqlConnectionSubsetsRequest + 76, // 246: mgmt.v1alpha1.JobService.UpdateJobDestinationConnection:input_type -> mgmt.v1alpha1.UpdateJobDestinationConnectionRequest + 78, // 247: mgmt.v1alpha1.JobService.DeleteJobDestinationConnection:input_type -> mgmt.v1alpha1.DeleteJobDestinationConnectionRequest + 80, // 248: mgmt.v1alpha1.JobService.CreateJobDestinationConnections:input_type -> mgmt.v1alpha1.CreateJobDestinationConnectionsRequest + 65, // 249: mgmt.v1alpha1.JobService.PauseJob:input_type -> mgmt.v1alpha1.PauseJobRequest + 96, // 250: mgmt.v1alpha1.JobService.GetJobRecentRuns:input_type -> mgmt.v1alpha1.GetJobRecentRunsRequest + 99, // 251: mgmt.v1alpha1.JobService.GetJobNextRuns:input_type -> mgmt.v1alpha1.GetJobNextRunsRequest + 101, // 252: mgmt.v1alpha1.JobService.GetJobStatus:input_type -> mgmt.v1alpha1.GetJobStatusRequest + 104, // 253: mgmt.v1alpha1.JobService.GetJobStatuses:input_type -> mgmt.v1alpha1.GetJobStatusesRequest + 86, // 254: mgmt.v1alpha1.JobService.GetJobRuns:input_type -> mgmt.v1alpha1.GetJobRunsRequest + 114, // 255: mgmt.v1alpha1.JobService.GetJobRunEvents:input_type -> mgmt.v1alpha1.GetJobRunEventsRequest + 88, // 256: mgmt.v1alpha1.JobService.GetJobRun:input_type -> mgmt.v1alpha1.GetJobRunRequest + 116, // 257: mgmt.v1alpha1.JobService.DeleteJobRun:input_type -> mgmt.v1alpha1.DeleteJobRunRequest + 90, // 258: mgmt.v1alpha1.JobService.CreateJobRun:input_type -> mgmt.v1alpha1.CreateJobRunRequest + 92, // 259: mgmt.v1alpha1.JobService.CancelJobRun:input_type -> mgmt.v1alpha1.CancelJobRunRequest + 118, // 260: mgmt.v1alpha1.JobService.TerminateJobRun:input_type -> mgmt.v1alpha1.TerminateJobRunRequest + 120, // 261: mgmt.v1alpha1.JobService.GetJobRunLogsStream:input_type -> mgmt.v1alpha1.GetJobRunLogsStreamRequest + 122, // 262: mgmt.v1alpha1.JobService.GetJobRunLogs:input_type -> mgmt.v1alpha1.GetJobRunLogsRequest + 124, // 263: mgmt.v1alpha1.JobService.SetJobWorkflowOptions:input_type -> mgmt.v1alpha1.SetJobWorkflowOptionsRequest + 126, // 264: mgmt.v1alpha1.JobService.SetJobSyncOptions:input_type -> mgmt.v1alpha1.SetJobSyncOptionsRequest + 128, // 265: mgmt.v1alpha1.JobService.ValidateJobMappings:input_type -> mgmt.v1alpha1.ValidateJobMappingsRequest + 134, // 266: mgmt.v1alpha1.JobService.ValidateSchema:input_type -> mgmt.v1alpha1.ValidateSchemaRequest + 139, // 267: mgmt.v1alpha1.JobService.GetRunContext:input_type -> mgmt.v1alpha1.GetRunContextRequest + 141, // 268: mgmt.v1alpha1.JobService.SetRunContext:input_type -> mgmt.v1alpha1.SetRunContextRequest + 143, // 269: mgmt.v1alpha1.JobService.SetRunContexts:input_type -> mgmt.v1alpha1.SetRunContextsRequest + 150, // 270: mgmt.v1alpha1.JobService.GetJobHooks:input_type -> mgmt.v1alpha1.GetJobHooksRequest + 152, // 271: mgmt.v1alpha1.JobService.GetJobHook:input_type -> mgmt.v1alpha1.GetJobHookRequest + 154, // 272: mgmt.v1alpha1.JobService.CreateJobHook:input_type -> mgmt.v1alpha1.CreateJobHookRequest + 156, // 273: mgmt.v1alpha1.JobService.DeleteJobHook:input_type -> mgmt.v1alpha1.DeleteJobHookRequest + 158, // 274: mgmt.v1alpha1.JobService.IsJobHookNameAvailable:input_type -> mgmt.v1alpha1.IsJobHookNameAvailableRequest + 160, // 275: mgmt.v1alpha1.JobService.UpdateJobHook:input_type -> mgmt.v1alpha1.UpdateJobHookRequest + 162, // 276: mgmt.v1alpha1.JobService.SetJobHookEnabled:input_type -> mgmt.v1alpha1.SetJobHookEnabledRequest + 164, // 277: mgmt.v1alpha1.JobService.GetActiveJobHooksByTiming:input_type -> mgmt.v1alpha1.GetActiveJobHooksByTimingRequest + 166, // 278: mgmt.v1alpha1.JobService.GetPiiDetectionReport:input_type -> mgmt.v1alpha1.GetPiiDetectionReportRequest + 12, // 279: mgmt.v1alpha1.JobService.GetJobs:output_type -> mgmt.v1alpha1.GetJobsResponse + 62, // 280: mgmt.v1alpha1.JobService.GetJob:output_type -> mgmt.v1alpha1.GetJobResponse + 58, // 281: mgmt.v1alpha1.JobService.CreateJob:output_type -> mgmt.v1alpha1.CreateJobResponse + 83, // 282: mgmt.v1alpha1.JobService.DeleteJob:output_type -> mgmt.v1alpha1.DeleteJobResponse + 85, // 283: mgmt.v1alpha1.JobService.IsJobNameAvailable:output_type -> mgmt.v1alpha1.IsJobNameAvailableResponse + 64, // 284: mgmt.v1alpha1.JobService.UpdateJobSchedule:output_type -> mgmt.v1alpha1.UpdateJobScheduleResponse + 68, // 285: mgmt.v1alpha1.JobService.UpdateJobSourceConnection:output_type -> mgmt.v1alpha1.UpdateJobSourceConnectionResponse + 75, // 286: mgmt.v1alpha1.JobService.SetJobSourceSqlConnectionSubsets:output_type -> mgmt.v1alpha1.SetJobSourceSqlConnectionSubsetsResponse + 77, // 287: mgmt.v1alpha1.JobService.UpdateJobDestinationConnection:output_type -> mgmt.v1alpha1.UpdateJobDestinationConnectionResponse + 79, // 288: mgmt.v1alpha1.JobService.DeleteJobDestinationConnection:output_type -> mgmt.v1alpha1.DeleteJobDestinationConnectionResponse + 81, // 289: mgmt.v1alpha1.JobService.CreateJobDestinationConnections:output_type -> mgmt.v1alpha1.CreateJobDestinationConnectionsResponse + 66, // 290: mgmt.v1alpha1.JobService.PauseJob:output_type -> mgmt.v1alpha1.PauseJobResponse + 97, // 291: mgmt.v1alpha1.JobService.GetJobRecentRuns:output_type -> mgmt.v1alpha1.GetJobRecentRunsResponse + 100, // 292: mgmt.v1alpha1.JobService.GetJobNextRuns:output_type -> mgmt.v1alpha1.GetJobNextRunsResponse + 102, // 293: mgmt.v1alpha1.JobService.GetJobStatus:output_type -> mgmt.v1alpha1.GetJobStatusResponse + 105, // 294: mgmt.v1alpha1.JobService.GetJobStatuses:output_type -> mgmt.v1alpha1.GetJobStatusesResponse + 87, // 295: mgmt.v1alpha1.JobService.GetJobRuns:output_type -> mgmt.v1alpha1.GetJobRunsResponse + 115, // 296: mgmt.v1alpha1.JobService.GetJobRunEvents:output_type -> mgmt.v1alpha1.GetJobRunEventsResponse + 89, // 297: mgmt.v1alpha1.JobService.GetJobRun:output_type -> mgmt.v1alpha1.GetJobRunResponse + 117, // 298: mgmt.v1alpha1.JobService.DeleteJobRun:output_type -> mgmt.v1alpha1.DeleteJobRunResponse + 91, // 299: mgmt.v1alpha1.JobService.CreateJobRun:output_type -> mgmt.v1alpha1.CreateJobRunResponse + 93, // 300: mgmt.v1alpha1.JobService.CancelJobRun:output_type -> mgmt.v1alpha1.CancelJobRunResponse + 119, // 301: mgmt.v1alpha1.JobService.TerminateJobRun:output_type -> mgmt.v1alpha1.TerminateJobRunResponse + 121, // 302: mgmt.v1alpha1.JobService.GetJobRunLogsStream:output_type -> mgmt.v1alpha1.GetJobRunLogsStreamResponse + 123, // 303: mgmt.v1alpha1.JobService.GetJobRunLogs:output_type -> mgmt.v1alpha1.GetJobRunLogsResponse + 125, // 304: mgmt.v1alpha1.JobService.SetJobWorkflowOptions:output_type -> mgmt.v1alpha1.SetJobWorkflowOptionsResponse + 127, // 305: mgmt.v1alpha1.JobService.SetJobSyncOptions:output_type -> mgmt.v1alpha1.SetJobSyncOptionsResponse + 133, // 306: mgmt.v1alpha1.JobService.ValidateJobMappings:output_type -> mgmt.v1alpha1.ValidateJobMappingsResponse + 135, // 307: mgmt.v1alpha1.JobService.ValidateSchema:output_type -> mgmt.v1alpha1.ValidateSchemaResponse + 140, // 308: mgmt.v1alpha1.JobService.GetRunContext:output_type -> mgmt.v1alpha1.GetRunContextResponse + 142, // 309: mgmt.v1alpha1.JobService.SetRunContext:output_type -> mgmt.v1alpha1.SetRunContextResponse + 144, // 310: mgmt.v1alpha1.JobService.SetRunContexts:output_type -> mgmt.v1alpha1.SetRunContextsResponse + 151, // 311: mgmt.v1alpha1.JobService.GetJobHooks:output_type -> mgmt.v1alpha1.GetJobHooksResponse + 153, // 312: mgmt.v1alpha1.JobService.GetJobHook:output_type -> mgmt.v1alpha1.GetJobHookResponse + 155, // 313: mgmt.v1alpha1.JobService.CreateJobHook:output_type -> mgmt.v1alpha1.CreateJobHookResponse + 157, // 314: mgmt.v1alpha1.JobService.DeleteJobHook:output_type -> mgmt.v1alpha1.DeleteJobHookResponse + 159, // 315: mgmt.v1alpha1.JobService.IsJobHookNameAvailable:output_type -> mgmt.v1alpha1.IsJobHookNameAvailableResponse + 161, // 316: mgmt.v1alpha1.JobService.UpdateJobHook:output_type -> mgmt.v1alpha1.UpdateJobHookResponse + 163, // 317: mgmt.v1alpha1.JobService.SetJobHookEnabled:output_type -> mgmt.v1alpha1.SetJobHookEnabledResponse + 165, // 318: mgmt.v1alpha1.JobService.GetActiveJobHooksByTiming:output_type -> mgmt.v1alpha1.GetActiveJobHooksByTimingResponse + 167, // 319: mgmt.v1alpha1.JobService.GetPiiDetectionReport:output_type -> mgmt.v1alpha1.GetPiiDetectionReportResponse + 279, // [279:320] is the sub-list for method output_type + 238, // [238:279] is the sub-list for method input_type + 238, // [238:238] is the sub-list for extension type_name + 238, // [238:238] is the sub-list for extension extendee + 0, // [0:238] is the sub-list for field type_name } func init() { file_mgmt_v1alpha1_job_proto_init() } @@ -15417,25 +17495,64 @@ func file_mgmt_v1alpha1_job_proto_init() { (*MssqlSourceConnectionOptions_NewColumnAdditionStrategy_HaltJob_)(nil), (*MssqlSourceConnectionOptions_NewColumnAdditionStrategy_Passthrough_)(nil), } + file_mgmt_v1alpha1_job_proto_msgTypes[182].OneofWrappers = []any{} file_mgmt_v1alpha1_job_proto_msgTypes[183].OneofWrappers = []any{} + file_mgmt_v1alpha1_job_proto_msgTypes[184].OneofWrappers = []any{} + file_mgmt_v1alpha1_job_proto_msgTypes[185].OneofWrappers = []any{ + (*JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas_)(nil), + (*JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas_)(nil), + } file_mgmt_v1alpha1_job_proto_msgTypes[186].OneofWrappers = []any{ + (*JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables_)(nil), + (*JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables_)(nil), + } + file_mgmt_v1alpha1_job_proto_msgTypes[187].OneofWrappers = []any{ + (*JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_)(nil), + (*JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns_)(nil), + } + file_mgmt_v1alpha1_job_proto_msgTypes[188].OneofWrappers = []any{} + file_mgmt_v1alpha1_job_proto_msgTypes[193].OneofWrappers = []any{} + file_mgmt_v1alpha1_job_proto_msgTypes[194].OneofWrappers = []any{} + file_mgmt_v1alpha1_job_proto_msgTypes[195].OneofWrappers = []any{ + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough_)(nil), + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap_)(nil), + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt_)(nil), + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop_)(nil), + } + file_mgmt_v1alpha1_job_proto_msgTypes[196].OneofWrappers = []any{ + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue_)(nil), + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt_)(nil), + } + file_mgmt_v1alpha1_job_proto_msgTypes[197].OneofWrappers = []any{ + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue_)(nil), + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop_)(nil), + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt_)(nil), + } + file_mgmt_v1alpha1_job_proto_msgTypes[198].OneofWrappers = []any{ + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue_)(nil), + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt_)(nil), + (*JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap_)(nil), + } + file_mgmt_v1alpha1_job_proto_msgTypes[211].OneofWrappers = []any{} + file_mgmt_v1alpha1_job_proto_msgTypes[212].OneofWrappers = []any{} + file_mgmt_v1alpha1_job_proto_msgTypes[215].OneofWrappers = []any{ (*JobTypeConfig_JobTypePiiDetect_TableScanFilter_IncludeAll)(nil), (*JobTypeConfig_JobTypePiiDetect_TableScanFilter_Include)(nil), (*JobTypeConfig_JobTypePiiDetect_TableScanFilter_Exclude)(nil), } - file_mgmt_v1alpha1_job_proto_msgTypes[191].OneofWrappers = []any{} - file_mgmt_v1alpha1_job_proto_msgTypes[199].OneofWrappers = []any{ + file_mgmt_v1alpha1_job_proto_msgTypes[220].OneofWrappers = []any{} + file_mgmt_v1alpha1_job_proto_msgTypes[228].OneofWrappers = []any{ (*JobHookConfig_JobSqlHook_Timing_PreSync)(nil), (*JobHookConfig_JobSqlHook_Timing_PostSync)(nil), } - file_mgmt_v1alpha1_job_proto_msgTypes[201].OneofWrappers = []any{} + file_mgmt_v1alpha1_job_proto_msgTypes[230].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mgmt_v1alpha1_job_proto_rawDesc, NumEnums: 11, - NumMessages: 204, + NumMessages: 233, NumExtensions: 0, NumServices: 1, }, diff --git a/backend/gen/go/protos/mgmt/v1alpha1/job.pb.json.go b/backend/gen/go/protos/mgmt/v1alpha1/job.pb.json.go index bf45e041c3..ee45b919ac 100644 --- a/backend/gen/go/protos/mgmt/v1alpha1/job.pb.json.go +++ b/backend/gen/go/protos/mgmt/v1alpha1/job.pb.json.go @@ -697,6 +697,296 @@ func (msg *JobTypeConfig_JobTypeSync) UnmarshalJSON(b []byte) error { return protojson.UnmarshalOptions{}.Unmarshal(b, msg) } +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaChange) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaChange) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaStrategy) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaStrategy) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_TableStrategy) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_TableStrategy) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaMapping) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaMapping) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{}.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{}.Unmarshal(b, msg) +} + // MarshalJSON implements json.Marshaler func (msg *JobTypeConfig_JobTypePiiDetect) MarshalJSON() ([]byte, error) { return protojson.MarshalOptions{}.Marshal(msg) diff --git a/backend/protos/mgmt/v1alpha1/job.proto b/backend/protos/mgmt/v1alpha1/job.proto index 40cd9c842b..6f381d9113 100644 --- a/backend/protos/mgmt/v1alpha1/job.proto +++ b/backend/protos/mgmt/v1alpha1/job.proto @@ -539,11 +539,6 @@ message BatchConfig { } message CreateJobRequest { - option (buf.validate.message).cel = { - id: "mappings_required_for_sync" - message: "For sync jobs, at least one mapping is required" - expression: "!has(this.job_type) || has(this.job_type.sync) ? size(this.mappings) >= 1 : true" - }; option (buf.validate.message).cel = { id: "destinations_required_for_sync" message: "For sync jobs, at least one destination is required" @@ -591,7 +586,200 @@ message JobTypeConfig { } // The configuration for a data sync job - message JobTypeSync {} + message JobTypeSync { + // Specify job-wide schema change strategies that will be used to map data from the source to the destination. + // This acts as the default configuration for all schemas and tables unless overridden by a schema mapping at a lower level. + optional SchemaChange schema_change = 1; + + // Specify schema mappings that will be used to map data from the source to the destination + // This replaces the mappings field and is used to configure column transformers as well as re-wire destination schemas and tables. + repeated SchemaMapping schema_mappings = 2; + + // Configure how schemas, tables, and columns are handled during a job run. + // If anything is not defined, a system-defined fallback will be implemented. Further information can be found in the documentation. + message SchemaChange { + // Configure how schemas are handled during a job run + optional SchemaStrategy schema_strategy = 1; + // Configure how tables are handled during a job run + optional TableStrategy table_strategy = 2; + // Configure how columns are handled during a job run + optional ColumnStrategy column_strategy = 3; + } + + // The strategy used to configure how schemas are handled during a job run + message SchemaStrategy { + oneof strategy { + option (buf.validate.oneof).required = false; + // When this strategy is configured, all schemas are mapped + MapAllSchemas map_all_schemas = 1; + // When this strategy is configured, only the schemas that are defined are mapped + MapDefinedSchemas map_defined_schemas = 2; + } + + // When this strategy is configured, all schemas are mapped + message MapAllSchemas {} + // When this strategy is configured, only the schemas that are defined are mapped + message MapDefinedSchemas {} + } + + // The strategy used to configure how tables are handled during a job run + message TableStrategy { + oneof strategy { + option (buf.validate.oneof).required = false; + // When this strategy is configured, all tables are mapped + MapAllTables map_all_tables = 1; + // When this strategy is configured, only the tables that are defined are mapped + MapDefinedTables map_defined_tables = 2; + } + + // When this strategy is configured, all tables are mapped + message MapAllTables {} + // When this strategy is configured, only the tables that are defined are mapped + message MapDefinedTables {} + } + + // The strategy used to configure how columns are handled during a job run + message ColumnStrategy { + oneof strategy { + // 1. Map all columns + user-defined sub-strategies for each mismatch scenario + MapAllColumns map_all_columns = 1; + + // 2. Only map user-defined columns + sub-strategies for mismatch scenarios + MapDefinedColumns map_defined_columns = 2; + } + + // ------------------------------------------------------------- + // 1. MapAllColumns + // ------------------------------------------------------------- + message MapAllColumns { + // When a column is present in source but not mapped + optional ColumnInSourceNotMappedStrategy column_in_source_not_mapped = 1; + + // When a column is mapped but not in source + optional ColumnMappedNotInSourceStrategy column_mapped_not_in_source = 2; + + // When a column is in source + mapped, but missing in destination + optional ColumnInSourceMappedNotInDestinationStrategy column_in_source_mapped_not_in_destination = 3; + + // When a column is in the destination but not in source + optional ColumnInDestinationNotInSourceStrategy column_in_destination_no_longer_in_source = 4; + } + + // ------------------------------------------------------------- + // 2. MapDefinedColumns + // ------------------------------------------------------------- + message MapDefinedColumns { + // Mapped but missing in source + optional ColumnMappedNotInSourceStrategy column_mapped_not_in_source = 1; + + // In source + mapped, but missing in destination + optional ColumnInSourceMappedNotInDestinationStrategy column_in_source_mapped_not_in_destination = 2; + } + + // ------------------------------------------------------------- + // Sub-strategy definitions + // ------------------------------------------------------------- + + // a) Column present in source, not mapped + message ColumnInSourceNotMappedStrategy { + oneof strategy { + Passthrough passthrough = 1; + AutoMap auto_map = 2; + Halt halt = 3; + Drop drop = 4; + } + message Passthrough {} + message AutoMap {} + message Halt {} + message Drop {} + } + + // b) Column mapped, but not in source + message ColumnMappedNotInSourceStrategy { + oneof strategy { + Continue continue = 1; // e.g. treat as NULL or skip + Halt halt = 2; // fail the job + } + message Continue {} + message Halt {} + } + + // c) Column in source + mapped, but missing in destination + message ColumnInSourceMappedNotInDestinationStrategy { + oneof strategy { + // In your version, "Continue" = "if init_schema => create column, else skip" + Continue continue = 1; + Drop drop = 2; + Halt halt = 3; + } + message Continue {} + message Drop {} + message Halt {} + } + + // d) Column in destination, but not in source + message ColumnInDestinationNotInSourceStrategy { + oneof strategy { + // "Continue" => "if init_schema => drop column, else leave it alone" + Continue continue = 1; + Halt halt = 2; + AutoMap auto_map = 3; + } + message Continue {} + message Halt {} + message AutoMap {} + } + + // // e) In "MapDefinedColumns" mode: columns in source that aren't in the user mapping + // message UnknownSourceColumnStrategy { + // oneof strategy { + // Ignore ignore = 1; + // Halt halt = 2; + // } + // message Ignore {} + // message Halt {} + // } + } + + // Configuration for a specific schema mapping + message SchemaMapping { + // The database schema this mapping belongs to + string schema = 1 [(buf.validate.field).string.min_len = 1]; + // Optionally specify a destination schema that this mapping will go to + optional string destination_schema = 2; + + // The list of table mappings that will be used to map data from the source to the destination + repeated TableMapping table_mappings = 3; + + // Optionally specify a table strategy. This will override the global table strategy for this schema + optional TableStrategy table_strategy = 4; + + // Optionally specify a column strategy. This will override the global column strategy for this schema + optional ColumnStrategy column_strategy = 5; + + // Configuration for a specific table mapping in a schema + message TableMapping { + // The database table this mapping belongs to + string table = 1 [(buf.validate.field).string.min_len = 1]; + // Optionally specify a destination table that this mapping will go to + optional string destination_table = 2; + + // The list of column mappings that will be used to map data from the source to the destination + repeated ColumnMapping column_mappings = 3; + + // Optionally specify a column strategy. This will override the global column strategy for this table + optional ColumnStrategy column_strategy = 4; + + // Configuration for a specific column mapping in a table + message ColumnMapping { + // The column this mapping belongs to + string column = 1 [(buf.validate.field).string.min_len = 1]; + // The transformer configuration that will be applied to each cell in the column + optional TransformerConfig transformer = 2; + } + } + } + } message JobTypePiiDetect { // The configuration for data sampling diff --git a/docs/openapi/mgmt/v1alpha1/job.openapi.yaml b/docs/openapi/mgmt/v1alpha1/job.openapi.yaml index 5c2f2bad8f..5f023ed0ea 100644 --- a/docs/openapi/mgmt/v1alpha1/job.openapi.yaml +++ b/docs/openapi/mgmt/v1alpha1/job.openapi.yaml @@ -754,11 +754,6 @@ components: title: CreateJobRequest additionalProperties: false description: |+ - For sync jobs, at least one mapping is required: - ``` - !has(this.job_type) || has(this.job_type.sync) ? size(this.mappings) >= 1 : true - ``` - For sync jobs, at least one destination is required: ``` !has(this.job_type) || has(this.job_type.sync) ? size(this.destinations) >= 1 : true @@ -3176,9 +3171,687 @@ components: description: Filter configuration for table scanning mgmt.v1alpha1.JobTypeConfig.JobTypeSync: type: object + allOf: + - anyOf: + - required: + - schemaChange + - not: + anyOf: + - required: + - schemaChange + anyOf: + - required: + - schemaChange + - not: + anyOf: + - required: + - schemaChange + properties: + schemaChange: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange' + title: schema_change + description: |- + Specify job-wide schema change strategies that will be used to map data from the source to the destination. + This acts as the default configuration for all schemas and tables unless overridden by a schema mapping at a lower level. + schemaMappings: + type: array + items: + $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping' + title: schema_mappings + description: |- + Specify schema mappings that will be used to map data from the source to the destination + This replaces the mappings field and is used to configure column transformers as well as re-wire destination schemas and tables. title: JobTypeSync additionalProperties: false description: The configuration for a data sync job + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy: + type: object + allOf: + - anyOf: + - required: + - mapAllColumns + - required: + - mapDefinedColumns + - not: + anyOf: + - required: + - mapAllColumns + - required: + - mapDefinedColumns + anyOf: + - required: + - mapAllColumns + - required: + - mapDefinedColumns + - not: + anyOf: + - required: + - mapAllColumns + - required: + - mapDefinedColumns + properties: + mapAllColumns: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns' + title: map_all_columns + description: 1. Map all columns + user-defined sub-strategies for each mismatch scenario + mapDefinedColumns: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns' + title: map_defined_columns + description: 2. Only map user-defined columns + sub-strategies for mismatch scenarios + title: ColumnStrategy + additionalProperties: false + description: The strategy used to configure how columns are handled during a job run + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy: + type: object + allOf: + - anyOf: + - required: + - autoMap + - required: + - continue + - required: + - halt + - not: + anyOf: + - required: + - autoMap + - required: + - continue + - required: + - halt + anyOf: + - required: + - autoMap + - required: + - continue + - required: + - halt + - not: + anyOf: + - required: + - autoMap + - required: + - continue + - required: + - halt + properties: + continue: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue' + title: continue + description: '"Continue" => "if init_schema => drop column, else leave it alone"' + halt: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt' + title: halt + autoMap: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap' + title: auto_map + title: ColumnInDestinationNotInSourceStrategy + additionalProperties: false + description: d) Column in destination, but not in source + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap: + type: object + title: AutoMap + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue: + type: object + title: Continue + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt: + type: object + title: Halt + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy: + type: object + allOf: + - anyOf: + - required: + - continue + - required: + - drop + - required: + - halt + - not: + anyOf: + - required: + - continue + - required: + - drop + - required: + - halt + anyOf: + - required: + - continue + - required: + - drop + - required: + - halt + - not: + anyOf: + - required: + - continue + - required: + - drop + - required: + - halt + properties: + continue: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue' + title: continue + description: In your version, "Continue" = "if init_schema => create column, else skip" + drop: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop' + title: drop + halt: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt' + title: halt + title: ColumnInSourceMappedNotInDestinationStrategy + additionalProperties: false + description: c) Column in source + mapped, but missing in destination + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue: + type: object + title: Continue + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop: + type: object + title: Drop + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt: + type: object + title: Halt + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy: + type: object + allOf: + - anyOf: + - required: + - autoMap + - required: + - drop + - required: + - halt + - required: + - passthrough + - not: + anyOf: + - required: + - autoMap + - required: + - drop + - required: + - halt + - required: + - passthrough + anyOf: + - required: + - autoMap + - required: + - drop + - required: + - halt + - required: + - passthrough + - not: + anyOf: + - required: + - autoMap + - required: + - drop + - required: + - halt + - required: + - passthrough + properties: + passthrough: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough' + title: passthrough + autoMap: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap' + title: auto_map + halt: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt' + title: halt + drop: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop' + title: drop + title: ColumnInSourceNotMappedStrategy + additionalProperties: false + description: a) Column present in source, not mapped + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap: + type: object + title: AutoMap + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop: + type: object + title: Drop + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt: + type: object + title: Halt + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough: + type: object + title: Passthrough + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy: + type: object + allOf: + - anyOf: + - required: + - continue + - required: + - halt + - not: + anyOf: + - required: + - continue + - required: + - halt + anyOf: + - required: + - continue + - required: + - halt + - not: + anyOf: + - required: + - continue + - required: + - halt + properties: + continue: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue' + title: continue + description: e.g. treat as NULL or skip + halt: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt' + title: halt + description: fail the job + title: ColumnMappedNotInSourceStrategy + additionalProperties: false + description: b) Column mapped, but not in source + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue: + type: object + title: Continue + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt: + type: object + title: Halt + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns: + type: object + allOf: + - anyOf: + - required: + - columnInDestinationNoLongerInSource + - not: + anyOf: + - required: + - columnInDestinationNoLongerInSource + - anyOf: + - required: + - columnInSourceMappedNotInDestination + - not: + anyOf: + - required: + - columnInSourceMappedNotInDestination + - anyOf: + - required: + - columnInSourceNotMapped + - not: + anyOf: + - required: + - columnInSourceNotMapped + - anyOf: + - required: + - columnMappedNotInSource + - not: + anyOf: + - required: + - columnMappedNotInSource + properties: + columnInSourceNotMapped: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy' + title: column_in_source_not_mapped + description: When a column is present in source but not mapped + columnMappedNotInSource: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy' + title: column_mapped_not_in_source + description: When a column is mapped but not in source + columnInSourceMappedNotInDestination: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy' + title: column_in_source_mapped_not_in_destination + description: When a column is in source + mapped, but missing in destination + columnInDestinationNoLongerInSource: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy' + title: column_in_destination_no_longer_in_source + description: When a column is in the destination but not in source + title: MapAllColumns + additionalProperties: false + description: |- + ------------------------------------------------------------- + 1. MapAllColumns + ------------------------------------------------------------- + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns: + type: object + allOf: + - anyOf: + - required: + - columnInSourceMappedNotInDestination + - not: + anyOf: + - required: + - columnInSourceMappedNotInDestination + - anyOf: + - required: + - columnMappedNotInSource + - not: + anyOf: + - required: + - columnMappedNotInSource + properties: + columnMappedNotInSource: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy' + title: column_mapped_not_in_source + description: Mapped but missing in source + columnInSourceMappedNotInDestination: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy' + title: column_in_source_mapped_not_in_destination + description: In source + mapped, but missing in destination + title: MapDefinedColumns + additionalProperties: false + description: |- + ------------------------------------------------------------- + 2. MapDefinedColumns + ------------------------------------------------------------- + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange: + type: object + allOf: + - anyOf: + - required: + - columnStrategy + - not: + anyOf: + - required: + - columnStrategy + - anyOf: + - required: + - schemaStrategy + - not: + anyOf: + - required: + - schemaStrategy + - anyOf: + - required: + - tableStrategy + - not: + anyOf: + - required: + - tableStrategy + properties: + schemaStrategy: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy' + title: schema_strategy + description: Configure how schemas are handled during a job run + tableStrategy: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy' + title: table_strategy + description: Configure how tables are handled during a job run + columnStrategy: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy' + title: column_strategy + description: Configure how columns are handled during a job run + title: SchemaChange + additionalProperties: false + description: |- + Configure how schemas, tables, and columns are handled during a job run. + If anything is not defined, a system-defined fallback will be implemented. Further information can be found in the documentation. + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping: + type: object + allOf: + - anyOf: + - required: + - columnStrategy + - not: + anyOf: + - required: + - columnStrategy + - anyOf: + - required: + - destinationSchema + - not: + anyOf: + - required: + - destinationSchema + - anyOf: + - required: + - tableStrategy + - not: + anyOf: + - required: + - tableStrategy + properties: + schema: + type: string + title: schema + minLength: 1 + description: The database schema this mapping belongs to + destinationSchema: + type: string + title: destination_schema + description: Optionally specify a destination schema that this mapping will go to + tableMappings: + type: array + items: + $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping' + title: table_mappings + description: The list of table mappings that will be used to map data from the source to the destination + tableStrategy: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy' + title: table_strategy + description: Optionally specify a table strategy. This will override the global table strategy for this schema + columnStrategy: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy' + title: column_strategy + description: Optionally specify a column strategy. This will override the global column strategy for this schema + title: SchemaMapping + additionalProperties: false + description: Configuration for a specific schema mapping + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping: + type: object + allOf: + - anyOf: + - required: + - columnStrategy + - not: + anyOf: + - required: + - columnStrategy + - anyOf: + - required: + - destinationTable + - not: + anyOf: + - required: + - destinationTable + properties: + table: + type: string + title: table + minLength: 1 + description: The database table this mapping belongs to + destinationTable: + type: string + title: destination_table + description: Optionally specify a destination table that this mapping will go to + columnMappings: + type: array + items: + $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping' + title: column_mappings + description: The list of column mappings that will be used to map data from the source to the destination + columnStrategy: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy' + title: column_strategy + description: Optionally specify a column strategy. This will override the global column strategy for this table + title: TableMapping + additionalProperties: false + description: Configuration for a specific table mapping in a schema + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping: + type: object + allOf: + - anyOf: + - required: + - transformer + - not: + anyOf: + - required: + - transformer + anyOf: + - required: + - transformer + - not: + anyOf: + - required: + - transformer + properties: + column: + type: string + title: column + minLength: 1 + description: The column this mapping belongs to + transformer: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.TransformerConfig' + title: transformer + description: The transformer configuration that will be applied to each cell in the column + title: ColumnMapping + additionalProperties: false + description: Configuration for a specific column mapping in a table + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy: + type: object + allOf: + - anyOf: + - required: + - mapAllSchemas + - required: + - mapDefinedSchemas + - not: + anyOf: + - required: + - mapAllSchemas + - required: + - mapDefinedSchemas + anyOf: + - required: + - mapAllSchemas + - required: + - mapDefinedSchemas + - not: + anyOf: + - required: + - mapAllSchemas + - required: + - mapDefinedSchemas + properties: + mapAllSchemas: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas' + title: map_all_schemas + description: When this strategy is configured, all schemas are mapped + mapDefinedSchemas: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas' + title: map_defined_schemas + description: When this strategy is configured, only the schemas that are defined are mapped + title: SchemaStrategy + additionalProperties: false + description: The strategy used to configure how schemas are handled during a job run + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas: + type: object + title: MapAllSchemas + additionalProperties: false + description: When this strategy is configured, all schemas are mapped + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas: + type: object + title: MapDefinedSchemas + additionalProperties: false + description: When this strategy is configured, only the schemas that are defined are mapped + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy: + type: object + allOf: + - anyOf: + - required: + - mapAllTables + - required: + - mapDefinedTables + - not: + anyOf: + - required: + - mapAllTables + - required: + - mapDefinedTables + anyOf: + - required: + - mapAllTables + - required: + - mapDefinedTables + - not: + anyOf: + - required: + - mapAllTables + - required: + - mapDefinedTables + properties: + mapAllTables: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables' + title: map_all_tables + description: When this strategy is configured, all tables are mapped + mapDefinedTables: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables' + title: map_defined_tables + description: When this strategy is configured, only the tables that are defined are mapped + title: TableStrategy + additionalProperties: false + description: The strategy used to configure how tables are handled during a job run + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables: + type: object + title: MapAllTables + additionalProperties: false + description: When this strategy is configured, all tables are mapped + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables: + type: object + title: MapDefinedTables + additionalProperties: false + description: When this strategy is configured, only the tables that are defined are mapped mgmt.v1alpha1.MongoDBDestinationConnectionOptions: type: object title: MongoDBDestinationConnectionOptions diff --git a/docs/openapi/neosync.mgmt.v1alpha1.yaml b/docs/openapi/neosync.mgmt.v1alpha1.yaml index 4d7b31916c..5efba4680d 100644 --- a/docs/openapi/neosync.mgmt.v1alpha1.yaml +++ b/docs/openapi/neosync.mgmt.v1alpha1.yaml @@ -10980,16 +10980,6 @@ components: title: CreateJobRequest additionalProperties: false description: >+ - For sync jobs, at least one mapping is required: - - ``` - - !has(this.job_type) || has(this.job_type.sync) ? size(this.mappings) >= - 1 : true - - ``` - - For sync jobs, at least one destination is required: ``` @@ -12951,9 +12941,749 @@ components: description: Filter configuration for table scanning mgmt.v1alpha1.JobTypeConfig.JobTypeSync: type: object + allOf: + - anyOf: + - required: + - schemaChange + - not: + anyOf: + - required: + - schemaChange + anyOf: + - required: + - schemaChange + - not: + anyOf: + - required: + - schemaChange + properties: + schemaChange: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange + title: schema_change + description: >- + Specify job-wide schema change strategies that will be used to map + data from the source to the destination. + This acts as the default configuration for all schemas and tables unless overridden by a schema mapping at a lower level. + schemaMappings: + type: array + items: + $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping + title: schema_mappings + description: >- + Specify schema mappings that will be used to map data from the + source to the destination + This replaces the mappings field and is used to configure column transformers as well as re-wire destination schemas and tables. title: JobTypeSync additionalProperties: false description: The configuration for a data sync job + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy: + type: object + allOf: + - anyOf: + - required: + - mapAllColumns + - required: + - mapDefinedColumns + - not: + anyOf: + - required: + - mapAllColumns + - required: + - mapDefinedColumns + anyOf: + - required: + - mapAllColumns + - required: + - mapDefinedColumns + - not: + anyOf: + - required: + - mapAllColumns + - required: + - mapDefinedColumns + properties: + mapAllColumns: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns + title: map_all_columns + description: >- + 1. Map all columns + user-defined sub-strategies for each mismatch + scenario + mapDefinedColumns: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns + title: map_defined_columns + description: >- + 2. Only map user-defined columns + sub-strategies for mismatch + scenarios + title: ColumnStrategy + additionalProperties: false + description: The strategy used to configure how columns are handled during a job run + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy: + type: object + allOf: + - anyOf: + - required: + - autoMap + - required: + - continue + - required: + - halt + - not: + anyOf: + - required: + - autoMap + - required: + - continue + - required: + - halt + anyOf: + - required: + - autoMap + - required: + - continue + - required: + - halt + - not: + anyOf: + - required: + - autoMap + - required: + - continue + - required: + - halt + properties: + continue: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue + title: continue + description: '"Continue" => "if init_schema => drop column, else leave it alone"' + halt: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt + title: halt + autoMap: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap + title: auto_map + title: ColumnInDestinationNotInSourceStrategy + additionalProperties: false + description: d) Column in destination, but not in source + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap: + type: object + title: AutoMap + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue: + type: object + title: Continue + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt: + type: object + title: Halt + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy: + type: object + allOf: + - anyOf: + - required: + - continue + - required: + - drop + - required: + - halt + - not: + anyOf: + - required: + - continue + - required: + - drop + - required: + - halt + anyOf: + - required: + - continue + - required: + - drop + - required: + - halt + - not: + anyOf: + - required: + - continue + - required: + - drop + - required: + - halt + properties: + continue: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue + title: continue + description: >- + In your version, "Continue" = "if init_schema => create column, else + skip" + drop: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop + title: drop + halt: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt + title: halt + title: ColumnInSourceMappedNotInDestinationStrategy + additionalProperties: false + description: c) Column in source + mapped, but missing in destination + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue: + type: object + title: Continue + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop: + type: object + title: Drop + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt: + type: object + title: Halt + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy: + type: object + allOf: + - anyOf: + - required: + - autoMap + - required: + - drop + - required: + - halt + - required: + - passthrough + - not: + anyOf: + - required: + - autoMap + - required: + - drop + - required: + - halt + - required: + - passthrough + anyOf: + - required: + - autoMap + - required: + - drop + - required: + - halt + - required: + - passthrough + - not: + anyOf: + - required: + - autoMap + - required: + - drop + - required: + - halt + - required: + - passthrough + properties: + passthrough: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough + title: passthrough + autoMap: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap + title: auto_map + halt: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt + title: halt + drop: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop + title: drop + title: ColumnInSourceNotMappedStrategy + additionalProperties: false + description: a) Column present in source, not mapped + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap: + type: object + title: AutoMap + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop: + type: object + title: Drop + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt: + type: object + title: Halt + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough: + type: object + title: Passthrough + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy: + type: object + allOf: + - anyOf: + - required: + - continue + - required: + - halt + - not: + anyOf: + - required: + - continue + - required: + - halt + anyOf: + - required: + - continue + - required: + - halt + - not: + anyOf: + - required: + - continue + - required: + - halt + properties: + continue: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue + title: continue + description: e.g. treat as NULL or skip + halt: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt + title: halt + description: fail the job + title: ColumnMappedNotInSourceStrategy + additionalProperties: false + description: b) Column mapped, but not in source + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue: + type: object + title: Continue + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt: + type: object + title: Halt + additionalProperties: false + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns: + type: object + allOf: + - anyOf: + - required: + - columnInDestinationNoLongerInSource + - not: + anyOf: + - required: + - columnInDestinationNoLongerInSource + - anyOf: + - required: + - columnInSourceMappedNotInDestination + - not: + anyOf: + - required: + - columnInSourceMappedNotInDestination + - anyOf: + - required: + - columnInSourceNotMapped + - not: + anyOf: + - required: + - columnInSourceNotMapped + - anyOf: + - required: + - columnMappedNotInSource + - not: + anyOf: + - required: + - columnMappedNotInSource + properties: + columnInSourceNotMapped: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy + title: column_in_source_not_mapped + description: When a column is present in source but not mapped + columnMappedNotInSource: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy + title: column_mapped_not_in_source + description: When a column is mapped but not in source + columnInSourceMappedNotInDestination: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy + title: column_in_source_mapped_not_in_destination + description: When a column is in source + mapped, but missing in destination + columnInDestinationNoLongerInSource: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy + title: column_in_destination_no_longer_in_source + description: When a column is in the destination but not in source + title: MapAllColumns + additionalProperties: false + description: |- + ------------------------------------------------------------- + 1. MapAllColumns + ------------------------------------------------------------- + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns: + type: object + allOf: + - anyOf: + - required: + - columnInSourceMappedNotInDestination + - not: + anyOf: + - required: + - columnInSourceMappedNotInDestination + - anyOf: + - required: + - columnMappedNotInSource + - not: + anyOf: + - required: + - columnMappedNotInSource + properties: + columnMappedNotInSource: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy + title: column_mapped_not_in_source + description: Mapped but missing in source + columnInSourceMappedNotInDestination: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy + title: column_in_source_mapped_not_in_destination + description: In source + mapped, but missing in destination + title: MapDefinedColumns + additionalProperties: false + description: |- + ------------------------------------------------------------- + 2. MapDefinedColumns + ------------------------------------------------------------- + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange: + type: object + allOf: + - anyOf: + - required: + - columnStrategy + - not: + anyOf: + - required: + - columnStrategy + - anyOf: + - required: + - schemaStrategy + - not: + anyOf: + - required: + - schemaStrategy + - anyOf: + - required: + - tableStrategy + - not: + anyOf: + - required: + - tableStrategy + properties: + schemaStrategy: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy + title: schema_strategy + description: Configure how schemas are handled during a job run + tableStrategy: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy + title: table_strategy + description: Configure how tables are handled during a job run + columnStrategy: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy + title: column_strategy + description: Configure how columns are handled during a job run + title: SchemaChange + additionalProperties: false + description: |- + Configure how schemas, tables, and columns are handled during a job run. + If anything is not defined, a system-defined fallback will be implemented. Further information can be found in the documentation. + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping: + type: object + allOf: + - anyOf: + - required: + - columnStrategy + - not: + anyOf: + - required: + - columnStrategy + - anyOf: + - required: + - destinationSchema + - not: + anyOf: + - required: + - destinationSchema + - anyOf: + - required: + - tableStrategy + - not: + anyOf: + - required: + - tableStrategy + properties: + schema: + type: string + title: schema + minLength: 1 + description: The database schema this mapping belongs to + destinationSchema: + type: string + title: destination_schema + description: Optionally specify a destination schema that this mapping will go to + tableMappings: + type: array + items: + $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping + title: table_mappings + description: >- + The list of table mappings that will be used to map data from the + source to the destination + tableStrategy: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy + title: table_strategy + description: >- + Optionally specify a table strategy. This will override the global + table strategy for this schema + columnStrategy: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy + title: column_strategy + description: >- + Optionally specify a column strategy. This will override the global + column strategy for this schema + title: SchemaMapping + additionalProperties: false + description: Configuration for a specific schema mapping + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping: + type: object + allOf: + - anyOf: + - required: + - columnStrategy + - not: + anyOf: + - required: + - columnStrategy + - anyOf: + - required: + - destinationTable + - not: + anyOf: + - required: + - destinationTable + properties: + table: + type: string + title: table + minLength: 1 + description: The database table this mapping belongs to + destinationTable: + type: string + title: destination_table + description: Optionally specify a destination table that this mapping will go to + columnMappings: + type: array + items: + $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping + title: column_mappings + description: >- + The list of column mappings that will be used to map data from the + source to the destination + columnStrategy: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy + title: column_strategy + description: >- + Optionally specify a column strategy. This will override the global + column strategy for this table + title: TableMapping + additionalProperties: false + description: Configuration for a specific table mapping in a schema + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping: + type: object + allOf: + - anyOf: + - required: + - transformer + - not: + anyOf: + - required: + - transformer + anyOf: + - required: + - transformer + - not: + anyOf: + - required: + - transformer + properties: + column: + type: string + title: column + minLength: 1 + description: The column this mapping belongs to + transformer: + allOf: + - $ref: '#/components/schemas/mgmt.v1alpha1.TransformerConfig' + title: transformer + description: >- + The transformer configuration that will be applied to each cell in + the column + title: ColumnMapping + additionalProperties: false + description: Configuration for a specific column mapping in a table + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy: + type: object + allOf: + - anyOf: + - required: + - mapAllSchemas + - required: + - mapDefinedSchemas + - not: + anyOf: + - required: + - mapAllSchemas + - required: + - mapDefinedSchemas + anyOf: + - required: + - mapAllSchemas + - required: + - mapDefinedSchemas + - not: + anyOf: + - required: + - mapAllSchemas + - required: + - mapDefinedSchemas + properties: + mapAllSchemas: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas + title: map_all_schemas + description: When this strategy is configured, all schemas are mapped + mapDefinedSchemas: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas + title: map_defined_schemas + description: >- + When this strategy is configured, only the schemas that are defined + are mapped + title: SchemaStrategy + additionalProperties: false + description: The strategy used to configure how schemas are handled during a job run + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas: + type: object + title: MapAllSchemas + additionalProperties: false + description: When this strategy is configured, all schemas are mapped + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas: + type: object + title: MapDefinedSchemas + additionalProperties: false + description: >- + When this strategy is configured, only the schemas that are defined are + mapped + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy: + type: object + allOf: + - anyOf: + - required: + - mapAllTables + - required: + - mapDefinedTables + - not: + anyOf: + - required: + - mapAllTables + - required: + - mapDefinedTables + anyOf: + - required: + - mapAllTables + - required: + - mapDefinedTables + - not: + anyOf: + - required: + - mapAllTables + - required: + - mapDefinedTables + properties: + mapAllTables: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables + title: map_all_tables + description: When this strategy is configured, all tables are mapped + mapDefinedTables: + allOf: + - $ref: >- + #/components/schemas/mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables + title: map_defined_tables + description: >- + When this strategy is configured, only the tables that are defined + are mapped + title: TableStrategy + additionalProperties: false + description: The strategy used to configure how tables are handled during a job run + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables: + type: object + title: MapAllTables + additionalProperties: false + description: When this strategy is configured, all tables are mapped + mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables: + type: object + title: MapDefinedTables + additionalProperties: false + description: >- + When this strategy is configured, only the tables that are defined are + mapped mgmt.v1alpha1.MongoDBDestinationConnectionOptions: type: object title: MongoDBDestinationConnectionOptions diff --git a/docs/protos/mgmt/v1alpha1/job.proto.mdx b/docs/protos/mgmt/v1alpha1/job.proto.mdx index fc01acd917..65fa74fef5 100644 --- a/docs/protos/mgmt/v1alpha1/job.proto.mdx +++ b/docs/protos/mgmt/v1alpha1/job.proto.mdx @@ -470,367 +470,483 @@ _**package** mgmt.v1alpha1_ ### `JobTypeConfig.JobTypeSync` - + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy` + \"if init_schema => drop column, else leave it alone\"","label":"","type":"Continue","longType":"JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue","fullType":"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue","ismap":false,"isoneof":true,"oneofdecl":"strategy","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/job.proto#jobtypeconfigjobtypesynccolumnstrategycolumnindestinationnotinsourcestrategycontinue"},{"name":"halt","description":"","label":"","type":"Halt","longType":"JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt","fullType":"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt","ismap":false,"isoneof":true,"oneofdecl":"strategy","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/job.proto#jobtypeconfigjobtypesynccolumnstrategycolumnindestinationnotinsourcestrategyhalt"},{"name":"auto_map","description":"","label":"","type":"AutoMap","longType":"JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap","fullType":"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap","ismap":false,"isoneof":true,"oneofdecl":"strategy","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/job.proto#jobtypeconfigjobtypesynccolumnstrategycolumnindestinationnotinsourcestrategyautomap"}]}} /> + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy` + create column, else skip\"","label":"","type":"Continue","longType":"JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue","fullType":"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue","ismap":false,"isoneof":true,"oneofdecl":"strategy","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/job.proto#jobtypeconfigjobtypesynccolumnstrategycolumninsourcemappednotindestinationstrategycontinue"},{"name":"drop","description":"","label":"","type":"Drop","longType":"JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop","fullType":"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop","ismap":false,"isoneof":true,"oneofdecl":"strategy","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/job.proto#jobtypeconfigjobtypesynccolumnstrategycolumninsourcemappednotindestinationstrategydrop"},{"name":"halt","description":"","label":"","type":"Halt","longType":"JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt","fullType":"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt","ismap":false,"isoneof":true,"oneofdecl":"strategy","defaultValue":"","typeLink":"/api/mgmt/v1alpha1/job.proto#jobtypeconfigjobtypesynccolumnstrategycolumninsourcemappednotindestinationstrategyhalt"}]}} /> + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns` + + + +### `JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns` + + + +### `JobTypeConfig.JobTypeSync.SchemaChange` + + + +### `JobTypeConfig.JobTypeSync.SchemaMapping` + + + +### `JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping` + + + +### `JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping` + + + +### `JobTypeConfig.JobTypeSync.SchemaStrategy` + + + +### `JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas` + + + +### `JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas` + + + +### `JobTypeConfig.JobTypeSync.TableStrategy` + + + +### `JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables` + + + +### `JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables` + ### `MongoDBDestinationConnectionOptions` - + ### `MongoDBSourceConnectionOptions` - + ### `MssqlDestinationConnectionOptions` - + ### `MssqlOnConflictConfig` - + ### `MssqlSourceConnectionOptions` - + ### `MssqlSourceConnectionOptions.ColumnRemovalStrategy` - + ### `MssqlSourceConnectionOptions.ColumnRemovalStrategy.ContinueJob` - + ### `MssqlSourceConnectionOptions.ColumnRemovalStrategy.HaltJob` - + ### `MssqlSourceConnectionOptions.NewColumnAdditionStrategy` - + ### `MssqlSourceConnectionOptions.NewColumnAdditionStrategy.HaltJob` - + ### `MssqlSourceConnectionOptions.NewColumnAdditionStrategy.Passthrough` - + ### `MssqlSourceSchemaOption` - + ### `MssqlSourceSchemaSubset` - + ### `MssqlSourceTableOption` - + ### `MssqlTruncateTableConfig` - + ### `MysqlDestinationConnectionOptions` - + ### `MysqlOnConflictConfig` - + ### `MysqlOnConflictConfig.MysqlOnConflictDoNothing` - + ### `MysqlOnConflictConfig.MysqlOnConflictUpdate` - + ### `MysqlSourceConnectionOptions` - + ### `MysqlSourceConnectionOptions.ColumnRemovalStrategy` - + ### `MysqlSourceConnectionOptions.ColumnRemovalStrategy.ContinueJob` - + ### `MysqlSourceConnectionOptions.ColumnRemovalStrategy.HaltJob` - + ### `MysqlSourceConnectionOptions.NewColumnAdditionStrategy` - + ### `MysqlSourceConnectionOptions.NewColumnAdditionStrategy.AutoMap` - + ### `MysqlSourceConnectionOptions.NewColumnAdditionStrategy.HaltJob` - + ### `MysqlSourceConnectionOptions.NewColumnAdditionStrategy.Passthrough` - + ### `MysqlSourceSchemaOption` - + ### `MysqlSourceSchemaSubset` - + ### `MysqlSourceTableOption` - + ### `MysqlTruncateTableConfig` - + ### `NewJobHook` - + ### `PauseJobRequest` - + ### `PauseJobResponse` - + ### `PendingActivity` - + ### `PiiDetectionReport` - + ### `PiiDetectionReport.TableReport` - + ### `PiiDetectionReport.TableReport.ColumnReport` - + ### `PiiDetectionReport.TableReport.ColumnReport.LLM` - + ### `PiiDetectionReport.TableReport.ColumnReport.Regex` - + ### `PostgresDestinationConnectionOptions` - + ### `PostgresOnConflictConfig` - + ### `PostgresOnConflictConfig.PostgresOnConflictDoNothing` - + ### `PostgresOnConflictConfig.PostgresOnConflictUpdate` - + ### `PostgresSourceConnectionOptions` - + ### `PostgresSourceConnectionOptions.ColumnRemovalStrategy` - + ### `PostgresSourceConnectionOptions.ColumnRemovalStrategy.ContinueJob` - + ### `PostgresSourceConnectionOptions.ColumnRemovalStrategy.HaltJob` - + ### `PostgresSourceConnectionOptions.NewColumnAdditionStrategy` - + ### `PostgresSourceConnectionOptions.NewColumnAdditionStrategy.AutoMap` - + ### `PostgresSourceConnectionOptions.NewColumnAdditionStrategy.HaltJob` - + ### `PostgresSourceConnectionOptions.NewColumnAdditionStrategy.Passthrough` - + ### `PostgresSourceSchemaOption` - + ### `PostgresSourceSchemaSubset` - + ### `PostgresSourceTableOption` - + ### `PostgresTruncateTableConfig` - + ### `RetryPolicy` - + ### `RunContextKey` - + ### `SetJobHookEnabledRequest` - + ### `SetJobHookEnabledResponse` - + ### `SetJobSourceSqlConnectionSubsetsRequest` - + ### `SetJobSourceSqlConnectionSubsetsResponse` - + ### `SetJobSyncOptionsRequest` - + ### `SetJobSyncOptionsResponse` - + ### `SetJobWorkflowOptionsRequest` - + ### `SetJobWorkflowOptionsResponse` - + ### `SetRunContextRequest` - + ### `SetRunContextResponse` - + ### `SetRunContextsRequest` - + ### `SetRunContextsResponse` - + ### `TableError` - + ### `TableError.TableErrorReport` - + ### `TerminateJobRunRequest` - + ### `TerminateJobRunResponse` - + ### `UpdateJobDestinationConnectionRequest` - + ### `UpdateJobDestinationConnectionResponse` - + ### `UpdateJobHookRequest` - + ### `UpdateJobHookResponse` - + ### `UpdateJobScheduleRequest` - + ### `UpdateJobScheduleResponse` - + ### `UpdateJobSourceConnectionRequest` - + ### `UpdateJobSourceConnectionResponse` - + ### `ValidateJobMappingsRequest` - + ### `ValidateJobMappingsResponse` - + ### `ValidateSchemaRequest` - + ### `ValidateSchemaResponse` - + ### `ValidateSchemaResponse.Table` - + ### `VirtualForeignConstraint` - + ### `VirtualForeignKey` - + ### `WorkflowOptions` - + --- ## Enums diff --git a/docs/protos/proto_docs.json b/docs/protos/proto_docs.json index b1cea762ee..0a4010827c 100644 --- a/docs/protos/proto_docs.json +++ b/docs/protos/proto_docs.json @@ -15003,6 +15003,819 @@ "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync", "description": "The configuration for a data sync job", "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "schema_change", + "description": "Specify job-wide schema change strategies that will be used to map data from the source to the destination.\nThis acts as the default configuration for all schemas and tables unless overridden by a schema mapping at a lower level.", + "label": "optional", + "type": "SchemaChange", + "longType": "JobTypeConfig.JobTypeSync.SchemaChange", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange", + "ismap": false, + "isoneof": true, + "oneofdecl": "_schema_change", + "defaultValue": "" + }, + { + "name": "schema_mappings", + "description": "Specify schema mappings that will be used to map data from the source to the destination\nThis replaces the mappings field and is used to configure column transformers as well as re-wire destination schemas and tables.", + "label": "repeated", + "type": "SchemaMapping", + "longType": "JobTypeConfig.JobTypeSync.SchemaMapping", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "ColumnStrategy", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy", + "description": "The strategy used to configure how columns are handled during a job run", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "map_all_columns", + "description": "1. Map all columns + user-defined sub-strategies for each mismatch scenario", + "label": "", + "type": "MapAllColumns", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + }, + { + "name": "map_defined_columns", + "description": "2. Only map user-defined columns + sub-strategies for mismatch scenarios", + "label": "", + "type": "MapDefinedColumns", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + } + ] + }, + { + "name": "ColumnInDestinationNotInSourceStrategy", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy", + "description": "d) Column in destination, but not in source", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "continue", + "description": "\"Continue\" =\u003e \"if init_schema =\u003e drop column, else leave it alone\"", + "label": "", + "type": "Continue", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + }, + { + "name": "halt", + "description": "", + "label": "", + "type": "Halt", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + }, + { + "name": "auto_map", + "description": "", + "label": "", + "type": "AutoMap", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + } + ] + }, + { + "name": "AutoMap", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "Continue", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "Halt", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "ColumnInSourceMappedNotInDestinationStrategy", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy", + "description": "c) Column in source + mapped, but missing in destination", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "continue", + "description": "In your version, \"Continue\" = \"if init_schema =\u003e create column, else skip\"", + "label": "", + "type": "Continue", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + }, + { + "name": "drop", + "description": "", + "label": "", + "type": "Drop", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + }, + { + "name": "halt", + "description": "", + "label": "", + "type": "Halt", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + } + ] + }, + { + "name": "Continue", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "Drop", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "Halt", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "ColumnInSourceNotMappedStrategy", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy", + "description": "a) Column present in source, not mapped", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "passthrough", + "description": "", + "label": "", + "type": "Passthrough", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + }, + { + "name": "auto_map", + "description": "", + "label": "", + "type": "AutoMap", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + }, + { + "name": "halt", + "description": "", + "label": "", + "type": "Halt", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + }, + { + "name": "drop", + "description": "", + "label": "", + "type": "Drop", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + } + ] + }, + { + "name": "AutoMap", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "Drop", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "Halt", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "Passthrough", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "ColumnMappedNotInSourceStrategy", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy", + "description": "b) Column mapped, but not in source", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "continue", + "description": "e.g. treat as NULL or skip", + "label": "", + "type": "Continue", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + }, + { + "name": "halt", + "description": "fail the job", + "label": "", + "type": "Halt", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + } + ] + }, + { + "name": "Continue", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "Halt", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt", + "description": "", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "MapAllColumns", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns", + "description": "-------------------------------------------------------------\n1. MapAllColumns\n-------------------------------------------------------------", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "column_in_source_not_mapped", + "description": "When a column is present in source but not mapped", + "label": "optional", + "type": "ColumnInSourceNotMappedStrategy", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_column_in_source_not_mapped", + "defaultValue": "" + }, + { + "name": "column_mapped_not_in_source", + "description": "When a column is mapped but not in source", + "label": "optional", + "type": "ColumnMappedNotInSourceStrategy", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_column_mapped_not_in_source", + "defaultValue": "" + }, + { + "name": "column_in_source_mapped_not_in_destination", + "description": "When a column is in source + mapped, but missing in destination", + "label": "optional", + "type": "ColumnInSourceMappedNotInDestinationStrategy", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_column_in_source_mapped_not_in_destination", + "defaultValue": "" + }, + { + "name": "column_in_destination_no_longer_in_source", + "description": "When a column is in the destination but not in source", + "label": "optional", + "type": "ColumnInDestinationNotInSourceStrategy", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_column_in_destination_no_longer_in_source", + "defaultValue": "" + } + ] + }, + { + "name": "MapDefinedColumns", + "longName": "JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns", + "description": "-------------------------------------------------------------\n2. MapDefinedColumns\n-------------------------------------------------------------", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "column_mapped_not_in_source", + "description": "Mapped but missing in source", + "label": "optional", + "type": "ColumnMappedNotInSourceStrategy", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_column_mapped_not_in_source", + "defaultValue": "" + }, + { + "name": "column_in_source_mapped_not_in_destination", + "description": "In source + mapped, but missing in destination", + "label": "optional", + "type": "ColumnInSourceMappedNotInDestinationStrategy", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_column_in_source_mapped_not_in_destination", + "defaultValue": "" + } + ] + }, + { + "name": "SchemaChange", + "longName": "JobTypeConfig.JobTypeSync.SchemaChange", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange", + "description": "Configure how schemas, tables, and columns are handled during a job run.\nIf anything is not defined, a system-defined fallback will be implemented. Further information can be found in the documentation.", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "schema_strategy", + "description": "Configure how schemas are handled during a job run", + "label": "optional", + "type": "SchemaStrategy", + "longType": "JobTypeConfig.JobTypeSync.SchemaStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_schema_strategy", + "defaultValue": "" + }, + { + "name": "table_strategy", + "description": "Configure how tables are handled during a job run", + "label": "optional", + "type": "TableStrategy", + "longType": "JobTypeConfig.JobTypeSync.TableStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_table_strategy", + "defaultValue": "" + }, + { + "name": "column_strategy", + "description": "Configure how columns are handled during a job run", + "label": "optional", + "type": "ColumnStrategy", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_column_strategy", + "defaultValue": "" + } + ] + }, + { + "name": "SchemaMapping", + "longName": "JobTypeConfig.JobTypeSync.SchemaMapping", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping", + "description": "Configuration for a specific schema mapping", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "schema", + "description": "The database schema this mapping belongs to", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "destination_schema", + "description": "Optionally specify a destination schema that this mapping will go to", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_destination_schema", + "defaultValue": "" + }, + { + "name": "table_mappings", + "description": "The list of table mappings that will be used to map data from the source to the destination", + "label": "repeated", + "type": "TableMapping", + "longType": "JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "table_strategy", + "description": "Optionally specify a table strategy. This will override the global table strategy for this schema", + "label": "optional", + "type": "TableStrategy", + "longType": "JobTypeConfig.JobTypeSync.TableStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_table_strategy", + "defaultValue": "" + }, + { + "name": "column_strategy", + "description": "Optionally specify a column strategy. This will override the global column strategy for this schema", + "label": "optional", + "type": "ColumnStrategy", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_column_strategy", + "defaultValue": "" + } + ] + }, + { + "name": "TableMapping", + "longName": "JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping", + "description": "Configuration for a specific table mapping in a schema", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "table", + "description": "The database table this mapping belongs to", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "destination_table", + "description": "Optionally specify a destination table that this mapping will go to", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_destination_table", + "defaultValue": "" + }, + { + "name": "column_mappings", + "description": "The list of column mappings that will be used to map data from the source to the destination", + "label": "repeated", + "type": "ColumnMapping", + "longType": "JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "column_strategy", + "description": "Optionally specify a column strategy. This will override the global column strategy for this table", + "label": "optional", + "type": "ColumnStrategy", + "longType": "JobTypeConfig.JobTypeSync.ColumnStrategy", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy", + "ismap": false, + "isoneof": true, + "oneofdecl": "_column_strategy", + "defaultValue": "" + } + ] + }, + { + "name": "ColumnMapping", + "longName": "JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping", + "description": "Configuration for a specific column mapping in a table", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "column", + "description": "The column this mapping belongs to", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "transformer", + "description": "The transformer configuration that will be applied to each cell in the column", + "label": "optional", + "type": "TransformerConfig", + "longType": "TransformerConfig", + "fullType": "mgmt.v1alpha1.TransformerConfig", + "ismap": false, + "isoneof": true, + "oneofdecl": "_transformer", + "defaultValue": "" + } + ] + }, + { + "name": "SchemaStrategy", + "longName": "JobTypeConfig.JobTypeSync.SchemaStrategy", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy", + "description": "The strategy used to configure how schemas are handled during a job run", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "map_all_schemas", + "description": "When this strategy is configured, all schemas are mapped", + "label": "", + "type": "MapAllSchemas", + "longType": "JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + }, + { + "name": "map_defined_schemas", + "description": "When this strategy is configured, only the schemas that are defined are mapped", + "label": "", + "type": "MapDefinedSchemas", + "longType": "JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + } + ] + }, + { + "name": "MapAllSchemas", + "longName": "JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas", + "description": "When this strategy is configured, all schemas are mapped", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "MapDefinedSchemas", + "longName": "JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas", + "description": "When this strategy is configured, only the schemas that are defined are mapped", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "TableStrategy", + "longName": "JobTypeConfig.JobTypeSync.TableStrategy", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy", + "description": "The strategy used to configure how tables are handled during a job run", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "map_all_tables", + "description": "When this strategy is configured, all tables are mapped", + "label": "", + "type": "MapAllTables", + "longType": "JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + }, + { + "name": "map_defined_tables", + "description": "When this strategy is configured, only the tables that are defined are mapped", + "label": "", + "type": "MapDefinedTables", + "longType": "JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables", + "fullType": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables", + "ismap": false, + "isoneof": true, + "oneofdecl": "strategy", + "defaultValue": "" + } + ] + }, + { + "name": "MapAllTables", + "longName": "JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables", + "description": "When this strategy is configured, all tables are mapped", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "MapDefinedTables", + "longName": "JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables", + "fullName": "mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables", + "description": "When this strategy is configured, only the tables that are defined are mapped", + "hasExtensions": false, "hasFields": false, "hasOneofs": false, "extensions": [], 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 3e5d0eb791..fcd29e23c8 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/QEKJUR5bmFtb0RCU291cmNlVW5tYXBwZWRUcmFuc2Zvcm1Db25maWcSLwoBYhgBIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZ1RyYW5zZm9ybWVyEjUKB2Jvb2xlYW4YAiABKAsyJC5tZ210LnYxYWxwaGExLkpvYk1hcHBpbmdUcmFuc2Zvcm1lchIvCgFuGAQgASgLMiQubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nVHJhbnNmb3JtZXISLwoBcxgGIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZ1RyYW5zZm9ybWVySgQIAxAESgQIBRAGIl8KGUR5bmFtb0RCU291cmNlVGFibGVPcHRpb24SFgoFdGFibGUYASABKAlCB7pIBHICEAESGQoMd2hlcmVfY2xhdXNlGAIgASgJSACIAQFCDwoNX3doZXJlX2NsYXVzZSKaCAofUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucxI6CgdzY2hlbWFzGAIgAygLMikubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZVNjaGVtYU9wdGlvbhIfCg1jb25uZWN0aW9uX2lkGAMgASgJQgi6SAVyA7ABARIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYBCABKAgSbgocbmV3X2NvbHVtbl9hZGRpdGlvbl9zdHJhdGVneRgFIAEoCzJILm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5EmUKF2NvbHVtbl9yZW1vdmFsX3N0cmF0ZWd5GAYgASgLMkQubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneRqFAwoZTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneRJkCghoYWx0X2pvYhgBIAEoCzJQLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5LkhhbHRKb2JIABJkCghhdXRvX21hcBgCIAEoCzJQLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5LkF1dG9NYXBIABJrCgtwYXNzdGhyb3VnaBgDIAEoCzJULm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5LlBhc3N0aHJvdWdoSAAaCQoHSGFsdEpvYhoJCgdBdXRvTWFwGg0KC1Bhc3N0aHJvdWdoQgoKCHN0cmF0ZWd5GokCChVDb2x1bW5SZW1vdmFsU3RyYXRlZ3kSYAoIaGFsdF9qb2IYASABKAsyTC5tZ210LnYxYWxwaGExLlBvc3RncmVzU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5LkhhbHRKb2JIABJoCgxjb250aW51ZV9qb2IYAiABKAsyUC5tZ210LnYxYWxwaGExLlBvc3RncmVzU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5LkNvbnRpbnVlSm9iSAAaCQoHSGFsdEpvYhoNCgtDb250aW51ZUpvYkIKCghzdHJhdGVneUoECAEQAiJ5ChpQb3N0Z3Jlc1NvdXJjZVNjaGVtYU9wdGlvbhIXCgZzY2hlbWEYASABKAlCB7pIBHICEAESQgoGdGFibGVzGAIgAygLMigubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZVRhYmxlT3B0aW9uQgi6SAWSAQIIASJfChlQb3N0Z3Jlc1NvdXJjZVRhYmxlT3B0aW9uEhYKBXRhYmxlGAEgASgJQge6SARyAhABEhkKDHdoZXJlX2NsYXVzZRgCIAEoCUgAiAEBQg8KDV93aGVyZV9jbGF1c2UioggKHE15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMSJwobaGFsdF9vbl9uZXdfY29sdW1uX2FkZGl0aW9uGAEgASgIQgIYARI3CgdzY2hlbWFzGAIgAygLMiYubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZVNjaGVtYU9wdGlvbhIfCg1jb25uZWN0aW9uX2lkGAMgASgJQgi6SAVyA7ABARIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYBCABKAgSYgoXY29sdW1uX3JlbW92YWxfc3RyYXRlZ3kYBSABKAsyQS5tZ210LnYxYWxwaGExLk15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5EmsKHG5ld19jb2x1bW5fYWRkaXRpb25fc3RyYXRlZ3kYBiABKAsyRS5tZ210LnYxYWxwaGExLk15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneRqDAgoVQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5El0KCGhhbHRfam9iGAEgASgLMkkubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5IYWx0Sm9iSAASZQoMY29udGludWVfam9iGAIgASgLMk0ubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5Db250aW51ZUpvYkgAGgkKB0hhbHRKb2IaDQoLQ29udGludWVKb2JCCgoIc3RyYXRlZ3ka/AIKGU5ld0NvbHVtbkFkZGl0aW9uU3RyYXRlZ3kSYQoIaGFsdF9qb2IYASABKAsyTS5tZ210LnYxYWxwaGExLk15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneS5IYWx0Sm9iSAASYQoIYXV0b19tYXAYAiABKAsyTS5tZ210LnYxYWxwaGExLk15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneS5BdXRvTWFwSAASaAoLcGFzc3Rocm91Z2gYAyABKAsyUS5tZ210LnYxYWxwaGExLk15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneS5QYXNzdGhyb3VnaEgAGgkKB0hhbHRKb2IaCQoHQXV0b01hcBoNCgtQYXNzdGhyb3VnaEIKCghzdHJhdGVneSJzChdNeXNxbFNvdXJjZVNjaGVtYU9wdGlvbhIXCgZzY2hlbWEYASABKAlCB7pIBHICEAESPwoGdGFibGVzGAIgAygLMiUubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZVRhYmxlT3B0aW9uQgi6SAWSAQIIASJcChZNeXNxbFNvdXJjZVRhYmxlT3B0aW9uEhYKBXRhYmxlGAEgASgJQge6SARyAhABEhkKDHdoZXJlX2NsYXVzZRgCIAEoCUgAiAEBQg8KDV93aGVyZV9jbGF1c2UitAcKHE1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMSJwobaGFsdF9vbl9uZXdfY29sdW1uX2FkZGl0aW9uGAEgASgIQgIYARI3CgdzY2hlbWFzGAIgAygLMiYubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZVNjaGVtYU9wdGlvbhIfCg1jb25uZWN0aW9uX2lkGAMgASgJQgi6SAVyA7ABARIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYBCABKAgSYgoXY29sdW1uX3JlbW92YWxfc3RyYXRlZ3kYBSABKAsyQS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5EmsKHG5ld19jb2x1bW5fYWRkaXRpb25fc3RyYXRlZ3kYBiABKAsyRS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneRqDAgoVQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5El0KCGhhbHRfam9iGAEgASgLMkkubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5IYWx0Sm9iSAASZQoMY29udGludWVfam9iGAIgASgLMk0ubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5Db250aW51ZUpvYkgAGgkKB0hhbHRKb2IaDQoLQ29udGludWVKb2JCCgoIc3RyYXRlZ3kajgIKGU5ld0NvbHVtbkFkZGl0aW9uU3RyYXRlZ3kSYQoIaGFsdF9qb2IYASABKAsyTS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneS5IYWx0Sm9iSAASaAoLcGFzc3Rocm91Z2gYAiABKAsyUS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneS5QYXNzdGhyb3VnaEgAGgkKB0hhbHRKb2IaDQoLUGFzc3Rocm91Z2hCCgoIc3RyYXRlZ3kicwoXTXNzcWxTb3VyY2VTY2hlbWFPcHRpb24SFwoGc2NoZW1hGAEgASgJQge6SARyAhABEj8KBnRhYmxlcxgCIAMoCzIlLm1nbXQudjFhbHBoYTEuTXNzcWxTb3VyY2VUYWJsZU9wdGlvbkIIukgFkgECCAEiXAoWTXNzcWxTb3VyY2VUYWJsZU9wdGlvbhIWCgV0YWJsZRgBIAEoCUIHukgEcgIQARIZCgx3aGVyZV9jbGF1c2UYAiABKAlIAIgBAUIPCg1fd2hlcmVfY2xhdXNlIj8KHEF3c1MzU291cmNlQ29ubmVjdGlvbk9wdGlvbnMSHwoNY29ubmVjdGlvbl9pZBgBIAEoCUIIukgFcgOwAQEi2wQKFUpvYkRlc3RpbmF0aW9uT3B0aW9ucxJPChBwb3N0Z3Jlc19vcHRpb25zGAEgASgLMjMubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc0Rlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnNIABJKCg5hd3NfczNfb3B0aW9ucxgCIAEoCzIwLm1nbXQudjFhbHBoYTEuQXdzUzNEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSAASSQoNbXlzcWxfb3B0aW9ucxgDIAEoCzIwLm1nbXQudjFhbHBoYTEuTXlzcWxEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSAASTQoPbW9uZ29kYl9vcHRpb25zGAQgASgLMjIubWdtdC52MWFscGhhMS5Nb25nb0RCRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9uc0gAEl4KGGdjcF9jbG91ZHN0b3JhZ2Vfb3B0aW9ucxgFIAEoCzI6Lm1nbXQudjFhbHBoYTEuR2NwQ2xvdWRTdG9yYWdlRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9uc0gAEk8KEGR5bmFtb2RiX29wdGlvbnMYBiABKAsyMy5tZ210LnYxYWxwaGExLkR5bmFtb0RCRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9uc0gAEkkKDW1zc3FsX29wdGlvbnMYByABKAsyMC5tZ210LnYxYWxwaGExLk1zc3FsRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9uc0gAQg8KBmNvbmZpZxIFukgCCAEiJQojTW9uZ29EQkRlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMiLQorR2NwQ2xvdWRTdG9yYWdlRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucyJuCiREeW5hbW9EQkRlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMSRgoOdGFibGVfbWFwcGluZ3MYASADKAsyLi5tZ210LnYxYWxwaGExLkR5bmFtb0RCRGVzdGluYXRpb25UYWJsZU1hcHBpbmciUgofRHluYW1vREJEZXN0aW5hdGlvblRhYmxlTWFwcGluZxIUCgxzb3VyY2VfdGFibGUYASABKAkSGQoRZGVzdGluYXRpb25fdGFibGUYAiABKAkiygIKJFBvc3RncmVzRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucxJCCg50cnVuY2F0ZV90YWJsZRgBIAEoCzIqLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNUcnVuY2F0ZVRhYmxlQ29uZmlnEhkKEWluaXRfdGFibGVfc2NoZW1hGAIgASgIEjwKC29uX2NvbmZsaWN0GAMgASgLMicubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc09uQ29uZmxpY3RDb25maWcSIwobc2tpcF9mb3JlaWduX2tleV92aW9sYXRpb25zGAQgASgIEikKBWJhdGNoGAUgASgLMhoubWdtdC52MWFscGhhMS5CYXRjaENvbmZpZxIjCg1tYXhfaW5fZmxpZ2h0GAYgASgNQge6SAQqAigBSACIAQFCEAoOX21heF9pbl9mbGlnaHQirAIKGFBvc3RncmVzT25Db25mbGljdENvbmZpZxIWCgpkb19ub3RoaW5nGAEgASgIQgIYARJWCgdub3RoaW5nGAIgASgLMkMubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc09uQ29uZmxpY3RDb25maWcuUG9zdGdyZXNPbkNvbmZsaWN0RG9Ob3RoaW5nSAASUgoGdXBkYXRlGAMgASgLMkAubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc09uQ29uZmxpY3RDb25maWcuUG9zdGdyZXNPbkNvbmZsaWN0VXBkYXRlSAAaHQobUG9zdGdyZXNPbkNvbmZsaWN0RG9Ob3RoaW5nGhoKGFBvc3RncmVzT25Db25mbGljdFVwZGF0ZUIRCghzdHJhdGVneRIFukgCCAAiTgobUG9zdGdyZXNUcnVuY2F0ZVRhYmxlQ29uZmlnEh4KFnRydW5jYXRlX2JlZm9yZV9pbnNlcnQYASABKAgSDwoHY2FzY2FkZRgCIAEoCCLBAgohTXlzcWxEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zEj8KDnRydW5jYXRlX3RhYmxlGAEgASgLMicubWdtdC52MWFscGhhMS5NeXNxbFRydW5jYXRlVGFibGVDb25maWcSGQoRaW5pdF90YWJsZV9zY2hlbWEYAiABKAgSOQoLb25fY29uZmxpY3QYAyABKAsyJC5tZ210LnYxYWxwaGExLk15c3FsT25Db25mbGljdENvbmZpZxIjChtza2lwX2ZvcmVpZ25fa2V5X3Zpb2xhdGlvbnMYBCABKAgSKQoFYmF0Y2gYBSABKAsyGi5tZ210LnYxYWxwaGExLkJhdGNoQ29uZmlnEiMKDW1heF9pbl9mbGlnaHQYBiABKA1CB7pIBCoCKAFIAIgBAUIQCg5fbWF4X2luX2ZsaWdodCI6ChhNeXNxbFRydW5jYXRlVGFibGVDb25maWcSHgoWdHJ1bmNhdGVfYmVmb3JlX2luc2VydBgBIAEoCCKTAgoVTXlzcWxPbkNvbmZsaWN0Q29uZmlnEhIKCmRvX25vdGhpbmcYASABKAgSUAoHbm90aGluZxgCIAEoCzI9Lm1nbXQudjFhbHBoYTEuTXlzcWxPbkNvbmZsaWN0Q29uZmlnLk15c3FsT25Db25mbGljdERvTm90aGluZ0gAEkwKBnVwZGF0ZRgDIAEoCzI6Lm1nbXQudjFhbHBoYTEuTXlzcWxPbkNvbmZsaWN0Q29uZmlnLk15c3FsT25Db25mbGljdFVwZGF0ZUgAGhoKGE15c3FsT25Db25mbGljdERvTm90aGluZxoXChVNeXNxbE9uQ29uZmxpY3RVcGRhdGVCEQoIc3RyYXRlZ3kSBbpIAggAIsECCiFNc3NxbERlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMSPwoOdHJ1bmNhdGVfdGFibGUYASABKAsyJy5tZ210LnYxYWxwaGExLk1zc3FsVHJ1bmNhdGVUYWJsZUNvbmZpZxIZChFpbml0X3RhYmxlX3NjaGVtYRgCIAEoCBI5Cgtvbl9jb25mbGljdBgDIAEoCzIkLm1nbXQudjFhbHBoYTEuTXNzcWxPbkNvbmZsaWN0Q29uZmlnEiMKG3NraXBfZm9yZWlnbl9rZXlfdmlvbGF0aW9ucxgEIAEoCBIpCgViYXRjaBgFIAEoCzIaLm1nbXQudjFhbHBoYTEuQmF0Y2hDb25maWcSIwoNbWF4X2luX2ZsaWdodBgGIAEoDUIHukgEKgIoAUgAiAEBQhAKDl9tYXhfaW5fZmxpZ2h0IjoKGE1zc3FsVHJ1bmNhdGVUYWJsZUNvbmZpZxIeChZ0cnVuY2F0ZV9iZWZvcmVfaW5zZXJ0GAEgASgIIisKFU1zc3FsT25Db25mbGljdENvbmZpZxISCgpkb19ub3RoaW5nGAEgASgIIo4ECiFBd3NTM0Rlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMSVAoNc3RvcmFnZV9jbGFzcxgBIAEoDjI9Lm1nbXQudjFhbHBoYTEuQXdzUzNEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zLlN0b3JhZ2VDbGFzcxIjCg1tYXhfaW5fZmxpZ2h0GAIgASgNQge6SAQqAigBSACIAQESFAoHdGltZW91dBgDIAEoCUgBiAEBEikKBWJhdGNoGAQgASgLMhoubWdtdC52MWFscGhhMS5CYXRjaENvbmZpZyKOAgoMU3RvcmFnZUNsYXNzEh0KGVNUT1JBR0VfQ0xBU1NfVU5TUEVDSUZJRUQQABIaChZTVE9SQUdFX0NMQVNTX1NUQU5EQVJEEAESJAogU1RPUkFHRV9DTEFTU19SRURVQ0VEX1JFRFVOREFOQ1kQAhIZChVTVE9SQUdFX0NMQVNTX0dMQUNJRVIQAxIdChlTVE9SQUdFX0NMQVNTX1NUQU5EQVJEX0lBEAQSHAoYU1RPUkFHRV9DTEFTU19PTkVaT05FX0lBEAUSJQohU1RPUkFHRV9DTEFTU19JTlRFTExJR0VOVF9USUVSSU5HEAYSHgoaU1RPUkFHRV9DTEFTU19ERUVQX0FSQ0hJVkUQB0IQCg5fbWF4X2luX2ZsaWdodEIKCghfdGltZW91dCJLCgtCYXRjaENvbmZpZxISCgVjb3VudBgBIAEoDUgAiAEBEhMKBnBlcmlvZBgCIAEoCUgBiAEBQggKBl9jb3VudEIJCgdfcGVyaW9kIocHChBDcmVhdGVKb2JSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEisKCGpvYl9uYW1lGAIgASgJQhm6SBZyFDISXlthLXowLTktXXszLDEwMH0kEhoKDWNyb25fc2NoZWR1bGUYAyABKAlIAIgBARIrCghtYXBwaW5ncxgEIAMoCzIZLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZxIoCgZzb3VyY2UYBSABKAsyGC5tZ210LnYxYWxwaGExLkpvYlNvdXJjZRI5CgxkZXN0aW5hdGlvbnMYBiADKAsyIy5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYkRlc3RpbmF0aW9uEhgKEGluaXRpYXRlX2pvYl9ydW4YByABKAgSOAoQd29ya2Zsb3dfb3B0aW9ucxgIIAEoCzIeLm1nbXQudjFhbHBoYTEuV29ya2Zsb3dPcHRpb25zEjQKDHN5bmNfb3B0aW9ucxgJIAEoCzIeLm1nbXQudjFhbHBoYTEuQWN0aXZpdHlPcHRpb25zEkUKFHZpcnR1YWxfZm9yZWlnbl9rZXlzGAogAygLMicubWdtdC52MWFscGhhMS5WaXJ0dWFsRm9yZWlnbkNvbnN0cmFpbnQSMwoIam9iX3R5cGUYCyABKAsyHC5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWdIAYgBATrUArpI0AIanwEKGm1hcHBpbmdzX3JlcXVpcmVkX2Zvcl9zeW5jEi9Gb3Igc3luYyBqb2JzLCBhdCBsZWFzdCBvbmUgbWFwcGluZyBpcyByZXF1aXJlZBpQIWhhcyh0aGlzLmpvYl90eXBlKSB8fCBoYXModGhpcy5qb2JfdHlwZS5zeW5jKSA/IHNpemUodGhpcy5tYXBwaW5ncykgPj0gMSA6IHRydWUaqwEKHmRlc3RpbmF0aW9uc19yZXF1aXJlZF9mb3Jfc3luYxIzRm9yIHN5bmMgam9icywgYXQgbGVhc3Qgb25lIGRlc3RpbmF0aW9uIGlzIHJlcXVpcmVkGlQhaGFzKHRoaXMuam9iX3R5cGUpIHx8IGhhcyh0aGlzLmpvYl90eXBlLnN5bmMpID8gc2l6ZSh0aGlzLmRlc3RpbmF0aW9ucykgPj0gMSA6IHRydWVCEAoOX2Nyb25fc2NoZWR1bGVCCwoJX2pvYl90eXBlIp8ICg1Kb2JUeXBlQ29uZmlnEjgKBHN5bmMYASABKAsyKC5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmNIABJDCgpwaWlfZGV0ZWN0GAIgASgLMi0ubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVQaWlEZXRlY3RIABoNCgtKb2JUeXBlU3luYxrsBgoQSm9iVHlwZVBpaURldGVjdBJRCg1kYXRhX3NhbXBsaW5nGAEgASgLMjoubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVQaWlEZXRlY3QuRGF0YVNhbXBsaW5nElgKEXRhYmxlX3NjYW5fZmlsdGVyGAIgASgLMj0ubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVQaWlEZXRlY3QuVGFibGVTY2FuRmlsdGVyEhgKC3VzZXJfcHJvbXB0GAMgASgJSACIAQESUwoLaW5jcmVtZW50YWwYBCABKAsyOS5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVBpaURldGVjdC5JbmNyZW1lbnRhbEgBiAEBGiEKC0luY3JlbWVudGFsEhIKCmlzX2VuYWJsZWQYASABKAgaIgoMRGF0YVNhbXBsaW5nEhIKCmlzX2VuYWJsZWQYASABKAgakQIKD1RhYmxlU2NhbkZpbHRlchJPCgtpbmNsdWRlX2FsbBgBIAEoCzI4Lm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlUGlpRGV0ZWN0LkluY2x1ZGVBbGxIABJOCgdpbmNsdWRlGAIgASgLMjsubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVQaWlEZXRlY3QuVGFibGVQYXR0ZXJuc0gAEk4KB2V4Y2x1ZGUYAyABKAsyOy5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVBpaURldGVjdC5UYWJsZVBhdHRlcm5zSABCDQoEbW9kZRIFukgCCAEaDAoKSW5jbHVkZUFsbBpvCg1UYWJsZVBhdHRlcm5zEg8KB3NjaGVtYXMYASADKAkSTQoGdGFibGVzGAIgAygLMj0ubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVQaWlEZXRlY3QuVGFibGVJZGVudGlmaWVyGkIKD1RhYmxlSWRlbnRpZmllchIXCgZzY2hlbWEYASABKAlCB7pIBHICEAESFgoFdGFibGUYAiABKAlCB7pIBHICEAFCDgoMX3VzZXJfcHJvbXB0Qg4KDF9pbmNyZW1lbnRhbEIRCghqb2JfdHlwZRIFukgCCAAiZQoPV29ya2Zsb3dPcHRpb25zEhgKC3J1bl90aW1lb3V0GAggASgDSACIAQFCDgoMX3J1bl90aW1lb3V0SgQIARACSgQIAhADSgQIAxAESgQIBBAFSgQIBRAGSgQIBhAHSgQIBxAIItsBCg9BY3Rpdml0eU9wdGlvbnMSLwoZc2NoZWR1bGVfdG9fY2xvc2VfdGltZW91dBgBIAEoA0IHukgEIgIoAUgAiAEBEiwKFnN0YXJ0X3RvX2Nsb3NlX3RpbWVvdXQYAiABKANCB7pIBCICKAFIAYgBARIwCgxyZXRyeV9wb2xpY3kYAyABKAsyGi5tZ210LnYxYWxwaGExLlJldHJ5UG9saWN5QhwKGl9zY2hlZHVsZV90b19jbG9zZV90aW1lb3V0QhkKF19zdGFydF90b19jbG9zZV90aW1lb3V0IkoKC1JldHJ5UG9saWN5EiYKEG1heGltdW1fYXR0ZW1wdHMYASABKAVCB7pIBBoCKABIAIgBAUITChFfbWF4aW11bV9hdHRlbXB0cyI0ChFDcmVhdGVKb2JSZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiJPChVKb2JNYXBwaW5nVHJhbnNmb3JtZXISMAoGY29uZmlnGAMgASgLMiAubWdtdC52MWFscGhhMS5UcmFuc2Zvcm1lckNvbmZpZ0oECAEQAiKRAQoKSm9iTWFwcGluZxIXCgZzY2hlbWEYASABKAlCB7pIBHICEAESFgoFdGFibGUYAiABKAlCB7pIBHICEAESFwoGY29sdW1uGAMgASgJQge6SARyAhABEjkKC3RyYW5zZm9ybWVyGAUgASgLMiQubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nVHJhbnNmb3JtZXIiJQoNR2V0Sm9iUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiMQoOR2V0Sm9iUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IiXgoYVXBkYXRlSm9iU2NoZWR1bGVSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABARIaCg1jcm9uX3NjaGVkdWxlGAIgASgJSACIAQFCEAoOX2Nyb25fc2NoZWR1bGUiPAoZVXBkYXRlSm9iU2NoZWR1bGVSZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiJSCg9QYXVzZUpvYlJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEg0KBXBhdXNlGAIgASgIEhEKBG5vdGUYAyABKAlIAIgBAUIHCgVfbm90ZSIzChBQYXVzZUpvYlJlc3BvbnNlEh8KA2pvYhgBIAEoCzISLm1nbXQudjFhbHBoYTEuSm9iIoYCCiBVcGRhdGVKb2JTb3VyY2VDb25uZWN0aW9uUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQESKAoGc291cmNlGAIgASgLMhgubWdtdC52MWFscGhhMS5Kb2JTb3VyY2USKwoIbWFwcGluZ3MYAyADKAsyGS5tZ210LnYxYWxwaGExLkpvYk1hcHBpbmcSRQoUdmlydHVhbF9mb3JlaWduX2tleXMYBCADKAsyJy5tZ210LnYxYWxwaGExLlZpcnR1YWxGb3JlaWduQ29uc3RyYWludBIuCghqb2JfdHlwZRgFIAEoCzIcLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZyJECiFVcGRhdGVKb2JTb3VyY2VDb25uZWN0aW9uUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IiYQoaUG9zdGdyZXNTb3VyY2VTY2hlbWFTdWJzZXQSQwoQcG9zdGdyZXNfc2NoZW1hcxgBIAMoCzIpLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VTY2hlbWFPcHRpb24iWAoXTXlzcWxTb3VyY2VTY2hlbWFTdWJzZXQSPQoNbXlzcWxfc2NoZW1hcxgBIAMoCzImLm1nbXQudjFhbHBoYTEuTXlzcWxTb3VyY2VTY2hlbWFPcHRpb24iVgoaRHluYW1vREJTb3VyY2VTY2hlbWFTdWJzZXQSOAoGdGFibGVzGAEgAygLMigubWdtdC52MWFscGhhMS5EeW5hbW9EQlNvdXJjZVRhYmxlT3B0aW9uIlgKF01zc3FsU291cmNlU2NoZW1hU3Vic2V0Ej0KDW1zc3FsX3NjaGVtYXMYASADKAsyJi5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlU2NoZW1hT3B0aW9uIr4CChhKb2JTb3VyY2VTcWxTdWJldFNjaGVtYXMSRAoPcG9zdGdyZXNfc3Vic2V0GAIgASgLMikubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZVNjaGVtYVN1YnNldEgAEj4KDG15c3FsX3N1YnNldBgDIAEoCzImLm1nbXQudjFhbHBoYTEuTXlzcWxTb3VyY2VTY2hlbWFTdWJzZXRIABJECg9keW5hbW9kYl9zdWJzZXQYBCABKAsyKS5tZ210LnYxYWxwaGExLkR5bmFtb0RCU291cmNlU2NoZW1hU3Vic2V0SAASPgoMbXNzcWxfc3Vic2V0GAUgASgLMiYubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZVNjaGVtYVN1YnNldEgAQhAKB3NjaGVtYXMSBbpIAggBSgQIARACIqQBCidTZXRKb2JTb3VyY2VTcWxDb25uZWN0aW9uU3Vic2V0c1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEjgKB3NjaGVtYXMYAiABKAsyJy5tZ210LnYxYWxwaGExLkpvYlNvdXJjZVNxbFN1YmV0U2NoZW1hcxIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYAyABKAgiSwooU2V0Sm9iU291cmNlU3FsQ29ubmVjdGlvblN1YnNldHNSZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiKxAQolVXBkYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBEh8KDWNvbm5lY3Rpb25faWQYAiABKAlCCLpIBXIDsAEBEjUKB29wdGlvbnMYAyABKAsyJC5tZ210LnYxYWxwaGExLkpvYkRlc3RpbmF0aW9uT3B0aW9ucxIWCg5kZXN0aW5hdGlvbl9pZBgEIAEoCSJJCiZVcGRhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiJJCiVEZWxldGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXF1ZXN0EiAKDmRlc3RpbmF0aW9uX2lkGAEgASgJQgi6SAVyA7ABASIoCiZEZWxldGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXNwb25zZSKHAQomQ3JlYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uc1JlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABARJDCgxkZXN0aW5hdGlvbnMYAiADKAsyIy5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYkRlc3RpbmF0aW9uQgi6SAWSAQIIASJKCidDcmVhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25zUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IiKAoQRGVsZXRlSm9iUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiEwoRRGVsZXRlSm9iUmVzcG9uc2UiYgoZSXNKb2JOYW1lQXZhaWxhYmxlUmVxdWVzdBInCgRuYW1lGAEgASgJQhm6SBZyFDISXlthLXowLTktXXszLDEwMH0kEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBIjIKGklzSm9iTmFtZUF2YWlsYWJsZVJlc3BvbnNlEhQKDGlzX2F2YWlsYWJsZRgBIAEoCCJVChFHZXRKb2JSdW5zUmVxdWVzdBIaCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBSAASHgoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQFIAEIECgJpZCI9ChJHZXRKb2JSdW5zUmVzcG9uc2USJwoIam9iX3J1bnMYASADKAsyFS5tZ210LnYxYWxwaGExLkpvYlJ1biJEChBHZXRKb2JSdW5SZXF1ZXN0EhIKCmpvYl9ydW5faWQYASABKAkSHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiOwoRR2V0Sm9iUnVuUmVzcG9uc2USJgoHam9iX3J1bhgBIAEoCzIVLm1nbXQudjFhbHBoYTEuSm9iUnVuIi8KE0NyZWF0ZUpvYlJ1blJlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABASIWChRDcmVhdGVKb2JSdW5SZXNwb25zZSJHChNDYW5jZWxKb2JSdW5SZXF1ZXN0EhIKCmpvYl9ydW5faWQYASABKAkSHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiFgoUQ2FuY2VsSm9iUnVuUmVzcG9uc2Ui7AQKA0pvYhIKCgJpZBgBIAEoCRIaChJjcmVhdGVkX2J5X3VzZXJfaWQYAiABKAkSLgoKY3JlYXRlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGgoSdXBkYXRlZF9ieV91c2VyX2lkGAQgASgJEi4KCnVwZGF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEgwKBG5hbWUYBiABKAkSKAoGc291cmNlGAcgASgLMhgubWdtdC52MWFscGhhMS5Kb2JTb3VyY2USMwoMZGVzdGluYXRpb25zGAggAygLMh0ubWdtdC52MWFscGhhMS5Kb2JEZXN0aW5hdGlvbhIrCghtYXBwaW5ncxgJIAMoCzIZLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZxIaCg1jcm9uX3NjaGVkdWxlGAogASgJSACIAQESEgoKYWNjb3VudF9pZBgLIAEoCRI0CgxzeW5jX29wdGlvbnMYDCABKAsyHi5tZ210LnYxYWxwaGExLkFjdGl2aXR5T3B0aW9ucxI4ChB3b3JrZmxvd19vcHRpb25zGA0gASgLMh4ubWdtdC52MWFscGhhMS5Xb3JrZmxvd09wdGlvbnMSRQoUdmlydHVhbF9mb3JlaWduX2tleXMYDiADKAsyJy5tZ210LnYxYWxwaGExLlZpcnR1YWxGb3JlaWduQ29uc3RyYWludBIuCghqb2JfdHlwZRgPIAEoCzIcLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZ0IQCg5fY3Jvbl9zY2hlZHVsZSJSCgxKb2JSZWNlbnRSdW4SLgoKc3RhcnRfdGltZRgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEgoKam9iX3J1bl9pZBgCIAEoCSIzChdHZXRKb2JSZWNlbnRSdW5zUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBIkwKGEdldEpvYlJlY2VudFJ1bnNSZXNwb25zZRIwCgtyZWNlbnRfcnVucxgBIAMoCzIbLm1nbXQudjFhbHBoYTEuSm9iUmVjZW50UnVuIkEKC0pvYk5leHRSdW5zEjIKDm5leHRfcnVuX3RpbWVzGAEgAygLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIxChVHZXRKb2JOZXh0UnVuc1JlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABASJHChZHZXRKb2JOZXh0UnVuc1Jlc3BvbnNlEi0KCW5leHRfcnVucxgBIAEoCzIaLm1nbXQudjFhbHBoYTEuSm9iTmV4dFJ1bnMiLwoTR2V0Sm9iU3RhdHVzUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBIkAKFEdldEpvYlN0YXR1c1Jlc3BvbnNlEigKBnN0YXR1cxgBIAEoDjIYLm1nbXQudjFhbHBoYTEuSm9iU3RhdHVzIlUKD0pvYlN0YXR1c1JlY29yZBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBEigKBnN0YXR1cxgCIAEoDjIYLm1nbXQudjFhbHBoYTEuSm9iU3RhdHVzIjUKFUdldEpvYlN0YXR1c2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABASJKChZHZXRKb2JTdGF0dXNlc1Jlc3BvbnNlEjAKCHN0YXR1c2VzGAEgAygLMh4ubWdtdC52MWFscGhhMS5Kb2JTdGF0dXNSZWNvcmQiIgoPQWN0aXZpdHlGYWlsdXJlEg8KB21lc3NhZ2UYASABKAkiowEKD1BlbmRpbmdBY3Rpdml0eRItCgZzdGF0dXMYASABKA4yHS5tZ210LnYxYWxwaGExLkFjdGl2aXR5U3RhdHVzEhUKDWFjdGl2aXR5X25hbWUYAiABKAkSOQoMbGFzdF9mYWlsdXJlGAMgASgLMh4ubWdtdC52MWFscGhhMS5BY3Rpdml0eUZhaWx1cmVIAIgBAUIPCg1fbGFzdF9mYWlsdXJlIpkCCgZKb2JSdW4SCgoCaWQYASABKAkSDgoGam9iX2lkGAIgASgJEgwKBG5hbWUYAyABKAkSKwoGc3RhdHVzGAQgASgOMhsubWdtdC52MWFscGhhMS5Kb2JSdW5TdGF0dXMSLgoKc3RhcnRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASNQoMY29tcGxldGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBEjoKEnBlbmRpbmdfYWN0aXZpdGllcxgIIAMoCzIeLm1nbXQudjFhbHBoYTEuUGVuZGluZ0FjdGl2aXR5Qg8KDV9jb21wbGV0ZWRfYXRKBAgFEAYiPAoUSm9iUnVuRXZlbnRUYXNrRXJyb3ISDwoHbWVzc2FnZRgBIAEoCRITCgtyZXRyeV9zdGF0ZRgCIAEoCSKPAQoPSm9iUnVuRXZlbnRUYXNrEgoKAmlkGAEgASgDEgwKBHR5cGUYAiABKAkSLgoKZXZlbnRfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMgoFZXJyb3IYBCABKAsyIy5tZ210LnYxYWxwaGExLkpvYlJ1bkV2ZW50VGFza0Vycm9yIjMKEkpvYlJ1blN5bmNNZXRhZGF0YRIOCgZzY2hlbWEYASABKAkSDQoFdGFibGUYAiABKAkiZAoTSm9iUnVuRXZlbnRNZXRhZGF0YRI6Cg1zeW5jX21ldGFkYXRhGAEgASgLMiEubWdtdC52MWFscGhhMS5Kb2JSdW5TeW5jTWV0YWRhdGFIAEIRCghtZXRhZGF0YRIFukgCCAEi7AEKC0pvYlJ1bkV2ZW50EgoKAmlkGAEgASgDEgwKBHR5cGUYAiABKAkSLgoKc3RhcnRfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKY2xvc2VfdGltZRgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASNAoIbWV0YWRhdGEYBSABKAsyIi5tZ210LnYxYWxwaGExLkpvYlJ1bkV2ZW50TWV0YWRhdGESLQoFdGFza3MYBiADKAsyHi5tZ210LnYxYWxwaGExLkpvYlJ1bkV2ZW50VGFzayJKChZHZXRKb2JSdW5FdmVudHNSZXF1ZXN0EhIKCmpvYl9ydW5faWQYASABKAkSHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiXgoXR2V0Sm9iUnVuRXZlbnRzUmVzcG9uc2USKgoGZXZlbnRzGAEgAygLMhoubWdtdC52MWFscGhhMS5Kb2JSdW5FdmVudBIXCg9pc19ydW5fY29tcGxldGUYAiABKAgiRwoTRGVsZXRlSm9iUnVuUmVxdWVzdBISCgpqb2JfcnVuX2lkGAEgASgJEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBIhYKFERlbGV0ZUpvYlJ1blJlc3BvbnNlIkoKFlRlcm1pbmF0ZUpvYlJ1blJlcXVlc3QSEgoKam9iX3J1bl9pZBgBIAEoCRIcCgphY2NvdW50X2lkGAIgASgJQgi6SAVyA7ABASIZChdUZXJtaW5hdGVKb2JSdW5SZXNwb25zZSLxAQoaR2V0Sm9iUnVuTG9nc1N0cmVhbVJlcXVlc3QSEgoKam9iX3J1bl9pZBgBIAEoCRIcCgphY2NvdW50X2lkGAIgASgJQgi6SAVyA7ABARIoCgZ3aW5kb3cYAyABKA4yGC5tZ210LnYxYWxwaGExLkxvZ1dpbmRvdxITCgtzaG91bGRfdGFpbBgEIAEoCBIjCg1tYXhfbG9nX2xpbmVzGAUgASgDQge6SAQiAigBSACIAQESKwoKbG9nX2xldmVscxgGIAMoDjIXLm1nbXQudjFhbHBoYTEuTG9nTGV2ZWxCEAoOX21heF9sb2dfbGluZXMi6AEKG0dldEpvYlJ1bkxvZ3NTdHJlYW1SZXNwb25zZRIQCghsb2dfbGluZRgBIAEoCRIyCgl0aW1lc3RhbXAYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSACIAQESRgoGbGFiZWxzGAMgAygLMjYubWdtdC52MWFscGhhMS5HZXRKb2JSdW5Mb2dzU3RyZWFtUmVzcG9uc2UuTGFiZWxzRW50cnkaLQoLTGFiZWxzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AUIMCgpfdGltZXN0YW1wItYBChRHZXRKb2JSdW5Mb2dzUmVxdWVzdBISCgpqb2JfcnVuX2lkGAEgASgJEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBEigKBndpbmRvdxgDIAEoDjIYLm1nbXQudjFhbHBoYTEuTG9nV2luZG93EiMKDW1heF9sb2dfbGluZXMYBCABKANCB7pIBCICKAFIAIgBARIrCgpsb2dfbGV2ZWxzGAUgAygOMhcubWdtdC52MWFscGhhMS5Mb2dMZXZlbEIQCg5fbWF4X2xvZ19saW5lcyKxAgoVR2V0Sm9iUnVuTG9nc1Jlc3BvbnNlEj8KCWxvZ19saW5lcxgBIAMoCzIsLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1Jlc3BvbnNlLkxvZ0xpbmUa1gEKB0xvZ0xpbmUSEAoIbG9nX2xpbmUYASABKAkSMgoJdGltZXN0YW1wGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBEkgKBmxhYmVscxgDIAMoCzI4Lm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1Jlc3BvbnNlLkxvZ0xpbmUuTGFiZWxzRW50cnkaLQoLTGFiZWxzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AUIMCgpfdGltZXN0YW1wIm4KHFNldEpvYldvcmtmbG93T3B0aW9uc1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEjgKEHdvcmZrbG93X29wdGlvbnMYAiABKAsyHi5tZ210LnYxYWxwaGExLldvcmtmbG93T3B0aW9ucyJACh1TZXRKb2JXb3JrZmxvd09wdGlvbnNSZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiJmChhTZXRKb2JTeW5jT3B0aW9uc1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEjQKDHN5bmNfb3B0aW9ucxgCIAEoCzIeLm1nbXQudjFhbHBoYTEuQWN0aXZpdHlPcHRpb25zIjwKGVNldEpvYlN5bmNPcHRpb25zUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IikQIKGlZhbGlkYXRlSm9iTWFwcGluZ3NSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEisKCG1hcHBpbmdzGAIgAygLMhkubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nEh8KDWNvbm5lY3Rpb25faWQYAyABKAlCCLpIBXIDsAEBEkUKFHZpcnR1YWxfZm9yZWlnbl9rZXlzGAQgAygLMicubWdtdC52MWFscGhhMS5WaXJ0dWFsRm9yZWlnbkNvbnN0cmFpbnQSMQoKam9iX3NvdXJjZRgFIAEoCzIYLm1nbXQudjFhbHBoYTEuSm9iU291cmNlSACIAQFCDQoLX2pvYl9zb3VyY2UiqwcKC0NvbHVtbkVycm9yEg4KBnNjaGVtYRgBIAEoCRINCgV0YWJsZRgCIAEoCRIOCgZjb2x1bW4YAyABKAkSEgoGZXJyb3JzGAQgAygJQgIYARJDCg1lcnJvcl9yZXBvcnRzGAUgAygLMiwubWdtdC52MWFscGhhMS5Db2x1bW5FcnJvci5Db2x1bW5FcnJvclJlcG9ydBpeChFDb2x1bW5FcnJvclJlcG9ydBI4CgRjb2RlGAEgASgOMioubWdtdC52MWFscGhhMS5Db2x1bW5FcnJvci5Db2x1bW5FcnJvckNvZGUSDwoHbWVzc2FnZRgCIAEoCSKzBQoPQ29sdW1uRXJyb3JDb2RlEiEKHUNPTFVNTl9FUlJPUl9DT0RFX1VOU1BFQ0lGSUVEEAASKQolQ09MVU1OX0VSUk9SX0NPREVfTk9UX0ZPVU5EX0lOX1NPVVJDRRABEioKJkNPTFVNTl9FUlJPUl9DT0RFX05PVF9GT1VORF9JTl9NQVBQSU5HEAISOgo2Q09MVU1OX0VSUk9SX0NPREVfUkVRVUlSRURfQ09MVU1OX05PVF9GT1VORF9JTl9NQVBQSU5HEAMSPwo7Q09MVU1OX0VSUk9SX0NPREVfUkVRVUlSRURfRk9SRUlHTl9LRVlfTk9UX0ZPVU5EX0lOX01BUFBJTkcQBBJLCkdDT0xVTU5fRVJST1JfQ09ERV9VTlNVUFBPUlRFRF9DSVJDVUxBUl9ERVBFTkRFTkNZX0FUX0xFQVNUX09ORV9OVUxMQUJMRRAFEjwKOENPTFVNTl9FUlJPUl9DT0RFX1ZGS19TT1VSQ0VfQ09MVU1OX05PVF9GT1VORF9JTl9NQVBQSU5HEAYSOwo3Q09MVU1OX0VSUk9SX0NPREVfVkZLX1NPVVJDRV9DT0xVTU5fTk9UX0ZPVU5EX0lOX1NPVVJDRRAHEjwKOENPTFVNTl9FUlJPUl9DT0RFX1ZGS19UQVJHRVRfQ09MVU1OX05PVF9GT1VORF9JTl9NQVBQSU5HEAgSOwo3Q09MVU1OX0VSUk9SX0NPREVfVkZLX1RBUkdFVF9DT0xVTU5fTk9UX0ZPVU5EX0lOX1NPVVJDRRAJEjIKLkNPTFVNTl9FUlJPUl9DT0RFX1ZGS19DT0xVTU5fREFUQVRZUEVfTUlTTUFUQ0gQChIyCi5DT0xVTU5fRVJST1JfQ09ERV9WRktfU09VUkNFX0NPTFVNTl9OT1RfVU5JUVVFEAsimwMKDUNvbHVtbldhcm5pbmcSDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEg4KBmNvbHVtbhgDIAEoCRIUCgh3YXJuaW5ncxgFIAMoCUICGAESSQoPd2FybmluZ19yZXBvcnRzGAYgAygLMjAubWdtdC52MWFscGhhMS5Db2x1bW5XYXJuaW5nLkNvbHVtbldhcm5pbmdSZXBvcnQaZAoTQ29sdW1uV2FybmluZ1JlcG9ydBI8CgRjb2RlGAEgASgOMi4ubWdtdC52MWFscGhhMS5Db2x1bW5XYXJuaW5nLkNvbHVtbldhcm5pbmdDb2RlEg8KB21lc3NhZ2UYAiABKAkikwEKEUNvbHVtbldhcm5pbmdDb2RlEiMKH0NPTFVNTl9XQVJOSU5HX0NPREVfVU5TUEVDSUZJRUQQABIrCidDT0xVTU5fV0FSTklOR19DT0RFX05PVF9GT1VORF9JTl9TT1VSQ0UQARIsCihDT0xVTU5fV0FSTklOR19DT0RFX05PVF9GT1VORF9JTl9NQVBQSU5HEAIiiQMKDURhdGFiYXNlRXJyb3ISEgoGZXJyb3JzGAEgAygJQgIYARJHCg1lcnJvcl9yZXBvcnRzGAIgAygLMjAubWdtdC52MWFscGhhMS5EYXRhYmFzZUVycm9yLkRhdGFiYXNlRXJyb3JSZXBvcnQaZAoTRGF0YWJhc2VFcnJvclJlcG9ydBI8CgRjb2RlGAEgASgOMi4ubWdtdC52MWFscGhhMS5EYXRhYmFzZUVycm9yLkRhdGFiYXNlRXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkitAEKEURhdGFiYXNlRXJyb3JDb2RlEiMKH0RBVEFCQVNFX0VSUk9SX0NPREVfVU5TUEVDSUZJRUQQABJNCklEQVRBQkFTRV9FUlJPUl9DT0RFX1VOU1VQUE9SVEVEX0NJUkNVTEFSX0RFUEVOREVOQ1lfQVRfTEVBU1RfT05FX05VTExBQkxFEAESKwonREFUQUJBU0VfRVJST1JfQ09ERV9WRktfQ09MVU1OX01JU01BVENIEAIingQKClRhYmxlRXJyb3ISDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEkEKDWVycm9yX3JlcG9ydHMYAyADKAsyKi5tZ210LnYxYWxwaGExLlRhYmxlRXJyb3IuVGFibGVFcnJvclJlcG9ydBpbChBUYWJsZUVycm9yUmVwb3J0EjYKBGNvZGUYASABKA4yKC5tZ210LnYxYWxwaGExLlRhYmxlRXJyb3IuVGFibGVFcnJvckNvZGUSDwoHbWVzc2FnZRgCIAEoCSLQAgoOVGFibGVFcnJvckNvZGUSIAocVEFCTEVfRVJST1JfQ09ERV9VTlNQRUNJRklFRBAAEi4KKlRBQkxFX0VSUk9SX0NPREVfVEFCTEVfTk9UX0ZPVU5EX0lOX1NPVVJDRRABEjoKNlRBQkxFX0VSUk9SX0NPREVfVkZLX1NPVVJDRV9UQUJMRV9OT1RfRk9VTkRfSU5fTUFQUElORxACEjkKNVRBQkxFX0VSUk9SX0NPREVfVkZLX1NPVVJDRV9UQUJMRV9OT1RfRk9VTkRfSU5fU09VUkNFEAMSOgo2VEFCTEVfRVJST1JfQ09ERV9WRktfVEFSR0VUX1RBQkxFX05PVF9GT1VORF9JTl9NQVBQSU5HEAQSOQo1VEFCTEVfRVJST1JfQ09ERV9WRktfVEFSR0VUX1RBQkxFX05PVF9GT1VORF9JTl9TT1VSQ0UQBSLvAQobVmFsaWRhdGVKb2JNYXBwaW5nc1Jlc3BvbnNlEjEKDWNvbHVtbl9lcnJvcnMYASADKAsyGi5tZ210LnYxYWxwaGExLkNvbHVtbkVycm9yEjUKD2RhdGFiYXNlX2Vycm9ycxgCIAEoCzIcLm1nbXQudjFhbHBoYTEuRGF0YWJhc2VFcnJvchI1Cg9jb2x1bW5fd2FybmluZ3MYAyADKAsyHC5tZ210LnYxYWxwaGExLkNvbHVtbldhcm5pbmcSLwoMdGFibGVfZXJyb3JzGAQgAygLMhkubWdtdC52MWFscGhhMS5UYWJsZUVycm9yImUKFVZhbGlkYXRlU2NoZW1hUmVxdWVzdBIrCghtYXBwaW5ncxgBIAMoCzIZLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZxIfCg1jb25uZWN0aW9uX2lkGAIgASgJQgi6SAVyA7ABASKMAgoWVmFsaWRhdGVTY2hlbWFSZXNwb25zZRI2Cg9taXNzaW5nX2NvbHVtbnMYASADKAsyHS5tZ210LnYxYWxwaGExLkRhdGFiYXNlQ29sdW1uEjQKDWV4dHJhX2NvbHVtbnMYAiADKAsyHS5tZ210LnYxYWxwaGExLkRhdGFiYXNlQ29sdW1uEkMKDm1pc3NpbmdfdGFibGVzGAMgAygLMisubWdtdC52MWFscGhhMS5WYWxpZGF0ZVNjaGVtYVJlc3BvbnNlLlRhYmxlEhcKD21pc3Npbmdfc2NoZW1hcxgEIAMoCRomCgVUYWJsZRIOCgZzY2hlbWEYASABKAkSDQoFdGFibGUYAiABKAkiQwoRVmlydHVhbEZvcmVpZ25LZXkSDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEg8KB2NvbHVtbnMYAyADKAkigQEKGFZpcnR1YWxGb3JlaWduQ29uc3RyYWludBIOCgZzY2hlbWEYASABKAkSDQoFdGFibGUYAiABKAkSDwoHY29sdW1ucxgDIAMoCRI1Cgtmb3JlaWduX2tleRgEIAEoCzIgLm1nbXQudjFhbHBoYTEuVmlydHVhbEZvcmVpZ25LZXkiZwoNUnVuQ29udGV4dEtleRIbCgpqb2JfcnVuX2lkGAEgASgJQge6SARyAhABEhwKC2V4dGVybmFsX2lkGAIgASgJQge6SARyAhABEhsKCmFjY291bnRfaWQYAyABKAlCB7pIBHICEAEiQAoUR2V0UnVuQ29udGV4dFJlcXVlc3QSKAoCaWQYASABKAsyHC5tZ210LnYxYWxwaGExLlJ1bkNvbnRleHRLZXkiJgoVR2V0UnVuQ29udGV4dFJlc3BvbnNlEg0KBXZhbHVlGAEgASgMIk8KFFNldFJ1bkNvbnRleHRSZXF1ZXN0EigKAmlkGAEgASgLMhwubWdtdC52MWFscGhhMS5SdW5Db250ZXh0S2V5Eg0KBXZhbHVlGAIgASgMIhcKFVNldFJ1bkNvbnRleHRSZXNwb25zZSJQChVTZXRSdW5Db250ZXh0c1JlcXVlc3QSKAoCaWQYASABKAsyHC5tZ210LnYxYWxwaGExLlJ1bkNvbnRleHRLZXkSDQoFdmFsdWUYAiABKAwiGAoWU2V0UnVuQ29udGV4dHNSZXNwb25zZSK8AgoHSm9iSG9vaxIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEg4KBmpvYl9pZBgEIAEoCRIsCgZjb25maWcYBSABKAsyHC5tZ210LnYxYWxwaGExLkpvYkhvb2tDb25maWcSGgoSY3JlYXRlZF9ieV91c2VyX2lkGAYgASgJEi4KCmNyZWF0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhoKEnVwZGF0ZWRfYnlfdXNlcl9pZBgIIAEoCRIuCgp1cGRhdGVkX2F0GAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIPCgdlbmFibGVkGAogASgIEhsKCHByaW9yaXR5GAsgASgNQgm6SAYqBBhkKAAirwEKCk5ld0pvYkhvb2sSJwoEbmFtZRgBIAEoCUIZukgWchQyEl5bYS16MC05LV17MywxMDB9JBIcCgtkZXNjcmlwdGlvbhgCIAEoCUIHukgEcgIQARIsCgZjb25maWcYAyABKAsyHC5tZ210LnYxYWxwaGExLkpvYkhvb2tDb25maWcSDwoHZW5hYmxlZBgEIAEoCBIbCghwcmlvcml0eRgFIAEoDUIJukgGKgQYZCgAIogDCg1Kb2JIb29rQ29uZmlnEjYKA3NxbBgFIAEoCzInLm1nbXQudjFhbHBoYTEuSm9iSG9va0NvbmZpZy5Kb2JTcWxIb29rSAAalQIKCkpvYlNxbEhvb2sSFgoFcXVlcnkYASABKAlCB7pIBHICEAESHwoNY29ubmVjdGlvbl9pZBgCIAEoCUIIukgFcgOwAQESPgoGdGltaW5nGAMgASgLMi4ubWdtdC52MWFscGhhMS5Kb2JIb29rQ29uZmlnLkpvYlNxbEhvb2suVGltaW5nGo0BCgZUaW1pbmcSNwoIcHJlX3N5bmMYAyABKAsyIy5tZ210LnYxYWxwaGExLkpvYkhvb2tUaW1pbmdQcmVTeW5jSAASOQoJcG9zdF9zeW5jGAQgASgLMiQubWdtdC52MWFscGhhMS5Kb2JIb29rVGltaW5nUG9zdFN5bmNIAEIPCgZ0aW1pbmcSBbpIAggBQg8KBmNvbmZpZxIFukgCCAFKBAgBEAJKBAgCEANKBAgDEARKBAgEEAUiFgoUSm9iSG9va1RpbWluZ1ByZVN5bmMiFwoVSm9iSG9va1RpbWluZ1Bvc3RTeW5jIi4KEkdldEpvYkhvb2tzUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBIjwKE0dldEpvYkhvb2tzUmVzcG9uc2USJQoFaG9va3MYASADKAsyFi5tZ210LnYxYWxwaGExLkpvYkhvb2siKQoRR2V0Sm9iSG9va1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBIjoKEkdldEpvYkhvb2tSZXNwb25zZRIkCgRob29rGAEgASgLMhYubWdtdC52MWFscGhhMS5Kb2JIb29rIk8KFENyZWF0ZUpvYkhvb2tSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRInCgRob29rGAIgASgLMhkubWdtdC52MWFscGhhMS5OZXdKb2JIb29rIj0KFUNyZWF0ZUpvYkhvb2tSZXNwb25zZRIkCgRob29rGAEgASgLMhYubWdtdC52MWFscGhhMS5Kb2JIb29rIiwKFERlbGV0ZUpvYkhvb2tSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABASIXChVEZWxldGVKb2JIb29rUmVzcG9uc2UiPQodSXNKb2JIb29rTmFtZUF2YWlsYWJsZVJlcXVlc3QSDgoGam9iX2lkGAEgASgJEgwKBG5hbWUYAiABKAkiNgoeSXNKb2JIb29rTmFtZUF2YWlsYWJsZVJlc3BvbnNlEhQKDGlzX2F2YWlsYWJsZRgBIAEoCCLPAQoUVXBkYXRlSm9iSG9va1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEicKBG5hbWUYAiABKAlCGbpIFnIUMhJeW2EtejAtOS1dezMsMTAwfSQSHAoLZGVzY3JpcHRpb24YAyABKAlCB7pIBHICEAESLAoGY29uZmlnGAQgASgLMhwubWdtdC52MWFscGhhMS5Kb2JIb29rQ29uZmlnEg8KB2VuYWJsZWQYBSABKAgSGwoIcHJpb3JpdHkYBiABKA1CCbpIBioEGGQoACI9ChVVcGRhdGVKb2JIb29rUmVzcG9uc2USJAoEaG9vaxgBIAEoCzIWLm1nbXQudjFhbHBoYTEuSm9iSG9vayJBChhTZXRKb2JIb29rRW5hYmxlZFJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEg8KB2VuYWJsZWQYAiABKAgiQQoZU2V0Sm9iSG9va0VuYWJsZWRSZXNwb25zZRIkCgRob29rGAEgASgLMhYubWdtdC52MWFscGhhMS5Kb2JIb29rIs8BCiBHZXRBY3RpdmVKb2JIb29rc0J5VGltaW5nUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBEkYKBnRpbWluZxgCIAEoDjI2Lm1nbXQudjFhbHBoYTEuR2V0QWN0aXZlSm9iSG9va3NCeVRpbWluZ1JlcXVlc3QuVGltaW5nIkkKBlRpbWluZxIWChJUSU1JTkdfVU5TUEVDSUZJRUQQABISCg5USU1JTkdfUFJFU1lOQxABEhMKD1RJTUlOR19QT1NUU1lOQxACIkoKIUdldEFjdGl2ZUpvYkhvb2tzQnlUaW1pbmdSZXNwb25zZRIlCgVob29rcxgBIAMoCzIWLm1nbXQudjFhbHBoYTEuSm9iSG9vayJZChxHZXRQaWlEZXRlY3Rpb25SZXBvcnRSZXF1ZXN0EhsKCmpvYl9ydW5faWQYASABKAlCB7pIBHICEAESHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiUgodR2V0UGlpRGV0ZWN0aW9uUmVwb3J0UmVzcG9uc2USMQoGcmVwb3J0GAEgASgLMiEubWdtdC52MWFscGhhMS5QaWlEZXRlY3Rpb25SZXBvcnQijgQKElBpaURldGVjdGlvblJlcG9ydBI9CgZ0YWJsZXMYASADKAsyLS5tZ210LnYxYWxwaGExLlBpaURldGVjdGlvblJlcG9ydC5UYWJsZVJlcG9ydBq4AwoLVGFibGVSZXBvcnQSDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEksKB2NvbHVtbnMYAyADKAsyOi5tZ210LnYxYWxwaGExLlBpaURldGVjdGlvblJlcG9ydC5UYWJsZVJlcG9ydC5Db2x1bW5SZXBvcnQavAIKDENvbHVtblJlcG9ydBIOCgZjb2x1bW4YASABKAkSWwoMcmVnZXhfcmVwb3J0GAIgASgLMkAubWdtdC52MWFscGhhMS5QaWlEZXRlY3Rpb25SZXBvcnQuVGFibGVSZXBvcnQuQ29sdW1uUmVwb3J0LlJlZ2V4SACIAQESVwoKbGxtX3JlcG9ydBgDIAEoCzI+Lm1nbXQudjFhbHBoYTEuUGlpRGV0ZWN0aW9uUmVwb3J0LlRhYmxlUmVwb3J0LkNvbHVtblJlcG9ydC5MTE1IAYgBARoZCgVSZWdleBIQCghjYXRlZ29yeRgBIAEoCRorCgNMTE0SEAoIY2F0ZWdvcnkYASABKAkSEgoKY29uZmlkZW5jZRgCIAEoAkIPCg1fcmVnZXhfcmVwb3J0Qg0KC19sbG1fcmVwb3J0Km8KCUpvYlN0YXR1cxIaChZKT0JfU1RBVFVTX1VOU1BFQ0lGSUVEEAASFgoSSk9CX1NUQVRVU19FTkFCTEVEEAESFQoRSk9CX1NUQVRVU19QQVVTRUQQAxIXChNKT0JfU1RBVFVTX0RJU0FCTEVEEAQqpwEKDkFjdGl2aXR5U3RhdHVzEh8KG0FDVElWSVRZX1NUQVRVU19VTlNQRUNJRklFRBAAEh0KGUFDVElWSVRZX1NUQVRVU19TQ0hFRFVMRUQQARIbChdBQ1RJVklUWV9TVEFUVVNfU1RBUlRFRBACEhwKGEFDVElWSVRZX1NUQVRVU19DQU5DRUxFRBADEhoKFkFDVElWSVRZX1NUQVRVU19GQUlMRUQQBCqSAgoMSm9iUnVuU3RhdHVzEh4KGkpPQl9SVU5fU1RBVFVTX1VOU1BFQ0lGSUVEEAASGgoWSk9CX1JVTl9TVEFUVVNfUEVORElORxABEhoKFkpPQl9SVU5fU1RBVFVTX1JVTk5JTkcQAhIbChdKT0JfUlVOX1NUQVRVU19DT01QTEVURRADEhgKFEpPQl9SVU5fU1RBVFVTX0VSUk9SEAQSGwoXSk9CX1JVTl9TVEFUVVNfQ0FOQ0VMRUQQBRIdChlKT0JfUlVOX1NUQVRVU19URVJNSU5BVEVEEAYSGQoVSk9CX1JVTl9TVEFUVVNfRkFJTEVEEAcSHAoYSk9CX1JVTl9TVEFUVVNfVElNRURfT1VUEAgqfAoJTG9nV2luZG93EiIKHkxPR19XSU5ET1dfTk9fVElNRV9VTlNQRUNJRklFRBAAEhoKFkxPR19XSU5ET1dfRklGVEVFTl9NSU4QARIXChNMT0dfV0lORE9XX09ORV9IT1VSEAISFgoSTE9HX1dJTkRPV19PTkVfREFZEAMqdwoITG9nTGV2ZWwSGQoVTE9HX0xFVkVMX1VOU1BFQ0lGSUVEEAASEwoPTE9HX0xFVkVMX0RFQlVHEAESEgoOTE9HX0xFVkVMX0lORk8QAhISCg5MT0dfTEVWRUxfV0FSThADEhMKD0xPR19MRVZFTF9FUlJPUhAEMrAhCgpKb2JTZXJ2aWNlEk0KB0dldEpvYnMSHS5tZ210LnYxYWxwaGExLkdldEpvYnNSZXF1ZXN0Gh4ubWdtdC52MWFscGhhMS5HZXRKb2JzUmVzcG9uc2UiA5ACARJKCgZHZXRKb2ISHC5tZ210LnYxYWxwaGExLkdldEpvYlJlcXVlc3QaHS5tZ210LnYxYWxwaGExLkdldEpvYlJlc3BvbnNlIgOQAgESUAoJQ3JlYXRlSm9iEh8ubWdtdC52MWFscGhhMS5DcmVhdGVKb2JSZXF1ZXN0GiAubWdtdC52MWFscGhhMS5DcmVhdGVKb2JSZXNwb25zZSIAElAKCURlbGV0ZUpvYhIfLm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iUmVxdWVzdBogLm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iUmVzcG9uc2UiABJuChJJc0pvYk5hbWVBdmFpbGFibGUSKC5tZ210LnYxYWxwaGExLklzSm9iTmFtZUF2YWlsYWJsZVJlcXVlc3QaKS5tZ210LnYxYWxwaGExLklzSm9iTmFtZUF2YWlsYWJsZVJlc3BvbnNlIgOQAgESaAoRVXBkYXRlSm9iU2NoZWR1bGUSJy5tZ210LnYxYWxwaGExLlVwZGF0ZUpvYlNjaGVkdWxlUmVxdWVzdBooLm1nbXQudjFhbHBoYTEuVXBkYXRlSm9iU2NoZWR1bGVSZXNwb25zZSIAEoABChlVcGRhdGVKb2JTb3VyY2VDb25uZWN0aW9uEi8ubWdtdC52MWFscGhhMS5VcGRhdGVKb2JTb3VyY2VDb25uZWN0aW9uUmVxdWVzdBowLm1nbXQudjFhbHBoYTEuVXBkYXRlSm9iU291cmNlQ29ubmVjdGlvblJlc3BvbnNlIgASlQEKIFNldEpvYlNvdXJjZVNxbENvbm5lY3Rpb25TdWJzZXRzEjYubWdtdC52MWFscGhhMS5TZXRKb2JTb3VyY2VTcWxDb25uZWN0aW9uU3Vic2V0c1JlcXVlc3QaNy5tZ210LnYxYWxwaGExLlNldEpvYlNvdXJjZVNxbENvbm5lY3Rpb25TdWJzZXRzUmVzcG9uc2UiABKPAQoeVXBkYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uEjQubWdtdC52MWFscGhhMS5VcGRhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXF1ZXN0GjUubWdtdC52MWFscGhhMS5VcGRhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXNwb25zZSIAEo8BCh5EZWxldGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb24SNC5tZ210LnYxYWxwaGExLkRlbGV0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvblJlcXVlc3QaNS5tZ210LnYxYWxwaGExLkRlbGV0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvblJlc3BvbnNlIgASkgEKH0NyZWF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvbnMSNS5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvbnNSZXF1ZXN0GjYubWdtdC52MWFscGhhMS5DcmVhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25zUmVzcG9uc2UiABJNCghQYXVzZUpvYhIeLm1nbXQudjFhbHBoYTEuUGF1c2VKb2JSZXF1ZXN0Gh8ubWdtdC52MWFscGhhMS5QYXVzZUpvYlJlc3BvbnNlIgASaAoQR2V0Sm9iUmVjZW50UnVucxImLm1nbXQudjFhbHBoYTEuR2V0Sm9iUmVjZW50UnVuc1JlcXVlc3QaJy5tZ210LnYxYWxwaGExLkdldEpvYlJlY2VudFJ1bnNSZXNwb25zZSIDkAIBEmIKDkdldEpvYk5leHRSdW5zEiQubWdtdC52MWFscGhhMS5HZXRKb2JOZXh0UnVuc1JlcXVlc3QaJS5tZ210LnYxYWxwaGExLkdldEpvYk5leHRSdW5zUmVzcG9uc2UiA5ACARJcCgxHZXRKb2JTdGF0dXMSIi5tZ210LnYxYWxwaGExLkdldEpvYlN0YXR1c1JlcXVlc3QaIy5tZ210LnYxYWxwaGExLkdldEpvYlN0YXR1c1Jlc3BvbnNlIgOQAgESYgoOR2V0Sm9iU3RhdHVzZXMSJC5tZ210LnYxYWxwaGExLkdldEpvYlN0YXR1c2VzUmVxdWVzdBolLm1nbXQudjFhbHBoYTEuR2V0Sm9iU3RhdHVzZXNSZXNwb25zZSIDkAIBElYKCkdldEpvYlJ1bnMSIC5tZ210LnYxYWxwaGExLkdldEpvYlJ1bnNSZXF1ZXN0GiEubWdtdC52MWFscGhhMS5HZXRKb2JSdW5zUmVzcG9uc2UiA5ACARJlCg9HZXRKb2JSdW5FdmVudHMSJS5tZ210LnYxYWxwaGExLkdldEpvYlJ1bkV2ZW50c1JlcXVlc3QaJi5tZ210LnYxYWxwaGExLkdldEpvYlJ1bkV2ZW50c1Jlc3BvbnNlIgOQAgESUwoJR2V0Sm9iUnVuEh8ubWdtdC52MWFscGhhMS5HZXRKb2JSdW5SZXF1ZXN0GiAubWdtdC52MWFscGhhMS5HZXRKb2JSdW5SZXNwb25zZSIDkAIBElkKDERlbGV0ZUpvYlJ1bhIiLm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iUnVuUmVxdWVzdBojLm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iUnVuUmVzcG9uc2UiABJZCgxDcmVhdGVKb2JSdW4SIi5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYlJ1blJlcXVlc3QaIy5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYlJ1blJlc3BvbnNlIgASWQoMQ2FuY2VsSm9iUnVuEiIubWdtdC52MWFscGhhMS5DYW5jZWxKb2JSdW5SZXF1ZXN0GiMubWdtdC52MWFscGhhMS5DYW5jZWxKb2JSdW5SZXNwb25zZSIAEmIKD1Rlcm1pbmF0ZUpvYlJ1bhIlLm1nbXQudjFhbHBoYTEuVGVybWluYXRlSm9iUnVuUmVxdWVzdBomLm1nbXQudjFhbHBoYTEuVGVybWluYXRlSm9iUnVuUmVzcG9uc2UiABJwChNHZXRKb2JSdW5Mb2dzU3RyZWFtEikubWdtdC52MWFscGhhMS5HZXRKb2JSdW5Mb2dzU3RyZWFtUmVxdWVzdBoqLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1N0cmVhbVJlc3BvbnNlIgAwARJcCg1HZXRKb2JSdW5Mb2dzEiMubWdtdC52MWFscGhhMS5HZXRKb2JSdW5Mb2dzUmVxdWVzdBokLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1Jlc3BvbnNlIgASdAoVU2V0Sm9iV29ya2Zsb3dPcHRpb25zEisubWdtdC52MWFscGhhMS5TZXRKb2JXb3JrZmxvd09wdGlvbnNSZXF1ZXN0GiwubWdtdC52MWFscGhhMS5TZXRKb2JXb3JrZmxvd09wdGlvbnNSZXNwb25zZSIAEmgKEVNldEpvYlN5bmNPcHRpb25zEicubWdtdC52MWFscGhhMS5TZXRKb2JTeW5jT3B0aW9uc1JlcXVlc3QaKC5tZ210LnYxYWxwaGExLlNldEpvYlN5bmNPcHRpb25zUmVzcG9uc2UiABJuChNWYWxpZGF0ZUpvYk1hcHBpbmdzEikubWdtdC52MWFscGhhMS5WYWxpZGF0ZUpvYk1hcHBpbmdzUmVxdWVzdBoqLm1nbXQudjFhbHBoYTEuVmFsaWRhdGVKb2JNYXBwaW5nc1Jlc3BvbnNlIgASXwoOVmFsaWRhdGVTY2hlbWESJC5tZ210LnYxYWxwaGExLlZhbGlkYXRlU2NoZW1hUmVxdWVzdBolLm1nbXQudjFhbHBoYTEuVmFsaWRhdGVTY2hlbWFSZXNwb25zZSIAElwKDUdldFJ1bkNvbnRleHQSIy5tZ210LnYxYWxwaGExLkdldFJ1bkNvbnRleHRSZXF1ZXN0GiQubWdtdC52MWFscGhhMS5HZXRSdW5Db250ZXh0UmVzcG9uc2UiABJcCg1TZXRSdW5Db250ZXh0EiMubWdtdC52MWFscGhhMS5TZXRSdW5Db250ZXh0UmVxdWVzdBokLm1nbXQudjFhbHBoYTEuU2V0UnVuQ29udGV4dFJlc3BvbnNlIgASYQoOU2V0UnVuQ29udGV4dHMSJC5tZ210LnYxYWxwaGExLlNldFJ1bkNvbnRleHRzUmVxdWVzdBolLm1nbXQudjFhbHBoYTEuU2V0UnVuQ29udGV4dHNSZXNwb25zZSIAKAESWQoLR2V0Sm9iSG9va3MSIS5tZ210LnYxYWxwaGExLkdldEpvYkhvb2tzUmVxdWVzdBoiLm1nbXQudjFhbHBoYTEuR2V0Sm9iSG9va3NSZXNwb25zZSIDkAIBElYKCkdldEpvYkhvb2sSIC5tZ210LnYxYWxwaGExLkdldEpvYkhvb2tSZXF1ZXN0GiEubWdtdC52MWFscGhhMS5HZXRKb2JIb29rUmVzcG9uc2UiA5ACARJcCg1DcmVhdGVKb2JIb29rEiMubWdtdC52MWFscGhhMS5DcmVhdGVKb2JIb29rUmVxdWVzdBokLm1nbXQudjFhbHBoYTEuQ3JlYXRlSm9iSG9va1Jlc3BvbnNlIgASXAoNRGVsZXRlSm9iSG9vaxIjLm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iSG9va1JlcXVlc3QaJC5tZ210LnYxYWxwaGExLkRlbGV0ZUpvYkhvb2tSZXNwb25zZSIAEncKFklzSm9iSG9va05hbWVBdmFpbGFibGUSLC5tZ210LnYxYWxwaGExLklzSm9iSG9va05hbWVBdmFpbGFibGVSZXF1ZXN0Gi0ubWdtdC52MWFscGhhMS5Jc0pvYkhvb2tOYW1lQXZhaWxhYmxlUmVzcG9uc2UiABJcCg1VcGRhdGVKb2JIb29rEiMubWdtdC52MWFscGhhMS5VcGRhdGVKb2JIb29rUmVxdWVzdBokLm1nbXQudjFhbHBoYTEuVXBkYXRlSm9iSG9va1Jlc3BvbnNlIgASaAoRU2V0Sm9iSG9va0VuYWJsZWQSJy5tZ210LnYxYWxwaGExLlNldEpvYkhvb2tFbmFibGVkUmVxdWVzdBooLm1nbXQudjFhbHBoYTEuU2V0Sm9iSG9va0VuYWJsZWRSZXNwb25zZSIAEoMBChlHZXRBY3RpdmVKb2JIb29rc0J5VGltaW5nEi8ubWdtdC52MWFscGhhMS5HZXRBY3RpdmVKb2JIb29rc0J5VGltaW5nUmVxdWVzdBowLm1nbXQudjFhbHBoYTEuR2V0QWN0aXZlSm9iSG9va3NCeVRpbWluZ1Jlc3BvbnNlIgOQAgESdwoVR2V0UGlpRGV0ZWN0aW9uUmVwb3J0EisubWdtdC52MWFscGhhMS5HZXRQaWlEZXRlY3Rpb25SZXBvcnRSZXF1ZXN0GiwubWdtdC52MWFscGhhMS5HZXRQaWlEZXRlY3Rpb25SZXBvcnRSZXNwb25zZSIDkAIBQsQBChFjb20ubWdtdC52MWFscGhhMUIISm9iUHJvdG9QAVpQZ2l0aHViLmNvbS9udWNsZXVzY2xvdWQvbmVvc3luYy9iYWNrZW5kL2dlbi9nby9wcm90b3MvbWdtdC92MWFscGhhMTttZ210djFhbHBoYTGiAgNNWFiqAg1NZ210LlYxYWxwaGExygINTWdtdFxWMWFscGhhMeICGU1nbXRcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5NZ210OjpWMWFscGhhMWIGcHJvdG8z", [file_buf_validate_validate, file_google_protobuf_timestamp, file_mgmt_v1alpha1_connection_data, file_mgmt_v1alpha1_transformer]); + fileDesc("ChdtZ210L3YxYWxwaGExL2pvYi5wcm90bxINbWdtdC52MWFscGhhMSIuCg5HZXRKb2JzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABASIzCg9HZXRKb2JzUmVzcG9uc2USIAoEam9icxgBIAMoCzISLm1nbXQudjFhbHBoYTEuSm9iIkUKCUpvYlNvdXJjZRI4CgdvcHRpb25zGAEgASgLMh8ubWdtdC52MWFscGhhMS5Kb2JTb3VyY2VPcHRpb25zQga6SAPIAQEioQQKEEpvYlNvdXJjZU9wdGlvbnMSQgoIcG9zdGdyZXMYASABKAsyLi5tZ210LnYxYWxwaGExLlBvc3RncmVzU291cmNlQ29ubmVjdGlvbk9wdGlvbnNIABI9CgZhd3NfczMYAiABKAsyKy5tZ210LnYxYWxwaGExLkF3c1MzU291cmNlQ29ubmVjdGlvbk9wdGlvbnNIABI8CgVteXNxbBgDIAEoCzIrLm1nbXQudjFhbHBoYTEuTXlzcWxTb3VyY2VDb25uZWN0aW9uT3B0aW9uc0gAEjgKCGdlbmVyYXRlGAQgASgLMiQubWdtdC52MWFscGhhMS5HZW5lcmF0ZVNvdXJjZU9wdGlvbnNIABI9CgthaV9nZW5lcmF0ZRgFIAEoCzImLm1nbXQudjFhbHBoYTEuQWlHZW5lcmF0ZVNvdXJjZU9wdGlvbnNIABJACgdtb25nb2RiGAYgASgLMi0ubWdtdC52MWFscGhhMS5Nb25nb0RCU291cmNlQ29ubmVjdGlvbk9wdGlvbnNIABJCCghkeW5hbW9kYhgHIAEoCzIuLm1nbXQudjFhbHBoYTEuRHluYW1vREJTb3VyY2VDb25uZWN0aW9uT3B0aW9uc0gAEjwKBW1zc3FsGAggASgLMisubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zSABCDwoGY29uZmlnEgW6SAIIASJuChRDcmVhdGVKb2JEZXN0aW5hdGlvbhIfCg1jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABARI1CgdvcHRpb25zGAIgASgLMiQubWdtdC52MWFscGhhMS5Kb2JEZXN0aW5hdGlvbk9wdGlvbnMidAoOSm9iRGVzdGluYXRpb24SHwoNY29ubmVjdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESNQoHb3B0aW9ucxgCIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iRGVzdGluYXRpb25PcHRpb25zEgoKAmlkGAMgASgJIt0CChdBaUdlbmVyYXRlU291cmNlT3B0aW9ucxIiChBhaV9jb25uZWN0aW9uX2lkGAEgASgJQgi6SAVyA7ABARJGCgdzY2hlbWFzGAIgAygLMisubWdtdC52MWFscGhhMS5BaUdlbmVyYXRlU291cmNlU2NoZW1hT3B0aW9uQgi6SAWSAQIIARIuChdma19zb3VyY2VfY29ubmVjdGlvbl9pZBgDIAEoCUIIukgFcgOwAQFIAIgBARIbCgptb2RlbF9uYW1lGAQgASgJQge6SARyAhABEhgKC3VzZXJfcHJvbXB0GAUgASgJSAGIAQESKwoTZ2VuZXJhdGVfYmF0Y2hfc2l6ZRgGIAEoA0IJukgGIgQYZCgBSAKIAQFCGgoYX2ZrX3NvdXJjZV9jb25uZWN0aW9uX2lkQg4KDF91c2VyX3Byb21wdEIWChRfZ2VuZXJhdGVfYmF0Y2hfc2l6ZSJ9ChxBaUdlbmVyYXRlU291cmNlU2NoZW1hT3B0aW9uEhcKBnNjaGVtYRgBIAEoCUIHukgEcgIQARJECgZ0YWJsZXMYAiADKAsyKi5tZ210LnYxYWxwaGExLkFpR2VuZXJhdGVTb3VyY2VUYWJsZU9wdGlvbkIIukgFkgECCAEiVAobQWlHZW5lcmF0ZVNvdXJjZVRhYmxlT3B0aW9uEhYKBXRhYmxlGAEgASgJQge6SARyAhABEh0KCXJvd19jb3VudBgCIAEoA0IKukgHIgUY6AcoASKvAQoVR2VuZXJhdGVTb3VyY2VPcHRpb25zEkQKB3NjaGVtYXMYASADKAsyKS5tZ210LnYxYWxwaGExLkdlbmVyYXRlU291cmNlU2NoZW1hT3B0aW9uQgi6SAWSAQIIARIuChdma19zb3VyY2VfY29ubmVjdGlvbl9pZBgDIAEoCUIIukgFcgOwAQFIAIgBAUIaChhfZmtfc291cmNlX2Nvbm5lY3Rpb25faWRKBAgCEAMieQoaR2VuZXJhdGVTb3VyY2VTY2hlbWFPcHRpb24SFwoGc2NoZW1hGAEgASgJQge6SARyAhABEkIKBnRhYmxlcxgCIAMoCzIoLm1nbXQudjFhbHBoYTEuR2VuZXJhdGVTb3VyY2VUYWJsZU9wdGlvbkIIukgFkgECCAEiTwoZR2VuZXJhdGVTb3VyY2VUYWJsZU9wdGlvbhIWCgV0YWJsZRgBIAEoCUIHukgEcgIQARIaCglyb3dfY291bnQYAiABKANCB7pIBCICKAEiQQoeTW9uZ29EQlNvdXJjZUNvbm5lY3Rpb25PcHRpb25zEh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBIu8BCh9EeW5hbW9EQlNvdXJjZUNvbm5lY3Rpb25PcHRpb25zEh8KDWNvbm5lY3Rpb25faWQYASABKAlCCLpIBXIDsAEBEjgKBnRhYmxlcxgCIAMoCzIoLm1nbXQudjFhbHBoYTEuRHluYW1vREJTb3VyY2VUYWJsZU9wdGlvbhJRChN1bm1hcHBlZF90cmFuc2Zvcm1zGAMgASgLMjQubWdtdC52MWFscGhhMS5EeW5hbW9EQlNvdXJjZVVubWFwcGVkVHJhbnNmb3JtQ29uZmlnEh4KFmVuYWJsZV9jb25zaXN0ZW50X3JlYWQYBCABKAgi/QEKJUR5bmFtb0RCU291cmNlVW5tYXBwZWRUcmFuc2Zvcm1Db25maWcSLwoBYhgBIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZ1RyYW5zZm9ybWVyEjUKB2Jvb2xlYW4YAiABKAsyJC5tZ210LnYxYWxwaGExLkpvYk1hcHBpbmdUcmFuc2Zvcm1lchIvCgFuGAQgASgLMiQubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nVHJhbnNmb3JtZXISLwoBcxgGIAEoCzIkLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZ1RyYW5zZm9ybWVySgQIAxAESgQIBRAGIl8KGUR5bmFtb0RCU291cmNlVGFibGVPcHRpb24SFgoFdGFibGUYASABKAlCB7pIBHICEAESGQoMd2hlcmVfY2xhdXNlGAIgASgJSACIAQFCDwoNX3doZXJlX2NsYXVzZSKaCAofUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucxI6CgdzY2hlbWFzGAIgAygLMikubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZVNjaGVtYU9wdGlvbhIfCg1jb25uZWN0aW9uX2lkGAMgASgJQgi6SAVyA7ABARIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYBCABKAgSbgocbmV3X2NvbHVtbl9hZGRpdGlvbl9zdHJhdGVneRgFIAEoCzJILm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5EmUKF2NvbHVtbl9yZW1vdmFsX3N0cmF0ZWd5GAYgASgLMkQubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneRqFAwoZTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneRJkCghoYWx0X2pvYhgBIAEoCzJQLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5LkhhbHRKb2JIABJkCghhdXRvX21hcBgCIAEoCzJQLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5LkF1dG9NYXBIABJrCgtwYXNzdGhyb3VnaBgDIAEoCzJULm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VDb25uZWN0aW9uT3B0aW9ucy5OZXdDb2x1bW5BZGRpdGlvblN0cmF0ZWd5LlBhc3N0aHJvdWdoSAAaCQoHSGFsdEpvYhoJCgdBdXRvTWFwGg0KC1Bhc3N0aHJvdWdoQgoKCHN0cmF0ZWd5GokCChVDb2x1bW5SZW1vdmFsU3RyYXRlZ3kSYAoIaGFsdF9qb2IYASABKAsyTC5tZ210LnYxYWxwaGExLlBvc3RncmVzU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5LkhhbHRKb2JIABJoCgxjb250aW51ZV9qb2IYAiABKAsyUC5tZ210LnYxYWxwaGExLlBvc3RncmVzU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5LkNvbnRpbnVlSm9iSAAaCQoHSGFsdEpvYhoNCgtDb250aW51ZUpvYkIKCghzdHJhdGVneUoECAEQAiJ5ChpQb3N0Z3Jlc1NvdXJjZVNjaGVtYU9wdGlvbhIXCgZzY2hlbWEYASABKAlCB7pIBHICEAESQgoGdGFibGVzGAIgAygLMigubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZVRhYmxlT3B0aW9uQgi6SAWSAQIIASJfChlQb3N0Z3Jlc1NvdXJjZVRhYmxlT3B0aW9uEhYKBXRhYmxlGAEgASgJQge6SARyAhABEhkKDHdoZXJlX2NsYXVzZRgCIAEoCUgAiAEBQg8KDV93aGVyZV9jbGF1c2UioggKHE15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMSJwobaGFsdF9vbl9uZXdfY29sdW1uX2FkZGl0aW9uGAEgASgIQgIYARI3CgdzY2hlbWFzGAIgAygLMiYubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZVNjaGVtYU9wdGlvbhIfCg1jb25uZWN0aW9uX2lkGAMgASgJQgi6SAVyA7ABARIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYBCABKAgSYgoXY29sdW1uX3JlbW92YWxfc3RyYXRlZ3kYBSABKAsyQS5tZ210LnYxYWxwaGExLk15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5EmsKHG5ld19jb2x1bW5fYWRkaXRpb25fc3RyYXRlZ3kYBiABKAsyRS5tZ210LnYxYWxwaGExLk15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneRqDAgoVQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5El0KCGhhbHRfam9iGAEgASgLMkkubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5IYWx0Sm9iSAASZQoMY29udGludWVfam9iGAIgASgLMk0ubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5Db250aW51ZUpvYkgAGgkKB0hhbHRKb2IaDQoLQ29udGludWVKb2JCCgoIc3RyYXRlZ3ka/AIKGU5ld0NvbHVtbkFkZGl0aW9uU3RyYXRlZ3kSYQoIaGFsdF9qb2IYASABKAsyTS5tZ210LnYxYWxwaGExLk15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneS5IYWx0Sm9iSAASYQoIYXV0b19tYXAYAiABKAsyTS5tZ210LnYxYWxwaGExLk15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneS5BdXRvTWFwSAASaAoLcGFzc3Rocm91Z2gYAyABKAsyUS5tZ210LnYxYWxwaGExLk15c3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneS5QYXNzdGhyb3VnaEgAGgkKB0hhbHRKb2IaCQoHQXV0b01hcBoNCgtQYXNzdGhyb3VnaEIKCghzdHJhdGVneSJzChdNeXNxbFNvdXJjZVNjaGVtYU9wdGlvbhIXCgZzY2hlbWEYASABKAlCB7pIBHICEAESPwoGdGFibGVzGAIgAygLMiUubWdtdC52MWFscGhhMS5NeXNxbFNvdXJjZVRhYmxlT3B0aW9uQgi6SAWSAQIIASJcChZNeXNxbFNvdXJjZVRhYmxlT3B0aW9uEhYKBXRhYmxlGAEgASgJQge6SARyAhABEhkKDHdoZXJlX2NsYXVzZRgCIAEoCUgAiAEBQg8KDV93aGVyZV9jbGF1c2UitAcKHE1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMSJwobaGFsdF9vbl9uZXdfY29sdW1uX2FkZGl0aW9uGAEgASgIQgIYARI3CgdzY2hlbWFzGAIgAygLMiYubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZVNjaGVtYU9wdGlvbhIfCg1jb25uZWN0aW9uX2lkGAMgASgJQgi6SAVyA7ABARIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYBCABKAgSYgoXY29sdW1uX3JlbW92YWxfc3RyYXRlZ3kYBSABKAsyQS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5EmsKHG5ld19jb2x1bW5fYWRkaXRpb25fc3RyYXRlZ3kYBiABKAsyRS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneRqDAgoVQ29sdW1uUmVtb3ZhbFN0cmF0ZWd5El0KCGhhbHRfam9iGAEgASgLMkkubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5IYWx0Sm9iSAASZQoMY29udGludWVfam9iGAIgASgLMk0ubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZUNvbm5lY3Rpb25PcHRpb25zLkNvbHVtblJlbW92YWxTdHJhdGVneS5Db250aW51ZUpvYkgAGgkKB0hhbHRKb2IaDQoLQ29udGludWVKb2JCCgoIc3RyYXRlZ3kajgIKGU5ld0NvbHVtbkFkZGl0aW9uU3RyYXRlZ3kSYQoIaGFsdF9qb2IYASABKAsyTS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneS5IYWx0Sm9iSAASaAoLcGFzc3Rocm91Z2gYAiABKAsyUS5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlQ29ubmVjdGlvbk9wdGlvbnMuTmV3Q29sdW1uQWRkaXRpb25TdHJhdGVneS5QYXNzdGhyb3VnaEgAGgkKB0hhbHRKb2IaDQoLUGFzc3Rocm91Z2hCCgoIc3RyYXRlZ3kicwoXTXNzcWxTb3VyY2VTY2hlbWFPcHRpb24SFwoGc2NoZW1hGAEgASgJQge6SARyAhABEj8KBnRhYmxlcxgCIAMoCzIlLm1nbXQudjFhbHBoYTEuTXNzcWxTb3VyY2VUYWJsZU9wdGlvbkIIukgFkgECCAEiXAoWTXNzcWxTb3VyY2VUYWJsZU9wdGlvbhIWCgV0YWJsZRgBIAEoCUIHukgEcgIQARIZCgx3aGVyZV9jbGF1c2UYAiABKAlIAIgBAUIPCg1fd2hlcmVfY2xhdXNlIj8KHEF3c1MzU291cmNlQ29ubmVjdGlvbk9wdGlvbnMSHwoNY29ubmVjdGlvbl9pZBgBIAEoCUIIukgFcgOwAQEi2wQKFUpvYkRlc3RpbmF0aW9uT3B0aW9ucxJPChBwb3N0Z3Jlc19vcHRpb25zGAEgASgLMjMubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc0Rlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnNIABJKCg5hd3NfczNfb3B0aW9ucxgCIAEoCzIwLm1nbXQudjFhbHBoYTEuQXdzUzNEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSAASSQoNbXlzcWxfb3B0aW9ucxgDIAEoCzIwLm1nbXQudjFhbHBoYTEuTXlzcWxEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zSAASTQoPbW9uZ29kYl9vcHRpb25zGAQgASgLMjIubWdtdC52MWFscGhhMS5Nb25nb0RCRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9uc0gAEl4KGGdjcF9jbG91ZHN0b3JhZ2Vfb3B0aW9ucxgFIAEoCzI6Lm1nbXQudjFhbHBoYTEuR2NwQ2xvdWRTdG9yYWdlRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9uc0gAEk8KEGR5bmFtb2RiX29wdGlvbnMYBiABKAsyMy5tZ210LnYxYWxwaGExLkR5bmFtb0RCRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9uc0gAEkkKDW1zc3FsX29wdGlvbnMYByABKAsyMC5tZ210LnYxYWxwaGExLk1zc3FsRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9uc0gAQg8KBmNvbmZpZxIFukgCCAEiJQojTW9uZ29EQkRlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMiLQorR2NwQ2xvdWRTdG9yYWdlRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucyJuCiREeW5hbW9EQkRlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMSRgoOdGFibGVfbWFwcGluZ3MYASADKAsyLi5tZ210LnYxYWxwaGExLkR5bmFtb0RCRGVzdGluYXRpb25UYWJsZU1hcHBpbmciUgofRHluYW1vREJEZXN0aW5hdGlvblRhYmxlTWFwcGluZxIUCgxzb3VyY2VfdGFibGUYASABKAkSGQoRZGVzdGluYXRpb25fdGFibGUYAiABKAkiygIKJFBvc3RncmVzRGVzdGluYXRpb25Db25uZWN0aW9uT3B0aW9ucxJCCg50cnVuY2F0ZV90YWJsZRgBIAEoCzIqLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNUcnVuY2F0ZVRhYmxlQ29uZmlnEhkKEWluaXRfdGFibGVfc2NoZW1hGAIgASgIEjwKC29uX2NvbmZsaWN0GAMgASgLMicubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc09uQ29uZmxpY3RDb25maWcSIwobc2tpcF9mb3JlaWduX2tleV92aW9sYXRpb25zGAQgASgIEikKBWJhdGNoGAUgASgLMhoubWdtdC52MWFscGhhMS5CYXRjaENvbmZpZxIjCg1tYXhfaW5fZmxpZ2h0GAYgASgNQge6SAQqAigBSACIAQFCEAoOX21heF9pbl9mbGlnaHQirAIKGFBvc3RncmVzT25Db25mbGljdENvbmZpZxIWCgpkb19ub3RoaW5nGAEgASgIQgIYARJWCgdub3RoaW5nGAIgASgLMkMubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc09uQ29uZmxpY3RDb25maWcuUG9zdGdyZXNPbkNvbmZsaWN0RG9Ob3RoaW5nSAASUgoGdXBkYXRlGAMgASgLMkAubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc09uQ29uZmxpY3RDb25maWcuUG9zdGdyZXNPbkNvbmZsaWN0VXBkYXRlSAAaHQobUG9zdGdyZXNPbkNvbmZsaWN0RG9Ob3RoaW5nGhoKGFBvc3RncmVzT25Db25mbGljdFVwZGF0ZUIRCghzdHJhdGVneRIFukgCCAAiTgobUG9zdGdyZXNUcnVuY2F0ZVRhYmxlQ29uZmlnEh4KFnRydW5jYXRlX2JlZm9yZV9pbnNlcnQYASABKAgSDwoHY2FzY2FkZRgCIAEoCCLBAgohTXlzcWxEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zEj8KDnRydW5jYXRlX3RhYmxlGAEgASgLMicubWdtdC52MWFscGhhMS5NeXNxbFRydW5jYXRlVGFibGVDb25maWcSGQoRaW5pdF90YWJsZV9zY2hlbWEYAiABKAgSOQoLb25fY29uZmxpY3QYAyABKAsyJC5tZ210LnYxYWxwaGExLk15c3FsT25Db25mbGljdENvbmZpZxIjChtza2lwX2ZvcmVpZ25fa2V5X3Zpb2xhdGlvbnMYBCABKAgSKQoFYmF0Y2gYBSABKAsyGi5tZ210LnYxYWxwaGExLkJhdGNoQ29uZmlnEiMKDW1heF9pbl9mbGlnaHQYBiABKA1CB7pIBCoCKAFIAIgBAUIQCg5fbWF4X2luX2ZsaWdodCI6ChhNeXNxbFRydW5jYXRlVGFibGVDb25maWcSHgoWdHJ1bmNhdGVfYmVmb3JlX2luc2VydBgBIAEoCCKTAgoVTXlzcWxPbkNvbmZsaWN0Q29uZmlnEhIKCmRvX25vdGhpbmcYASABKAgSUAoHbm90aGluZxgCIAEoCzI9Lm1nbXQudjFhbHBoYTEuTXlzcWxPbkNvbmZsaWN0Q29uZmlnLk15c3FsT25Db25mbGljdERvTm90aGluZ0gAEkwKBnVwZGF0ZRgDIAEoCzI6Lm1nbXQudjFhbHBoYTEuTXlzcWxPbkNvbmZsaWN0Q29uZmlnLk15c3FsT25Db25mbGljdFVwZGF0ZUgAGhoKGE15c3FsT25Db25mbGljdERvTm90aGluZxoXChVNeXNxbE9uQ29uZmxpY3RVcGRhdGVCEQoIc3RyYXRlZ3kSBbpIAggAIsECCiFNc3NxbERlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMSPwoOdHJ1bmNhdGVfdGFibGUYASABKAsyJy5tZ210LnYxYWxwaGExLk1zc3FsVHJ1bmNhdGVUYWJsZUNvbmZpZxIZChFpbml0X3RhYmxlX3NjaGVtYRgCIAEoCBI5Cgtvbl9jb25mbGljdBgDIAEoCzIkLm1nbXQudjFhbHBoYTEuTXNzcWxPbkNvbmZsaWN0Q29uZmlnEiMKG3NraXBfZm9yZWlnbl9rZXlfdmlvbGF0aW9ucxgEIAEoCBIpCgViYXRjaBgFIAEoCzIaLm1nbXQudjFhbHBoYTEuQmF0Y2hDb25maWcSIwoNbWF4X2luX2ZsaWdodBgGIAEoDUIHukgEKgIoAUgAiAEBQhAKDl9tYXhfaW5fZmxpZ2h0IjoKGE1zc3FsVHJ1bmNhdGVUYWJsZUNvbmZpZxIeChZ0cnVuY2F0ZV9iZWZvcmVfaW5zZXJ0GAEgASgIIisKFU1zc3FsT25Db25mbGljdENvbmZpZxISCgpkb19ub3RoaW5nGAEgASgIIo4ECiFBd3NTM0Rlc3RpbmF0aW9uQ29ubmVjdGlvbk9wdGlvbnMSVAoNc3RvcmFnZV9jbGFzcxgBIAEoDjI9Lm1nbXQudjFhbHBoYTEuQXdzUzNEZXN0aW5hdGlvbkNvbm5lY3Rpb25PcHRpb25zLlN0b3JhZ2VDbGFzcxIjCg1tYXhfaW5fZmxpZ2h0GAIgASgNQge6SAQqAigBSACIAQESFAoHdGltZW91dBgDIAEoCUgBiAEBEikKBWJhdGNoGAQgASgLMhoubWdtdC52MWFscGhhMS5CYXRjaENvbmZpZyKOAgoMU3RvcmFnZUNsYXNzEh0KGVNUT1JBR0VfQ0xBU1NfVU5TUEVDSUZJRUQQABIaChZTVE9SQUdFX0NMQVNTX1NUQU5EQVJEEAESJAogU1RPUkFHRV9DTEFTU19SRURVQ0VEX1JFRFVOREFOQ1kQAhIZChVTVE9SQUdFX0NMQVNTX0dMQUNJRVIQAxIdChlTVE9SQUdFX0NMQVNTX1NUQU5EQVJEX0lBEAQSHAoYU1RPUkFHRV9DTEFTU19PTkVaT05FX0lBEAUSJQohU1RPUkFHRV9DTEFTU19JTlRFTExJR0VOVF9USUVSSU5HEAYSHgoaU1RPUkFHRV9DTEFTU19ERUVQX0FSQ0hJVkUQB0IQCg5fbWF4X2luX2ZsaWdodEIKCghfdGltZW91dCJLCgtCYXRjaENvbmZpZxISCgVjb3VudBgBIAEoDUgAiAEBEhMKBnBlcmlvZBgCIAEoCUgBiAEBQggKBl9jb3VudEIJCgdfcGVyaW9kIuUFChBDcmVhdGVKb2JSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEisKCGpvYl9uYW1lGAIgASgJQhm6SBZyFDISXlthLXowLTktXXszLDEwMH0kEhoKDWNyb25fc2NoZWR1bGUYAyABKAlIAIgBARIrCghtYXBwaW5ncxgEIAMoCzIZLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZxIoCgZzb3VyY2UYBSABKAsyGC5tZ210LnYxYWxwaGExLkpvYlNvdXJjZRI5CgxkZXN0aW5hdGlvbnMYBiADKAsyIy5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYkRlc3RpbmF0aW9uEhgKEGluaXRpYXRlX2pvYl9ydW4YByABKAgSOAoQd29ya2Zsb3dfb3B0aW9ucxgIIAEoCzIeLm1nbXQudjFhbHBoYTEuV29ya2Zsb3dPcHRpb25zEjQKDHN5bmNfb3B0aW9ucxgJIAEoCzIeLm1nbXQudjFhbHBoYTEuQWN0aXZpdHlPcHRpb25zEkUKFHZpcnR1YWxfZm9yZWlnbl9rZXlzGAogAygLMicubWdtdC52MWFscGhhMS5WaXJ0dWFsRm9yZWlnbkNvbnN0cmFpbnQSMwoIam9iX3R5cGUYCyABKAsyHC5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWdIAYgBATqyAbpIrgEaqwEKHmRlc3RpbmF0aW9uc19yZXF1aXJlZF9mb3Jfc3luYxIzRm9yIHN5bmMgam9icywgYXQgbGVhc3Qgb25lIGRlc3RpbmF0aW9uIGlzIHJlcXVpcmVkGlQhaGFzKHRoaXMuam9iX3R5cGUpIHx8IGhhcyh0aGlzLmpvYl90eXBlLnN5bmMpID8gc2l6ZSh0aGlzLmRlc3RpbmF0aW9ucykgPj0gMSA6IHRydWVCEAoOX2Nyb25fc2NoZWR1bGVCCwoJX2pvYl90eXBlItUvCg1Kb2JUeXBlQ29uZmlnEjgKBHN5bmMYASABKAsyKC5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmNIABJDCgpwaWlfZGV0ZWN0GAIgASgLMi0ubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVQaWlEZXRlY3RIABrCJwoLSm9iVHlwZVN5bmMSUQoNc2NoZW1hX2NoYW5nZRgBIAEoCzI1Lm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlU3luYy5TY2hlbWFDaGFuZ2VIAIgBARJPCg9zY2hlbWFfbWFwcGluZ3MYAiADKAsyNi5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuU2NoZW1hTWFwcGluZxrMAgoMU2NoZW1hQ2hhbmdlElUKD3NjaGVtYV9zdHJhdGVneRgBIAEoCzI3Lm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlU3luYy5TY2hlbWFTdHJhdGVneUgAiAEBElMKDnRhYmxlX3N0cmF0ZWd5GAIgASgLMjYubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVTeW5jLlRhYmxlU3RyYXRlZ3lIAYgBARJVCg9jb2x1bW5fc3RyYXRlZ3kYAyABKAsyNy5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3lIAogBAUISChBfc2NoZW1hX3N0cmF0ZWd5QhEKD190YWJsZV9zdHJhdGVneUISChBfY29sdW1uX3N0cmF0ZWd5GpUCCg5TY2hlbWFTdHJhdGVneRJgCg9tYXBfYWxsX3NjaGVtYXMYASABKAsyRS5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuU2NoZW1hU3RyYXRlZ3kuTWFwQWxsU2NoZW1hc0gAEmgKE21hcF9kZWZpbmVkX3NjaGVtYXMYAiABKAsySS5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuU2NoZW1hU3RyYXRlZ3kuTWFwRGVmaW5lZFNjaGVtYXNIABoPCg1NYXBBbGxTY2hlbWFzGhMKEU1hcERlZmluZWRTY2hlbWFzQhEKCHN0cmF0ZWd5EgW6SAIIABqMAgoNVGFibGVTdHJhdGVneRJdCg5tYXBfYWxsX3RhYmxlcxgBIAEoCzJDLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlU3luYy5UYWJsZVN0cmF0ZWd5Lk1hcEFsbFRhYmxlc0gAEmUKEm1hcF9kZWZpbmVkX3RhYmxlcxgCIAEoCzJHLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlU3luYy5UYWJsZVN0cmF0ZWd5Lk1hcERlZmluZWRUYWJsZXNIABoOCgxNYXBBbGxUYWJsZXMaEgoQTWFwRGVmaW5lZFRhYmxlc0IRCghzdHJhdGVneRIFukgCCAAaxxgKDkNvbHVtblN0cmF0ZWd5EmAKD21hcF9hbGxfY29sdW1ucxgBIAEoCzJFLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlU3luYy5Db2x1bW5TdHJhdGVneS5NYXBBbGxDb2x1bW5zSAASaAoTbWFwX2RlZmluZWRfY29sdW1ucxgCIAEoCzJJLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlU3luYy5Db2x1bW5TdHJhdGVneS5NYXBEZWZpbmVkQ29sdW1uc0gAGu0FCg1NYXBBbGxDb2x1bW5zEoEBChtjb2x1bW5faW5fc291cmNlX25vdF9tYXBwZWQYASABKAsyVy5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3kuQ29sdW1uSW5Tb3VyY2VOb3RNYXBwZWRTdHJhdGVneUgAiAEBEoEBChtjb2x1bW5fbWFwcGVkX25vdF9pbl9zb3VyY2UYAiABKAsyVy5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3kuQ29sdW1uTWFwcGVkTm90SW5Tb3VyY2VTdHJhdGVneUgBiAEBEp0BCipjb2x1bW5faW5fc291cmNlX21hcHBlZF9ub3RfaW5fZGVzdGluYXRpb24YAyABKAsyZC5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3kuQ29sdW1uSW5Tb3VyY2VNYXBwZWROb3RJbkRlc3RpbmF0aW9uU3RyYXRlZ3lIAogBARKWAQopY29sdW1uX2luX2Rlc3RpbmF0aW9uX25vX2xvbmdlcl9pbl9zb3VyY2UYBCABKAsyXi5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3kuQ29sdW1uSW5EZXN0aW5hdGlvbk5vdEluU291cmNlU3RyYXRlZ3lIA4gBAUIeChxfY29sdW1uX2luX3NvdXJjZV9ub3RfbWFwcGVkQh4KHF9jb2x1bW5fbWFwcGVkX25vdF9pbl9zb3VyY2VCLQorX2NvbHVtbl9pbl9zb3VyY2VfbWFwcGVkX25vdF9pbl9kZXN0aW5hdGlvbkIsCipfY29sdW1uX2luX2Rlc3RpbmF0aW9uX25vX2xvbmdlcl9pbl9zb3VyY2UahgMKEU1hcERlZmluZWRDb2x1bW5zEoEBChtjb2x1bW5fbWFwcGVkX25vdF9pbl9zb3VyY2UYASABKAsyVy5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3kuQ29sdW1uTWFwcGVkTm90SW5Tb3VyY2VTdHJhdGVneUgAiAEBEp0BCipjb2x1bW5faW5fc291cmNlX21hcHBlZF9ub3RfaW5fZGVzdGluYXRpb24YAiABKAsyZC5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3kuQ29sdW1uSW5Tb3VyY2VNYXBwZWROb3RJbkRlc3RpbmF0aW9uU3RyYXRlZ3lIAYgBAUIeChxfY29sdW1uX21hcHBlZF9ub3RfaW5fc291cmNlQi0KK19jb2x1bW5faW5fc291cmNlX21hcHBlZF9ub3RfaW5fZGVzdGluYXRpb24apAQKH0NvbHVtbkluU291cmNlTm90TWFwcGVkU3RyYXRlZ3kSegoLcGFzc3Rocm91Z2gYASABKAsyYy5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3kuQ29sdW1uSW5Tb3VyY2VOb3RNYXBwZWRTdHJhdGVneS5QYXNzdGhyb3VnaEgAEnMKCGF1dG9fbWFwGAIgASgLMl8ubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVTeW5jLkNvbHVtblN0cmF0ZWd5LkNvbHVtbkluU291cmNlTm90TWFwcGVkU3RyYXRlZ3kuQXV0b01hcEgAEmwKBGhhbHQYAyABKAsyXC5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3kuQ29sdW1uSW5Tb3VyY2VOb3RNYXBwZWRTdHJhdGVneS5IYWx0SAASbAoEZHJvcBgEIAEoCzJcLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlU3luYy5Db2x1bW5TdHJhdGVneS5Db2x1bW5JblNvdXJjZU5vdE1hcHBlZFN0cmF0ZWd5LkRyb3BIABoNCgtQYXNzdGhyb3VnaBoJCgdBdXRvTWFwGgYKBEhhbHQaBgoERHJvcEIKCghzdHJhdGVneRqlAgofQ29sdW1uTWFwcGVkTm90SW5Tb3VyY2VTdHJhdGVneRJ0Cghjb250aW51ZRgBIAEoCzJgLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlU3luYy5Db2x1bW5TdHJhdGVneS5Db2x1bW5NYXBwZWROb3RJblNvdXJjZVN0cmF0ZWd5LkNvbnRpbnVlSAASbAoEaGFsdBgCIAEoCzJcLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlU3luYy5Db2x1bW5TdHJhdGVneS5Db2x1bW5NYXBwZWROb3RJblNvdXJjZVN0cmF0ZWd5LkhhbHRIABoKCghDb250aW51ZRoGCgRIYWx0QgoKCHN0cmF0ZWd5GtADCixDb2x1bW5JblNvdXJjZU1hcHBlZE5vdEluRGVzdGluYXRpb25TdHJhdGVneRKBAQoIY29udGludWUYASABKAsybS5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3kuQ29sdW1uSW5Tb3VyY2VNYXBwZWROb3RJbkRlc3RpbmF0aW9uU3RyYXRlZ3kuQ29udGludWVIABJ5CgRkcm9wGAIgASgLMmkubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVTeW5jLkNvbHVtblN0cmF0ZWd5LkNvbHVtbkluU291cmNlTWFwcGVkTm90SW5EZXN0aW5hdGlvblN0cmF0ZWd5LkRyb3BIABJ5CgRoYWx0GAMgASgLMmkubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVTeW5jLkNvbHVtblN0cmF0ZWd5LkNvbHVtbkluU291cmNlTWFwcGVkTm90SW5EZXN0aW5hdGlvblN0cmF0ZWd5LkhhbHRIABoKCghDb250aW51ZRoGCgREcm9wGgYKBEhhbHRCCgoIc3RyYXRlZ3kawQMKJkNvbHVtbkluRGVzdGluYXRpb25Ob3RJblNvdXJjZVN0cmF0ZWd5EnsKCGNvbnRpbnVlGAEgASgLMmcubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVTeW5jLkNvbHVtblN0cmF0ZWd5LkNvbHVtbkluRGVzdGluYXRpb25Ob3RJblNvdXJjZVN0cmF0ZWd5LkNvbnRpbnVlSAAScwoEaGFsdBgCIAEoCzJjLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlU3luYy5Db2x1bW5TdHJhdGVneS5Db2x1bW5JbkRlc3RpbmF0aW9uTm90SW5Tb3VyY2VTdHJhdGVneS5IYWx0SAASegoIYXV0b19tYXAYAyABKAsyZi5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3kuQ29sdW1uSW5EZXN0aW5hdGlvbk5vdEluU291cmNlU3RyYXRlZ3kuQXV0b01hcEgAGgoKCENvbnRpbnVlGgYKBEhhbHQaCQoHQXV0b01hcEIKCghzdHJhdGVneUIKCghzdHJhdGVneRq8BgoNU2NoZW1hTWFwcGluZxIXCgZzY2hlbWEYASABKAlCB7pIBHICEAESHwoSZGVzdGluYXRpb25fc2NoZW1hGAIgASgJSACIAQESWwoOdGFibGVfbWFwcGluZ3MYAyADKAsyQy5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuU2NoZW1hTWFwcGluZy5UYWJsZU1hcHBpbmcSUwoOdGFibGVfc3RyYXRlZ3kYBCABKAsyNi5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuVGFibGVTdHJhdGVneUgBiAEBElUKD2NvbHVtbl9zdHJhdGVneRgFIAEoCzI3Lm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlU3luYy5Db2x1bW5TdHJhdGVneUgCiAEBGqkDCgxUYWJsZU1hcHBpbmcSFgoFdGFibGUYASABKAlCB7pIBHICEAESHgoRZGVzdGluYXRpb25fdGFibGUYAiABKAlIAIgBARJqCg9jb2x1bW5fbWFwcGluZ3MYAyADKAsyUS5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuU2NoZW1hTWFwcGluZy5UYWJsZU1hcHBpbmcuQ29sdW1uTWFwcGluZxJVCg9jb2x1bW5fc3RyYXRlZ3kYBCABKAsyNy5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVN5bmMuQ29sdW1uU3RyYXRlZ3lIAYgBARp0Cg1Db2x1bW5NYXBwaW5nEhcKBmNvbHVtbhgBIAEoCUIHukgEcgIQARI6Cgt0cmFuc2Zvcm1lchgCIAEoCzIgLm1nbXQudjFhbHBoYTEuVHJhbnNmb3JtZXJDb25maWdIAIgBAUIOCgxfdHJhbnNmb3JtZXJCFAoSX2Rlc3RpbmF0aW9uX3RhYmxlQhIKEF9jb2x1bW5fc3RyYXRlZ3lCFQoTX2Rlc3RpbmF0aW9uX3NjaGVtYUIRCg9fdGFibGVfc3RyYXRlZ3lCEgoQX2NvbHVtbl9zdHJhdGVneUIQCg5fc2NoZW1hX2NoYW5nZRrsBgoQSm9iVHlwZVBpaURldGVjdBJRCg1kYXRhX3NhbXBsaW5nGAEgASgLMjoubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVQaWlEZXRlY3QuRGF0YVNhbXBsaW5nElgKEXRhYmxlX3NjYW5fZmlsdGVyGAIgASgLMj0ubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVQaWlEZXRlY3QuVGFibGVTY2FuRmlsdGVyEhgKC3VzZXJfcHJvbXB0GAMgASgJSACIAQESUwoLaW5jcmVtZW50YWwYBCABKAsyOS5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVBpaURldGVjdC5JbmNyZW1lbnRhbEgBiAEBGiEKC0luY3JlbWVudGFsEhIKCmlzX2VuYWJsZWQYASABKAgaIgoMRGF0YVNhbXBsaW5nEhIKCmlzX2VuYWJsZWQYASABKAgakQIKD1RhYmxlU2NhbkZpbHRlchJPCgtpbmNsdWRlX2FsbBgBIAEoCzI4Lm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZy5Kb2JUeXBlUGlpRGV0ZWN0LkluY2x1ZGVBbGxIABJOCgdpbmNsdWRlGAIgASgLMjsubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVQaWlEZXRlY3QuVGFibGVQYXR0ZXJuc0gAEk4KB2V4Y2x1ZGUYAyABKAsyOy5tZ210LnYxYWxwaGExLkpvYlR5cGVDb25maWcuSm9iVHlwZVBpaURldGVjdC5UYWJsZVBhdHRlcm5zSABCDQoEbW9kZRIFukgCCAEaDAoKSW5jbHVkZUFsbBpvCg1UYWJsZVBhdHRlcm5zEg8KB3NjaGVtYXMYASADKAkSTQoGdGFibGVzGAIgAygLMj0ubWdtdC52MWFscGhhMS5Kb2JUeXBlQ29uZmlnLkpvYlR5cGVQaWlEZXRlY3QuVGFibGVJZGVudGlmaWVyGkIKD1RhYmxlSWRlbnRpZmllchIXCgZzY2hlbWEYASABKAlCB7pIBHICEAESFgoFdGFibGUYAiABKAlCB7pIBHICEAFCDgoMX3VzZXJfcHJvbXB0Qg4KDF9pbmNyZW1lbnRhbEIRCghqb2JfdHlwZRIFukgCCAAiZQoPV29ya2Zsb3dPcHRpb25zEhgKC3J1bl90aW1lb3V0GAggASgDSACIAQFCDgoMX3J1bl90aW1lb3V0SgQIARACSgQIAhADSgQIAxAESgQIBBAFSgQIBRAGSgQIBhAHSgQIBxAIItsBCg9BY3Rpdml0eU9wdGlvbnMSLwoZc2NoZWR1bGVfdG9fY2xvc2VfdGltZW91dBgBIAEoA0IHukgEIgIoAUgAiAEBEiwKFnN0YXJ0X3RvX2Nsb3NlX3RpbWVvdXQYAiABKANCB7pIBCICKAFIAYgBARIwCgxyZXRyeV9wb2xpY3kYAyABKAsyGi5tZ210LnYxYWxwaGExLlJldHJ5UG9saWN5QhwKGl9zY2hlZHVsZV90b19jbG9zZV90aW1lb3V0QhkKF19zdGFydF90b19jbG9zZV90aW1lb3V0IkoKC1JldHJ5UG9saWN5EiYKEG1heGltdW1fYXR0ZW1wdHMYASABKAVCB7pIBBoCKABIAIgBAUITChFfbWF4aW11bV9hdHRlbXB0cyI0ChFDcmVhdGVKb2JSZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiJPChVKb2JNYXBwaW5nVHJhbnNmb3JtZXISMAoGY29uZmlnGAMgASgLMiAubWdtdC52MWFscGhhMS5UcmFuc2Zvcm1lckNvbmZpZ0oECAEQAiKRAQoKSm9iTWFwcGluZxIXCgZzY2hlbWEYASABKAlCB7pIBHICEAESFgoFdGFibGUYAiABKAlCB7pIBHICEAESFwoGY29sdW1uGAMgASgJQge6SARyAhABEjkKC3RyYW5zZm9ybWVyGAUgASgLMiQubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nVHJhbnNmb3JtZXIiJQoNR2V0Sm9iUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiMQoOR2V0Sm9iUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IiXgoYVXBkYXRlSm9iU2NoZWR1bGVSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABARIaCg1jcm9uX3NjaGVkdWxlGAIgASgJSACIAQFCEAoOX2Nyb25fc2NoZWR1bGUiPAoZVXBkYXRlSm9iU2NoZWR1bGVSZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiJSCg9QYXVzZUpvYlJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEg0KBXBhdXNlGAIgASgIEhEKBG5vdGUYAyABKAlIAIgBAUIHCgVfbm90ZSIzChBQYXVzZUpvYlJlc3BvbnNlEh8KA2pvYhgBIAEoCzISLm1nbXQudjFhbHBoYTEuSm9iIoYCCiBVcGRhdGVKb2JTb3VyY2VDb25uZWN0aW9uUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQESKAoGc291cmNlGAIgASgLMhgubWdtdC52MWFscGhhMS5Kb2JTb3VyY2USKwoIbWFwcGluZ3MYAyADKAsyGS5tZ210LnYxYWxwaGExLkpvYk1hcHBpbmcSRQoUdmlydHVhbF9mb3JlaWduX2tleXMYBCADKAsyJy5tZ210LnYxYWxwaGExLlZpcnR1YWxGb3JlaWduQ29uc3RyYWludBIuCghqb2JfdHlwZRgFIAEoCzIcLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZyJECiFVcGRhdGVKb2JTb3VyY2VDb25uZWN0aW9uUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IiYQoaUG9zdGdyZXNTb3VyY2VTY2hlbWFTdWJzZXQSQwoQcG9zdGdyZXNfc2NoZW1hcxgBIAMoCzIpLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNTb3VyY2VTY2hlbWFPcHRpb24iWAoXTXlzcWxTb3VyY2VTY2hlbWFTdWJzZXQSPQoNbXlzcWxfc2NoZW1hcxgBIAMoCzImLm1nbXQudjFhbHBoYTEuTXlzcWxTb3VyY2VTY2hlbWFPcHRpb24iVgoaRHluYW1vREJTb3VyY2VTY2hlbWFTdWJzZXQSOAoGdGFibGVzGAEgAygLMigubWdtdC52MWFscGhhMS5EeW5hbW9EQlNvdXJjZVRhYmxlT3B0aW9uIlgKF01zc3FsU291cmNlU2NoZW1hU3Vic2V0Ej0KDW1zc3FsX3NjaGVtYXMYASADKAsyJi5tZ210LnYxYWxwaGExLk1zc3FsU291cmNlU2NoZW1hT3B0aW9uIr4CChhKb2JTb3VyY2VTcWxTdWJldFNjaGVtYXMSRAoPcG9zdGdyZXNfc3Vic2V0GAIgASgLMikubWdtdC52MWFscGhhMS5Qb3N0Z3Jlc1NvdXJjZVNjaGVtYVN1YnNldEgAEj4KDG15c3FsX3N1YnNldBgDIAEoCzImLm1nbXQudjFhbHBoYTEuTXlzcWxTb3VyY2VTY2hlbWFTdWJzZXRIABJECg9keW5hbW9kYl9zdWJzZXQYBCABKAsyKS5tZ210LnYxYWxwaGExLkR5bmFtb0RCU291cmNlU2NoZW1hU3Vic2V0SAASPgoMbXNzcWxfc3Vic2V0GAUgASgLMiYubWdtdC52MWFscGhhMS5Nc3NxbFNvdXJjZVNjaGVtYVN1YnNldEgAQhAKB3NjaGVtYXMSBbpIAggBSgQIARACIqQBCidTZXRKb2JTb3VyY2VTcWxDb25uZWN0aW9uU3Vic2V0c1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEjgKB3NjaGVtYXMYAiABKAsyJy5tZ210LnYxYWxwaGExLkpvYlNvdXJjZVNxbFN1YmV0U2NoZW1hcxIpCiFzdWJzZXRfYnlfZm9yZWlnbl9rZXlfY29uc3RyYWludHMYAyABKAgiSwooU2V0Sm9iU291cmNlU3FsQ29ubmVjdGlvblN1YnNldHNSZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiKxAQolVXBkYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBEh8KDWNvbm5lY3Rpb25faWQYAiABKAlCCLpIBXIDsAEBEjUKB29wdGlvbnMYAyABKAsyJC5tZ210LnYxYWxwaGExLkpvYkRlc3RpbmF0aW9uT3B0aW9ucxIWCg5kZXN0aW5hdGlvbl9pZBgEIAEoCSJJCiZVcGRhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiJJCiVEZWxldGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXF1ZXN0EiAKDmRlc3RpbmF0aW9uX2lkGAEgASgJQgi6SAVyA7ABASIoCiZEZWxldGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXNwb25zZSKHAQomQ3JlYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uc1JlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABARJDCgxkZXN0aW5hdGlvbnMYAiADKAsyIy5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYkRlc3RpbmF0aW9uQgi6SAWSAQIIASJKCidDcmVhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25zUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IiKAoQRGVsZXRlSm9iUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiEwoRRGVsZXRlSm9iUmVzcG9uc2UiYgoZSXNKb2JOYW1lQXZhaWxhYmxlUmVxdWVzdBInCgRuYW1lGAEgASgJQhm6SBZyFDISXlthLXowLTktXXszLDEwMH0kEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBIjIKGklzSm9iTmFtZUF2YWlsYWJsZVJlc3BvbnNlEhQKDGlzX2F2YWlsYWJsZRgBIAEoCCJVChFHZXRKb2JSdW5zUmVxdWVzdBIaCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBSAASHgoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQFIAEIECgJpZCI9ChJHZXRKb2JSdW5zUmVzcG9uc2USJwoIam9iX3J1bnMYASADKAsyFS5tZ210LnYxYWxwaGExLkpvYlJ1biJEChBHZXRKb2JSdW5SZXF1ZXN0EhIKCmpvYl9ydW5faWQYASABKAkSHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiOwoRR2V0Sm9iUnVuUmVzcG9uc2USJgoHam9iX3J1bhgBIAEoCzIVLm1nbXQudjFhbHBoYTEuSm9iUnVuIi8KE0NyZWF0ZUpvYlJ1blJlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABASIWChRDcmVhdGVKb2JSdW5SZXNwb25zZSJHChNDYW5jZWxKb2JSdW5SZXF1ZXN0EhIKCmpvYl9ydW5faWQYASABKAkSHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiFgoUQ2FuY2VsSm9iUnVuUmVzcG9uc2Ui7AQKA0pvYhIKCgJpZBgBIAEoCRIaChJjcmVhdGVkX2J5X3VzZXJfaWQYAiABKAkSLgoKY3JlYXRlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGgoSdXBkYXRlZF9ieV91c2VyX2lkGAQgASgJEi4KCnVwZGF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEgwKBG5hbWUYBiABKAkSKAoGc291cmNlGAcgASgLMhgubWdtdC52MWFscGhhMS5Kb2JTb3VyY2USMwoMZGVzdGluYXRpb25zGAggAygLMh0ubWdtdC52MWFscGhhMS5Kb2JEZXN0aW5hdGlvbhIrCghtYXBwaW5ncxgJIAMoCzIZLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZxIaCg1jcm9uX3NjaGVkdWxlGAogASgJSACIAQESEgoKYWNjb3VudF9pZBgLIAEoCRI0CgxzeW5jX29wdGlvbnMYDCABKAsyHi5tZ210LnYxYWxwaGExLkFjdGl2aXR5T3B0aW9ucxI4ChB3b3JrZmxvd19vcHRpb25zGA0gASgLMh4ubWdtdC52MWFscGhhMS5Xb3JrZmxvd09wdGlvbnMSRQoUdmlydHVhbF9mb3JlaWduX2tleXMYDiADKAsyJy5tZ210LnYxYWxwaGExLlZpcnR1YWxGb3JlaWduQ29uc3RyYWludBIuCghqb2JfdHlwZRgPIAEoCzIcLm1nbXQudjFhbHBoYTEuSm9iVHlwZUNvbmZpZ0IQCg5fY3Jvbl9zY2hlZHVsZSJSCgxKb2JSZWNlbnRSdW4SLgoKc3RhcnRfdGltZRgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEgoKam9iX3J1bl9pZBgCIAEoCSIzChdHZXRKb2JSZWNlbnRSdW5zUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBIkwKGEdldEpvYlJlY2VudFJ1bnNSZXNwb25zZRIwCgtyZWNlbnRfcnVucxgBIAMoCzIbLm1nbXQudjFhbHBoYTEuSm9iUmVjZW50UnVuIkEKC0pvYk5leHRSdW5zEjIKDm5leHRfcnVuX3RpbWVzGAEgAygLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIxChVHZXRKb2JOZXh0UnVuc1JlcXVlc3QSGAoGam9iX2lkGAEgASgJQgi6SAVyA7ABASJHChZHZXRKb2JOZXh0UnVuc1Jlc3BvbnNlEi0KCW5leHRfcnVucxgBIAEoCzIaLm1nbXQudjFhbHBoYTEuSm9iTmV4dFJ1bnMiLwoTR2V0Sm9iU3RhdHVzUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBIkAKFEdldEpvYlN0YXR1c1Jlc3BvbnNlEigKBnN0YXR1cxgBIAEoDjIYLm1nbXQudjFhbHBoYTEuSm9iU3RhdHVzIlUKD0pvYlN0YXR1c1JlY29yZBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBEigKBnN0YXR1cxgCIAEoDjIYLm1nbXQudjFhbHBoYTEuSm9iU3RhdHVzIjUKFUdldEpvYlN0YXR1c2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABASJKChZHZXRKb2JTdGF0dXNlc1Jlc3BvbnNlEjAKCHN0YXR1c2VzGAEgAygLMh4ubWdtdC52MWFscGhhMS5Kb2JTdGF0dXNSZWNvcmQiIgoPQWN0aXZpdHlGYWlsdXJlEg8KB21lc3NhZ2UYASABKAkiowEKD1BlbmRpbmdBY3Rpdml0eRItCgZzdGF0dXMYASABKA4yHS5tZ210LnYxYWxwaGExLkFjdGl2aXR5U3RhdHVzEhUKDWFjdGl2aXR5X25hbWUYAiABKAkSOQoMbGFzdF9mYWlsdXJlGAMgASgLMh4ubWdtdC52MWFscGhhMS5BY3Rpdml0eUZhaWx1cmVIAIgBAUIPCg1fbGFzdF9mYWlsdXJlIpkCCgZKb2JSdW4SCgoCaWQYASABKAkSDgoGam9iX2lkGAIgASgJEgwKBG5hbWUYAyABKAkSKwoGc3RhdHVzGAQgASgOMhsubWdtdC52MWFscGhhMS5Kb2JSdW5TdGF0dXMSLgoKc3RhcnRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASNQoMY29tcGxldGVkX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBEjoKEnBlbmRpbmdfYWN0aXZpdGllcxgIIAMoCzIeLm1nbXQudjFhbHBoYTEuUGVuZGluZ0FjdGl2aXR5Qg8KDV9jb21wbGV0ZWRfYXRKBAgFEAYiPAoUSm9iUnVuRXZlbnRUYXNrRXJyb3ISDwoHbWVzc2FnZRgBIAEoCRITCgtyZXRyeV9zdGF0ZRgCIAEoCSKPAQoPSm9iUnVuRXZlbnRUYXNrEgoKAmlkGAEgASgDEgwKBHR5cGUYAiABKAkSLgoKZXZlbnRfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMgoFZXJyb3IYBCABKAsyIy5tZ210LnYxYWxwaGExLkpvYlJ1bkV2ZW50VGFza0Vycm9yIjMKEkpvYlJ1blN5bmNNZXRhZGF0YRIOCgZzY2hlbWEYASABKAkSDQoFdGFibGUYAiABKAkiZAoTSm9iUnVuRXZlbnRNZXRhZGF0YRI6Cg1zeW5jX21ldGFkYXRhGAEgASgLMiEubWdtdC52MWFscGhhMS5Kb2JSdW5TeW5jTWV0YWRhdGFIAEIRCghtZXRhZGF0YRIFukgCCAEi7AEKC0pvYlJ1bkV2ZW50EgoKAmlkGAEgASgDEgwKBHR5cGUYAiABKAkSLgoKc3RhcnRfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKY2xvc2VfdGltZRgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASNAoIbWV0YWRhdGEYBSABKAsyIi5tZ210LnYxYWxwaGExLkpvYlJ1bkV2ZW50TWV0YWRhdGESLQoFdGFza3MYBiADKAsyHi5tZ210LnYxYWxwaGExLkpvYlJ1bkV2ZW50VGFzayJKChZHZXRKb2JSdW5FdmVudHNSZXF1ZXN0EhIKCmpvYl9ydW5faWQYASABKAkSHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiXgoXR2V0Sm9iUnVuRXZlbnRzUmVzcG9uc2USKgoGZXZlbnRzGAEgAygLMhoubWdtdC52MWFscGhhMS5Kb2JSdW5FdmVudBIXCg9pc19ydW5fY29tcGxldGUYAiABKAgiRwoTRGVsZXRlSm9iUnVuUmVxdWVzdBISCgpqb2JfcnVuX2lkGAEgASgJEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBIhYKFERlbGV0ZUpvYlJ1blJlc3BvbnNlIkoKFlRlcm1pbmF0ZUpvYlJ1blJlcXVlc3QSEgoKam9iX3J1bl9pZBgBIAEoCRIcCgphY2NvdW50X2lkGAIgASgJQgi6SAVyA7ABASIZChdUZXJtaW5hdGVKb2JSdW5SZXNwb25zZSLxAQoaR2V0Sm9iUnVuTG9nc1N0cmVhbVJlcXVlc3QSEgoKam9iX3J1bl9pZBgBIAEoCRIcCgphY2NvdW50X2lkGAIgASgJQgi6SAVyA7ABARIoCgZ3aW5kb3cYAyABKA4yGC5tZ210LnYxYWxwaGExLkxvZ1dpbmRvdxITCgtzaG91bGRfdGFpbBgEIAEoCBIjCg1tYXhfbG9nX2xpbmVzGAUgASgDQge6SAQiAigBSACIAQESKwoKbG9nX2xldmVscxgGIAMoDjIXLm1nbXQudjFhbHBoYTEuTG9nTGV2ZWxCEAoOX21heF9sb2dfbGluZXMi6AEKG0dldEpvYlJ1bkxvZ3NTdHJlYW1SZXNwb25zZRIQCghsb2dfbGluZRgBIAEoCRIyCgl0aW1lc3RhbXAYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSACIAQESRgoGbGFiZWxzGAMgAygLMjYubWdtdC52MWFscGhhMS5HZXRKb2JSdW5Mb2dzU3RyZWFtUmVzcG9uc2UuTGFiZWxzRW50cnkaLQoLTGFiZWxzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AUIMCgpfdGltZXN0YW1wItYBChRHZXRKb2JSdW5Mb2dzUmVxdWVzdBISCgpqb2JfcnVuX2lkGAEgASgJEhwKCmFjY291bnRfaWQYAiABKAlCCLpIBXIDsAEBEigKBndpbmRvdxgDIAEoDjIYLm1nbXQudjFhbHBoYTEuTG9nV2luZG93EiMKDW1heF9sb2dfbGluZXMYBCABKANCB7pIBCICKAFIAIgBARIrCgpsb2dfbGV2ZWxzGAUgAygOMhcubWdtdC52MWFscGhhMS5Mb2dMZXZlbEIQCg5fbWF4X2xvZ19saW5lcyKxAgoVR2V0Sm9iUnVuTG9nc1Jlc3BvbnNlEj8KCWxvZ19saW5lcxgBIAMoCzIsLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1Jlc3BvbnNlLkxvZ0xpbmUa1gEKB0xvZ0xpbmUSEAoIbG9nX2xpbmUYASABKAkSMgoJdGltZXN0YW1wGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBEkgKBmxhYmVscxgDIAMoCzI4Lm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1Jlc3BvbnNlLkxvZ0xpbmUuTGFiZWxzRW50cnkaLQoLTGFiZWxzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AUIMCgpfdGltZXN0YW1wIm4KHFNldEpvYldvcmtmbG93T3B0aW9uc1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEjgKEHdvcmZrbG93X29wdGlvbnMYAiABKAsyHi5tZ210LnYxYWxwaGExLldvcmtmbG93T3B0aW9ucyJACh1TZXRKb2JXb3JrZmxvd09wdGlvbnNSZXNwb25zZRIfCgNqb2IYASABKAsyEi5tZ210LnYxYWxwaGExLkpvYiJmChhTZXRKb2JTeW5jT3B0aW9uc1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEjQKDHN5bmNfb3B0aW9ucxgCIAEoCzIeLm1nbXQudjFhbHBoYTEuQWN0aXZpdHlPcHRpb25zIjwKGVNldEpvYlN5bmNPcHRpb25zUmVzcG9uc2USHwoDam9iGAEgASgLMhIubWdtdC52MWFscGhhMS5Kb2IikQIKGlZhbGlkYXRlSm9iTWFwcGluZ3NSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEisKCG1hcHBpbmdzGAIgAygLMhkubWdtdC52MWFscGhhMS5Kb2JNYXBwaW5nEh8KDWNvbm5lY3Rpb25faWQYAyABKAlCCLpIBXIDsAEBEkUKFHZpcnR1YWxfZm9yZWlnbl9rZXlzGAQgAygLMicubWdtdC52MWFscGhhMS5WaXJ0dWFsRm9yZWlnbkNvbnN0cmFpbnQSMQoKam9iX3NvdXJjZRgFIAEoCzIYLm1nbXQudjFhbHBoYTEuSm9iU291cmNlSACIAQFCDQoLX2pvYl9zb3VyY2UiqwcKC0NvbHVtbkVycm9yEg4KBnNjaGVtYRgBIAEoCRINCgV0YWJsZRgCIAEoCRIOCgZjb2x1bW4YAyABKAkSEgoGZXJyb3JzGAQgAygJQgIYARJDCg1lcnJvcl9yZXBvcnRzGAUgAygLMiwubWdtdC52MWFscGhhMS5Db2x1bW5FcnJvci5Db2x1bW5FcnJvclJlcG9ydBpeChFDb2x1bW5FcnJvclJlcG9ydBI4CgRjb2RlGAEgASgOMioubWdtdC52MWFscGhhMS5Db2x1bW5FcnJvci5Db2x1bW5FcnJvckNvZGUSDwoHbWVzc2FnZRgCIAEoCSKzBQoPQ29sdW1uRXJyb3JDb2RlEiEKHUNPTFVNTl9FUlJPUl9DT0RFX1VOU1BFQ0lGSUVEEAASKQolQ09MVU1OX0VSUk9SX0NPREVfTk9UX0ZPVU5EX0lOX1NPVVJDRRABEioKJkNPTFVNTl9FUlJPUl9DT0RFX05PVF9GT1VORF9JTl9NQVBQSU5HEAISOgo2Q09MVU1OX0VSUk9SX0NPREVfUkVRVUlSRURfQ09MVU1OX05PVF9GT1VORF9JTl9NQVBQSU5HEAMSPwo7Q09MVU1OX0VSUk9SX0NPREVfUkVRVUlSRURfRk9SRUlHTl9LRVlfTk9UX0ZPVU5EX0lOX01BUFBJTkcQBBJLCkdDT0xVTU5fRVJST1JfQ09ERV9VTlNVUFBPUlRFRF9DSVJDVUxBUl9ERVBFTkRFTkNZX0FUX0xFQVNUX09ORV9OVUxMQUJMRRAFEjwKOENPTFVNTl9FUlJPUl9DT0RFX1ZGS19TT1VSQ0VfQ09MVU1OX05PVF9GT1VORF9JTl9NQVBQSU5HEAYSOwo3Q09MVU1OX0VSUk9SX0NPREVfVkZLX1NPVVJDRV9DT0xVTU5fTk9UX0ZPVU5EX0lOX1NPVVJDRRAHEjwKOENPTFVNTl9FUlJPUl9DT0RFX1ZGS19UQVJHRVRfQ09MVU1OX05PVF9GT1VORF9JTl9NQVBQSU5HEAgSOwo3Q09MVU1OX0VSUk9SX0NPREVfVkZLX1RBUkdFVF9DT0xVTU5fTk9UX0ZPVU5EX0lOX1NPVVJDRRAJEjIKLkNPTFVNTl9FUlJPUl9DT0RFX1ZGS19DT0xVTU5fREFUQVRZUEVfTUlTTUFUQ0gQChIyCi5DT0xVTU5fRVJST1JfQ09ERV9WRktfU09VUkNFX0NPTFVNTl9OT1RfVU5JUVVFEAsimwMKDUNvbHVtbldhcm5pbmcSDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEg4KBmNvbHVtbhgDIAEoCRIUCgh3YXJuaW5ncxgFIAMoCUICGAESSQoPd2FybmluZ19yZXBvcnRzGAYgAygLMjAubWdtdC52MWFscGhhMS5Db2x1bW5XYXJuaW5nLkNvbHVtbldhcm5pbmdSZXBvcnQaZAoTQ29sdW1uV2FybmluZ1JlcG9ydBI8CgRjb2RlGAEgASgOMi4ubWdtdC52MWFscGhhMS5Db2x1bW5XYXJuaW5nLkNvbHVtbldhcm5pbmdDb2RlEg8KB21lc3NhZ2UYAiABKAkikwEKEUNvbHVtbldhcm5pbmdDb2RlEiMKH0NPTFVNTl9XQVJOSU5HX0NPREVfVU5TUEVDSUZJRUQQABIrCidDT0xVTU5fV0FSTklOR19DT0RFX05PVF9GT1VORF9JTl9TT1VSQ0UQARIsCihDT0xVTU5fV0FSTklOR19DT0RFX05PVF9GT1VORF9JTl9NQVBQSU5HEAIiiQMKDURhdGFiYXNlRXJyb3ISEgoGZXJyb3JzGAEgAygJQgIYARJHCg1lcnJvcl9yZXBvcnRzGAIgAygLMjAubWdtdC52MWFscGhhMS5EYXRhYmFzZUVycm9yLkRhdGFiYXNlRXJyb3JSZXBvcnQaZAoTRGF0YWJhc2VFcnJvclJlcG9ydBI8CgRjb2RlGAEgASgOMi4ubWdtdC52MWFscGhhMS5EYXRhYmFzZUVycm9yLkRhdGFiYXNlRXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkitAEKEURhdGFiYXNlRXJyb3JDb2RlEiMKH0RBVEFCQVNFX0VSUk9SX0NPREVfVU5TUEVDSUZJRUQQABJNCklEQVRBQkFTRV9FUlJPUl9DT0RFX1VOU1VQUE9SVEVEX0NJUkNVTEFSX0RFUEVOREVOQ1lfQVRfTEVBU1RfT05FX05VTExBQkxFEAESKwonREFUQUJBU0VfRVJST1JfQ09ERV9WRktfQ09MVU1OX01JU01BVENIEAIingQKClRhYmxlRXJyb3ISDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEkEKDWVycm9yX3JlcG9ydHMYAyADKAsyKi5tZ210LnYxYWxwaGExLlRhYmxlRXJyb3IuVGFibGVFcnJvclJlcG9ydBpbChBUYWJsZUVycm9yUmVwb3J0EjYKBGNvZGUYASABKA4yKC5tZ210LnYxYWxwaGExLlRhYmxlRXJyb3IuVGFibGVFcnJvckNvZGUSDwoHbWVzc2FnZRgCIAEoCSLQAgoOVGFibGVFcnJvckNvZGUSIAocVEFCTEVfRVJST1JfQ09ERV9VTlNQRUNJRklFRBAAEi4KKlRBQkxFX0VSUk9SX0NPREVfVEFCTEVfTk9UX0ZPVU5EX0lOX1NPVVJDRRABEjoKNlRBQkxFX0VSUk9SX0NPREVfVkZLX1NPVVJDRV9UQUJMRV9OT1RfRk9VTkRfSU5fTUFQUElORxACEjkKNVRBQkxFX0VSUk9SX0NPREVfVkZLX1NPVVJDRV9UQUJMRV9OT1RfRk9VTkRfSU5fU09VUkNFEAMSOgo2VEFCTEVfRVJST1JfQ09ERV9WRktfVEFSR0VUX1RBQkxFX05PVF9GT1VORF9JTl9NQVBQSU5HEAQSOQo1VEFCTEVfRVJST1JfQ09ERV9WRktfVEFSR0VUX1RBQkxFX05PVF9GT1VORF9JTl9TT1VSQ0UQBSLvAQobVmFsaWRhdGVKb2JNYXBwaW5nc1Jlc3BvbnNlEjEKDWNvbHVtbl9lcnJvcnMYASADKAsyGi5tZ210LnYxYWxwaGExLkNvbHVtbkVycm9yEjUKD2RhdGFiYXNlX2Vycm9ycxgCIAEoCzIcLm1nbXQudjFhbHBoYTEuRGF0YWJhc2VFcnJvchI1Cg9jb2x1bW5fd2FybmluZ3MYAyADKAsyHC5tZ210LnYxYWxwaGExLkNvbHVtbldhcm5pbmcSLwoMdGFibGVfZXJyb3JzGAQgAygLMhkubWdtdC52MWFscGhhMS5UYWJsZUVycm9yImUKFVZhbGlkYXRlU2NoZW1hUmVxdWVzdBIrCghtYXBwaW5ncxgBIAMoCzIZLm1nbXQudjFhbHBoYTEuSm9iTWFwcGluZxIfCg1jb25uZWN0aW9uX2lkGAIgASgJQgi6SAVyA7ABASKMAgoWVmFsaWRhdGVTY2hlbWFSZXNwb25zZRI2Cg9taXNzaW5nX2NvbHVtbnMYASADKAsyHS5tZ210LnYxYWxwaGExLkRhdGFiYXNlQ29sdW1uEjQKDWV4dHJhX2NvbHVtbnMYAiADKAsyHS5tZ210LnYxYWxwaGExLkRhdGFiYXNlQ29sdW1uEkMKDm1pc3NpbmdfdGFibGVzGAMgAygLMisubWdtdC52MWFscGhhMS5WYWxpZGF0ZVNjaGVtYVJlc3BvbnNlLlRhYmxlEhcKD21pc3Npbmdfc2NoZW1hcxgEIAMoCRomCgVUYWJsZRIOCgZzY2hlbWEYASABKAkSDQoFdGFibGUYAiABKAkiQwoRVmlydHVhbEZvcmVpZ25LZXkSDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEg8KB2NvbHVtbnMYAyADKAkigQEKGFZpcnR1YWxGb3JlaWduQ29uc3RyYWludBIOCgZzY2hlbWEYASABKAkSDQoFdGFibGUYAiABKAkSDwoHY29sdW1ucxgDIAMoCRI1Cgtmb3JlaWduX2tleRgEIAEoCzIgLm1nbXQudjFhbHBoYTEuVmlydHVhbEZvcmVpZ25LZXkiZwoNUnVuQ29udGV4dEtleRIbCgpqb2JfcnVuX2lkGAEgASgJQge6SARyAhABEhwKC2V4dGVybmFsX2lkGAIgASgJQge6SARyAhABEhsKCmFjY291bnRfaWQYAyABKAlCB7pIBHICEAEiQAoUR2V0UnVuQ29udGV4dFJlcXVlc3QSKAoCaWQYASABKAsyHC5tZ210LnYxYWxwaGExLlJ1bkNvbnRleHRLZXkiJgoVR2V0UnVuQ29udGV4dFJlc3BvbnNlEg0KBXZhbHVlGAEgASgMIk8KFFNldFJ1bkNvbnRleHRSZXF1ZXN0EigKAmlkGAEgASgLMhwubWdtdC52MWFscGhhMS5SdW5Db250ZXh0S2V5Eg0KBXZhbHVlGAIgASgMIhcKFVNldFJ1bkNvbnRleHRSZXNwb25zZSJQChVTZXRSdW5Db250ZXh0c1JlcXVlc3QSKAoCaWQYASABKAsyHC5tZ210LnYxYWxwaGExLlJ1bkNvbnRleHRLZXkSDQoFdmFsdWUYAiABKAwiGAoWU2V0UnVuQ29udGV4dHNSZXNwb25zZSK8AgoHSm9iSG9vaxIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEg4KBmpvYl9pZBgEIAEoCRIsCgZjb25maWcYBSABKAsyHC5tZ210LnYxYWxwaGExLkpvYkhvb2tDb25maWcSGgoSY3JlYXRlZF9ieV91c2VyX2lkGAYgASgJEi4KCmNyZWF0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhoKEnVwZGF0ZWRfYnlfdXNlcl9pZBgIIAEoCRIuCgp1cGRhdGVkX2F0GAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIPCgdlbmFibGVkGAogASgIEhsKCHByaW9yaXR5GAsgASgNQgm6SAYqBBhkKAAirwEKCk5ld0pvYkhvb2sSJwoEbmFtZRgBIAEoCUIZukgWchQyEl5bYS16MC05LV17MywxMDB9JBIcCgtkZXNjcmlwdGlvbhgCIAEoCUIHukgEcgIQARIsCgZjb25maWcYAyABKAsyHC5tZ210LnYxYWxwaGExLkpvYkhvb2tDb25maWcSDwoHZW5hYmxlZBgEIAEoCBIbCghwcmlvcml0eRgFIAEoDUIJukgGKgQYZCgAIogDCg1Kb2JIb29rQ29uZmlnEjYKA3NxbBgFIAEoCzInLm1nbXQudjFhbHBoYTEuSm9iSG9va0NvbmZpZy5Kb2JTcWxIb29rSAAalQIKCkpvYlNxbEhvb2sSFgoFcXVlcnkYASABKAlCB7pIBHICEAESHwoNY29ubmVjdGlvbl9pZBgCIAEoCUIIukgFcgOwAQESPgoGdGltaW5nGAMgASgLMi4ubWdtdC52MWFscGhhMS5Kb2JIb29rQ29uZmlnLkpvYlNxbEhvb2suVGltaW5nGo0BCgZUaW1pbmcSNwoIcHJlX3N5bmMYAyABKAsyIy5tZ210LnYxYWxwaGExLkpvYkhvb2tUaW1pbmdQcmVTeW5jSAASOQoJcG9zdF9zeW5jGAQgASgLMiQubWdtdC52MWFscGhhMS5Kb2JIb29rVGltaW5nUG9zdFN5bmNIAEIPCgZ0aW1pbmcSBbpIAggBQg8KBmNvbmZpZxIFukgCCAFKBAgBEAJKBAgCEANKBAgDEARKBAgEEAUiFgoUSm9iSG9va1RpbWluZ1ByZVN5bmMiFwoVSm9iSG9va1RpbWluZ1Bvc3RTeW5jIi4KEkdldEpvYkhvb2tzUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBIjwKE0dldEpvYkhvb2tzUmVzcG9uc2USJQoFaG9va3MYASADKAsyFi5tZ210LnYxYWxwaGExLkpvYkhvb2siKQoRR2V0Sm9iSG9va1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBIjoKEkdldEpvYkhvb2tSZXNwb25zZRIkCgRob29rGAEgASgLMhYubWdtdC52MWFscGhhMS5Kb2JIb29rIk8KFENyZWF0ZUpvYkhvb2tSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRInCgRob29rGAIgASgLMhkubWdtdC52MWFscGhhMS5OZXdKb2JIb29rIj0KFUNyZWF0ZUpvYkhvb2tSZXNwb25zZRIkCgRob29rGAEgASgLMhYubWdtdC52MWFscGhhMS5Kb2JIb29rIiwKFERlbGV0ZUpvYkhvb2tSZXF1ZXN0EhQKAmlkGAEgASgJQgi6SAVyA7ABASIXChVEZWxldGVKb2JIb29rUmVzcG9uc2UiPQodSXNKb2JIb29rTmFtZUF2YWlsYWJsZVJlcXVlc3QSDgoGam9iX2lkGAEgASgJEgwKBG5hbWUYAiABKAkiNgoeSXNKb2JIb29rTmFtZUF2YWlsYWJsZVJlc3BvbnNlEhQKDGlzX2F2YWlsYWJsZRgBIAEoCCLPAQoUVXBkYXRlSm9iSG9va1JlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEicKBG5hbWUYAiABKAlCGbpIFnIUMhJeW2EtejAtOS1dezMsMTAwfSQSHAoLZGVzY3JpcHRpb24YAyABKAlCB7pIBHICEAESLAoGY29uZmlnGAQgASgLMhwubWdtdC52MWFscGhhMS5Kb2JIb29rQ29uZmlnEg8KB2VuYWJsZWQYBSABKAgSGwoIcHJpb3JpdHkYBiABKA1CCbpIBioEGGQoACI9ChVVcGRhdGVKb2JIb29rUmVzcG9uc2USJAoEaG9vaxgBIAEoCzIWLm1nbXQudjFhbHBoYTEuSm9iSG9vayJBChhTZXRKb2JIb29rRW5hYmxlZFJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEg8KB2VuYWJsZWQYAiABKAgiQQoZU2V0Sm9iSG9va0VuYWJsZWRSZXNwb25zZRIkCgRob29rGAEgASgLMhYubWdtdC52MWFscGhhMS5Kb2JIb29rIs8BCiBHZXRBY3RpdmVKb2JIb29rc0J5VGltaW5nUmVxdWVzdBIYCgZqb2JfaWQYASABKAlCCLpIBXIDsAEBEkYKBnRpbWluZxgCIAEoDjI2Lm1nbXQudjFhbHBoYTEuR2V0QWN0aXZlSm9iSG9va3NCeVRpbWluZ1JlcXVlc3QuVGltaW5nIkkKBlRpbWluZxIWChJUSU1JTkdfVU5TUEVDSUZJRUQQABISCg5USU1JTkdfUFJFU1lOQxABEhMKD1RJTUlOR19QT1NUU1lOQxACIkoKIUdldEFjdGl2ZUpvYkhvb2tzQnlUaW1pbmdSZXNwb25zZRIlCgVob29rcxgBIAMoCzIWLm1nbXQudjFhbHBoYTEuSm9iSG9vayJZChxHZXRQaWlEZXRlY3Rpb25SZXBvcnRSZXF1ZXN0EhsKCmpvYl9ydW5faWQYASABKAlCB7pIBHICEAESHAoKYWNjb3VudF9pZBgCIAEoCUIIukgFcgOwAQEiUgodR2V0UGlpRGV0ZWN0aW9uUmVwb3J0UmVzcG9uc2USMQoGcmVwb3J0GAEgASgLMiEubWdtdC52MWFscGhhMS5QaWlEZXRlY3Rpb25SZXBvcnQijgQKElBpaURldGVjdGlvblJlcG9ydBI9CgZ0YWJsZXMYASADKAsyLS5tZ210LnYxYWxwaGExLlBpaURldGVjdGlvblJlcG9ydC5UYWJsZVJlcG9ydBq4AwoLVGFibGVSZXBvcnQSDgoGc2NoZW1hGAEgASgJEg0KBXRhYmxlGAIgASgJEksKB2NvbHVtbnMYAyADKAsyOi5tZ210LnYxYWxwaGExLlBpaURldGVjdGlvblJlcG9ydC5UYWJsZVJlcG9ydC5Db2x1bW5SZXBvcnQavAIKDENvbHVtblJlcG9ydBIOCgZjb2x1bW4YASABKAkSWwoMcmVnZXhfcmVwb3J0GAIgASgLMkAubWdtdC52MWFscGhhMS5QaWlEZXRlY3Rpb25SZXBvcnQuVGFibGVSZXBvcnQuQ29sdW1uUmVwb3J0LlJlZ2V4SACIAQESVwoKbGxtX3JlcG9ydBgDIAEoCzI+Lm1nbXQudjFhbHBoYTEuUGlpRGV0ZWN0aW9uUmVwb3J0LlRhYmxlUmVwb3J0LkNvbHVtblJlcG9ydC5MTE1IAYgBARoZCgVSZWdleBIQCghjYXRlZ29yeRgBIAEoCRorCgNMTE0SEAoIY2F0ZWdvcnkYASABKAkSEgoKY29uZmlkZW5jZRgCIAEoAkIPCg1fcmVnZXhfcmVwb3J0Qg0KC19sbG1fcmVwb3J0Km8KCUpvYlN0YXR1cxIaChZKT0JfU1RBVFVTX1VOU1BFQ0lGSUVEEAASFgoSSk9CX1NUQVRVU19FTkFCTEVEEAESFQoRSk9CX1NUQVRVU19QQVVTRUQQAxIXChNKT0JfU1RBVFVTX0RJU0FCTEVEEAQqpwEKDkFjdGl2aXR5U3RhdHVzEh8KG0FDVElWSVRZX1NUQVRVU19VTlNQRUNJRklFRBAAEh0KGUFDVElWSVRZX1NUQVRVU19TQ0hFRFVMRUQQARIbChdBQ1RJVklUWV9TVEFUVVNfU1RBUlRFRBACEhwKGEFDVElWSVRZX1NUQVRVU19DQU5DRUxFRBADEhoKFkFDVElWSVRZX1NUQVRVU19GQUlMRUQQBCqSAgoMSm9iUnVuU3RhdHVzEh4KGkpPQl9SVU5fU1RBVFVTX1VOU1BFQ0lGSUVEEAASGgoWSk9CX1JVTl9TVEFUVVNfUEVORElORxABEhoKFkpPQl9SVU5fU1RBVFVTX1JVTk5JTkcQAhIbChdKT0JfUlVOX1NUQVRVU19DT01QTEVURRADEhgKFEpPQl9SVU5fU1RBVFVTX0VSUk9SEAQSGwoXSk9CX1JVTl9TVEFUVVNfQ0FOQ0VMRUQQBRIdChlKT0JfUlVOX1NUQVRVU19URVJNSU5BVEVEEAYSGQoVSk9CX1JVTl9TVEFUVVNfRkFJTEVEEAcSHAoYSk9CX1JVTl9TVEFUVVNfVElNRURfT1VUEAgqfAoJTG9nV2luZG93EiIKHkxPR19XSU5ET1dfTk9fVElNRV9VTlNQRUNJRklFRBAAEhoKFkxPR19XSU5ET1dfRklGVEVFTl9NSU4QARIXChNMT0dfV0lORE9XX09ORV9IT1VSEAISFgoSTE9HX1dJTkRPV19PTkVfREFZEAMqdwoITG9nTGV2ZWwSGQoVTE9HX0xFVkVMX1VOU1BFQ0lGSUVEEAASEwoPTE9HX0xFVkVMX0RFQlVHEAESEgoOTE9HX0xFVkVMX0lORk8QAhISCg5MT0dfTEVWRUxfV0FSThADEhMKD0xPR19MRVZFTF9FUlJPUhAEMrAhCgpKb2JTZXJ2aWNlEk0KB0dldEpvYnMSHS5tZ210LnYxYWxwaGExLkdldEpvYnNSZXF1ZXN0Gh4ubWdtdC52MWFscGhhMS5HZXRKb2JzUmVzcG9uc2UiA5ACARJKCgZHZXRKb2ISHC5tZ210LnYxYWxwaGExLkdldEpvYlJlcXVlc3QaHS5tZ210LnYxYWxwaGExLkdldEpvYlJlc3BvbnNlIgOQAgESUAoJQ3JlYXRlSm9iEh8ubWdtdC52MWFscGhhMS5DcmVhdGVKb2JSZXF1ZXN0GiAubWdtdC52MWFscGhhMS5DcmVhdGVKb2JSZXNwb25zZSIAElAKCURlbGV0ZUpvYhIfLm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iUmVxdWVzdBogLm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iUmVzcG9uc2UiABJuChJJc0pvYk5hbWVBdmFpbGFibGUSKC5tZ210LnYxYWxwaGExLklzSm9iTmFtZUF2YWlsYWJsZVJlcXVlc3QaKS5tZ210LnYxYWxwaGExLklzSm9iTmFtZUF2YWlsYWJsZVJlc3BvbnNlIgOQAgESaAoRVXBkYXRlSm9iU2NoZWR1bGUSJy5tZ210LnYxYWxwaGExLlVwZGF0ZUpvYlNjaGVkdWxlUmVxdWVzdBooLm1nbXQudjFhbHBoYTEuVXBkYXRlSm9iU2NoZWR1bGVSZXNwb25zZSIAEoABChlVcGRhdGVKb2JTb3VyY2VDb25uZWN0aW9uEi8ubWdtdC52MWFscGhhMS5VcGRhdGVKb2JTb3VyY2VDb25uZWN0aW9uUmVxdWVzdBowLm1nbXQudjFhbHBoYTEuVXBkYXRlSm9iU291cmNlQ29ubmVjdGlvblJlc3BvbnNlIgASlQEKIFNldEpvYlNvdXJjZVNxbENvbm5lY3Rpb25TdWJzZXRzEjYubWdtdC52MWFscGhhMS5TZXRKb2JTb3VyY2VTcWxDb25uZWN0aW9uU3Vic2V0c1JlcXVlc3QaNy5tZ210LnYxYWxwaGExLlNldEpvYlNvdXJjZVNxbENvbm5lY3Rpb25TdWJzZXRzUmVzcG9uc2UiABKPAQoeVXBkYXRlSm9iRGVzdGluYXRpb25Db25uZWN0aW9uEjQubWdtdC52MWFscGhhMS5VcGRhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXF1ZXN0GjUubWdtdC52MWFscGhhMS5VcGRhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25SZXNwb25zZSIAEo8BCh5EZWxldGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb24SNC5tZ210LnYxYWxwaGExLkRlbGV0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvblJlcXVlc3QaNS5tZ210LnYxYWxwaGExLkRlbGV0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvblJlc3BvbnNlIgASkgEKH0NyZWF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvbnMSNS5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYkRlc3RpbmF0aW9uQ29ubmVjdGlvbnNSZXF1ZXN0GjYubWdtdC52MWFscGhhMS5DcmVhdGVKb2JEZXN0aW5hdGlvbkNvbm5lY3Rpb25zUmVzcG9uc2UiABJNCghQYXVzZUpvYhIeLm1nbXQudjFhbHBoYTEuUGF1c2VKb2JSZXF1ZXN0Gh8ubWdtdC52MWFscGhhMS5QYXVzZUpvYlJlc3BvbnNlIgASaAoQR2V0Sm9iUmVjZW50UnVucxImLm1nbXQudjFhbHBoYTEuR2V0Sm9iUmVjZW50UnVuc1JlcXVlc3QaJy5tZ210LnYxYWxwaGExLkdldEpvYlJlY2VudFJ1bnNSZXNwb25zZSIDkAIBEmIKDkdldEpvYk5leHRSdW5zEiQubWdtdC52MWFscGhhMS5HZXRKb2JOZXh0UnVuc1JlcXVlc3QaJS5tZ210LnYxYWxwaGExLkdldEpvYk5leHRSdW5zUmVzcG9uc2UiA5ACARJcCgxHZXRKb2JTdGF0dXMSIi5tZ210LnYxYWxwaGExLkdldEpvYlN0YXR1c1JlcXVlc3QaIy5tZ210LnYxYWxwaGExLkdldEpvYlN0YXR1c1Jlc3BvbnNlIgOQAgESYgoOR2V0Sm9iU3RhdHVzZXMSJC5tZ210LnYxYWxwaGExLkdldEpvYlN0YXR1c2VzUmVxdWVzdBolLm1nbXQudjFhbHBoYTEuR2V0Sm9iU3RhdHVzZXNSZXNwb25zZSIDkAIBElYKCkdldEpvYlJ1bnMSIC5tZ210LnYxYWxwaGExLkdldEpvYlJ1bnNSZXF1ZXN0GiEubWdtdC52MWFscGhhMS5HZXRKb2JSdW5zUmVzcG9uc2UiA5ACARJlCg9HZXRKb2JSdW5FdmVudHMSJS5tZ210LnYxYWxwaGExLkdldEpvYlJ1bkV2ZW50c1JlcXVlc3QaJi5tZ210LnYxYWxwaGExLkdldEpvYlJ1bkV2ZW50c1Jlc3BvbnNlIgOQAgESUwoJR2V0Sm9iUnVuEh8ubWdtdC52MWFscGhhMS5HZXRKb2JSdW5SZXF1ZXN0GiAubWdtdC52MWFscGhhMS5HZXRKb2JSdW5SZXNwb25zZSIDkAIBElkKDERlbGV0ZUpvYlJ1bhIiLm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iUnVuUmVxdWVzdBojLm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iUnVuUmVzcG9uc2UiABJZCgxDcmVhdGVKb2JSdW4SIi5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYlJ1blJlcXVlc3QaIy5tZ210LnYxYWxwaGExLkNyZWF0ZUpvYlJ1blJlc3BvbnNlIgASWQoMQ2FuY2VsSm9iUnVuEiIubWdtdC52MWFscGhhMS5DYW5jZWxKb2JSdW5SZXF1ZXN0GiMubWdtdC52MWFscGhhMS5DYW5jZWxKb2JSdW5SZXNwb25zZSIAEmIKD1Rlcm1pbmF0ZUpvYlJ1bhIlLm1nbXQudjFhbHBoYTEuVGVybWluYXRlSm9iUnVuUmVxdWVzdBomLm1nbXQudjFhbHBoYTEuVGVybWluYXRlSm9iUnVuUmVzcG9uc2UiABJwChNHZXRKb2JSdW5Mb2dzU3RyZWFtEikubWdtdC52MWFscGhhMS5HZXRKb2JSdW5Mb2dzU3RyZWFtUmVxdWVzdBoqLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1N0cmVhbVJlc3BvbnNlIgAwARJcCg1HZXRKb2JSdW5Mb2dzEiMubWdtdC52MWFscGhhMS5HZXRKb2JSdW5Mb2dzUmVxdWVzdBokLm1nbXQudjFhbHBoYTEuR2V0Sm9iUnVuTG9nc1Jlc3BvbnNlIgASdAoVU2V0Sm9iV29ya2Zsb3dPcHRpb25zEisubWdtdC52MWFscGhhMS5TZXRKb2JXb3JrZmxvd09wdGlvbnNSZXF1ZXN0GiwubWdtdC52MWFscGhhMS5TZXRKb2JXb3JrZmxvd09wdGlvbnNSZXNwb25zZSIAEmgKEVNldEpvYlN5bmNPcHRpb25zEicubWdtdC52MWFscGhhMS5TZXRKb2JTeW5jT3B0aW9uc1JlcXVlc3QaKC5tZ210LnYxYWxwaGExLlNldEpvYlN5bmNPcHRpb25zUmVzcG9uc2UiABJuChNWYWxpZGF0ZUpvYk1hcHBpbmdzEikubWdtdC52MWFscGhhMS5WYWxpZGF0ZUpvYk1hcHBpbmdzUmVxdWVzdBoqLm1nbXQudjFhbHBoYTEuVmFsaWRhdGVKb2JNYXBwaW5nc1Jlc3BvbnNlIgASXwoOVmFsaWRhdGVTY2hlbWESJC5tZ210LnYxYWxwaGExLlZhbGlkYXRlU2NoZW1hUmVxdWVzdBolLm1nbXQudjFhbHBoYTEuVmFsaWRhdGVTY2hlbWFSZXNwb25zZSIAElwKDUdldFJ1bkNvbnRleHQSIy5tZ210LnYxYWxwaGExLkdldFJ1bkNvbnRleHRSZXF1ZXN0GiQubWdtdC52MWFscGhhMS5HZXRSdW5Db250ZXh0UmVzcG9uc2UiABJcCg1TZXRSdW5Db250ZXh0EiMubWdtdC52MWFscGhhMS5TZXRSdW5Db250ZXh0UmVxdWVzdBokLm1nbXQudjFhbHBoYTEuU2V0UnVuQ29udGV4dFJlc3BvbnNlIgASYQoOU2V0UnVuQ29udGV4dHMSJC5tZ210LnYxYWxwaGExLlNldFJ1bkNvbnRleHRzUmVxdWVzdBolLm1nbXQudjFhbHBoYTEuU2V0UnVuQ29udGV4dHNSZXNwb25zZSIAKAESWQoLR2V0Sm9iSG9va3MSIS5tZ210LnYxYWxwaGExLkdldEpvYkhvb2tzUmVxdWVzdBoiLm1nbXQudjFhbHBoYTEuR2V0Sm9iSG9va3NSZXNwb25zZSIDkAIBElYKCkdldEpvYkhvb2sSIC5tZ210LnYxYWxwaGExLkdldEpvYkhvb2tSZXF1ZXN0GiEubWdtdC52MWFscGhhMS5HZXRKb2JIb29rUmVzcG9uc2UiA5ACARJcCg1DcmVhdGVKb2JIb29rEiMubWdtdC52MWFscGhhMS5DcmVhdGVKb2JIb29rUmVxdWVzdBokLm1nbXQudjFhbHBoYTEuQ3JlYXRlSm9iSG9va1Jlc3BvbnNlIgASXAoNRGVsZXRlSm9iSG9vaxIjLm1nbXQudjFhbHBoYTEuRGVsZXRlSm9iSG9va1JlcXVlc3QaJC5tZ210LnYxYWxwaGExLkRlbGV0ZUpvYkhvb2tSZXNwb25zZSIAEncKFklzSm9iSG9va05hbWVBdmFpbGFibGUSLC5tZ210LnYxYWxwaGExLklzSm9iSG9va05hbWVBdmFpbGFibGVSZXF1ZXN0Gi0ubWdtdC52MWFscGhhMS5Jc0pvYkhvb2tOYW1lQXZhaWxhYmxlUmVzcG9uc2UiABJcCg1VcGRhdGVKb2JIb29rEiMubWdtdC52MWFscGhhMS5VcGRhdGVKb2JIb29rUmVxdWVzdBokLm1nbXQudjFhbHBoYTEuVXBkYXRlSm9iSG9va1Jlc3BvbnNlIgASaAoRU2V0Sm9iSG9va0VuYWJsZWQSJy5tZ210LnYxYWxwaGExLlNldEpvYkhvb2tFbmFibGVkUmVxdWVzdBooLm1nbXQudjFhbHBoYTEuU2V0Sm9iSG9va0VuYWJsZWRSZXNwb25zZSIAEoMBChlHZXRBY3RpdmVKb2JIb29rc0J5VGltaW5nEi8ubWdtdC52MWFscGhhMS5HZXRBY3RpdmVKb2JIb29rc0J5VGltaW5nUmVxdWVzdBowLm1nbXQudjFhbHBoYTEuR2V0QWN0aXZlSm9iSG9va3NCeVRpbWluZ1Jlc3BvbnNlIgOQAgESdwoVR2V0UGlpRGV0ZWN0aW9uUmVwb3J0EisubWdtdC52MWFscGhhMS5HZXRQaWlEZXRlY3Rpb25SZXBvcnRSZXF1ZXN0GiwubWdtdC52MWFscGhhMS5HZXRQaWlEZXRlY3Rpb25SZXBvcnRSZXNwb25zZSIDkAIBQsQBChFjb20ubWdtdC52MWFscGhhMUIISm9iUHJvdG9QAVpQZ2l0aHViLmNvbS9udWNsZXVzY2xvdWQvbmVvc3luYy9iYWNrZW5kL2dlbi9nby9wcm90b3MvbWdtdC92MWFscGhhMTttZ210djFhbHBoYTGiAgNNWFiqAg1NZ210LlYxYWxwaGExygINTWdtdFxWMWFscGhhMeICGU1nbXRcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5NZ210OjpWMWFscGhhMWIGcHJvdG8z", [file_buf_validate_validate, file_google_protobuf_timestamp, file_mgmt_v1alpha1_connection_data, file_mgmt_v1alpha1_transformer]); /** * @generated from message mgmt.v1alpha1.GetJobsRequest @@ -2064,6 +2064,21 @@ export const JobTypeConfigSchema: GenMessage = /*@__PURE__*/ * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync */ export type JobTypeConfig_JobTypeSync = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync"> & { + /** + * Specify job-wide schema change strategies that will be used to map data from the source to the destination. + * This acts as the default configuration for all schemas and tables unless overridden by a schema mapping at a lower level. + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange schema_change = 1; + */ + schemaChange?: JobTypeConfig_JobTypeSync_SchemaChange; + + /** + * Specify schema mappings that will be used to map data from the source to the destination + * This replaces the mappings field and is used to configure column transformers as well as re-wire destination schemas and tables. + * + * @generated from field: repeated mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping schema_mappings = 2; + */ + schemaMappings: JobTypeConfig_JobTypeSync_SchemaMapping[]; }; /** @@ -2073,6 +2088,712 @@ export type JobTypeConfig_JobTypeSync = Message<"mgmt.v1alpha1.JobTypeConfig.Job export const JobTypeConfig_JobTypeSyncSchema: GenMessage = /*@__PURE__*/ messageDesc(file_mgmt_v1alpha1_job, 43, 0); +/** + * Configure how schemas, tables, and columns are handled during a job run. + * If anything is not defined, a system-defined fallback will be implemented. Further information can be found in the documentation. + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange + */ +export type JobTypeConfig_JobTypeSync_SchemaChange = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange"> & { + /** + * Configure how schemas are handled during a job run + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy schema_strategy = 1; + */ + schemaStrategy?: JobTypeConfig_JobTypeSync_SchemaStrategy; + + /** + * Configure how tables are handled during a job run + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy table_strategy = 2; + */ + tableStrategy?: JobTypeConfig_JobTypeSync_TableStrategy; + + /** + * Configure how columns are handled during a job run + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy column_strategy = 3; + */ + columnStrategy?: JobTypeConfig_JobTypeSync_ColumnStrategy; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChange. + * Use `create(JobTypeConfig_JobTypeSync_SchemaChangeSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_SchemaChangeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 0); + +/** + * The strategy used to configure how schemas are handled during a job run + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy + */ +export type JobTypeConfig_JobTypeSync_SchemaStrategy = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy"> & { + /** + * @generated from oneof mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.strategy + */ + strategy: { + /** + * When this strategy is configured, all schemas are mapped + * + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas map_all_schemas = 1; + */ + value: JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas; + case: "mapAllSchemas"; + } | { + /** + * When this strategy is configured, only the schemas that are defined are mapped + * + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas map_defined_schemas = 2; + */ + value: JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas; + case: "mapDefinedSchemas"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy. + * Use `create(JobTypeConfig_JobTypeSync_SchemaStrategySchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_SchemaStrategySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 1); + +/** + * When this strategy is configured, all schemas are mapped + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas + */ +export type JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas. + * Use `create(JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemasSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemasSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 1, 0); + +/** + * When this strategy is configured, only the schemas that are defined are mapped + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas + */ +export type JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas. + * Use `create(JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemasSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemasSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 1, 1); + +/** + * The strategy used to configure how tables are handled during a job run + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy + */ +export type JobTypeConfig_JobTypeSync_TableStrategy = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy"> & { + /** + * @generated from oneof mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.strategy + */ + strategy: { + /** + * When this strategy is configured, all tables are mapped + * + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables map_all_tables = 1; + */ + value: JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables; + case: "mapAllTables"; + } | { + /** + * When this strategy is configured, only the tables that are defined are mapped + * + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables map_defined_tables = 2; + */ + value: JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables; + case: "mapDefinedTables"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy. + * Use `create(JobTypeConfig_JobTypeSync_TableStrategySchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_TableStrategySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 2); + +/** + * When this strategy is configured, all tables are mapped + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables + */ +export type JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables. + * Use `create(JobTypeConfig_JobTypeSync_TableStrategy_MapAllTablesSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_TableStrategy_MapAllTablesSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 2, 0); + +/** + * When this strategy is configured, only the tables that are defined are mapped + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables + */ +export type JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables. + * Use `create(JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTablesSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTablesSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 2, 1); + +/** + * The strategy used to configure how columns are handled during a job run + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy"> & { + /** + * @generated from oneof mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.strategy + */ + strategy: { + /** + * 1. Map all columns + user-defined sub-strategies for each mismatch scenario + * + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns map_all_columns = 1; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns; + case: "mapAllColumns"; + } | { + /** + * 2. Only map user-defined columns + sub-strategies for mismatch scenarios + * + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns map_defined_columns = 2; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns; + case: "mapDefinedColumns"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategySchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3); + +/** + * ------------------------------------------------------------- + * 1. MapAllColumns + * ------------------------------------------------------------- + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns"> & { + /** + * When a column is present in source but not mapped + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy column_in_source_not_mapped = 1; + */ + columnInSourceNotMapped?: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy; + + /** + * When a column is mapped but not in source + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy column_mapped_not_in_source = 2; + */ + columnMappedNotInSource?: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy; + + /** + * When a column is in source + mapped, but missing in destination + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy column_in_source_mapped_not_in_destination = 3; + */ + columnInSourceMappedNotInDestination?: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy; + + /** + * When a column is in the destination but not in source + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy column_in_destination_no_longer_in_source = 4; + */ + columnInDestinationNoLongerInSource?: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumnsSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumnsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 0); + +/** + * ------------------------------------------------------------- + * 2. MapDefinedColumns + * ------------------------------------------------------------- + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns"> & { + /** + * Mapped but missing in source + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy column_mapped_not_in_source = 1; + */ + columnMappedNotInSource?: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy; + + /** + * In source + mapped, but missing in destination + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy column_in_source_mapped_not_in_destination = 2; + */ + columnInSourceMappedNotInDestination?: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumnsSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumnsSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 1); + +/** + * a) Column present in source, not mapped + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy"> & { + /** + * @generated from oneof mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.strategy + */ + strategy: { + /** + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough passthrough = 1; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough; + case: "passthrough"; + } | { + /** + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap auto_map = 2; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap; + case: "autoMap"; + } | { + /** + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt halt = 3; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt; + case: "halt"; + } | { + /** + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop drop = 4; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop; + case: "drop"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategySchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 2); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_PassthroughSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_PassthroughSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 2, 0); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMapSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMapSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 2, 1); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_HaltSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_HaltSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 2, 2); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_DropSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_DropSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 2, 3); + +/** + * b) Column mapped, but not in source + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy"> & { + /** + * @generated from oneof mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.strategy + */ + strategy: { + /** + * e.g. treat as NULL or skip + * + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue continue = 1; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue; + case: "continue"; + } | { + /** + * fail the job + * + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt halt = 2; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt; + case: "halt"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategySchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 3); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Continue. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_ContinueSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_ContinueSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 3, 0); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_HaltSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_HaltSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 3, 1); + +/** + * c) Column in source + mapped, but missing in destination + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy"> & { + /** + * @generated from oneof mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.strategy + */ + strategy: { + /** + * In your version, "Continue" = "if init_schema => create column, else skip" + * + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue continue = 1; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue; + case: "continue"; + } | { + /** + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop drop = 2; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop; + case: "drop"; + } | { + /** + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt halt = 3; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt; + case: "halt"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategySchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 4); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Continue. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_ContinueSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_ContinueSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 4, 0); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_DropSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_DropSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 4, 1); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_HaltSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_HaltSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 4, 2); + +/** + * d) Column in destination, but not in source + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy"> & { + /** + * @generated from oneof mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.strategy + */ + strategy: { + /** + * "Continue" => "if init_schema => drop column, else leave it alone" + * + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue continue = 1; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue; + case: "continue"; + } | { + /** + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt halt = 2; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt; + case: "halt"; + } | { + /** + * @generated from field: mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap auto_map = 3; + */ + value: JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap; + case: "autoMap"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategySchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 5); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Continue. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_ContinueSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_ContinueSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 5, 0); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_HaltSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_HaltSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 5, 1); + +/** + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap + */ +export type JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap"> & { +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap. + * Use `create(JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMapSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMapSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 3, 5, 2); + +/** + * Configuration for a specific schema mapping + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping + */ +export type JobTypeConfig_JobTypeSync_SchemaMapping = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping"> & { + /** + * The database schema this mapping belongs to + * + * @generated from field: string schema = 1; + */ + schema: string; + + /** + * Optionally specify a destination schema that this mapping will go to + * + * @generated from field: optional string destination_schema = 2; + */ + destinationSchema?: string; + + /** + * The list of table mappings that will be used to map data from the source to the destination + * + * @generated from field: repeated mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping table_mappings = 3; + */ + tableMappings: JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping[]; + + /** + * Optionally specify a table strategy. This will override the global table strategy for this schema + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy table_strategy = 4; + */ + tableStrategy?: JobTypeConfig_JobTypeSync_TableStrategy; + + /** + * Optionally specify a column strategy. This will override the global column strategy for this schema + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy column_strategy = 5; + */ + columnStrategy?: JobTypeConfig_JobTypeSync_ColumnStrategy; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping. + * Use `create(JobTypeConfig_JobTypeSync_SchemaMappingSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_SchemaMappingSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 4); + +/** + * Configuration for a specific table mapping in a schema + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping + */ +export type JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping"> & { + /** + * The database table this mapping belongs to + * + * @generated from field: string table = 1; + */ + table: string; + + /** + * Optionally specify a destination table that this mapping will go to + * + * @generated from field: optional string destination_table = 2; + */ + destinationTable?: string; + + /** + * The list of column mappings that will be used to map data from the source to the destination + * + * @generated from field: repeated mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping column_mappings = 3; + */ + columnMappings: JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping[]; + + /** + * Optionally specify a column strategy. This will override the global column strategy for this table + * + * @generated from field: optional mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy column_strategy = 4; + */ + columnStrategy?: JobTypeConfig_JobTypeSync_ColumnStrategy; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping. + * Use `create(JobTypeConfig_JobTypeSync_SchemaMapping_TableMappingSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_SchemaMapping_TableMappingSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 4, 0); + +/** + * Configuration for a specific column mapping in a table + * + * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping + */ +export type JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping = Message<"mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping"> & { + /** + * The column this mapping belongs to + * + * @generated from field: string column = 1; + */ + column: string; + + /** + * The transformer configuration that will be applied to each cell in the column + * + * @generated from field: optional mgmt.v1alpha1.TransformerConfig transformer = 2; + */ + transformer?: TransformerConfig; +}; + +/** + * Describes the message mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping. + * Use `create(JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMappingSchema)` to create a new message. + */ +export const JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMappingSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_mgmt_v1alpha1_job, 43, 0, 4, 0, 0); + /** * @generated from message mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect */ diff --git a/internal/benthos/benthos-builder/builders/benthos-builder_test.go b/internal/benthos/benthos-builder/builders/benthos-builder_test.go index bd8fdf7f17..2cb7ae5a73 100644 --- a/internal/benthos/benthos-builder/builders/benthos-builder_test.go +++ b/internal/benthos/benthos-builder/builders/benthos-builder_test.go @@ -37,29 +37,38 @@ func Test_ProcessorConfigEmpty(t *testing.T) { tableMappings := map[string]*tableMapping{ "public.users": {Schema: "public", Table: "users", - Mappings: []*mgmtv1alpha1.JobMapping{ + Mappings: []*shared.JobTransformationMapping{ { - Schema: "public", - Table: "users", - Column: "id", - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{}, + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "id", + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{}, + }, }, }, }, { - Schema: "public", - Table: "users", - Column: "name", - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{}, + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "name", + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{}, + }, }, }, }, }, - }} + }, + } groupedSchemas := map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow{ "public.users": { @@ -125,33 +134,42 @@ func Test_ProcessorConfigEmptyJavascript(t *testing.T) { tableMappings := map[string]*tableMapping{ "public.users": {Schema: "public", Table: "users", - Mappings: []*mgmtv1alpha1.JobMapping{ + Mappings: []*shared.JobTransformationMapping{ { - Schema: "public", - Table: "users", - Column: "id", - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{ - PassthroughConfig: &mgmtv1alpha1.Passthrough{}, + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "id", + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{ + PassthroughConfig: &mgmtv1alpha1.Passthrough{}, + }, }, }, }, }, { - Schema: "public", - Table: "users", - Column: "name", - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_TransformJavascriptConfig{ - TransformJavascriptConfig: &mgmtv1alpha1.TransformJavascript{Code: ""}, + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "name", + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_TransformJavascriptConfig{ + TransformJavascriptConfig: &mgmtv1alpha1.TransformJavascript{Code: ""}, + }, }, }, }, }, }, - }} + }, + } groupedSchemas := map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow{ "public.users": { @@ -212,70 +230,6 @@ func Test_ProcessorConfigEmptyJavascript(t *testing.T) { require.Empty(t, res[0].Config.StreamConfig.Pipeline.Processors) } -func TestShouldHaltOnSchemaAddition(t *testing.T) { - newCols, ok := shouldHaltOnSchemaAddition( - map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow{ - "public.users": { - "id": &sqlmanager_shared.DatabaseSchemaRow{}, - "created_by": &sqlmanager_shared.DatabaseSchemaRow{}, - }, - }, - []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: "id"}, - {Schema: "public", Table: "users", Column: "created_by"}, - }, - ) - require.False(t, ok, "job mappings are valid set of database schemas") - require.Empty(t, newCols) - - newCols, ok = shouldHaltOnSchemaAddition( - map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow{ - "public.users": { - "id": &sqlmanager_shared.DatabaseSchemaRow{}, - "created_by": &sqlmanager_shared.DatabaseSchemaRow{}, - }, - "neosync_api.accounts": { - "id": &sqlmanager_shared.DatabaseSchemaRow{}, - "name": &sqlmanager_shared.DatabaseSchemaRow{}, - }, - }, - []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: "id"}, - {Schema: "public", Table: "users", Column: "created_by"}, - }, - ) - require.False(t, ok, "valid subset of job mappings") - - newCols, ok = shouldHaltOnSchemaAddition( - map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow{ - "public.users": { - "id": &sqlmanager_shared.DatabaseSchemaRow{}, - "created_by": &sqlmanager_shared.DatabaseSchemaRow{}, - }, - }, - []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: "id"}, - }, - ) - require.True(t, ok, "job mappings are missing table column") - require.Equal(t, []string{"public.users.created_by"}, newCols) - - newCols, ok = shouldHaltOnSchemaAddition( - map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow{ - "public.users": { - "id": &sqlmanager_shared.DatabaseSchemaRow{}, - "created_by": &sqlmanager_shared.DatabaseSchemaRow{}, - }, - }, - []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: "id"}, - {Schema: "public", Table: "users", Column: "updated_by"}, - }, - ) - require.True(t, ok, "job mappings have same column count, but missing specific column") - require.Equal(t, []string{"public.users.created_by"}, newCols) -} - func Test_buildProcessorConfigsMutation(t *testing.T) { mockTransformerClient := mgmtv1alpha1connect.NewMockTransformersServiceClient(t) @@ -283,47 +237,47 @@ func Test_buildProcessorConfigsMutation(t *testing.T) { schemaTable := sqlmanager_shared.SchemaTable{Schema: "public", Table: "users"} runconfig := rc.NewRunConfig(schemaTable.String(), schemaTable, rc.RunTypeInsert, []string{}, nil, []string{}, []string{}, []*rc.DependsOn{}, false) - output, err := buildProcessorConfigs(ctx, mockTransformerClient, []*mgmtv1alpha1.JobMapping{}, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) + output, err := buildProcessorConfigs(ctx, mockTransformerClient, []*shared.JobTransformationMapping{}, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) require.Nil(t, err) require.Empty(t, output) - output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*mgmtv1alpha1.JobMapping{}, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) + output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*shared.JobTransformationMapping{}, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) require.Nil(t, err) require.Empty(t, output) runconfig = rc.NewRunConfig(schemaTable.String(), schemaTable, rc.RunTypeInsert, []string{}, nil, []string{}, []string{"id"}, []*rc.DependsOn{}, false) - output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: "id"}, + output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*shared.JobTransformationMapping{ + {DestinationSchema: "public", DestinationTable: "users", JobMapping: &mgmtv1alpha1.JobMapping{Schema: "public", Table: "users", Column: "id"}}, }, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) require.Nil(t, err) require.Empty(t, output) - output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: "id", Transformer: &mgmtv1alpha1.JobMappingTransformer{}}, + output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*shared.JobTransformationMapping{ + {DestinationSchema: "public", DestinationTable: "users", JobMapping: &mgmtv1alpha1.JobMapping{Schema: "public", Table: "users", Column: "id", Transformer: &mgmtv1alpha1.JobMappingTransformer{}}}, }, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) require.Nil(t, err) require.Empty(t, output) - output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: "id", Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: &mgmtv1alpha1.TransformerConfig{ + output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*shared.JobTransformationMapping{ + {DestinationSchema: "public", DestinationTable: "users", JobMapping: &mgmtv1alpha1.JobMapping{Schema: "public", Table: "users", Column: "id", Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: &mgmtv1alpha1.TransformerConfig{ Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{}, - }}}, + }}}}, }, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) require.Nil(t, err) require.Empty(t, output) runconfig = rc.NewRunConfig(schemaTable.String(), schemaTable, rc.RunTypeInsert, []string{}, nil, []string{}, []string{"id", "name"}, []*rc.DependsOn{}, false) - output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: "id", Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: &mgmtv1alpha1.TransformerConfig{ + output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*shared.JobTransformationMapping{ + {DestinationSchema: "public", DestinationTable: "users", JobMapping: &mgmtv1alpha1.JobMapping{Schema: "public", Table: "users", Column: "id", Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: &mgmtv1alpha1.TransformerConfig{ Config: &mgmtv1alpha1.TransformerConfig_Nullconfig{ Nullconfig: &mgmtv1alpha1.Null{}, }, - }}}, - {Schema: "public", Table: "users", Column: "name", Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: &mgmtv1alpha1.TransformerConfig{ + }}}}, + {DestinationSchema: "public", DestinationTable: "users", JobMapping: &mgmtv1alpha1.JobMapping{Schema: "public", Table: "users", Column: "name", Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: &mgmtv1alpha1.TransformerConfig{ Config: &mgmtv1alpha1.TransformerConfig_Nullconfig{ Nullconfig: &mgmtv1alpha1.Null{}, }, - }}}, + }}}}, }, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) require.Nil(t, err) @@ -358,8 +312,9 @@ func Test_buildProcessorConfigsMutation(t *testing.T) { } runconfig = rc.NewRunConfig(schemaTable.String(), schemaTable, rc.RunTypeInsert, []string{"id"}, nil, []string{"email"}, []string{"email"}, []*rc.DependsOn{}, false) - output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: "email", Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}}}, groupedSchemas, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) + output, err = buildProcessorConfigs(ctx, mockTransformerClient, []*shared.JobTransformationMapping{ + {DestinationSchema: "public", DestinationTable: "users", JobMapping: &mgmtv1alpha1.JobMapping{Schema: "public", Table: "users", Column: "email", Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}}}, + }, groupedSchemas, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) require.Nil(t, err) require.Equal(t, `root."email" = transform_email(value:this."email",preserve_length:false,preserve_domain:true,excluded_domains:[],max_length:40,email_type:"uuidv4",invalid_email_action:"reject")`, *output[0].Mutation) @@ -407,8 +362,9 @@ func Test_buildProcessorConfigsJavascriptEmpty(t *testing.T) { schemaTable := sqlmanager_shared.SchemaTable{Schema: "public", Table: "users"} runconfig := rc.NewRunConfig(schemaTable.String(), schemaTable, rc.RunTypeInsert, []string{"id"}, nil, []string{"id"}, []string{"id"}, []*rc.DependsOn{}, false) - resp, err := buildProcessorConfigs(ctx, mockTransformerClient, []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: "id", Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}}}, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) + resp, err := buildProcessorConfigs(ctx, mockTransformerClient, []*shared.JobTransformationMapping{ + {DestinationSchema: "public", DestinationTable: "users", JobMapping: &mgmtv1alpha1.JobMapping{Schema: "public", Table: "users", Column: "id", Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}}}, + }, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfig, nil, []string{}) require.NoError(t, err) require.Empty(t, resp) @@ -473,13 +429,13 @@ func Test_convertUserDefinedFunctionConfig(t *testing.T) { func Test_buildPlainColumns(t *testing.T) { require.Empty(t, buildPlainColumns(nil)) - require.Empty(t, buildPlainColumns([]*mgmtv1alpha1.JobMapping{})) + require.Empty(t, buildPlainColumns([]*shared.JobTransformationMapping{})) require.Equal( t, - buildPlainColumns([]*mgmtv1alpha1.JobMapping{ - {Column: "foo"}, - {Column: "bar"}, - {Column: "baz"}, + buildPlainColumns([]*shared.JobTransformationMapping{ + {DestinationSchema: "public", DestinationTable: "users", JobMapping: &mgmtv1alpha1.JobMapping{Schema: "public", Table: "users", Column: "foo"}}, + {DestinationSchema: "public", DestinationTable: "users", JobMapping: &mgmtv1alpha1.JobMapping{Schema: "public", Table: "users", Column: "bar"}}, + {DestinationSchema: "public", DestinationTable: "users", JobMapping: &mgmtv1alpha1.JobMapping{Schema: "public", Table: "users", Column: "baz"}}, }), []string{"foo", "bar", "baz"}, ) @@ -553,11 +509,18 @@ func Test_buildBenthosS3Credentials(t *testing.T) { func Test_computeMutationFunction_null(t *testing.T) { val, err := computeMutationFunction( - &mgmtv1alpha1.JobMapping{ - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{Config: &mgmtv1alpha1.TransformerConfig_Nullconfig{}}, + &shared.JobTransformationMapping{ + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{Config: &mgmtv1alpha1.TransformerConfig_Nullconfig{}}, + }, }, - }, &sqlmanager_shared.DatabaseSchemaRow{}, false) + }, + &sqlmanager_shared.DatabaseSchemaRow{}, + false, + ) require.NoError(t, err) require.Equal(t, val, "null") } @@ -973,10 +936,14 @@ func Test_computeMutationFunction_Validate_Bloblang_Output(t *testing.T) { for _, transformer := range transformers { t.Run(fmt.Sprintf("%s_%T_lint", t.Name(), transformer.Config.Config), func(t *testing.T) { val, err := computeMutationFunction( - &mgmtv1alpha1.JobMapping{ - Column: "email", - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: transformer.Config, + &shared.JobTransformationMapping{ + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Column: "email", + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: transformer.Config, + }, }, }, emailColInfo, false) require.NoError(t, err) @@ -1132,10 +1099,14 @@ func Test_computeMutationFunction_Validate_Bloblang_Output_EmptyConfigs(t *testi for _, transformer := range transformers { t.Run(fmt.Sprintf("%s_%T_lint", t.Name(), transformer.Config.Config), func(t *testing.T) { val, err := computeMutationFunction( - &mgmtv1alpha1.JobMapping{ - Column: "email", - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: transformer.Config, + &shared.JobTransformationMapping{ + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Column: "email", + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: transformer.Config, + }, }, }, emailColInfo, false) require.NoError(t, err) @@ -1149,17 +1120,21 @@ func Test_computeMutationFunction_Validate_Bloblang_Output_EmptyConfigs(t *testi func Test_computeMutationFunction_handles_Db_Maxlen(t *testing.T) { type testcase struct { - jm *mgmtv1alpha1.JobMapping + jm *shared.JobTransformationMapping ci *sqlmanager_shared.DatabaseSchemaRow expected string } - jm := &mgmtv1alpha1.JobMapping{ - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ - GenerateStringConfig: &mgmtv1alpha1.GenerateString{ - Min: gotypeutil.ToPtr(int64(2)), - Max: gotypeutil.ToPtr(int64(7)), + jm := &shared.JobTransformationMapping{ + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ + GenerateStringConfig: &mgmtv1alpha1.GenerateString{ + Min: gotypeutil.ToPtr(int64(2)), + Max: gotypeutil.ToPtr(int64(7)), + }, }, }, }, @@ -1230,11 +1205,15 @@ func Test_computeMutationFunction_handles_Db_Maxlen(t *testing.T) { } func Test_buildBranchCacheConfigs_null(t *testing.T) { - cols := []*mgmtv1alpha1.JobMapping{ + cols := []*shared.JobTransformationMapping{ { - Schema: "public", - Table: "users", - Column: "user_id", + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "user_id", + }, }, } @@ -1251,17 +1230,51 @@ func Test_buildBranchCacheConfigs_null(t *testing.T) { require.Len(t, resp, 0) } +func Test_buildBranchCacheConfigs_missing_redis(t *testing.T) { + cols := []*shared.JobTransformationMapping{ + { + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "user_id", + }, + }, + } + + constraints := map[string][]*bb_internal.ReferenceKey{ + "user_id": { + { + Table: "public.orders", + Column: "buyer_id", + }, + }, + } + + resp := buildBranchCacheConfigs(cols, constraints, mockJobId, mockRunId) + require.Len(t, resp, 1) +} + func Test_buildBranchCacheConfigs_success(t *testing.T) { - cols := []*mgmtv1alpha1.JobMapping{ + cols := []*shared.JobTransformationMapping{ { - Schema: "public", - Table: "users", - Column: "user_id", + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "user_id", + }, }, { - Schema: "public", - Table: "users", - Column: "name", + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "name", + }, }, } @@ -1281,11 +1294,15 @@ func Test_buildBranchCacheConfigs_success(t *testing.T) { } func Test_buildBranchCacheConfigs_self_referencing(t *testing.T) { - cols := []*mgmtv1alpha1.JobMapping{ + cols := []*shared.JobTransformationMapping{ { - Schema: "public", - Table: "users", - Column: "user_id", + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "user_id", + }, }, } diff --git a/internal/benthos/benthos-builder/builders/dynamodb.go b/internal/benthos/benthos-builder/builders/dynamodb.go index 431c7f1813..500e9c3619 100644 --- a/internal/benthos/benthos-builder/builders/dynamodb.go +++ b/internal/benthos/benthos-builder/builders/dynamodb.go @@ -11,6 +11,7 @@ import ( "github.com/nucleuscloud/neosync/backend/pkg/metrics" sqlmanager_shared "github.com/nucleuscloud/neosync/backend/pkg/sqlmanager/shared" awsmanager "github.com/nucleuscloud/neosync/internal/aws" + jobmapping_builder_shared "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/builders/jobmapping-builder/shared" bb_internal "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/internal" "github.com/nucleuscloud/neosync/internal/runconfigs" neosync_benthos "github.com/nucleuscloud/neosync/worker/pkg/benthos" @@ -51,7 +52,7 @@ func (b *dyanmodbSyncBuilder) BuildSourceConfigs( dynamoJobSourceOpts := job.GetSource().GetOptions().GetDynamodb() tableOptsMap := toDynamoDbSourceTableOptionMap(dynamoJobSourceOpts.GetTables()) - groupedMappings := groupMappingsByTable(job.GetMappings()) + groupedMappings := groupMappingsByTable(jobmapping_builder_shared.JobMappingsFromLegacyMappings(job.GetMappings())) benthosConfigs := []*bb_internal.BenthosSourceConfig{} // todo: may need to filter here based on the destination config mappings if there is no source->destination table map diff --git a/internal/benthos/benthos-builder/builders/generate.go b/internal/benthos/benthos-builder/builders/generate.go index 0d97e04952..6587c00a91 100644 --- a/internal/benthos/benthos-builder/builders/generate.go +++ b/internal/benthos/benthos-builder/builders/generate.go @@ -8,6 +8,7 @@ import ( "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1/mgmtv1alpha1connect" "github.com/nucleuscloud/neosync/backend/pkg/metrics" "github.com/nucleuscloud/neosync/backend/pkg/sqlmanager" + jobmapping_builder_shared "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/builders/jobmapping-builder/shared" bb_internal "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/internal" bb_shared "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/shared" connectionmanager "github.com/nucleuscloud/neosync/internal/connection-manager" @@ -68,7 +69,7 @@ func (b *generateBuilder) BuildSourceConfigs( defer db.Db().Close() b.driver = db.Driver() - groupedMappings := groupMappingsByTable(job.Mappings) + groupedMappings := groupMappingsByTable(jobmapping_builder_shared.JobMappingsFromLegacyMappings(job.GetMappings())) groupedTableMapping := getTableMappingsMap(groupedMappings) colTransformerMap := getColumnTransformerMap(groupedTableMapping) sourceTableOpts := groupGenerateSourceOptionsByTable(sourceOptions.Schemas) diff --git a/internal/benthos/benthos-builder/builders/jobmapping-builder/settings/cascade-settings.go b/internal/benthos/benthos-builder/builders/jobmapping-builder/settings/cascade-settings.go new file mode 100644 index 0000000000..4c9f68e930 --- /dev/null +++ b/internal/benthos/benthos-builder/builders/jobmapping-builder/settings/cascade-settings.go @@ -0,0 +1,362 @@ +package cascade_settings + +import ( + "iter" + "log/slog" + "maps" + "slices" + + mgmtv1alpha1 "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1" +) + +type CascadeSchemaSettings struct { + config *mgmtv1alpha1.JobTypeConfig_JobTypeSync + logger *slog.Logger +} + +func NewCascadeSchemaSettings(config *mgmtv1alpha1.JobTypeConfig_JobTypeSync, logger *slog.Logger) *CascadeSchemaSettings { + return &CascadeSchemaSettings{ + config: config, + logger: logger, + } +} + +func (c *CascadeSchemaSettings) GetSchemaStrategy() *mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy { + return getSchemaStrategyOrDefault( + c.logger, + c.getGlobalSchemaStrategy(), + ) +} + +func (c *CascadeSchemaSettings) getGlobalSchemaStrategy() *mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy { + return c.config.GetSchemaChange().GetSchemaStrategy() +} + +func getSchemaStrategyOrDefault( + logger *slog.Logger, + strategies ...*mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy, +) *mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy { + var strategy *mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy + for _, s := range strategies { + if s != nil { + strategy = s + break + } + } + if strategy == nil { + return getDefaultSchemaStrategy(logger) + } + + switch s := strategy.GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas_: + if s.MapAllSchemas == nil { + strategy.Strategy = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas_{ + MapAllSchemas: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas{}, + } + } + return strategy + default: + return getDefaultSchemaStrategy(logger) + } +} + +func getDefaultSchemaStrategy(logger *slog.Logger) *mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy { + logger.Debug("no schema strategy defined, using default MapAllSchemas strategy") + return &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas_{ + MapAllSchemas: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas{}, + }, + } +} + +func (c *CascadeSchemaSettings) GetTableStrategy(schemaName string) *mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy { + return getTableStrategyOrDefault( + c.logger, + c.getSchemaLevelTableStrategy(schemaName), + c.getGlobalTableStrategy(), + ) +} + +func (c *CascadeSchemaSettings) getGlobalTableStrategy() *mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy { + return c.config.GetSchemaChange().GetTableStrategy() +} + +func getTableStrategyOrDefault( + logger *slog.Logger, + strategies ...*mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy, +) *mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy { + var strategy *mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy + for _, s := range strategies { + if s != nil { + strategy = s + break + } + } + if strategy == nil { + return getDefaultTableStrategy(logger) + } + + switch s := strategy.GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables_: + if s.MapAllTables == nil { + strategy.Strategy = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables_{ + MapAllTables: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables{}, + } + } + return strategy + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables_: + if s.MapDefinedTables == nil { + strategy.Strategy = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables_{ + MapDefinedTables: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables{}, + } + } + return strategy + default: + return getDefaultTableStrategy(logger) + } +} + +func getDefaultTableStrategy(logger *slog.Logger) *mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy { + logger.Debug("no table strategy defined, using default MapAllTables strategy") + return &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables_{ + MapAllTables: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables{}, + }, + } +} + +func (c *CascadeSchemaSettings) getSchemaLevelTableStrategy(schemaName string) *mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy { + for _, schemaMapping := range c.config.GetSchemaMappings() { + if schemaMapping.GetSchema() == schemaName { + return schemaMapping.GetTableStrategy() + } + } + return nil +} + +func (c *CascadeSchemaSettings) GetColumnStrategy(schemaName, tableName string) *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy { + return getColumnStrategyOrDefault( + c.getTablelevelColumnStrategy(schemaName, tableName), + c.getSchemaLevelColumnStrategy(schemaName), + c.getGlobalColumnStrategy(), + ) +} + +func getColumnStrategyOrDefault( + strategies ...*mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy, +) *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy { + var strategy *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy + for _, s := range strategies { + if s != nil { + strategy = s + break + } + } + if strategy == nil { + return getDefaultColumnStrategy() + } + + switch s := strategy.GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_: + mapAll := s.MapAllColumns + if mapAll == nil { + mapAll = getDefaultMapAllColumnsStrategy() + } + + // Get default settings to merge with + defaultStrat := getDefaultMapAllColumnsStrategy() + + // Merge with defaults for any undefined settings + if mapAll.ColumnInSourceNotMapped == nil { + mapAll.ColumnInSourceNotMapped = defaultStrat.ColumnInSourceNotMapped + } else { + switch start := mapAll.GetColumnInSourceNotMapped().GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap_: + if start.AutoMap == nil { + start.AutoMap = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap{} + } + mapAll.ColumnInSourceNotMapped.Strategy = start + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop_: + if start.Drop == nil { + start.Drop = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop{} + } + mapAll.ColumnInSourceNotMapped.Strategy = start + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough_: + if start.Passthrough == nil { + start.Passthrough = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough{} + } + mapAll.ColumnInSourceNotMapped.Strategy = start + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt_: + if start.Halt == nil { + start.Halt = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt{} + } + mapAll.ColumnInSourceNotMapped.Strategy = start + default: + mapAll.ColumnInSourceNotMapped = defaultStrat.ColumnInSourceNotMapped + } + } + + if mapAll.ColumnMappedNotInSource == nil { + mapAll.ColumnMappedNotInSource = defaultStrat.ColumnMappedNotInSource + } else { + switch start := mapAll.GetColumnMappedNotInSource().GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue_: + if start.Continue == nil { + start.Continue = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue{} + } + mapAll.ColumnMappedNotInSource.Strategy = start + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt_: + if start.Halt == nil { + start.Halt = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt{} + } + mapAll.ColumnMappedNotInSource.Strategy = start + default: + mapAll.ColumnMappedNotInSource = defaultStrat.ColumnMappedNotInSource + } + } + + if mapAll.ColumnInSourceMappedNotInDestination == nil { + mapAll.ColumnInSourceMappedNotInDestination = defaultStrat.ColumnInSourceMappedNotInDestination + } else { + switch start := mapAll.GetColumnInSourceMappedNotInDestination().GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop_: + if start.Drop == nil { + start.Drop = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop{} + } + mapAll.ColumnInSourceMappedNotInDestination.Strategy = start + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt_: + if start.Halt == nil { + start.Halt = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt{} + } + mapAll.ColumnInSourceMappedNotInDestination.Strategy = start + default: + mapAll.ColumnInSourceMappedNotInDestination = defaultStrat.ColumnInSourceMappedNotInDestination + } + } + + if mapAll.ColumnInDestinationNoLongerInSource == nil { + mapAll.ColumnInDestinationNoLongerInSource = defaultStrat.ColumnInDestinationNoLongerInSource + } else { + switch start := mapAll.GetColumnInDestinationNoLongerInSource().GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap_: + if start.AutoMap == nil { + start.AutoMap = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap{} + } + mapAll.ColumnInDestinationNoLongerInSource.Strategy = start + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue_: + if start.Continue == nil { + start.Continue = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue{} + } + mapAll.ColumnInDestinationNoLongerInSource.Strategy = start + default: + mapAll.ColumnInDestinationNoLongerInSource = defaultStrat.ColumnInDestinationNoLongerInSource + } + } + + return &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_{ + MapAllColumns: mapAll, + }, + } + default: + return getDefaultColumnStrategy() + } +} + +func (c *CascadeSchemaSettings) getTablelevelColumnStrategy( + schemaName, tableName string, +) *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy { + for _, schemaMapping := range c.config.GetSchemaMappings() { + if schemaMapping.GetSchema() == schemaName { + for _, tableMapping := range schemaMapping.GetTableMappings() { + if tableMapping.GetTable() == tableName { + return tableMapping.GetColumnStrategy() + } + } + break + } + } + return nil +} + +func (c *CascadeSchemaSettings) getSchemaLevelColumnStrategy(schemaName string) *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy { + for _, schemaMapping := range c.config.GetSchemaMappings() { + if schemaMapping.GetSchema() == schemaName { + if cs := schemaMapping.GetColumnStrategy(); cs != nil { + return cs + } + } + } + return nil +} + +func (c *CascadeSchemaSettings) getGlobalColumnStrategy() *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy { + return c.config.GetSchemaChange().GetColumnStrategy() +} + +func getDefaultColumnStrategy() *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy { + return &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_{ + MapAllColumns: getDefaultMapAllColumnsStrategy(), + }, + } +} + +func getDefaultMapAllColumnsStrategy() *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns { + return &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns{ + ColumnInSourceNotMapped: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough_{ + Passthrough: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough{}, + }, + }, + ColumnMappedNotInSource: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue_{}, + }, + ColumnInSourceMappedNotInDestination: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop_{}, + }, + ColumnInDestinationNoLongerInSource: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap_{}, + }, + } +} + +func (c *CascadeSchemaSettings) GetColumnTransformerConfigByTable( + schemaName, tableName string, +) iter.Seq2[string, *mgmtv1alpha1.TransformerConfig] { + return func(yield func(string, *mgmtv1alpha1.TransformerConfig) bool) { + for _, schemaMapping := range c.config.GetSchemaMappings() { + if schemaMapping.GetSchema() == schemaName { + for _, tableMapping := range schemaMapping.GetTableMappings() { + if tableMapping.GetTable() == tableName { + for _, columnMapping := range tableMapping.GetColumnMappings() { + if !yield(columnMapping.GetColumn(), columnMapping.GetTransformer()) { + return + } + } + } + } + } + } + } +} + +func (c *CascadeSchemaSettings) GetDefinedSchemas() []string { + output := map[string]bool{} + for _, schemaMapping := range c.config.GetSchemaMappings() { + output[schemaMapping.GetSchema()] = true + } + return slices.Collect(maps.Keys(output)) +} + +func (c *CascadeSchemaSettings) GetDefinedTables(schemaName string) []string { + output := map[string]bool{} + for _, schemaMapping := range c.config.GetSchemaMappings() { + if schemaMapping.GetSchema() == schemaName { + for _, tableMapping := range schemaMapping.GetTableMappings() { + output[tableMapping.GetTable()] = true + } + } + } + return slices.Collect(maps.Keys(output)) +} diff --git a/internal/benthos/benthos-builder/builders/jobmapping-builder/settings/cascade-settings_test.go b/internal/benthos/benthos-builder/builders/jobmapping-builder/settings/cascade-settings_test.go new file mode 100644 index 0000000000..ff4078871c --- /dev/null +++ b/internal/benthos/benthos-builder/builders/jobmapping-builder/settings/cascade-settings_test.go @@ -0,0 +1,277 @@ +package cascade_settings + +import ( + "testing" + + mgmtv1alpha1 "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1" + "github.com/nucleuscloud/neosync/internal/testutil" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_GetSchemaStrategy(t *testing.T) { + t.Run("returns default when no strategy set", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{} + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + strategy := settings.GetSchemaStrategy() + require.NotNil(t, strategy) + require.NotNil(t, strategy.GetMapAllSchemas()) + }) + + t.Run("returns configured strategy", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{ + SchemaChange: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaChange{ + SchemaStrategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas_{ + MapAllSchemas: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas{}, + }, + }, + }, + } + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + strategy := settings.GetSchemaStrategy() + require.NotNil(t, strategy) + require.NotNil(t, strategy.GetMapAllSchemas()) + }) +} + +func Test_GetTableStrategy(t *testing.T) { + t.Run("returns default when no strategy set", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{} + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + strategy := settings.GetTableStrategy("public") + require.NotNil(t, strategy) + require.NotNil(t, strategy.GetMapAllTables()) + }) + + t.Run("returns global strategy when no schema specific strategy", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{ + SchemaChange: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaChange{ + TableStrategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables_{ + MapDefinedTables: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables{}, + }, + }, + }, + } + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + strategy := settings.GetTableStrategy("public") + require.NotNil(t, strategy) + require.NotNil(t, strategy.GetMapDefinedTables()) + }) + + t.Run("returns schema level strategy over global", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{ + SchemaChange: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaChange{ + TableStrategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables_{ + MapAllTables: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables{}, + }, + }, + }, + SchemaMappings: []*mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaMapping{ + { + Schema: "public", + TableStrategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables_{ + MapDefinedTables: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables{}, + }, + }, + }, + }, + } + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + strategy := settings.GetTableStrategy("public") + require.NotNil(t, strategy) + require.NotNil(t, strategy.GetMapDefinedTables()) + }) +} + +func Test_GetColumnStrategy(t *testing.T) { + t.Run("returns default when no strategy set", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{} + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + strategy := settings.GetColumnStrategy("public", "users") + require.NotNil(t, strategy) + require.NotNil(t, strategy.GetMapAllColumns()) + }) + + t.Run("returns global strategy when no schema or table specific strategy", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{ + SchemaChange: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaChange{ + ColumnStrategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_{ + MapAllColumns: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns{ + ColumnInSourceNotMapped: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop_{}, + }, + }, + }, + }, + }, + } + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + strategy := settings.GetColumnStrategy("public", "users") + require.NotNil(t, strategy) + require.NotNil(t, strategy.GetMapAllColumns()) + require.NotNil(t, strategy.GetMapAllColumns().GetColumnInSourceNotMapped().GetDrop()) + }) + + t.Run("returns table level strategy over schema and global", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{ + SchemaChange: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaChange{ + ColumnStrategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_{ + MapAllColumns: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns{ + ColumnInSourceNotMapped: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop_{}, + }, + }, + }, + }, + }, + SchemaMappings: []*mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaMapping{ + { + Schema: "public", + TableMappings: []*mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping{ + { + Table: "users", + ColumnStrategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_{ + MapAllColumns: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns{ + ColumnInSourceNotMapped: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy{ + Strategy: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough_{}, + }, + }, + }, + }, + }, + }, + }, + }, + } + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + strategy := settings.GetColumnStrategy("public", "users") + require.NotNil(t, strategy) + require.NotNil(t, strategy.GetMapAllColumns()) + require.NotNil(t, strategy.GetMapAllColumns().GetColumnInSourceNotMapped().GetPassthrough()) + }) +} + +func Test_GetColumnTransformerConfigByTable(t *testing.T) { + t.Run("returns empty when no transformers configured", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{} + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + var count int + for range settings.GetColumnTransformerConfigByTable("public", "users") { + count++ + } + assert.Equal(t, 0, count) + }) + + t.Run("returns configured transformers", func(t *testing.T) { + transformer := &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{ + PassthroughConfig: &mgmtv1alpha1.Passthrough{}, + }, + } + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{ + SchemaMappings: []*mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaMapping{ + { + Schema: "public", + TableMappings: []*mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping{ + { + Table: "users", + ColumnMappings: []*mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping_ColumnMapping{ + { + Column: "id", + Transformer: transformer, + }, + }, + }, + }, + }, + }, + } + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + var transformers []*mgmtv1alpha1.TransformerConfig + var columns []string + for col, trans := range settings.GetColumnTransformerConfigByTable("public", "users") { + columns = append(columns, col) + transformers = append(transformers, trans) + } + require.Len(t, transformers, 1) + require.Equal(t, transformer, transformers[0]) + require.Equal(t, []string{"id"}, columns) + }) +} + +func Test_GetDefinedSchemas(t *testing.T) { + t.Run("returns empty when no schemas defined", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{} + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + schemas := settings.GetDefinedSchemas() + assert.Empty(t, schemas) + }) + + t.Run("returns defined schemas", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{ + SchemaMappings: []*mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaMapping{ + {Schema: "public"}, + {Schema: "private"}, + }, + } + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + schemas := settings.GetDefinedSchemas() + assert.ElementsMatch(t, []string{"public", "private"}, schemas) + }) +} + +func Test_GetDefinedTables(t *testing.T) { + t.Run("returns empty when no tables defined", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{} + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + tables := settings.GetDefinedTables("public") + assert.Empty(t, tables) + }) + + t.Run("returns defined tables for schema", func(t *testing.T) { + cfg := &mgmtv1alpha1.JobTypeConfig_JobTypeSync{ + SchemaMappings: []*mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaMapping{ + { + Schema: "public", + TableMappings: []*mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping{ + {Table: "users"}, + {Table: "posts"}, + }, + }, + { + Schema: "private", + TableMappings: []*mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaMapping_TableMapping{ + {Table: "secrets"}, + }, + }, + }, + } + settings := NewCascadeSchemaSettings(cfg, testutil.GetConcurrentTestLogger(t)) + + tables := settings.GetDefinedTables("public") + assert.ElementsMatch(t, []string{"users", "posts"}, tables) + + tables = settings.GetDefinedTables("private") + assert.ElementsMatch(t, []string{"secrets"}, tables) + }) +} diff --git a/internal/benthos/benthos-builder/builders/jobmapping-builder/shared/util.go b/internal/benthos/benthos-builder/builders/jobmapping-builder/shared/util.go new file mode 100644 index 0000000000..c0d2d343fb --- /dev/null +++ b/internal/benthos/benthos-builder/builders/jobmapping-builder/shared/util.go @@ -0,0 +1,22 @@ +package jobmapping_builder_shared + +import ( + mgmtv1alpha1 "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1" + "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/shared" +) + +func JobMappingsFromLegacyMappings(mappings []*mgmtv1alpha1.JobMapping) []*shared.JobTransformationMapping { + jobMappings := make([]*shared.JobTransformationMapping, len(mappings)) + for i, mapping := range mappings { + jobMappings[i] = jobMappingFromLegacyMapping(mapping) + } + return jobMappings +} + +func jobMappingFromLegacyMapping(mapping *mgmtv1alpha1.JobMapping) *shared.JobTransformationMapping { + return &shared.JobTransformationMapping{ + JobMapping: mapping, + DestinationSchema: mapping.GetSchema(), + DestinationTable: mapping.GetTable(), + } +} diff --git a/internal/benthos/benthos-builder/builders/jobmapping-builder/sql/builders.go b/internal/benthos/benthos-builder/builders/jobmapping-builder/sql/builders.go new file mode 100644 index 0000000000..8308926735 --- /dev/null +++ b/internal/benthos/benthos-builder/builders/jobmapping-builder/sql/builders.go @@ -0,0 +1,1386 @@ +package jobmapping_builder_sql + +import ( + "errors" + "fmt" + "iter" + "log/slog" + "maps" + "math" + "slices" + "strconv" + "strings" + + mgmtv1alpha1 "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1" + sqlmanager_shared "github.com/nucleuscloud/neosync/backend/pkg/sqlmanager/shared" + cascade_settings "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/builders/jobmapping-builder/settings" + jobmapping_builder_shared "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/builders/jobmapping-builder/shared" + job_util "github.com/nucleuscloud/neosync/internal/job" + neosync_benthos "github.com/nucleuscloud/neosync/worker/pkg/benthos" + "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/shared" +) + +const ( + jobmappingSubsetErrMsg = "unable to continue: job mappings contain schemas, tables, or columns that were not found in the source connection" + haltOnSchemaAdditionErrMsg = "unable to continue: HaltOnNewColumnAddition: job mappings are missing columns for the mapped tables found in the source connection" + haltOnColumnRemovalErrMsg = "unable to continue: HaltOnColumnRemoval: source database is missing columns for the mapped tables found in the job mappings" +) + +type SqlJobMappingBuilder struct { + schemaSettings *cascade_settings.CascadeSchemaSettings + + sourceSchemaRows map[string]map[string][]*sqlmanager_shared.DatabaseSchemaRow + destSchemaRows map[string]map[string][]*sqlmanager_shared.DatabaseSchemaRow + + driver string + logger *slog.Logger +} + +func NewSqlJobMappingBuilder( + schemaSettings *cascade_settings.CascadeSchemaSettings, + sourceSchemaRows map[string]map[string][]*sqlmanager_shared.DatabaseSchemaRow, + destSchemaRows map[string]map[string][]*sqlmanager_shared.DatabaseSchemaRow, + driver string, + logger *slog.Logger, +) *SqlJobMappingBuilder { + return &SqlJobMappingBuilder{ + schemaSettings: schemaSettings, + sourceSchemaRows: sourceSchemaRows, + destSchemaRows: destSchemaRows, + driver: driver, + logger: logger, + } +} + +func (b *SqlJobMappingBuilder) BuildJobMappings() ([]*shared.JobTransformationMapping, error) { + schemas := b.getSchemasByStrategy(func() []string { return slices.Collect(maps.Keys(b.sourceSchemaRows)) }) + tables := b.getTablesByStrategy(schemas, func(schema string) []string { return slices.Collect(maps.Keys(b.sourceSchemaRows[schema])) }) + + columnTransformErrors := []error{} + jobMappings := []*shared.JobTransformationMapping{} + for _, schema := range schemas { + tables, ok := tables[schema] + if !ok { + continue + } + for _, table := range tables { + columnRows, ok := b.sourceSchemaRows[schema][table] + if !ok { + continue + } + sourceColumnMap := maps.Collect(getColumnMapFromDbInfo(columnRows)) + destColumnRows, ok := b.destSchemaRows[schema][table] + if !ok { + destColumnRows = []*sqlmanager_shared.DatabaseSchemaRow{} + } + destColumnMap := maps.Collect(getColumnMapFromDbInfo(destColumnRows)) + + columnTransforms, err := b.getColumnTransforms(schema, table, sourceColumnMap, destColumnMap) + if err != nil { + columnTransformErrors = append(columnTransformErrors, err) + continue + } + for colName, transformerConfig := range columnTransforms { + jobMappings = append(jobMappings, &shared.JobTransformationMapping{ + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: schema, + Table: table, + Column: colName, + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: transformerConfig, + }, + }, + }) + } + } + } + if len(columnTransformErrors) > 0 { + return nil, fmt.Errorf("unable to build column transforms: %w", errors.Join(columnTransformErrors...)) + } + return jobMappings, nil +} + +// GetSchemasByStrategy returns the schemas to process based on the schema strategy +// If MapAll or default, returns input. If MapDefined, returns what is defined in the config, does not consider input +func (c *SqlJobMappingBuilder) getSchemasByStrategy(getDbSchemas func() []string) []string { + switch c.schemaSettings.GetSchemaStrategy().GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy_MapAllSchemas_: + return getDbSchemas() + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_SchemaStrategy_MapDefinedSchemas_: + return c.schemaSettings.GetDefinedSchemas() + default: + return getDbSchemas() + } +} + +func (c *SqlJobMappingBuilder) getTablesByStrategy(schemas []string, getDbTables func(schema string) []string) map[string][]string { + output := map[string][]string{} + for _, schema := range schemas { + switch c.schemaSettings.GetTableStrategy(schema).GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapAllTables_: + output[schema] = getDbTables(schema) + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_TableStrategy_MapDefinedTables_: + output[schema] = c.schemaSettings.GetDefinedTables(schema) + default: + output[schema] = getDbTables(schema) + } + } + return output +} + +func (c *SqlJobMappingBuilder) getColumnTransforms( + schemaName, + tableName string, + sourceColumnMap map[string]*sqlmanager_shared.DatabaseSchemaRow, + destColumnMap map[string]*sqlmanager_shared.DatabaseSchemaRow, +) (map[string]*mgmtv1alpha1.TransformerConfig, error) { + colStrategy := c.schemaSettings.GetColumnStrategy(schemaName, tableName) + + output := map[string]*mgmtv1alpha1.TransformerConfig{} + maps.Insert(output, c.schemaSettings.GetColumnTransformerConfigByTable(schemaName, tableName)) + + switch colStrat := colStrategy.GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns_: + if colStrat.MapAllColumns == nil { + colStrat.MapAllColumns = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapAllColumns{} + } + + for colName := range output { + if _, ok := sourceColumnMap[colName]; !ok { + switch colStrat.MapAllColumns.GetColumnMappedNotInSource().GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue_: + // do nothing + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt_: + return nil, fmt.Errorf("column %s in source but not mapped, and halt is set", colName) + default: + // do nothing + } + } + } + + for _, columnRow := range sourceColumnMap { + // column in source, but not mapped + if _, ok := output[columnRow.ColumnName]; !ok { + switch colStrat.MapAllColumns.GetColumnInSourceNotMapped().GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_AutoMap_: + transformer, err := getTransformerConfigByDataType(c.driver, columnRow, c.logger) + if err != nil { + return nil, fmt.Errorf("unable to get transformer config for column %s: %w", columnRow.ColumnName, err) + } + output[columnRow.ColumnName] = transformer.GetConfig() + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Passthrough_: + output[columnRow.ColumnName] = &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{ + PassthroughConfig: &mgmtv1alpha1.Passthrough{}, + }, + } + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Halt_: + return nil, fmt.Errorf("column %s in source but not mapped, and halt is set", columnRow.ColumnName) + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceNotMappedStrategy_Drop_: + delete(output, columnRow.ColumnName) + default: + output[columnRow.ColumnName] = &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{ + PassthroughConfig: &mgmtv1alpha1.Passthrough{}, + }, + } + } + } + } + + missingInDestColumns := []string{} + for colName := range output { + if _, ok := destColumnMap[colName]; !ok { + missingInDestColumns = append(missingInDestColumns, colName) + } + } + if len(missingInDestColumns) > 0 { + switch colStrat.MapAllColumns.GetColumnInSourceMappedNotInDestination().GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue_: + // do nothing + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop_: + for _, colName := range missingInDestColumns { + delete(output, colName) + } + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt_: + return nil, fmt.Errorf("columns in source + mapped, but not in destination: %s.%s.[%s]", schemaName, tableName, strings.Join(missingInDestColumns, ", ")) + } + } + + missingInSourceColumns := []string{} + for _, columnRow := range destColumnMap { + if _, ok := sourceColumnMap[columnRow.ColumnName]; !ok { + missingInSourceColumns = append(missingInSourceColumns, columnRow.ColumnName) + } + } + if len(missingInSourceColumns) > 0 { + strat := colStrat.MapAllColumns.GetColumnInDestinationNoLongerInSource().GetStrategy() + if strat == nil { + strat = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap_{ + AutoMap: &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap{}, + } + } + switch strat.(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Continue_: + // do nothing + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_Halt_: + return nil, fmt.Errorf("columns in destination but not in source: %s.%s.[%s]", schemaName, tableName, strings.Join(missingInSourceColumns, ", ")) + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInDestinationNotInSourceStrategy_AutoMap_: + for _, colName := range missingInSourceColumns { + destColInfo, ok := destColumnMap[colName] + if !ok { + return nil, fmt.Errorf("column %s in destination but not in source, and auto map is set", colName) + } + transformer, err := getTransformerConfigByDataType(c.driver, destColInfo, c.logger) + if err != nil { + return nil, fmt.Errorf("unable to get transformer config for column %s: %w", colName, err) + } + output[colName] = transformer.GetConfig() + } + default: + // do nothing, should be the same as auto map + } + } + + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns_: + if colStrat.MapDefinedColumns == nil { + colStrat.MapDefinedColumns = &mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_MapDefinedColumns{} + } + for colName := range output { + if _, ok := sourceColumnMap[colName]; !ok { + switch colStrat.MapDefinedColumns.GetColumnMappedNotInSource().GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Continue_: + // do nothing + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnMappedNotInSourceStrategy_Halt_: + return nil, fmt.Errorf("column %s in source but not mapped, and halt is set", colName) + default: + // do nothing + } + } + } + + missingInDestColumns := []string{} + for colName := range output { + if _, ok := destColumnMap[colName]; !ok { + missingInDestColumns = append(missingInDestColumns, colName) + } + } + if len(missingInDestColumns) > 0 { + switch colStrat.MapDefinedColumns.GetColumnInSourceMappedNotInDestination().GetStrategy().(type) { + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Continue_: + // do nothing + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Drop_: + for _, colName := range missingInDestColumns { + delete(output, colName) + } + case *mgmtv1alpha1.JobTypeConfig_JobTypeSync_ColumnStrategy_ColumnInSourceMappedNotInDestinationStrategy_Halt_: + return nil, fmt.Errorf("columns in source + mapped, but not in destination: %s.%s.[%s]", schemaName, tableName, strings.Join(missingInDestColumns, ", ")) + } + } + default: + // do nothing for now + } + + return output, nil +} + +// assumes the columnRows are already scoped to a table +func getColumnMapFromDbInfo(columnRows []*sqlmanager_shared.DatabaseSchemaRow) iter.Seq2[string, *sqlmanager_shared.DatabaseSchemaRow] { + return func(yield func(string, *sqlmanager_shared.DatabaseSchemaRow) bool) { + for _, columnRow := range columnRows { + if !yield(columnRow.ColumnName, columnRow) { + return + } + } + } +} + +type LegacySqlJobMappingBuilder struct { + job *mgmtv1alpha1.Job + sourceColumnInfo map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow + driver string + logger *slog.Logger +} + +func NewLegacySqlJobMappingBuilder( + job *mgmtv1alpha1.Job, + sourceColumnInfo map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, + driver string, + logger *slog.Logger, +) *LegacySqlJobMappingBuilder { + return &LegacySqlJobMappingBuilder{ + job: job, + sourceColumnInfo: sourceColumnInfo, + driver: driver, + logger: logger, + } +} + +func (b *LegacySqlJobMappingBuilder) BuildJobMappings() ([]*shared.JobTransformationMapping, error) { + legacyMappings := b.job.GetMappings() + if len(legacyMappings) == 0 { + return nil, fmt.Errorf("no mappings found") + } + + sqlSourceOpts, err := job_util.GetSqlJobSourceOpts(b.job.GetSource()) + if err != nil { + return nil, fmt.Errorf("unable to get sql job source opts: %w", err) + } + + if sqlSourceOpts != nil && sqlSourceOpts.HaltOnNewColumnAddition { + newColumns, shouldHalt := shouldHaltOnSchemaAddition(b.sourceColumnInfo, legacyMappings) + if shouldHalt { + return nil, fmt.Errorf("%s: [%s]", haltOnSchemaAdditionErrMsg, strings.Join(newColumns, ", ")) + } + } + + if sqlSourceOpts != nil && sqlSourceOpts.HaltOnColumnRemoval { + missing, shouldHalt := isSourceMissingColumnsFoundInMappings(b.sourceColumnInfo, legacyMappings) + if shouldHalt { + return nil, fmt.Errorf("%s: [%s]", haltOnSchemaAdditionErrMsg, strings.Join(missing, ", ")) + } + } + + // remove mappings that are not found in the source + filteredExistingSourceMappings := removeMappingsNotFoundInSource(legacyMappings, b.sourceColumnInfo) + + if sqlSourceOpts != nil && sqlSourceOpts.PassthroughOnNewColumnAddition { + extraMappings, err := getAdditionalPassthroughJobMappings( + b.sourceColumnInfo, + filteredExistingSourceMappings, + splitKeyToTablePieces, + b.logger, + ) + if err != nil { + return nil, err + } + b.logger.Debug( + fmt.Sprintf("adding %d extra passthrough mappings due to unmapped columns", len(extraMappings)), + ) + filteredExistingSourceMappings = append(filteredExistingSourceMappings, extraMappings...) + } + + if sqlSourceOpts != nil && sqlSourceOpts.GenerateNewColumnTransformers { + extraMappings, err := getAdditionalJobMappings( + b.driver, + b.sourceColumnInfo, + filteredExistingSourceMappings, + splitKeyToTablePieces, + b.logger, + ) + if err != nil { + return nil, fmt.Errorf("unable to get additional legacy job mappings: %w", err) + } + b.logger.Debug(fmt.Sprintf("adding %d extra mappings due to unmapped columns", len(extraMappings))) + filteredExistingSourceMappings = append(filteredExistingSourceMappings, extraMappings...) + } + return jobmapping_builder_shared.JobMappingsFromLegacyMappings(filteredExistingSourceMappings), nil +} + +// Based on the source schema, we check each mapped table for newly added columns that are not present in the mappings, +// but are present in the source. If so, halt because this means PII may be leaked. +func shouldHaltOnSchemaAddition( + groupedSchemas map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, + mappings []*mgmtv1alpha1.JobMapping, +) ([]string, bool) { + tableColMappings := getUniqueColMappingsMap(mappings) + newColumns := []string{} + for table, cols := range groupedSchemas { + mappingCols, exists := tableColMappings[table] + if !exists { + // table not mapped in job mappings, skip + continue + } + for col := range cols { + if _, exists := mappingCols[col]; !exists { + newColumns = append(newColumns, fmt.Sprintf("%s.%s", table, col)) + } + } + } + return newColumns, len(newColumns) != 0 +} + +// Builds a map of ->column +func getUniqueColMappingsMap( + mappings []*mgmtv1alpha1.JobMapping, +) map[string]map[string]struct{} { + tableColMappings := map[string]map[string]struct{}{} + for _, mapping := range mappings { + key := neosync_benthos.BuildBenthosTable(mapping.Schema, mapping.Table) + if _, ok := tableColMappings[key]; ok { + tableColMappings[key][mapping.Column] = struct{}{} + } else { + tableColMappings[key] = map[string]struct{}{ + mapping.Column: {}, + } + } + } + return tableColMappings +} + +// checks that the source database has all the columns that are mapped in the job mappings +func isSourceMissingColumnsFoundInMappings( + groupedSchemas map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, + mappings []*mgmtv1alpha1.JobMapping, +) ([]string, bool) { + missingColumns := []string{} + tableColMappings := getUniqueColMappingsMap(mappings) + + for schemaTable, cols := range tableColMappings { + tableCols := groupedSchemas[schemaTable] + for col := range cols { + if _, ok := tableCols[col]; !ok { + missingColumns = append(missingColumns, fmt.Sprintf("%s.%s", schemaTable, col)) + } + } + } + return missingColumns, len(missingColumns) != 0 +} + +func removeMappingsNotFoundInSource( + mappings []*mgmtv1alpha1.JobMapping, + groupedSchemas map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, +) []*mgmtv1alpha1.JobMapping { + newMappings := make([]*mgmtv1alpha1.JobMapping, 0, len(mappings)) + for _, mapping := range mappings { + key := sqlmanager_shared.BuildTable(mapping.Schema, mapping.Table) + if _, ok := groupedSchemas[key]; ok { + if _, ok := groupedSchemas[key][mapping.Column]; ok { + newMappings = append(newMappings, mapping) + } + } + } + return newMappings +} + +// Based on the source schema and the provided mappings, we find the missing columns (if any) and generate passthrough job mappings for them automatically +func getAdditionalPassthroughJobMappings( + groupedSchemas map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, + mappings []*mgmtv1alpha1.JobMapping, + getTableFromKey func(key string) (schema, table string, err error), + logger *slog.Logger, +) ([]*mgmtv1alpha1.JobMapping, error) { + output := []*mgmtv1alpha1.JobMapping{} + + tableColMappings := getUniqueColMappingsMap(mappings) + + for schematable, cols := range groupedSchemas { + mappedCols, ok := tableColMappings[schematable] + if !ok { + // todo: we may want to generate mappings for this entire table? However this may be dead code as we get the grouped schemas based on the mappings + logger.Warn( + "table found in schema data that is not present in job mappings", + "table", + schematable, + ) + continue + } + if len(cols) == len(mappedCols) { + continue + } + for col, info := range cols { + if _, ok := mappedCols[col]; !ok { + schema, table, err := getTableFromKey(schematable) + if err != nil { + return nil, err + } + // we found a column that is not present in the mappings, let's create a mapping for it + if info.GeneratedType != nil { + output = append(output, &mgmtv1alpha1.JobMapping{ + Schema: schema, + Table: table, + Column: col, + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateDefaultConfig{ + GenerateDefaultConfig: &mgmtv1alpha1.GenerateDefault{}, + }, + }, + }, + }) + } else { + output = append(output, &mgmtv1alpha1.JobMapping{ + Schema: schema, + Table: table, + Column: col, + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{ + PassthroughConfig: &mgmtv1alpha1.Passthrough{}, + }, + }, + }, + }) + } + } + } + } + + return output, nil +} + +// Based on the source schema and the provided mappings, we find the missing columns (if any) and generate job mappings for them automatically +func getAdditionalJobMappings( + driver string, + groupedSchemas map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, + mappings []*mgmtv1alpha1.JobMapping, + getTableFromKey func(key string) (schema, table string, err error), + logger *slog.Logger, +) ([]*mgmtv1alpha1.JobMapping, error) { + output := []*mgmtv1alpha1.JobMapping{} + + tableColMappings := getUniqueColMappingsMap(mappings) + + for schematable, cols := range groupedSchemas { + mappedCols, ok := tableColMappings[schematable] + if !ok { + // todo: we may want to generate mappings for this entire table? However this may be dead code as we get the grouped schemas based on the mappings + logger.Warn( + "table found in schema data that is not present in job mappings", + "table", + schematable, + ) + continue + } + if len(cols) == len(mappedCols) { + continue + } + for col, info := range cols { + if _, ok := mappedCols[col]; !ok { + schema, table, err := getTableFromKey(schematable) + if err != nil { + return nil, err + } + transformer, err := getTransformerConfigByDataType(driver, info, logger) + if err != nil { + return nil, err + } + output = append(output, &mgmtv1alpha1.JobMapping{ + Schema: schema, + Table: table, + Column: col, + Transformer: transformer, + }) + } + } + } + return output, nil +} + +// Automap configuration +func getTransformerConfigByDataType( + driver string, + info *sqlmanager_shared.DatabaseSchemaRow, + logger *slog.Logger, +) (*mgmtv1alpha1.JobMappingTransformer, error) { + // we found a column that is not present in the mappings, let's create a mapping for it + if info.ColumnDefault != "" || info.IdentityGeneration != nil || + info.GeneratedType != nil { + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateDefaultConfig{ + GenerateDefaultConfig: &mgmtv1alpha1.GenerateDefault{}, + }, + }, + }, nil + } else if info.IsNullable { + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_Nullconfig{ + Nullconfig: &mgmtv1alpha1.Null{}, + }, + }, + }, nil + } else { + switch driver { + case sqlmanager_shared.PostgresDriver: + return getJmTransformerByPostgresDataType(info) + case sqlmanager_shared.MysqlDriver: + return getJmTransformerByMysqlDataType(info) + default: + logger.Warn("this driver is not currently supported for additional job mapping by data type") + return nil, fmt.Errorf("this driver %q does not currently support additional job mappings by data type. Please provide discrete job mappings for %q.%q.%q to continue: %w", + driver, info.TableSchema, info.TableName, info.ColumnName, errors.ErrUnsupported, + ) + } + } +} + +func getJmTransformerByPostgresDataType( + colInfo *sqlmanager_shared.DatabaseSchemaRow, +) (*mgmtv1alpha1.JobMappingTransformer, error) { + cleanedDataType := cleanPostgresType(colInfo.DataType) + switch cleanedDataType { + case "smallint": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ + GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ + Min: shared.Ptr(int64(-32768)), + Max: shared.Ptr(int64(32767)), + }, + }, + }, + }, nil + case "integer": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ + GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ + Min: shared.Ptr(int64(-2147483648)), + Max: shared.Ptr(int64(2147483647)), + }, + }, + }, + }, nil + case "bigint": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ + GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ + Min: shared.Ptr(int64(-9223372036854775808)), + Max: shared.Ptr(int64(9223372036854775807)), + }, + }, + }, + }, nil + case "decimal", "numeric": + var precision *int64 + if colInfo.NumericPrecision > 0 { + np := int64(colInfo.NumericPrecision) + precision = &np + } + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateFloat64Config{ + GenerateFloat64Config: &mgmtv1alpha1.GenerateFloat64{ + Precision: precision, // todo: we need to expose scale... + }, + }, + }, + }, nil + case "real", "double precision": + var precision *int64 + if colInfo.NumericPrecision > 0 { + np := int64(colInfo.NumericPrecision) + precision = &np + } + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateFloat64Config{ + GenerateFloat64Config: &mgmtv1alpha1.GenerateFloat64{ + Precision: precision, + }, + }, + }, + }, nil + + case "smallserial", "serial", "bigserial": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateDefaultConfig{ + GenerateDefaultConfig: &mgmtv1alpha1.GenerateDefault{}, + }, + }, + }, nil + case "money": + var precision *int64 + if colInfo.NumericPrecision > 0 { + np := int64(colInfo.NumericPrecision) + precision = &np + } + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateFloat64Config{ + GenerateFloat64Config: &mgmtv1alpha1.GenerateFloat64{ + // todo: to adequately support money, we need to know the scale which is set via the lc_monetary setting (but may be properly populated via our query..) + Precision: precision, + Min: shared.Ptr(float64(-92233720368547758.08)), + Max: shared.Ptr(float64(92233720368547758.07)), + }, + }, + }, + }, nil + case "text", + "bpchar", + "character", + "character varying": // todo: test to see if this works when (n) has been specified + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ + GenerateStringConfig: &mgmtv1alpha1.GenerateString{}, // todo? + }, + }, + }, nil + // case "bytea": // todo https://www.postgresql.org/docs/current/datatype-binary.html + case "date": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + Code: ` + const date = new Date(); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return year + "-" + month + "-" + day; + `, + }, + }, + }, + }, nil + case "time without time zone": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + Code: ` + const date = new Date(); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + return hours + ":" + minutes + ":" + seconds; + `, + }, + }, + }, + }, nil + case "time with time zone": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + Code: ` + const date = new Date(); + const hours = String(date.getUTCHours()).padStart(2, '0'); + const minutes = String(date.getUTCMinutes()).padStart(2, '0'); + const seconds = String(date.getUTCSeconds()).padStart(2, '0'); + const timezoneOffset = -date.getTimezoneOffset(); + const absOffset = Math.abs(timezoneOffset); + const offsetHours = String(Math.floor(absOffset / 60)).padStart(2, '0'); + const offsetMinutes = String(absOffset % 60).padStart(2, '0'); + const offsetSign = timezoneOffset >= 0 ? '+' : '-'; + return hours + ":" + minutes + ":" + seconds + offsetSign + offsetHours + ":" + offsetMinutes; + `, + }, + }, + }, + }, nil + case "interval": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + Code: ` + const date = new Date(); + const hours = String(date.getUTCHours()).padStart(2, '0'); + const minutes = String(date.getUTCMinutes()).padStart(2, '0'); + const seconds = String(date.getUTCSeconds()).padStart(2, '0'); + return hours + ":" + minutes + ":" + seconds; + `, + }, + }, + }, + }, nil + case "timestamp without time zone": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + Code: ` + const date = new Date(); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds; + `, + }, + }, + }, + }, nil + case "timestamp with time zone": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + Code: ` + const date = new Date(); + const year = date.getUTCFullYear(); + const month = String(date.getUTCMonth() + 1).padStart(2, '0'); + const day = String(date.getUTCDate()).padStart(2, '0'); + const hours = String(date.getUTCHours()).padStart(2, '0'); + const minutes = String(date.getUTCMinutes()).padStart(2, '0'); + const seconds = String(date.getUTCSeconds()).padStart(2, '0'); + const timezoneOffset = -date.getTimezoneOffset(); + const absOffset = Math.abs(timezoneOffset); + const offsetHours = String(Math.floor(absOffset / 60)).padStart(2, '0'); + const offsetMinutes = String(absOffset % 60).padStart(2, '0'); + const offsetSign = timezoneOffset >= 0 ? '+' : '-'; + return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds + offsetSign + offsetHours + ":" + offsetMinutes; + `, + }, + }, + }, + }, nil + + case "boolean": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateBoolConfig{ + GenerateBoolConfig: &mgmtv1alpha1.GenerateBool{}, + }, + }, + }, nil + case "uuid": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateUuidConfig{ + GenerateUuidConfig: &mgmtv1alpha1.GenerateUuid{ + IncludeHyphens: shared.Ptr(true), + }, + }, + }, + }, nil + default: + return nil, fmt.Errorf( + "uncountered unsupported data type %q for %q.%q.%q when attempting to generate an auto-mapper. To continue, provide a discrete job mapping for this column.: %w", + colInfo.DataType, + colInfo.TableSchema, + colInfo.TableName, + colInfo.ColumnName, + errors.ErrUnsupported, + ) + } +} + +func getJmTransformerByMysqlDataType( + colInfo *sqlmanager_shared.DatabaseSchemaRow, +) (*mgmtv1alpha1.JobMappingTransformer, error) { + cleanedDataType := cleanMysqlType(colInfo.MysqlColumnType) + switch cleanedDataType { + case "char": + params := extractMysqlTypeParams(colInfo.MysqlColumnType) + minLength := int64(0) + maxLength := int64(255) + if len(params) > 0 { + fixedLength, err := strconv.ParseInt(params[0], 10, 64) + if err != nil { + return nil, fmt.Errorf( + "failed to parse length for type %q: %w", + colInfo.MysqlColumnType, + err, + ) + } + minLength = fixedLength + maxLength = fixedLength + } else if colInfo.CharacterMaximumLength > 0 { + maxLength = int64(colInfo.CharacterMaximumLength) + } + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ + GenerateStringConfig: &mgmtv1alpha1.GenerateString{ + Min: shared.Ptr(minLength), + Max: shared.Ptr(maxLength), + }, + }, + }, + }, nil + + case "varchar": + params := extractMysqlTypeParams(colInfo.MysqlColumnType) + maxLength := int64(65535) + if len(params) > 0 { + fixedLength, err := strconv.ParseInt(params[0], 10, 64) + if err != nil { + return nil, fmt.Errorf( + "failed to parse length for type %q: %w", + colInfo.MysqlColumnType, + err, + ) + } + maxLength = fixedLength + } else if colInfo.CharacterMaximumLength > 0 { + maxLength = int64(colInfo.CharacterMaximumLength) + } + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ + GenerateStringConfig: &mgmtv1alpha1.GenerateString{Max: shared.Ptr(maxLength)}, + }, + }, + }, nil + + case "tinytext": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ + GenerateStringConfig: &mgmtv1alpha1.GenerateString{Max: shared.Ptr(int64(255))}, + }, + }, + }, nil + + case "text": + params := extractMysqlTypeParams(colInfo.MysqlColumnType) + maxLength := int64(65535) + if len(params) > 0 { + length, err := strconv.ParseInt(params[0], 10, 64) + if err != nil { + return nil, fmt.Errorf( + "failed to parse length for type %q: %w", + colInfo.MysqlColumnType, + err, + ) + } + maxLength = length + } else if colInfo.CharacterMaximumLength > 0 { + maxLength = int64(colInfo.CharacterMaximumLength) + } + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ + GenerateStringConfig: &mgmtv1alpha1.GenerateString{Max: shared.Ptr(maxLength)}, + }, + }, + }, nil + + case "mediumtext": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ + GenerateStringConfig: &mgmtv1alpha1.GenerateString{ + Max: shared.Ptr(int64(16_777_215)), + }, + }, + }, + }, nil + case "longtext": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ + GenerateStringConfig: &mgmtv1alpha1.GenerateString{ + Max: shared.Ptr(int64(4_294_967_295)), + }, + }, + }, + }, nil + case "enum", "set": + params := extractMysqlTypeParams(colInfo.MysqlColumnType) + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateCategoricalConfig{ + GenerateCategoricalConfig: &mgmtv1alpha1.GenerateCategorical{ + Categories: shared.Ptr(strings.Join(params, ",")), + }, + }, + }, + }, nil + + case "tinyint": + isUnsigned := strings.Contains(strings.ToLower(colInfo.MysqlColumnType), "unsigned") + var minVal, maxVal int64 + if isUnsigned { + minVal = 0 + maxVal = 255 // 2^8 - 1 + } else { + minVal = -128 // -2^7 + maxVal = 127 // 2^7 - 1 + } + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ + GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ + Min: shared.Ptr(minVal), + Max: shared.Ptr(maxVal), + }, + }, + }, + }, nil + + case "smallint": + isUnsigned := strings.Contains(strings.ToLower(colInfo.MysqlColumnType), "unsigned") + var minVal, maxVal int64 + if isUnsigned { + minVal = 0 + maxVal = 65535 // 2^16 - 1 + } else { + minVal = -32768 // -2^15 + maxVal = 32767 // 2^15 - 1 + } + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ + GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ + Min: shared.Ptr(minVal), + Max: shared.Ptr(maxVal), + }, + }, + }, + }, nil + case "mediumint": + isUnsigned := strings.Contains(strings.ToLower(colInfo.MysqlColumnType), "unsigned") + var minVal, maxVal int64 + if isUnsigned { + minVal = 0 + maxVal = 16777215 // 2^24 - 1 + } else { + minVal = -8388608 // -2^23 + maxVal = 8388607 // 2^23 - 1 + } + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ + GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ + Min: shared.Ptr(minVal), + Max: shared.Ptr(maxVal), + }, + }, + }, + }, nil + case "int", "integer": + isUnsigned := strings.Contains(strings.ToLower(colInfo.MysqlColumnType), "unsigned") + var minVal, maxVal int64 + if isUnsigned { + minVal = 0 + maxVal = 4294967295 // 2^32 - 1 + } else { + minVal = -2147483648 // -2^31 + maxVal = 2147483647 // 2^31 - 1 + } + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ + GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ + Min: shared.Ptr(minVal), + Max: shared.Ptr(maxVal), + }, + }, + }, + }, nil + case "bigint": + minVal := int64(0) // -2^63 + maxVal := int64(math.MaxInt64) // 2^63 - 1 + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ + GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ + Min: shared.Ptr(minVal), + Max: shared.Ptr(maxVal), + }, + }, + }, + }, nil + case "float": + precision := int64(colInfo.NumericPrecision) + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateFloat64Config{ + GenerateFloat64Config: &mgmtv1alpha1.GenerateFloat64{ + Precision: &precision, + }, + }, + }, + }, nil + case "double", "double precision", "decimal", "dec": + precision := int64(colInfo.NumericPrecision) + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateFloat64Config{ + GenerateFloat64Config: &mgmtv1alpha1.GenerateFloat64{ + Precision: &precision, // todo: expose scale + }, + }, + }, + }, nil + + // case "bit": + // params := extractMysqlTypeParams(colInfo.MysqlColumnType) + // bitLength := int64(1) // default length is 1 + // if len(params) > 0 { + // if parsed, err := strconv.ParseInt(params[0], 10, 64); err == nil && parsed > 0 && parsed <= 64 { + // bitLength = parsed + // } + // } + // return &mgmtv1alpha1.JobMappingTransformer{ + // Config: &mgmtv1alpha1.TransformerConfig{ + // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + // Code: fmt.Sprintf(` + // // Generate random bits up to specified length + // const length = %d; + // let value = 0; + // for (let i = 0; i < length; i++) { + // if (Math.random() < 0.5) { + // value |= (1 << i); + // } + // } + // // Convert to binary string padded to the correct length + // return value.toString(2).padStart(length, '0'); + // `, bitLength), + // }, + // }, + // }, + // }, nil + // case "binary", "varbinary": + // params := extractMysqlTypeParams(colInfo.DataType) + // maxLength := int64(255) // default max length + // if len(params) > 0 { + // if parsed, err := strconv.ParseInt(params[0], 10, 64); err == nil && parsed > 0 && parsed <= 255 { + // maxLength = parsed + // } + // } + // return &mgmtv1alpha1.JobMappingTransformer{ + // Config: &mgmtv1alpha1.TransformerConfig{ + // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + // Code: fmt.Sprintf(` + // // Generate random binary data up to maxLength bytes + // const maxLength = %d; + // const length = Math.floor(Math.random() * maxLength) + 1; + // const bytes = new Uint8Array(length); + // for (let i = 0; i < length; i++) { + // bytes[i] = Math.floor(Math.random() * 256); + // } + // // Convert to base64 for safe transport + // return Buffer.from(bytes).toString('base64'); + // `, maxLength), + // }, + // }, + // }, + // }, nil + // case "tinyblob": + // return &mgmtv1alpha1.JobMappingTransformer{ + // Config: &mgmtv1alpha1.TransformerConfig{ + // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + // Code: ` + // // Generate random TINYBLOB (max 255 bytes) + // const maxLength = 255; + // const length = Math.floor(Math.random() * maxLength) + 1; + // const bytes = new Uint8Array(length); + // for (let i = 0; i < length; i++) { + // bytes[i] = Math.floor(Math.random() * 256); + // } + // return Buffer.from(bytes).toString('base64'); + // `, + // }, + // }, + // }, + // }, nil + // case "blob": + // return &mgmtv1alpha1.JobMappingTransformer{ + // Config: &mgmtv1alpha1.TransformerConfig{ + // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + // Code: ` + // // Generate random BLOB (max 65,535 bytes) + // // Using a smaller max for practical purposes + // const maxLength = 1024; // Using 1KB for reasonable performance + // const length = Math.floor(Math.random() * maxLength) + 1; + // const bytes = new Uint8Array(length); + // for (let i = 0; i < length; i++) { + // bytes[i] = Math.floor(Math.random() * 256); + // } + // return Buffer.from(bytes).toString('base64'); + // `, + // }, + // }, + // }, + // }, nil + // case "mediumblob": + // return &mgmtv1alpha1.JobMappingTransformer{ + // Config: &mgmtv1alpha1.TransformerConfig{ + // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + // Code: ` + // // Generate random MEDIUMBLOB (max 16,777,215 bytes) + // // Using a smaller max for practical purposes + // const maxLength = 2048; // Using 2KB for reasonable performance + // const length = Math.floor(Math.random() * maxLength) + 1; + // const bytes = new Uint8Array(length); + // for (let i = 0; i < length; i++) { + // bytes[i] = Math.floor(Math.random() * 256); + // } + // return Buffer.from(bytes).toString('base64'); + // `, + // }, + // }, + // }, + // }, nil + // case "longblob": + // return &mgmtv1alpha1.JobMappingTransformer{ + // Config: &mgmtv1alpha1.TransformerConfig{ + // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + // Code: ` + // // Generate random LONGBLOB (max 4,294,967,295 bytes) + // // Using a smaller max for practical purposes + // const maxLength = 4096; // Using 4KB for reasonable performance + // const length = Math.floor(Math.random() * maxLength) + 1; + // const bytes = new Uint8Array(length); + // for (let i = 0; i < length; i++) { + // bytes[i] = Math.floor(Math.random() * 256); + // } + // return Buffer.from(bytes).toString('base64'); + // `, + // }, + // }, + // }, + // }, nil + + case "date": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + Code: ` + const date = new Date(); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return year + "-" + month + "-" + day; + `, + }, + }, + }, + }, nil + case "datetime", "timestamp": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + Code: ` + const date = new Date(); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds; + `, + }, + }, + }, + }, nil + case "time": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + Code: ` + const date = new Date(); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + return hours + ":" + minutes + ":" + seconds; + `, + }, + }, + }, + }, nil + case "year": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ + GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ + Code: ` + const date = new Date(); + return date.getFullYear(); + `, + }, + }, + }, + }, nil + case "boolean", "bool": + return &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateBoolConfig{ + GenerateBoolConfig: &mgmtv1alpha1.GenerateBool{}, + }, + }, + }, nil + default: + return nil, fmt.Errorf( + "uncountered unsupported data type %q for %q.%q.%q when attempting to generate an auto-mapper. To continue, provide a discrete job mapping for this column.: %w", + colInfo.DataType, + colInfo.TableSchema, + colInfo.TableName, + colInfo.ColumnName, + errors.ErrUnsupported, + ) + } +} + +func cleanPostgresType(dataType string) string { + parenIndex := strings.Index(dataType, "(") + if parenIndex == -1 { + return dataType + } + return strings.TrimSpace(dataType[:parenIndex]) +} + +func cleanMysqlType(dataType string) string { + parenIndex := strings.Index(dataType, "(") + if parenIndex == -1 { + return dataType + } + return strings.TrimSpace(dataType[:parenIndex]) +} + +// extractMysqlTypeParams extracts the parameters from MySQL data type definitions +// Examples: +// - CHAR(10) -> ["10"] +// - FLOAT(10, 2) -> ["10", "2"] +// - ENUM('val1', 'val2') -> ["val1", "val2"] +func extractMysqlTypeParams(dataType string) []string { + parenIndex := strings.Index(dataType, "(") + if parenIndex == -1 { + return nil + } + + closingIndex := strings.LastIndex(dataType, ")") + if closingIndex == -1 { + return nil + } + + // Extract content between parentheses + paramsStr := dataType[parenIndex+1 : closingIndex] + + // Handle ENUM/SET cases which use quotes + if strings.Contains(paramsStr, "'") { + // Split by comma and handle quoted values + params := strings.Split(paramsStr, ",") + result := make([]string, 0, len(params)) + for _, p := range params { + // Remove quotes and whitespace + p = strings.Trim(strings.TrimSpace(p), "'") + if p != "" { + result = append(result, p) + } + } + return result + } + + // Handle regular numeric parameters + params := strings.Split(paramsStr, ",") + result := make([]string, 0, len(params)) + for _, p := range params { + p = strings.TrimSpace(p) + if p != "" { + result = append(result, p) + } + } + return result +} + +func splitKeyToTablePieces(key string) (schema, table string, err error) { + pieces := strings.SplitN(key, ".", 2) + if len(pieces) != 2 { + return "", "", errors.New("unable to split key to get schema and table, not 2 pieces") + } + return pieces[0], pieces[1], nil +} diff --git a/internal/benthos/benthos-builder/builders/sql-util_test.go b/internal/benthos/benthos-builder/builders/jobmapping-builder/sql/builders_test.go similarity index 86% rename from internal/benthos/benthos-builder/builders/sql-util_test.go rename to internal/benthos/benthos-builder/builders/jobmapping-builder/sql/builders_test.go index f108de7c2f..433abbe6b5 100644 --- a/internal/benthos/benthos-builder/builders/sql-util_test.go +++ b/internal/benthos/benthos-builder/builders/jobmapping-builder/sql/builders_test.go @@ -1,4 +1,4 @@ -package benthosbuilder_builders +package jobmapping_builder_sql import ( "testing" @@ -202,6 +202,160 @@ func Test_getAdditionalMappings(t *testing.T) { }) } +func Test_cleanMysqlType(t *testing.T) { + t.Run("simple type without params", func(t *testing.T) { + result := cleanMysqlType("varchar") + expected := "varchar" + require.Equal(t, expected, result) + }) + + t.Run("type with single parameter", func(t *testing.T) { + result := cleanMysqlType("varchar(255)") + expected := "varchar" + require.Equal(t, expected, result) + }) + + t.Run("type with multiple parameters", func(t *testing.T) { + result := cleanMysqlType("decimal(10,2)") + expected := "decimal" + require.Equal(t, expected, result) + }) + + t.Run("enum type with values", func(t *testing.T) { + result := cleanMysqlType("enum('small','medium','large')") + expected := "enum" + require.Equal(t, expected, result) + }) + + t.Run("set type with values", func(t *testing.T) { + result := cleanMysqlType("set('draft','published','archived')") + expected := "set" + require.Equal(t, expected, result) + }) + + t.Run("type with trailing space", func(t *testing.T) { + result := cleanMysqlType("decimal(10,2) ") + expected := "decimal" + require.Equal(t, expected, result) + }) + + t.Run("type with leading space", func(t *testing.T) { + result := cleanMysqlType(" decimal(10,2)") + expected := "decimal" + require.Equal(t, expected, result) + }) + + t.Run("empty string", func(t *testing.T) { + result := cleanMysqlType("") + expected := "" + require.Equal(t, expected, result) + }) + + t.Run("just parentheses", func(t *testing.T) { + result := cleanMysqlType("()") + expected := "" + require.Equal(t, expected, result) + }) + + t.Run("datetime type", func(t *testing.T) { + result := cleanMysqlType("datetime") + expected := "datetime" + require.Equal(t, expected, result) + }) + + t.Run("timestamp with precision", func(t *testing.T) { + result := cleanMysqlType("timestamp(6)") + expected := "timestamp" + require.Equal(t, expected, result) + }) +} + +func BenchmarkCleanMysqlType(b *testing.B) { + inputs := []string{ + "varchar", + "decimal(10,2)", + "enum('small','medium','large')", + "set('draft','published','archived')", + "datetime", + "timestamp(6)", + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, input := range inputs { + cleanMysqlType(input) + } + } +} + +func Test_extractMysqlTypeParams(t *testing.T) { + t.Run("numeric parameters", func(t *testing.T) { + t.Run("single parameter", func(t *testing.T) { + result := extractMysqlTypeParams("CHAR(10)") + require.Equal(t, []string{"10"}, result) + }) + + t.Run("multiple parameters", func(t *testing.T) { + result := extractMysqlTypeParams("FLOAT(10,2)") + require.Equal(t, []string{"10", "2"}, result) + }) + + t.Run("parameters with spaces", func(t *testing.T) { + result := extractMysqlTypeParams("DECIMAL(10, 2)") + require.Equal(t, []string{"10", "2"}, result) + }) + }) + + t.Run("enum values", func(t *testing.T) { + t.Run("simple values", func(t *testing.T) { + result := extractMysqlTypeParams("ENUM('small','medium','large')") + require.Equal(t, []string{"small", "medium", "large"}, result) + }) + + t.Run("values with spaces", func(t *testing.T) { + result := extractMysqlTypeParams("ENUM('small', 'medium', 'large')") + require.Equal(t, []string{"small", "medium", "large"}, result) + }) + + t.Run("values with special characters", func(t *testing.T) { + result := extractMysqlTypeParams("ENUM('draft-1','published_2','archived.3')") + require.Equal(t, []string{"draft-1", "published_2", "archived.3"}, result) + }) + }) + + t.Run("set values", func(t *testing.T) { + result := extractMysqlTypeParams("SET('draft','published','archived')") + require.Equal(t, []string{"draft", "published", "archived"}, result) + }) + + t.Run("edge cases", func(t *testing.T) { + t.Run("no parameters", func(t *testing.T) { + result := extractMysqlTypeParams("VARCHAR") + require.Nil(t, result) + }) + + t.Run("empty parameters", func(t *testing.T) { + result := extractMysqlTypeParams("CHAR()") + require.Empty(t, result) + }) + + t.Run("missing closing parenthesis", func(t *testing.T) { + result := extractMysqlTypeParams("CHAR(10") + require.Nil(t, result) + }) + + t.Run("empty enum values", func(t *testing.T) { + result := extractMysqlTypeParams("ENUM('','','')") + require.Empty(t, result) + }) + + t.Run("mixed empty and non-empty enum values", func(t *testing.T) { + result := extractMysqlTypeParams("ENUM('', 'valid', '')") + require.Equal(t, []string{"valid"}, result) + }) + }) +} + func Test_isSourceMissingColumns(t *testing.T) { t.Run("no missing columns", func(t *testing.T) { missing, ok := isSourceMissingColumnsFoundInMappings( @@ -382,156 +536,66 @@ func Test_removeMappingsNotFoundInSource(t *testing.T) { }) } -func Test_cleanMysqlType(t *testing.T) { - t.Run("simple type without params", func(t *testing.T) { - result := cleanMysqlType("varchar") - expected := "varchar" - require.Equal(t, expected, result) - }) - - t.Run("type with single parameter", func(t *testing.T) { - result := cleanMysqlType("varchar(255)") - expected := "varchar" - require.Equal(t, expected, result) - }) - - t.Run("type with multiple parameters", func(t *testing.T) { - result := cleanMysqlType("decimal(10,2)") - expected := "decimal" - require.Equal(t, expected, result) - }) - - t.Run("enum type with values", func(t *testing.T) { - result := cleanMysqlType("enum('small','medium','large')") - expected := "enum" - require.Equal(t, expected, result) - }) - - t.Run("set type with values", func(t *testing.T) { - result := cleanMysqlType("set('draft','published','archived')") - expected := "set" - require.Equal(t, expected, result) - }) - - t.Run("type with trailing space", func(t *testing.T) { - result := cleanMysqlType("decimal(10,2) ") - expected := "decimal" - require.Equal(t, expected, result) - }) - - t.Run("type with leading space", func(t *testing.T) { - result := cleanMysqlType(" decimal(10,2)") - expected := "decimal" - require.Equal(t, expected, result) - }) - - t.Run("empty string", func(t *testing.T) { - result := cleanMysqlType("") - expected := "" - require.Equal(t, expected, result) - }) - - t.Run("just parentheses", func(t *testing.T) { - result := cleanMysqlType("()") - expected := "" - require.Equal(t, expected, result) - }) - - t.Run("datetime type", func(t *testing.T) { - result := cleanMysqlType("datetime") - expected := "datetime" - require.Equal(t, expected, result) - }) - - t.Run("timestamp with precision", func(t *testing.T) { - result := cleanMysqlType("timestamp(6)") - expected := "timestamp" - require.Equal(t, expected, result) - }) -} - -func BenchmarkCleanMysqlType(b *testing.B) { - inputs := []string{ - "varchar", - "decimal(10,2)", - "enum('small','medium','large')", - "set('draft','published','archived')", - "datetime", - "timestamp(6)", - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - for _, input := range inputs { - cleanMysqlType(input) - } - } -} - -func Test_extractMysqlTypeParams(t *testing.T) { - t.Run("numeric parameters", func(t *testing.T) { - t.Run("single parameter", func(t *testing.T) { - result := extractMysqlTypeParams("CHAR(10)") - require.Equal(t, []string{"10"}, result) - }) - - t.Run("multiple parameters", func(t *testing.T) { - result := extractMysqlTypeParams("FLOAT(10,2)") - require.Equal(t, []string{"10", "2"}, result) - }) - - t.Run("parameters with spaces", func(t *testing.T) { - result := extractMysqlTypeParams("DECIMAL(10, 2)") - require.Equal(t, []string{"10", "2"}, result) - }) - }) - - t.Run("enum values", func(t *testing.T) { - t.Run("simple values", func(t *testing.T) { - result := extractMysqlTypeParams("ENUM('small','medium','large')") - require.Equal(t, []string{"small", "medium", "large"}, result) - }) - - t.Run("values with spaces", func(t *testing.T) { - result := extractMysqlTypeParams("ENUM('small', 'medium', 'large')") - require.Equal(t, []string{"small", "medium", "large"}, result) - }) - - t.Run("values with special characters", func(t *testing.T) { - result := extractMysqlTypeParams("ENUM('draft-1','published_2','archived.3')") - require.Equal(t, []string{"draft-1", "published_2", "archived.3"}, result) - }) - }) - - t.Run("set values", func(t *testing.T) { - result := extractMysqlTypeParams("SET('draft','published','archived')") - require.Equal(t, []string{"draft", "published", "archived"}, result) - }) - - t.Run("edge cases", func(t *testing.T) { - t.Run("no parameters", func(t *testing.T) { - result := extractMysqlTypeParams("VARCHAR") - require.Nil(t, result) - }) - - t.Run("empty parameters", func(t *testing.T) { - result := extractMysqlTypeParams("CHAR()") - require.Empty(t, result) - }) - - t.Run("missing closing parenthesis", func(t *testing.T) { - result := extractMysqlTypeParams("CHAR(10") - require.Nil(t, result) - }) - - t.Run("empty enum values", func(t *testing.T) { - result := extractMysqlTypeParams("ENUM('','','')") - require.Empty(t, result) - }) - - t.Run("mixed empty and non-empty enum values", func(t *testing.T) { - result := extractMysqlTypeParams("ENUM('', 'valid', '')") - require.Equal(t, []string{"valid"}, result) - }) - }) +func TestShouldHaltOnSchemaAddition(t *testing.T) { + newCols, ok := shouldHaltOnSchemaAddition( + map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow{ + "public.users": { + "id": &sqlmanager_shared.DatabaseSchemaRow{}, + "created_by": &sqlmanager_shared.DatabaseSchemaRow{}, + }, + }, + []*mgmtv1alpha1.JobMapping{ + {Schema: "public", Table: "users", Column: "id"}, + {Schema: "public", Table: "users", Column: "created_by"}, + }, + ) + require.False(t, ok, "job mappings are valid set of database schemas") + require.Empty(t, newCols) + + newCols, ok = shouldHaltOnSchemaAddition( + map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow{ + "public.users": { + "id": &sqlmanager_shared.DatabaseSchemaRow{}, + "created_by": &sqlmanager_shared.DatabaseSchemaRow{}, + }, + "neosync_api.accounts": { + "id": &sqlmanager_shared.DatabaseSchemaRow{}, + "name": &sqlmanager_shared.DatabaseSchemaRow{}, + }, + }, + []*mgmtv1alpha1.JobMapping{ + {Schema: "public", Table: "users", Column: "id"}, + {Schema: "public", Table: "users", Column: "created_by"}, + }, + ) + require.False(t, ok, "valid subset of job mappings") + + newCols, ok = shouldHaltOnSchemaAddition( + map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow{ + "public.users": { + "id": &sqlmanager_shared.DatabaseSchemaRow{}, + "created_by": &sqlmanager_shared.DatabaseSchemaRow{}, + }, + }, + []*mgmtv1alpha1.JobMapping{ + {Schema: "public", Table: "users", Column: "id"}, + }, + ) + require.True(t, ok, "job mappings are missing table column") + require.Equal(t, []string{"public.users.created_by"}, newCols) + + newCols, ok = shouldHaltOnSchemaAddition( + map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow{ + "public.users": { + "id": &sqlmanager_shared.DatabaseSchemaRow{}, + "created_by": &sqlmanager_shared.DatabaseSchemaRow{}, + }, + }, + []*mgmtv1alpha1.JobMapping{ + {Schema: "public", Table: "users", Column: "id"}, + {Schema: "public", Table: "users", Column: "updated_by"}, + }, + ) + require.True(t, ok, "job mappings have same column count, but missing specific column") + require.Equal(t, []string{"public.users.created_by"}, newCols) } diff --git a/internal/benthos/benthos-builder/builders/mongodb.go b/internal/benthos/benthos-builder/builders/mongodb.go index bd459d8a21..16fc8ef346 100644 --- a/internal/benthos/benthos-builder/builders/mongodb.go +++ b/internal/benthos/benthos-builder/builders/mongodb.go @@ -7,6 +7,7 @@ import ( "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1/mgmtv1alpha1connect" "github.com/nucleuscloud/neosync/backend/pkg/metrics" sqlmanager_shared "github.com/nucleuscloud/neosync/backend/pkg/sqlmanager/shared" + jobmapping_builder_shared "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/builders/jobmapping-builder/shared" bb_internal "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/internal" bb_shared "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/shared" "github.com/nucleuscloud/neosync/internal/runconfigs" @@ -31,7 +32,7 @@ func (b *mongodbSyncBuilder) BuildSourceConfigs( ) ([]*bb_internal.BenthosSourceConfig, error) { sourceConnection := params.SourceConnection job := params.Job - groupedMappings := groupMappingsByTable(job.GetMappings()) + groupedMappings := groupMappingsByTable(jobmapping_builder_shared.JobMappingsFromLegacyMappings(job.GetMappings())) benthosConfigs := []*bb_internal.BenthosSourceConfig{} for _, tableMapping := range groupedMappings { diff --git a/internal/benthos/benthos-builder/builders/processors.go b/internal/benthos/benthos-builder/builders/processors.go index 380e0496bd..d50f1ff403 100644 --- a/internal/benthos/benthos-builder/builders/processors.go +++ b/internal/benthos/benthos-builder/builders/processors.go @@ -31,7 +31,7 @@ func buildProcessorConfigsByRunType( columnForeignKeysMap map[string][]*bb_internal.ReferenceKey, transformedFktoPkMap map[string][]*bb_internal.ReferenceKey, jobId, runId string, - mappings []*mgmtv1alpha1.JobMapping, + mappings []*shared.JobTransformationMapping, columnInfoMap map[string]*sqlmanager_shared.DatabaseSchemaRow, jobSourceOptions *mgmtv1alpha1.JobSourceOptions, mappedKeys []string, @@ -136,7 +136,7 @@ func buildSqlUpdateProcessorConfigs( func buildProcessorConfigs( ctx context.Context, transformerclient mgmtv1alpha1connect.TransformersServiceClient, - cols []*mgmtv1alpha1.JobMapping, + cols []*shared.JobTransformationMapping, tableColumnInfo map[string]*sqlmanager_shared.DatabaseSchemaRow, transformedFktoPkMap map[string][]*bb_internal.ReferenceKey, fkSourceCols []string, @@ -146,13 +146,13 @@ func buildProcessorConfigs( mappedKeys []string, ) ([]*neosync_benthos.ProcessorConfig, error) { // filter columns by config insert cols - filteredCols := []*mgmtv1alpha1.JobMapping{} + filteredColumnMappings := []*shared.JobTransformationMapping{} for _, col := range cols { if slices.Contains(runconfig.InsertColumns(), col.Column) { - filteredCols = append(filteredCols, col) + filteredColumnMappings = append(filteredColumnMappings, col) } } - jsCode, err := extractJsFunctionsAndOutputs(ctx, transformerclient, filteredCols) + jsCode, err := extractJsFunctionsAndOutputs(ctx, transformerclient, filteredColumnMappings) if err != nil { return nil, err } @@ -160,7 +160,7 @@ func buildProcessorConfigs( mutations, err := buildMutationConfigs( ctx, transformerclient, - filteredCols, + filteredColumnMappings, tableColumnInfo, runconfig.SplitColumnPaths(), ) @@ -169,13 +169,13 @@ func buildProcessorConfigs( } cacheBranches := buildBranchCacheConfigs( - filteredCols, + filteredColumnMappings, transformedFktoPkMap, jobId, runId, ) - pkMapping := buildPrimaryKeyMappingConfigs(filteredCols, fkSourceCols) + pkMapping := buildPrimaryKeyMappingConfigs(filteredColumnMappings, fkSourceCols) defaultTransformerConfig, err := buildDefaultTransformerConfigs(jobSourceOptions, mappedKeys) if err != nil { @@ -254,7 +254,7 @@ func buildDefaultTransformerConfigs( func extractJsFunctionsAndOutputs( ctx context.Context, transformerclient mgmtv1alpha1connect.TransformersServiceClient, - cols []*mgmtv1alpha1.JobMapping, + cols []*shared.JobTransformationMapping, ) (string, error) { var benthosOutputs []string var jsFunctions []string @@ -311,7 +311,7 @@ func isJavascriptTransformer(jmt *mgmtv1alpha1.JobMappingTransformer) bool { func buildIdentityCursors( ctx context.Context, transformerclient mgmtv1alpha1connect.TransformersServiceClient, - cols []*mgmtv1alpha1.JobMapping, + cols []*shared.JobTransformationMapping, ) (map[string]*tablesync_shared.IdentityCursor, error) { cursors := map[string]*tablesync_shared.IdentityCursor{} @@ -341,7 +341,7 @@ func buildIdentityCursors( func buildMutationConfigs( ctx context.Context, transformerclient mgmtv1alpha1connect.TransformersServiceClient, - cols []*mgmtv1alpha1.JobMapping, + cols []*shared.JobTransformationMapping, tableColumnInfo map[string]*sqlmanager_shared.DatabaseSchemaRow, splitColumnPaths bool, ) (string, error) { @@ -399,7 +399,7 @@ func getBenthosColumnKey(column string, shouldSplitPath bool) string { return fmt.Sprintf("%q", column) } -func buildPrimaryKeyMappingConfigs(cols []*mgmtv1alpha1.JobMapping, primaryKeys []string) string { +func buildPrimaryKeyMappingConfigs(cols []*shared.JobTransformationMapping, primaryKeys []string) string { mappings := []string{} for _, col := range cols { if shouldProcessColumn(col.Transformer) && slices.Contains(primaryKeys, col.Column) { @@ -428,7 +428,7 @@ func generateSha1Hash(input string) string { } func buildBranchCacheConfigs( - cols []*mgmtv1alpha1.JobMapping, + cols []*shared.JobTransformationMapping, transformedFktoPkMap map[string][]*bb_internal.ReferenceKey, jobId, runId string, ) []*neosync_benthos.BranchConfig { @@ -526,7 +526,7 @@ func convertUserDefinedFunctionConfig( } func computeMutationFunction( - col *mgmtv1alpha1.JobMapping, + col *shared.JobTransformationMapping, colInfo *sqlmanager_shared.DatabaseSchemaRow, splitColumnPath bool, ) (string, error) { @@ -837,7 +837,7 @@ func computeMutationFunction( } } -func buildScrambleIdentityToken(col *mgmtv1alpha1.JobMapping) string { +func buildScrambleIdentityToken(col *shared.JobTransformationMapping) string { return neosync_benthos.ToSha256( fmt.Sprintf("%s.%s.%s", col.GetSchema(), col.GetTable(), col.GetColumn()), ) diff --git a/internal/benthos/benthos-builder/builders/processors_test.go b/internal/benthos/benthos-builder/builders/processors_test.go index e60819efc1..986bbc1c70 100644 --- a/internal/benthos/benthos-builder/builders/processors_test.go +++ b/internal/benthos/benthos-builder/builders/processors_test.go @@ -14,6 +14,7 @@ import ( bb_internal "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/internal" "github.com/nucleuscloud/neosync/internal/runconfigs" neosync_benthos "github.com/nucleuscloud/neosync/worker/pkg/benthos" + "github.com/nucleuscloud/neosync/worker/pkg/workflows/datasync/activities/shared" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" ) @@ -35,11 +36,16 @@ func Test_buildProcessorConfigsJavascript(t *testing.T) { res, err := buildProcessorConfigs( ctx, mockTransformerClient, - []*mgmtv1alpha1.JobMapping{ + []*shared.JobTransformationMapping{ { - Schema: "public", Table: "users", Column: "address", - Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}, - }}, + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", Table: "users", Column: "address", + Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}, + }, + }, + }, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfigs.NewRunConfig("id", sqlmanager_shared.SchemaTable{}, runconfigs.RunTypeInsert, nil, nil, nil, []string{"address"}, nil, false), @@ -95,10 +101,16 @@ func Test_buildProcessorConfigsGenerateJavascript(t *testing.T) { res, err := buildProcessorConfigs( ctx, mockTransformerClient, - []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: "test", - Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}, - }}, + []*shared.JobTransformationMapping{ + { + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", Table: "users", Column: "test", + Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}, + }, + }, + }, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfigs.NewRunConfig("id", sqlmanager_shared.SchemaTable{}, runconfigs.RunTypeInsert, nil, nil, nil, []string{"test"}, nil, false), @@ -165,9 +177,24 @@ func Test_buildProcessorConfigsJavascriptMultiple(t *testing.T) { res, err := buildProcessorConfigs( ctx, mockTransformerClient, - []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: nameCol, Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}}, - {Schema: "public", Table: "users", Column: ageCol, Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT2.Config}}}, + []*shared.JobTransformationMapping{ + { + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", Table: "users", Column: nameCol, + Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}, + }, + }, + { + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", Table: "users", Column: ageCol, + Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT2.Config}, + }, + }, + }, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfigs.NewRunConfig("id", sqlmanager_shared.SchemaTable{}, runconfigs.RunTypeInsert, nil, nil, nil, []string{nameCol, ageCol}, nil, false), nil, @@ -234,9 +261,24 @@ func Test_buildProcessorConfigsTransformAndGenerateJavascript(t *testing.T) { res, err := buildProcessorConfigs( ctx, mockTransformerClient, - []*mgmtv1alpha1.JobMapping{ - {Schema: "public", Table: "users", Column: nameCol, Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}}, - {Schema: "public", Table: "users", Column: col2, Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT2.Config}}}, + []*shared.JobTransformationMapping{ + { + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", Table: "users", Column: nameCol, + Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}, + }, + }, + { + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", Table: "users", Column: col2, + Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT2.Config}, + }, + }, + }, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfigs.NewRunConfig("id", sqlmanager_shared.SchemaTable{}, runconfigs.RunTypeInsert, nil, nil, nil, []string{nameCol, col2}, nil, false), nil, @@ -291,11 +333,16 @@ func Test_buildProcessorConfigsJavascript_DeepKeys(t *testing.T) { res, err := buildProcessorConfigs( ctx, mockTransformerClient, - []*mgmtv1alpha1.JobMapping{ + []*shared.JobTransformationMapping{ { - Schema: "public", Table: "users", Column: "foo.bar.baz", - Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}, - }}, + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", Table: "users", Column: "foo.bar.baz", + Transformer: &mgmtv1alpha1.JobMappingTransformer{Config: jsT.Config}, + }, + }, + }, map[string]*sqlmanager_shared.DatabaseSchemaRow{}, map[string][]*bb_internal.ReferenceKey{}, []string{}, mockJobId, mockRunId, runconfigs.NewRunConfig("id", sqlmanager_shared.SchemaTable{}, runconfigs.RunTypeInsert, nil, nil, nil, []string{"foo.bar.baz"}, nil, false), @@ -400,7 +447,7 @@ func Test_buildIdentityCursors(t *testing.T) { t.Run("empty columns list returns empty map", func(t *testing.T) { mockTransformerClient := mgmtv1alpha1connect.NewMockTransformersServiceClient(t) - cursors, err := buildIdentityCursors(context.Background(), mockTransformerClient, []*mgmtv1alpha1.JobMapping{}) + cursors, err := buildIdentityCursors(context.Background(), mockTransformerClient, []*shared.JobTransformationMapping{}) require.NoError(t, err) require.Empty(t, cursors) @@ -409,27 +456,35 @@ func Test_buildIdentityCursors(t *testing.T) { t.Run("columns with scramble identity transformer", func(t *testing.T) { mockTransformerClient := mgmtv1alpha1connect.NewMockTransformersServiceClient(t) - cols := []*mgmtv1alpha1.JobMapping{ + cols := []*shared.JobTransformationMapping{ { - Schema: "public", - Table: "users", - Column: "id", - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_TransformScrambleIdentityConfig{ - TransformScrambleIdentityConfig: &mgmtv1alpha1.TransformScrambleIdentity{}, + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "id", + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_TransformScrambleIdentityConfig{ + TransformScrambleIdentityConfig: &mgmtv1alpha1.TransformScrambleIdentity{}, + }, }, }, }, }, { - Schema: "public", - Table: "orders", - Column: "user_id", - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_TransformScrambleIdentityConfig{ - TransformScrambleIdentityConfig: &mgmtv1alpha1.TransformScrambleIdentity{}, + DestinationSchema: "public", + DestinationTable: "orders", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "orders", + Column: "user_id", + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_TransformScrambleIdentityConfig{ + TransformScrambleIdentityConfig: &mgmtv1alpha1.TransformScrambleIdentity{}, + }, }, }, }, @@ -473,16 +528,20 @@ func Test_buildIdentityCursors(t *testing.T) { nil, ) - cols := []*mgmtv1alpha1.JobMapping{ + cols := []*shared.JobTransformationMapping{ { - Schema: "public", - Table: "users", - Column: "id", - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_UserDefinedTransformerConfig{ - UserDefinedTransformerConfig: &mgmtv1alpha1.UserDefinedTransformerConfig{ - Id: userDefinedId, + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "id", + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_UserDefinedTransformerConfig{ + UserDefinedTransformerConfig: &mgmtv1alpha1.UserDefinedTransformerConfig{ + Id: userDefinedId, + }, }, }, }, @@ -502,15 +561,19 @@ func Test_buildIdentityCursors(t *testing.T) { t.Run("columns with other transformers are ignored", func(t *testing.T) { mockTransformerClient := mgmtv1alpha1connect.NewMockTransformersServiceClient(t) - cols := []*mgmtv1alpha1.JobMapping{ + cols := []*shared.JobTransformationMapping{ { - Schema: "public", - Table: "users", - Column: "email", - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateEmailConfig{ - GenerateEmailConfig: &mgmtv1alpha1.GenerateEmail{}, + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "email", + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_GenerateEmailConfig{ + GenerateEmailConfig: &mgmtv1alpha1.GenerateEmail{}, + }, }, }, }, @@ -539,16 +602,20 @@ func Test_buildIdentityCursors(t *testing.T) { connect.NewError(connect.CodeNotFound, errors.New("transformer not found")), ) - cols := []*mgmtv1alpha1.JobMapping{ + cols := []*shared.JobTransformationMapping{ { - Schema: "public", - Table: "users", - Column: "id", - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_UserDefinedTransformerConfig{ - UserDefinedTransformerConfig: &mgmtv1alpha1.UserDefinedTransformerConfig{ - Id: userDefinedId, + DestinationSchema: "public", + DestinationTable: "users", + JobMapping: &mgmtv1alpha1.JobMapping{ + Schema: "public", + Table: "users", + Column: "id", + Transformer: &mgmtv1alpha1.JobMappingTransformer{ + Config: &mgmtv1alpha1.TransformerConfig{ + Config: &mgmtv1alpha1.TransformerConfig_UserDefinedTransformerConfig{ + UserDefinedTransformerConfig: &mgmtv1alpha1.UserDefinedTransformerConfig{ + Id: userDefinedId, + }, }, }, }, diff --git a/internal/benthos/benthos-builder/builders/sql-util.go b/internal/benthos/benthos-builder/builders/sql-util.go index 532fba83be..8c200e4b48 100644 --- a/internal/benthos/benthos-builder/builders/sql-util.go +++ b/internal/benthos/benthos-builder/builders/sql-util.go @@ -2,12 +2,8 @@ package benthosbuilder_builders import ( "context" - "errors" "fmt" "log/slog" - "math" - "strconv" - "strings" "sync" "time" @@ -21,12 +17,6 @@ import ( "golang.org/x/sync/errgroup" ) -const ( - jobmappingSubsetErrMsg = "unable to continue: job mappings contain schemas, tables, or columns that were not found in the source connection" - haltOnSchemaAdditionErrMsg = "unable to continue: HaltOnNewColumnAddition: job mappings are missing columns for the mapped tables found in the source connection" - haltOnColumnRemovalErrMsg = "unable to continue: HaltOnColumnRemoval: source database is missing columns for the mapped tables found in the job mappings" -) - type sqlSourceTableOptions struct { WhereClause *string } @@ -34,83 +24,7 @@ type sqlSourceTableOptions struct { type tableMapping struct { Schema string Table string - Mappings []*mgmtv1alpha1.JobMapping -} - -func removeMappingsNotFoundInSource( - mappings []*mgmtv1alpha1.JobMapping, - groupedSchemas map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, -) []*mgmtv1alpha1.JobMapping { - newMappings := make([]*mgmtv1alpha1.JobMapping, 0, len(mappings)) - for _, mapping := range mappings { - key := sqlmanager_shared.BuildTable(mapping.Schema, mapping.Table) - if _, ok := groupedSchemas[key]; ok { - if _, ok := groupedSchemas[key][mapping.Column]; ok { - newMappings = append(newMappings, mapping) - } - } - } - return newMappings -} - -// checks that the source database has all the columns that are mapped in the job mappings -func isSourceMissingColumnsFoundInMappings( - groupedSchemas map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, - mappings []*mgmtv1alpha1.JobMapping, -) ([]string, bool) { - missingColumns := []string{} - tableColMappings := getUniqueColMappingsMap(mappings) - - for schemaTable, cols := range tableColMappings { - tableCols := groupedSchemas[schemaTable] - for col := range cols { - if _, ok := tableCols[col]; !ok { - missingColumns = append(missingColumns, fmt.Sprintf("%s.%s", schemaTable, col)) - } - } - } - return missingColumns, len(missingColumns) != 0 -} - -// Builds a map of ->column -func getUniqueColMappingsMap( - mappings []*mgmtv1alpha1.JobMapping, -) map[string]map[string]struct{} { - tableColMappings := map[string]map[string]struct{}{} - for _, mapping := range mappings { - key := neosync_benthos.BuildBenthosTable(mapping.Schema, mapping.Table) - if _, ok := tableColMappings[key]; ok { - tableColMappings[key][mapping.Column] = struct{}{} - } else { - tableColMappings[key] = map[string]struct{}{ - mapping.Column: {}, - } - } - } - return tableColMappings -} - -// Based on the source schema, we check each mapped table for newly added columns that are not present in the mappings, -// but are present in the source. If so, halt because this means PII may be leaked. -func shouldHaltOnSchemaAddition( - groupedSchemas map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, - mappings []*mgmtv1alpha1.JobMapping, -) ([]string, bool) { - tableColMappings := getUniqueColMappingsMap(mappings) - newColumns := []string{} - for table, cols := range groupedSchemas { - mappingCols, exists := tableColMappings[table] - if !exists { - // table not mapped in job mappings, skip - continue - } - for col := range cols { - if _, exists := mappingCols[col]; !exists { - newColumns = append(newColumns, fmt.Sprintf("%s.%s", table, col)) - } - } - } - return newColumns, len(newColumns) != 0 + Mappings []*shared.JobTransformationMapping } func getMapValuesCount[K comparable, V any](m map[K][]V) int { @@ -121,7 +35,7 @@ func getMapValuesCount[K comparable, V any](m map[K][]V) int { return count } -func buildPlainColumns(mappings []*mgmtv1alpha1.JobMapping) []string { +func buildPlainColumns(mappings []*shared.JobTransformationMapping) []string { columns := make([]string, len(mappings)) for idx := range mappings { columns[idx] = mappings[idx].Column @@ -201,9 +115,9 @@ func mergeVirtualForeignKeys( } func groupMappingsByTable( - mappings []*mgmtv1alpha1.JobMapping, + mappings []*shared.JobTransformationMapping, ) []*tableMapping { - groupedMappings := map[string][]*mgmtv1alpha1.JobMapping{} + groupedMappings := map[string][]*shared.JobTransformationMapping{} for _, mapping := range mappings { key := neosync_benthos.BuildBenthosTable(mapping.Schema, mapping.Table) @@ -597,940 +511,6 @@ func getParsedBatchingConfig(destOpt batchDestinationOption) (batchingConfig, er return output, nil } -// Based on the source schema and the provided mappings, we find the missing columns (if any) and generate passthrough job mappings for them automatically -func getAdditionalPassthroughJobMappings( - groupedSchemas map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, - mappings []*mgmtv1alpha1.JobMapping, - getTableFromKey func(key string) (schema, table string, err error), - logger *slog.Logger, -) ([]*mgmtv1alpha1.JobMapping, error) { - output := []*mgmtv1alpha1.JobMapping{} - - tableColMappings := getUniqueColMappingsMap(mappings) - - for schematable, cols := range groupedSchemas { - mappedCols, ok := tableColMappings[schematable] - if !ok { - // todo: we may want to generate mappings for this entire table? However this may be dead code as we get the grouped schemas based on the mappings - logger.Warn( - "table found in schema data that is not present in job mappings", - "table", - schematable, - ) - continue - } - if len(cols) == len(mappedCols) { - continue - } - for col, info := range cols { - if _, ok := mappedCols[col]; !ok { - schema, table, err := getTableFromKey(schematable) - if err != nil { - return nil, err - } - // we found a column that is not present in the mappings, let's create a mapping for it - if info.GeneratedType != nil { - output = append(output, &mgmtv1alpha1.JobMapping{ - Schema: schema, - Table: table, - Column: col, - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateDefaultConfig{ - GenerateDefaultConfig: &mgmtv1alpha1.GenerateDefault{}, - }, - }, - }, - }) - } else { - output = append(output, &mgmtv1alpha1.JobMapping{ - Schema: schema, - Table: table, - Column: col, - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_PassthroughConfig{ - PassthroughConfig: &mgmtv1alpha1.Passthrough{}, - }, - }, - }, - }) - } - } - } - } - - return output, nil -} - -// Based on the source schema and the provided mappings, we find the missing columns (if any) and generate job mappings for them automatically -func getAdditionalJobMappings( - driver string, - groupedSchemas map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, - mappings []*mgmtv1alpha1.JobMapping, - getTableFromKey func(key string) (schema, table string, err error), - logger *slog.Logger, -) ([]*mgmtv1alpha1.JobMapping, error) { - output := []*mgmtv1alpha1.JobMapping{} - - tableColMappings := getUniqueColMappingsMap(mappings) - - for schematable, cols := range groupedSchemas { - mappedCols, ok := tableColMappings[schematable] - if !ok { - // todo: we may want to generate mappings for this entire table? However this may be dead code as we get the grouped schemas based on the mappings - logger.Warn( - "table found in schema data that is not present in job mappings", - "table", - schematable, - ) - continue - } - if len(cols) == len(mappedCols) { - continue - } - for col, info := range cols { - if _, ok := mappedCols[col]; !ok { - schema, table, err := getTableFromKey(schematable) - if err != nil { - return nil, err - } - // we found a column that is not present in the mappings, let's create a mapping for it - if info.ColumnDefault != "" || info.IdentityGeneration != nil || - info.GeneratedType != nil { - output = append(output, &mgmtv1alpha1.JobMapping{ - Schema: schema, - Table: table, - Column: col, - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateDefaultConfig{ - GenerateDefaultConfig: &mgmtv1alpha1.GenerateDefault{}, - }, - }, - }, - }) - } else if info.IsNullable { - output = append(output, &mgmtv1alpha1.JobMapping{ - Schema: schema, - Table: table, - Column: col, - Transformer: &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_Nullconfig{ - Nullconfig: &mgmtv1alpha1.Null{}, - }, - }, - }, - }) - } else { - switch driver { - case sqlmanager_shared.PostgresDriver: - transformer, err := getJmTransformerByPostgresDataType(info) - if err != nil { - return nil, err - } - output = append(output, &mgmtv1alpha1.JobMapping{ - Schema: schema, - Table: table, - Column: col, - Transformer: transformer, - }) - case sqlmanager_shared.MysqlDriver: - transformer, err := getJmTransformerByMysqlDataType(info) - if err != nil { - return nil, err - } - output = append(output, &mgmtv1alpha1.JobMapping{ - Schema: schema, - Table: table, - Column: col, - Transformer: transformer, - }) - default: - logger.Warn("this driver is not currently supported for additional job mapping by data type") - return nil, fmt.Errorf("this driver %q does not currently support additional job mappings by data type. Please provide discrete job mappings for %q.%q.%q to continue: %w", - driver, info.TableSchema, info.TableName, info.ColumnName, errors.ErrUnsupported, - ) - } - } - } - } - } - - return output, nil -} - -func getJmTransformerByPostgresDataType( - colInfo *sqlmanager_shared.DatabaseSchemaRow, -) (*mgmtv1alpha1.JobMappingTransformer, error) { - cleanedDataType := cleanPostgresType(colInfo.DataType) - switch cleanedDataType { - case "smallint": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ - GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ - Min: shared.Ptr(int64(-32768)), - Max: shared.Ptr(int64(32767)), - }, - }, - }, - }, nil - case "integer": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ - GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ - Min: shared.Ptr(int64(-2147483648)), - Max: shared.Ptr(int64(2147483647)), - }, - }, - }, - }, nil - case "bigint": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ - GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ - Min: shared.Ptr(int64(-9223372036854775808)), - Max: shared.Ptr(int64(9223372036854775807)), - }, - }, - }, - }, nil - case "decimal", "numeric": - var precision *int64 - if colInfo.NumericPrecision > 0 { - np := int64(colInfo.NumericPrecision) - precision = &np - } - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateFloat64Config{ - GenerateFloat64Config: &mgmtv1alpha1.GenerateFloat64{ - Precision: precision, // todo: we need to expose scale... - }, - }, - }, - }, nil - case "real", "double precision": - var precision *int64 - if colInfo.NumericPrecision > 0 { - np := int64(colInfo.NumericPrecision) - precision = &np - } - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateFloat64Config{ - GenerateFloat64Config: &mgmtv1alpha1.GenerateFloat64{ - Precision: precision, - }, - }, - }, - }, nil - - case "smallserial", "serial", "bigserial": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateDefaultConfig{ - GenerateDefaultConfig: &mgmtv1alpha1.GenerateDefault{}, - }, - }, - }, nil - case "money": - var precision *int64 - if colInfo.NumericPrecision > 0 { - np := int64(colInfo.NumericPrecision) - precision = &np - } - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateFloat64Config{ - GenerateFloat64Config: &mgmtv1alpha1.GenerateFloat64{ - // todo: to adequately support money, we need to know the scale which is set via the lc_monetary setting (but may be properly populated via our query..) - Precision: precision, - Min: shared.Ptr(float64(-92233720368547758.08)), - Max: shared.Ptr(float64(92233720368547758.07)), - }, - }, - }, - }, nil - case "text", - "bpchar", - "character", - "character varying": // todo: test to see if this works when (n) has been specified - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ - GenerateStringConfig: &mgmtv1alpha1.GenerateString{}, // todo? - }, - }, - }, nil - // case "bytea": // todo https://www.postgresql.org/docs/current/datatype-binary.html - case "date": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - Code: ` - const date = new Date(); - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - return year + "-" + month + "-" + day; - `, - }, - }, - }, - }, nil - case "time without time zone": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - Code: ` - const date = new Date(); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - return hours + ":" + minutes + ":" + seconds; - `, - }, - }, - }, - }, nil - case "time with time zone": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - Code: ` - const date = new Date(); - const hours = String(date.getUTCHours()).padStart(2, '0'); - const minutes = String(date.getUTCMinutes()).padStart(2, '0'); - const seconds = String(date.getUTCSeconds()).padStart(2, '0'); - const timezoneOffset = -date.getTimezoneOffset(); - const absOffset = Math.abs(timezoneOffset); - const offsetHours = String(Math.floor(absOffset / 60)).padStart(2, '0'); - const offsetMinutes = String(absOffset % 60).padStart(2, '0'); - const offsetSign = timezoneOffset >= 0 ? '+' : '-'; - return hours + ":" + minutes + ":" + seconds + offsetSign + offsetHours + ":" + offsetMinutes; - `, - }, - }, - }, - }, nil - case "interval": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - Code: ` - const date = new Date(); - const hours = String(date.getUTCHours()).padStart(2, '0'); - const minutes = String(date.getUTCMinutes()).padStart(2, '0'); - const seconds = String(date.getUTCSeconds()).padStart(2, '0'); - return hours + ":" + minutes + ":" + seconds; - `, - }, - }, - }, - }, nil - case "timestamp without time zone": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - Code: ` - const date = new Date(); - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds; - `, - }, - }, - }, - }, nil - case "timestamp with time zone": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - Code: ` - const date = new Date(); - const year = date.getUTCFullYear(); - const month = String(date.getUTCMonth() + 1).padStart(2, '0'); - const day = String(date.getUTCDate()).padStart(2, '0'); - const hours = String(date.getUTCHours()).padStart(2, '0'); - const minutes = String(date.getUTCMinutes()).padStart(2, '0'); - const seconds = String(date.getUTCSeconds()).padStart(2, '0'); - const timezoneOffset = -date.getTimezoneOffset(); - const absOffset = Math.abs(timezoneOffset); - const offsetHours = String(Math.floor(absOffset / 60)).padStart(2, '0'); - const offsetMinutes = String(absOffset % 60).padStart(2, '0'); - const offsetSign = timezoneOffset >= 0 ? '+' : '-'; - return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds + offsetSign + offsetHours + ":" + offsetMinutes; - `, - }, - }, - }, - }, nil - case "boolean": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateBoolConfig{ - GenerateBoolConfig: &mgmtv1alpha1.GenerateBool{}, - }, - }, - }, nil - case "uuid": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateUuidConfig{ - GenerateUuidConfig: &mgmtv1alpha1.GenerateUuid{ - IncludeHyphens: shared.Ptr(true), - }, - }, - }, - }, nil - default: - return nil, fmt.Errorf( - "uncountered unsupported data type %q for %q.%q.%q when attempting to generate an auto-mapper. To continue, provide a discrete job mapping for this column.: %w", - colInfo.DataType, - colInfo.TableSchema, - colInfo.TableName, - colInfo.ColumnName, - errors.ErrUnsupported, - ) - } -} - -func getJmTransformerByMysqlDataType( - colInfo *sqlmanager_shared.DatabaseSchemaRow, -) (*mgmtv1alpha1.JobMappingTransformer, error) { - cleanedDataType := cleanMysqlType(colInfo.MysqlColumnType) - switch cleanedDataType { - case "char": - params := extractMysqlTypeParams(colInfo.MysqlColumnType) - minLength := int64(0) - maxLength := int64(255) - if len(params) > 0 { - fixedLength, err := strconv.ParseInt(params[0], 10, 64) - if err != nil { - return nil, fmt.Errorf( - "failed to parse length for type %q: %w", - colInfo.MysqlColumnType, - err, - ) - } - minLength = fixedLength - maxLength = fixedLength - } else if colInfo.CharacterMaximumLength > 0 { - maxLength = int64(colInfo.CharacterMaximumLength) - } - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ - GenerateStringConfig: &mgmtv1alpha1.GenerateString{ - Min: shared.Ptr(minLength), - Max: shared.Ptr(maxLength), - }, - }, - }, - }, nil - - case "varchar": - params := extractMysqlTypeParams(colInfo.MysqlColumnType) - maxLength := int64(65535) - if len(params) > 0 { - fixedLength, err := strconv.ParseInt(params[0], 10, 64) - if err != nil { - return nil, fmt.Errorf( - "failed to parse length for type %q: %w", - colInfo.MysqlColumnType, - err, - ) - } - maxLength = fixedLength - } else if colInfo.CharacterMaximumLength > 0 { - maxLength = int64(colInfo.CharacterMaximumLength) - } - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ - GenerateStringConfig: &mgmtv1alpha1.GenerateString{Max: shared.Ptr(maxLength)}, - }, - }, - }, nil - - case "tinytext": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ - GenerateStringConfig: &mgmtv1alpha1.GenerateString{Max: shared.Ptr(int64(255))}, - }, - }, - }, nil - - case "text": - params := extractMysqlTypeParams(colInfo.MysqlColumnType) - maxLength := int64(65535) - if len(params) > 0 { - length, err := strconv.ParseInt(params[0], 10, 64) - if err != nil { - return nil, fmt.Errorf( - "failed to parse length for type %q: %w", - colInfo.MysqlColumnType, - err, - ) - } - maxLength = length - } else if colInfo.CharacterMaximumLength > 0 { - maxLength = int64(colInfo.CharacterMaximumLength) - } - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ - GenerateStringConfig: &mgmtv1alpha1.GenerateString{Max: shared.Ptr(maxLength)}, - }, - }, - }, nil - - case "mediumtext": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ - GenerateStringConfig: &mgmtv1alpha1.GenerateString{ - Max: shared.Ptr(int64(16_777_215)), - }, - }, - }, - }, nil - case "longtext": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateStringConfig{ - GenerateStringConfig: &mgmtv1alpha1.GenerateString{ - Max: shared.Ptr(int64(4_294_967_295)), - }, - }, - }, - }, nil - case "enum", "set": - params := extractMysqlTypeParams(colInfo.MysqlColumnType) - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateCategoricalConfig{ - GenerateCategoricalConfig: &mgmtv1alpha1.GenerateCategorical{ - Categories: shared.Ptr(strings.Join(params, ",")), - }, - }, - }, - }, nil - - case "tinyint": - isUnsigned := strings.Contains(strings.ToLower(colInfo.MysqlColumnType), "unsigned") - var minVal, maxVal int64 - if isUnsigned { - minVal = 0 - maxVal = 255 // 2^8 - 1 - } else { - minVal = -128 // -2^7 - maxVal = 127 // 2^7 - 1 - } - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ - GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ - Min: shared.Ptr(minVal), - Max: shared.Ptr(maxVal), - }, - }, - }, - }, nil - - case "smallint": - isUnsigned := strings.Contains(strings.ToLower(colInfo.MysqlColumnType), "unsigned") - var minVal, maxVal int64 - if isUnsigned { - minVal = 0 - maxVal = 65535 // 2^16 - 1 - } else { - minVal = -32768 // -2^15 - maxVal = 32767 // 2^15 - 1 - } - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ - GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ - Min: shared.Ptr(minVal), - Max: shared.Ptr(maxVal), - }, - }, - }, - }, nil - case "mediumint": - isUnsigned := strings.Contains(strings.ToLower(colInfo.MysqlColumnType), "unsigned") - var minVal, maxVal int64 - if isUnsigned { - minVal = 0 - maxVal = 16777215 // 2^24 - 1 - } else { - minVal = -8388608 // -2^23 - maxVal = 8388607 // 2^23 - 1 - } - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ - GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ - Min: shared.Ptr(minVal), - Max: shared.Ptr(maxVal), - }, - }, - }, - }, nil - case "int", "integer": - isUnsigned := strings.Contains(strings.ToLower(colInfo.MysqlColumnType), "unsigned") - var minVal, maxVal int64 - if isUnsigned { - minVal = 0 - maxVal = 4294967295 // 2^32 - 1 - } else { - minVal = -2147483648 // -2^31 - maxVal = 2147483647 // 2^31 - 1 - } - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ - GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ - Min: shared.Ptr(minVal), - Max: shared.Ptr(maxVal), - }, - }, - }, - }, nil - case "bigint": - minVal := int64(0) // -2^63 - maxVal := int64(math.MaxInt64) // 2^63 - 1 - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateInt64Config{ - GenerateInt64Config: &mgmtv1alpha1.GenerateInt64{ - Min: shared.Ptr(minVal), - Max: shared.Ptr(maxVal), - }, - }, - }, - }, nil - case "float": - precision := int64(colInfo.NumericPrecision) - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateFloat64Config{ - GenerateFloat64Config: &mgmtv1alpha1.GenerateFloat64{ - Precision: &precision, - }, - }, - }, - }, nil - case "double", "double precision", "decimal", "dec": - precision := int64(colInfo.NumericPrecision) - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateFloat64Config{ - GenerateFloat64Config: &mgmtv1alpha1.GenerateFloat64{ - Precision: &precision, // todo: expose scale - }, - }, - }, - }, nil - - // case "bit": - // params := extractMysqlTypeParams(colInfo.MysqlColumnType) - // bitLength := int64(1) // default length is 1 - // if len(params) > 0 { - // if parsed, err := strconv.ParseInt(params[0], 10, 64); err == nil && parsed > 0 && parsed <= 64 { - // bitLength = parsed - // } - // } - // return &mgmtv1alpha1.JobMappingTransformer{ - // Config: &mgmtv1alpha1.TransformerConfig{ - // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - // Code: fmt.Sprintf(` - // // Generate random bits up to specified length - // const length = %d; - // let value = 0; - // for (let i = 0; i < length; i++) { - // if (Math.random() < 0.5) { - // value |= (1 << i); - // } - // } - // // Convert to binary string padded to the correct length - // return value.toString(2).padStart(length, '0'); - // `, bitLength), - // }, - // }, - // }, - // }, nil - // case "binary", "varbinary": - // params := extractMysqlTypeParams(colInfo.DataType) - // maxLength := int64(255) // default max length - // if len(params) > 0 { - // if parsed, err := strconv.ParseInt(params[0], 10, 64); err == nil && parsed > 0 && parsed <= 255 { - // maxLength = parsed - // } - // } - // return &mgmtv1alpha1.JobMappingTransformer{ - // Config: &mgmtv1alpha1.TransformerConfig{ - // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - // Code: fmt.Sprintf(` - // // Generate random binary data up to maxLength bytes - // const maxLength = %d; - // const length = Math.floor(Math.random() * maxLength) + 1; - // const bytes = new Uint8Array(length); - // for (let i = 0; i < length; i++) { - // bytes[i] = Math.floor(Math.random() * 256); - // } - // // Convert to base64 for safe transport - // return Buffer.from(bytes).toString('base64'); - // `, maxLength), - // }, - // }, - // }, - // }, nil - // case "tinyblob": - // return &mgmtv1alpha1.JobMappingTransformer{ - // Config: &mgmtv1alpha1.TransformerConfig{ - // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - // Code: ` - // // Generate random TINYBLOB (max 255 bytes) - // const maxLength = 255; - // const length = Math.floor(Math.random() * maxLength) + 1; - // const bytes = new Uint8Array(length); - // for (let i = 0; i < length; i++) { - // bytes[i] = Math.floor(Math.random() * 256); - // } - // return Buffer.from(bytes).toString('base64'); - // `, - // }, - // }, - // }, - // }, nil - // case "blob": - // return &mgmtv1alpha1.JobMappingTransformer{ - // Config: &mgmtv1alpha1.TransformerConfig{ - // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - // Code: ` - // // Generate random BLOB (max 65,535 bytes) - // // Using a smaller max for practical purposes - // const maxLength = 1024; // Using 1KB for reasonable performance - // const length = Math.floor(Math.random() * maxLength) + 1; - // const bytes = new Uint8Array(length); - // for (let i = 0; i < length; i++) { - // bytes[i] = Math.floor(Math.random() * 256); - // } - // return Buffer.from(bytes).toString('base64'); - // `, - // }, - // }, - // }, - // }, nil - // case "mediumblob": - // return &mgmtv1alpha1.JobMappingTransformer{ - // Config: &mgmtv1alpha1.TransformerConfig{ - // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - // Code: ` - // // Generate random MEDIUMBLOB (max 16,777,215 bytes) - // // Using a smaller max for practical purposes - // const maxLength = 2048; // Using 2KB for reasonable performance - // const length = Math.floor(Math.random() * maxLength) + 1; - // const bytes = new Uint8Array(length); - // for (let i = 0; i < length; i++) { - // bytes[i] = Math.floor(Math.random() * 256); - // } - // return Buffer.from(bytes).toString('base64'); - // `, - // }, - // }, - // }, - // }, nil - // case "longblob": - // return &mgmtv1alpha1.JobMappingTransformer{ - // Config: &mgmtv1alpha1.TransformerConfig{ - // Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - // GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - // Code: ` - // // Generate random LONGBLOB (max 4,294,967,295 bytes) - // // Using a smaller max for practical purposes - // const maxLength = 4096; // Using 4KB for reasonable performance - // const length = Math.floor(Math.random() * maxLength) + 1; - // const bytes = new Uint8Array(length); - // for (let i = 0; i < length; i++) { - // bytes[i] = Math.floor(Math.random() * 256); - // } - // return Buffer.from(bytes).toString('base64'); - // `, - // }, - // }, - // }, - // }, nil - - case "date": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - Code: ` - const date = new Date(); - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - return year + "-" + month + "-" + day; - `, - }, - }, - }, - }, nil - case "datetime", "timestamp": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - Code: ` - const date = new Date(); - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds; - `, - }, - }, - }, - }, nil - case "time": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - Code: ` - const date = new Date(); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - return hours + ":" + minutes + ":" + seconds; - `, - }, - }, - }, - }, nil - case "year": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateJavascriptConfig{ - GenerateJavascriptConfig: &mgmtv1alpha1.GenerateJavascript{ - Code: ` - const date = new Date(); - return date.getFullYear(); - `, - }, - }, - }, - }, nil - case "boolean", "bool": - return &mgmtv1alpha1.JobMappingTransformer{ - Config: &mgmtv1alpha1.TransformerConfig{ - Config: &mgmtv1alpha1.TransformerConfig_GenerateBoolConfig{ - GenerateBoolConfig: &mgmtv1alpha1.GenerateBool{}, - }, - }, - }, nil - default: - return nil, fmt.Errorf( - "uncountered unsupported data type %q for %q.%q.%q when attempting to generate an auto-mapper. To continue, provide a discrete job mapping for this column.: %w", - colInfo.DataType, - colInfo.TableSchema, - colInfo.TableName, - colInfo.ColumnName, - errors.ErrUnsupported, - ) - } -} - -func cleanPostgresType(dataType string) string { - parenIndex := strings.Index(dataType, "(") - if parenIndex == -1 { - return dataType - } - return strings.TrimSpace(dataType[:parenIndex]) -} - -func cleanMysqlType(dataType string) string { - parenIndex := strings.Index(dataType, "(") - if parenIndex == -1 { - return dataType - } - return strings.TrimSpace(dataType[:parenIndex]) -} - -// extractMysqlTypeParams extracts the parameters from MySQL data type definitions -// Examples: -// - CHAR(10) -> ["10"] -// - FLOAT(10, 2) -> ["10", "2"] -// - ENUM('val1', 'val2') -> ["val1", "val2"] -func extractMysqlTypeParams(dataType string) []string { - parenIndex := strings.Index(dataType, "(") - if parenIndex == -1 { - return nil - } - - closingIndex := strings.LastIndex(dataType, ")") - if closingIndex == -1 { - return nil - } - - // Extract content between parentheses - paramsStr := dataType[parenIndex+1 : closingIndex] - - // Handle ENUM/SET cases which use quotes - if strings.Contains(paramsStr, "'") { - // Split by comma and handle quoted values - params := strings.Split(paramsStr, ",") - result := make([]string, 0, len(params)) - for _, p := range params { - // Remove quotes and whitespace - p = strings.Trim(strings.TrimSpace(p), "'") - if p != "" { - result = append(result, p) - } - } - return result - } - - // Handle regular numeric parameters - params := strings.Split(paramsStr, ",") - result := make([]string, 0, len(params)) - for _, p := range params { - p = strings.TrimSpace(p) - if p != "" { - result = append(result, p) - } - } - return result -} - func shouldOverrideColumnDefault( columnDefaults map[string]*neosync_benthos.ColumnDefaultProperties, ) bool { diff --git a/internal/benthos/benthos-builder/builders/sql.go b/internal/benthos/benthos-builder/builders/sql.go index 6f8e5630d5..c1f55a4cd4 100644 --- a/internal/benthos/benthos-builder/builders/sql.go +++ b/internal/benthos/benthos-builder/builders/sql.go @@ -2,10 +2,8 @@ package benthosbuilder_builders import ( "context" - "errors" "fmt" "log/slog" - "strings" mgmtv1alpha1 "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1" "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1/mgmtv1alpha1connect" @@ -13,6 +11,9 @@ import ( "github.com/nucleuscloud/neosync/backend/pkg/sqlmanager" sqlmanager_mssql "github.com/nucleuscloud/neosync/backend/pkg/sqlmanager/mssql" sqlmanager_shared "github.com/nucleuscloud/neosync/backend/pkg/sqlmanager/shared" + cascade_settings "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/builders/jobmapping-builder/settings" + jobmapping_builder_shared "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/builders/jobmapping-builder/shared" + jobmapping_builder_sql "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/builders/jobmapping-builder/sql" bb_internal "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/internal" bb_shared "github.com/nucleuscloud/neosync/internal/benthos/benthos-builder/shared" connectionmanager "github.com/nucleuscloud/neosync/internal/connection-manager" @@ -37,7 +38,9 @@ type sqlSyncBuilder struct { // merged source and destination schema. with preference given to destination schema mergedSchemaColumnMap map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow // schema.table -> column -> column info struct configQueryMap map[string]*sqlmanager_shared.SelectQuery // config id -> query info - tableDeferrableMap map[string]bool // schema.table -> true if table has at least one deferrable constraint + + jobMappings []*shared.JobTransformationMapping + tableDeferrableMap map[string]bool // schema.table -> true if table has at least one deferrable constraint } func NewSqlSyncBuilder( @@ -56,6 +59,63 @@ func NewSqlSyncBuilder( } } +func isLegacyJob(job *mgmtv1alpha1.Job) bool { + return len(job.GetMappings()) > 0 +} + +func (b *sqlSyncBuilder) hydrateJobMappings( + job *mgmtv1alpha1.Job, + groupedColumnInfo map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, + logger *slog.Logger, +) ([]*shared.JobTransformationMapping, error) { + if isLegacyJob(job) { + jmBuilder := jobmapping_builder_sql.NewLegacySqlJobMappingBuilder(job, groupedColumnInfo, b.driver, logger) + jobMappings, err := jmBuilder.BuildJobMappings() + if err != nil { + return nil, fmt.Errorf("unable to build legacy job mappings: %w", err) + } + return jobMappings, nil + } + + syncConfig := job.GetJobType().GetSync() + if syncConfig == nil { + return nil, fmt.Errorf("unable to hydrate job mappings: sync config not found") + } + + schemaTableColumnDbInfo := getSchemaTableColumnDbInfo(groupedColumnInfo) + + jmBuilder := jobmapping_builder_sql.NewSqlJobMappingBuilder( + cascade_settings.NewCascadeSchemaSettings(syncConfig, logger), + schemaTableColumnDbInfo, + schemaTableColumnDbInfo, + ) // todo: add dest db info + jobMappings, err := jmBuilder.BuildJobMappings() + if err != nil { + return nil, fmt.Errorf("unable to build job mappings: %w", err) + } + return jobMappings, nil +} + +// outputs schema -> table -> []column info +func getSchemaTableColumnDbInfo( + groupedColumnInfo map[string]map[string]*sqlmanager_shared.DatabaseSchemaRow, +) map[string]map[string][]*sqlmanager_shared.DatabaseSchemaRow { + output := map[string]map[string][]*sqlmanager_shared.DatabaseSchemaRow{} + + for _, columnMap := range groupedColumnInfo { + for _, row := range columnMap { + tableMap, ok := output[row.TableSchema] + if !ok { + tableMap = map[string][]*sqlmanager_shared.DatabaseSchemaRow{} + } + tableMap[row.TableName] = append(tableMap[row.TableName], row) + output[row.TableSchema] = tableMap + } + } + + return output +} + func (b *sqlSyncBuilder) BuildSourceConfigs( ctx context.Context, params *bb_internal.SourceParams, @@ -89,70 +149,17 @@ func (b *sqlSyncBuilder) BuildSourceConfigs( return nil, fmt.Errorf("unable to get database schema for connection: %w", err) } - b.sqlSourceSchemaColumnInfoMap = groupedColumnInfo - if sqlSourceOpts != nil && sqlSourceOpts.HaltOnNewColumnAddition { - newColumns, shouldHalt := shouldHaltOnSchemaAddition(groupedColumnInfo, job.Mappings) - if shouldHalt { - return nil, fmt.Errorf( - "%s: [%s]", - haltOnSchemaAdditionErrMsg, - strings.Join(newColumns, ", "), - ) - } - } - - if sqlSourceOpts != nil && sqlSourceOpts.HaltOnColumnRemoval { - missing, shouldHalt := isSourceMissingColumnsFoundInMappings( - groupedColumnInfo, - job.Mappings, - ) - if shouldHalt { - return nil, fmt.Errorf( - "%s: [%s]", - haltOnSchemaAdditionErrMsg, - strings.Join(missing, ", "), - ) - } + jobMappings, err := b.hydrateJobMappings(job, groupedColumnInfo, logger) + if err != nil { + return nil, fmt.Errorf("unable to hydrate job mappings: %w", err) } - // remove mappings that are not found in the source - existingSourceMappings := removeMappingsNotFoundInSource(job.Mappings, groupedColumnInfo) - - if sqlSourceOpts != nil && sqlSourceOpts.PassthroughOnNewColumnAddition { - extraMappings, err := getAdditionalPassthroughJobMappings( - groupedColumnInfo, - existingSourceMappings, - splitKeyToTablePieces, - logger, - ) - if err != nil { - return nil, err - } - logger.Debug( - fmt.Sprintf("adding %d extra passthrough mappings due to unmapped columns", len(extraMappings)), - ) - existingSourceMappings = append(existingSourceMappings, extraMappings...) - } + b.sqlSourceSchemaColumnInfoMap = groupedColumnInfo + b.jobMappings = jobMappings // needed when building destination config - if sqlSourceOpts != nil && sqlSourceOpts.GenerateNewColumnTransformers { - extraMappings, err := getAdditionalJobMappings( - b.driver, - groupedColumnInfo, - existingSourceMappings, - splitKeyToTablePieces, - logger, - ) - if err != nil { - return nil, err - } - logger.Debug( - fmt.Sprintf("adding %d extra mappings due to unmapped columns", len(extraMappings)), - ) - existingSourceMappings = append(existingSourceMappings, extraMappings...) - } - uniqueSchemas := shared.GetUniqueSchemasFromMappings(existingSourceMappings) + uniqueSchemas := shared.GetUniqueSchemasFromMappings(jobMappings) - schemaTablesMap := shared.GetSchemaTablesMapFromMappings(existingSourceMappings) + schemaTablesMap := shared.GetSchemaTablesMapFromMappings(jobMappings) tableDeferrableMap, err := getTableDeferrableMap(ctx, db, sourceConnection, schemaTablesMap) if err != nil { return nil, fmt.Errorf("unable to get table deferrable map: %w", err) @@ -186,7 +193,7 @@ func (b *sqlSyncBuilder) BuildSourceConfigs( ), ) - groupedMappings := groupMappingsByTable(existingSourceMappings) + groupedMappings := groupMappingsByTable(jobMappings) groupedTableMapping := getTableMappingsMap(groupedMappings) colTransformerMap := getColumnTransformerMap( groupedTableMapping, @@ -245,14 +252,6 @@ func (b *sqlSyncBuilder) BuildSourceConfigs( return configs, nil } -func splitKeyToTablePieces(key string) (schema, table string, err error) { - pieces := strings.SplitN(key, ".", 2) - if len(pieces) != 2 { - return "", "", errors.New("unable to split key to get schema and table, not 2 pieces") - } - return pieces[0], pieces[1], nil -} - // TODO: remove tableDependencies and use runconfig's foreign keys func buildBenthosSqlSourceConfigResponses( slogger *slog.Logger, @@ -274,7 +273,7 @@ func buildBenthosSqlSourceConfigResponses( transformedForeignKeyToSourceMap := getTransformedFksMap(tableDependencies, colTransformerMap) for _, config := range runconfigs { - mappings, ok := groupedTableMapping[config.Table()] + tableMapping, ok := groupedTableMapping[config.Table()] if !ok { return nil, fmt.Errorf("missing column mappings for table: %s", config.Table()) } @@ -325,7 +324,7 @@ func buildBenthosSqlSourceConfigResponses( transformedFktoPkMap, jobId, runId, - mappings.Mappings, + tableMapping.Mappings, colInfoMap, nil, []string{}, @@ -337,7 +336,7 @@ func buildBenthosSqlSourceConfigResponses( bc.Pipeline.Processors = append(bc.Pipeline.Processors, *pc) } - cursors, err := buildIdentityCursors(ctx, transformerclient, mappings.Mappings) + cursors, err := buildIdentityCursors(ctx, transformerclient, tableMapping.Mappings) if err != nil { return nil, fmt.Errorf("unable to build identity cursors: %w", err) } @@ -350,16 +349,16 @@ func buildBenthosSqlSourceConfigResponses( BenthosDsns: []*bb_shared.BenthosDsn{{ConnectionId: dsnConnectionId}}, - TableSchema: mappings.Schema, - TableName: mappings.Table, + TableSchema: tableMapping.Schema, + TableName: tableMapping.Table, Columns: config.InsertColumns(), PrimaryKeys: config.PrimaryKeys(), ColumnIdentityCursors: cursors, Metriclabels: metrics.MetricLabels{ - metrics.NewEqLabel(metrics.TableSchemaLabel, mappings.Schema), - metrics.NewEqLabel(metrics.TableNameLabel, mappings.Table), + metrics.NewEqLabel(metrics.TableSchemaLabel, tableMapping.Schema), + metrics.NewEqLabel(metrics.TableNameLabel, tableMapping.Table), metrics.NewEqLabel(metrics.JobTypeLabel, "sync"), }, }) @@ -372,6 +371,15 @@ func (b *sqlSyncBuilder) BuildDestinationConfig( params *bb_internal.DestinationParams, ) (*bb_internal.BenthosDestinationConfig, error) { logger := params.Logger + // need to do this due to the CLI not actually calling BuildSource + // So we need to conditionally use the job mappings from the builder for the CLI to work properly + var jobMappings []*shared.JobTransformationMapping + if len(b.jobMappings) > 0 { + jobMappings = b.jobMappings + } else { + jobMappings = jobmapping_builder_shared.JobMappingsFromLegacyMappings(params.Job.GetMappings()) + } + benthosConfig := params.SourceConfig tableKey := neosync_benthos.BuildBenthosTable( benthosConfig.TableSchema, @@ -416,7 +424,7 @@ func (b *sqlSyncBuilder) BuildDestinationConfig( colTransformerMap := b.colTransformerMap // lazy load if len(colTransformerMap) == 0 { - groupedMappings := groupMappingsByTable(params.Job.Mappings) + groupedMappings := groupMappingsByTable(jobMappings) groupedTableMapping := getTableMappingsMap(groupedMappings) colTMap := getColumnTransformerMap( groupedTableMapping, diff --git a/python/src/neosync/mgmt/v1alpha1/job_pb2.py b/python/src/neosync/mgmt/v1alpha1/job_pb2.py index a85b63e478..7c98d110af 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\"\xb8\t\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\xa4\x03\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\x12x\n\x0bpassthrough\x18\x03 \x01(\x0b\x32T.mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.PassthroughH\x00R\x0bpassthrough\x1a\t\n\x07HaltJob\x1a\t\n\x07\x41utoMap\x1a\r\n\x0bPassthroughB\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\"\xd9\t\n\x1cMysqlSourceConnectionOptions\x12@\n\x1bhalt_on_new_column_addition\x18\x01 \x01(\x08\x42\x02\x18\x01R\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\x12\x86\x01\n\x1cnew_column_addition_strategy\x18\x06 \x01(\x0b\x32\x45.mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategyR\x19newColumnAdditionStrategy\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\x1a\x9b\x03\n\x19NewColumnAdditionStrategy\x12j\n\x08halt_job\x18\x01 \x01(\x0b\x32M.mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.HaltJobH\x00R\x07haltJob\x12j\n\x08\x61uto_map\x18\x02 \x01(\x0b\x32M.mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.AutoMapH\x00R\x07\x61utoMap\x12u\n\x0bpassthrough\x18\x03 \x01(\x0b\x32Q.mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.PassthroughH\x00R\x0bpassthrough\x1a\t\n\x07HaltJob\x1a\t\n\x07\x41utoMap\x1a\r\n\x0bPassthroughB\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\"\xe2\x08\n\x1cMssqlSourceConnectionOptions\x12@\n\x1bhalt_on_new_column_addition\x18\x01 \x01(\x08\x42\x02\x18\x01R\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\x12\x86\x01\n\x1cnew_column_addition_strategy\x18\x06 \x01(\x0b\x32\x45.mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategyR\x19newColumnAdditionStrategy\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\x1a\xa4\x02\n\x19NewColumnAdditionStrategy\x12j\n\x08halt_job\x18\x01 \x01(\x0b\x32M.mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.HaltJobH\x00R\x07haltJob\x12u\n\x0bpassthrough\x18\x02 \x01(\x0b\x32Q.mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.PassthroughH\x00R\x0bpassthrough\x1a\t\n\x07HaltJob\x1a\r\n\x0bPassthroughB\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\"\x94\x08\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\x12virtualForeignKeys\x12<\n\x08job_type\x18\x0b \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobTypeConfigH\x01R\x07jobType\x88\x01\x01:\xd4\x02\xbaH\xd0\x02\x1a\x9f\x01\n\x1amappings_required_for_sync\x12/For sync jobs, at least one mapping is required\x1aP!has(this.job_type) || has(this.job_type.sync) ? size(this.mappings) >= 1 : true\x1a\xab\x01\n\x1e\x64\x65stinations_required_for_sync\x12\x33\x46or sync jobs, at least one destination is required\x1aT!has(this.job_type) || has(this.job_type.sync) ? size(this.destinations) >= 1 : trueB\x10\n\x0e_cron_scheduleB\x0b\n\t_job_type\"\xbd\t\n\rJobTypeConfig\x12>\n\x04sync\x18\x01 \x01(\x0b\x32(.mgmt.v1alpha1.JobTypeConfig.JobTypeSyncH\x00R\x04sync\x12N\n\npii_detect\x18\x02 \x01(\x0b\x32-.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetectH\x00R\tpiiDetect\x1a\r\n\x0bJobTypeSync\x1a\xf9\x07\n\x10JobTypePiiDetect\x12_\n\rdata_sampling\x18\x01 \x01(\x0b\x32:.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.DataSamplingR\x0c\x64\x61taSampling\x12i\n\x11table_scan_filter\x18\x02 \x01(\x0b\x32=.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilterR\x0ftableScanFilter\x12$\n\x0buser_prompt\x18\x03 \x01(\tH\x00R\nuserPrompt\x88\x01\x01\x12`\n\x0bincremental\x18\x04 \x01(\x0b\x32\x39.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.IncrementalH\x01R\x0bincremental\x88\x01\x01\x1a,\n\x0bIncremental\x12\x1d\n\nis_enabled\x18\x01 \x01(\x08R\tisEnabled\x1a-\n\x0c\x44\x61taSampling\x12\x1d\n\nis_enabled\x18\x01 \x01(\x08R\tisEnabled\x1a\xaf\x02\n\x0fTableScanFilter\x12[\n\x0binclude_all\x18\x01 \x01(\x0b\x32\x38.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.IncludeAllH\x00R\nincludeAll\x12W\n\x07include\x18\x02 \x01(\x0b\x32;.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatternsH\x00R\x07include\x12W\n\x07\x65xclude\x18\x03 \x01(\x0b\x32;.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatternsH\x00R\x07\x65xcludeB\r\n\x04mode\x12\x05\xbaH\x02\x08\x01\x1a\x0c\n\nIncludeAll\x1a\x80\x01\n\rTablePatterns\x12\x18\n\x07schemas\x18\x01 \x03(\tR\x07schemas\x12U\n\x06tables\x18\x02 \x03(\x0b\x32=.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableIdentifierR\x06tables\x1aQ\n\x0fTableIdentifier\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\x05tableB\x0e\n\x0c_user_promptB\x0e\n\x0c_incrementalB\x11\n\x08job_type\x12\x05\xbaH\x02\x08\x00\"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\"\xb9\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\x12\x37\n\x08job_type\x18\x05 \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobTypeConfigR\x07jobType\"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\"\xa2\x06\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\x12virtualForeignKeys\x12\x37\n\x08job_type\x18\x0f \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobTypeConfigR\x07jobTypeB\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\"n\n\x1cGetPiiDetectionReportRequest\x12%\n\njob_run_id\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"Z\n\x1dGetPiiDetectionReportResponse\x12\x39\n\x06report\x18\x01 \x01(\x0b\x32!.mgmt.v1alpha1.PiiDetectionReportR\x06report\"\xee\x04\n\x12PiiDetectionReport\x12\x45\n\x06tables\x18\x01 \x03(\x0b\x32-.mgmt.v1alpha1.PiiDetectionReport.TableReportR\x06tables\x1a\x90\x04\n\x0bTableReport\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12T\n\x07\x63olumns\x18\x03 \x03(\x0b\x32:.mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReportR\x07\x63olumns\x1a\xfc\x02\n\x0c\x43olumnReport\x12\x16\n\x06\x63olumn\x18\x01 \x01(\tR\x06\x63olumn\x12h\n\x0cregex_report\x18\x02 \x01(\x0b\x32@.mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.RegexH\x00R\x0bregexReport\x88\x01\x01\x12\x62\n\nllm_report\x18\x03 \x01(\x0b\x32>.mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.LLMH\x01R\tllmReport\x88\x01\x01\x1a#\n\x05Regex\x12\x1a\n\x08\x63\x61tegory\x18\x01 \x01(\tR\x08\x63\x61tegory\x1a\x41\n\x03LLM\x12\x1a\n\x08\x63\x61tegory\x18\x01 \x01(\tR\x08\x63\x61tegory\x12\x1e\n\nconfidence\x18\x02 \x01(\x02R\nconfidenceB\x0f\n\r_regex_reportB\r\n\x0b_llm_report*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\xb0!\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\x12w\n\x15GetPiiDetectionReport\x12+.mgmt.v1alpha1.GetPiiDetectionReportRequest\x1a,.mgmt.v1alpha1.GetPiiDetectionReportResponse\"\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\"\xb8\t\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\xa4\x03\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\x12x\n\x0bpassthrough\x18\x03 \x01(\x0b\x32T.mgmt.v1alpha1.PostgresSourceConnectionOptions.NewColumnAdditionStrategy.PassthroughH\x00R\x0bpassthrough\x1a\t\n\x07HaltJob\x1a\t\n\x07\x41utoMap\x1a\r\n\x0bPassthroughB\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\"\xd9\t\n\x1cMysqlSourceConnectionOptions\x12@\n\x1bhalt_on_new_column_addition\x18\x01 \x01(\x08\x42\x02\x18\x01R\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\x12\x86\x01\n\x1cnew_column_addition_strategy\x18\x06 \x01(\x0b\x32\x45.mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategyR\x19newColumnAdditionStrategy\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\x1a\x9b\x03\n\x19NewColumnAdditionStrategy\x12j\n\x08halt_job\x18\x01 \x01(\x0b\x32M.mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.HaltJobH\x00R\x07haltJob\x12j\n\x08\x61uto_map\x18\x02 \x01(\x0b\x32M.mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.AutoMapH\x00R\x07\x61utoMap\x12u\n\x0bpassthrough\x18\x03 \x01(\x0b\x32Q.mgmt.v1alpha1.MysqlSourceConnectionOptions.NewColumnAdditionStrategy.PassthroughH\x00R\x0bpassthrough\x1a\t\n\x07HaltJob\x1a\t\n\x07\x41utoMap\x1a\r\n\x0bPassthroughB\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\"\xe2\x08\n\x1cMssqlSourceConnectionOptions\x12@\n\x1bhalt_on_new_column_addition\x18\x01 \x01(\x08\x42\x02\x18\x01R\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\x12\x86\x01\n\x1cnew_column_addition_strategy\x18\x06 \x01(\x0b\x32\x45.mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategyR\x19newColumnAdditionStrategy\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\x1a\xa4\x02\n\x19NewColumnAdditionStrategy\x12j\n\x08halt_job\x18\x01 \x01(\x0b\x32M.mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.HaltJobH\x00R\x07haltJob\x12u\n\x0bpassthrough\x18\x02 \x01(\x0b\x32Q.mgmt.v1alpha1.MssqlSourceConnectionOptions.NewColumnAdditionStrategy.PassthroughH\x00R\x0bpassthrough\x1a\t\n\x07HaltJob\x1a\r\n\x0bPassthroughB\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\x06\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\x12virtualForeignKeys\x12<\n\x08job_type\x18\x0b \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobTypeConfigH\x01R\x07jobType\x88\x01\x01:\xb2\x01\xbaH\xae\x01\x1a\xab\x01\n\x1e\x64\x65stinations_required_for_sync\x12\x33\x46or sync jobs, at least one destination is required\x1aT!has(this.job_type) || has(this.job_type.sync) ? size(this.destinations) >= 1 : trueB\x10\n\x0e_cron_scheduleB\x0b\n\t_job_type\"\xdc\x35\n\rJobTypeConfig\x12>\n\x04sync\x18\x01 \x01(\x0b\x32(.mgmt.v1alpha1.JobTypeConfig.JobTypeSyncH\x00R\x04sync\x12N\n\npii_detect\x18\x02 \x01(\x0b\x32-.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetectH\x00R\tpiiDetect\x1a\xab,\n\x0bJobTypeSync\x12_\n\rschema_change\x18\x01 \x01(\x0b\x32\x35.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaChangeH\x00R\x0cschemaChange\x88\x01\x01\x12_\n\x0fschema_mappings\x18\x02 \x03(\x0b\x32\x36.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMappingR\x0eschemaMappings\x1a\xfb\x02\n\x0cSchemaChange\x12\x65\n\x0fschema_strategy\x18\x01 \x01(\x0b\x32\x37.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategyH\x00R\x0eschemaStrategy\x88\x01\x01\x12\x62\n\x0etable_strategy\x18\x02 \x01(\x0b\x32\x36.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategyH\x01R\rtableStrategy\x88\x01\x01\x12\x65\n\x0f\x63olumn_strategy\x18\x03 \x01(\x0b\x32\x37.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategyH\x02R\x0e\x63olumnStrategy\x88\x01\x01\x42\x12\n\x10_schema_strategyB\x11\n\x0f_table_strategyB\x12\n\x10_column_strategy\x1a\xb7\x02\n\x0eSchemaStrategy\x12o\n\x0fmap_all_schemas\x18\x01 \x01(\x0b\x32\x45.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemasH\x00R\rmapAllSchemas\x12{\n\x13map_defined_schemas\x18\x02 \x01(\x0b\x32I.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemasH\x00R\x11mapDefinedSchemas\x1a\x0f\n\rMapAllSchemas\x1a\x13\n\x11MapDefinedSchemasB\x11\n\x08strategy\x12\x05\xbaH\x02\x08\x00\x1a\xac\x02\n\rTableStrategy\x12k\n\x0emap_all_tables\x18\x01 \x01(\x0b\x32\x43.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapAllTablesH\x00R\x0cmapAllTables\x12w\n\x12map_defined_tables\x18\x02 \x01(\x0b\x32G.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTablesH\x00R\x10mapDefinedTables\x1a\x0e\n\x0cMapAllTables\x1a\x12\n\x10MapDefinedTablesB\x11\n\x08strategy\x12\x05\xbaH\x02\x08\x00\x1a\x89\x1b\n\x0e\x43olumnStrategy\x12o\n\x0fmap_all_columns\x18\x01 \x01(\x0b\x32\x45.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumnsH\x00R\rmapAllColumns\x12{\n\x13map_defined_columns\x18\x02 \x01(\x0b\x32I.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumnsH\x00R\x11mapDefinedColumns\x1a\xea\x06\n\rMapAllColumns\x12\x9a\x01\n\x1b\x63olumn_in_source_not_mapped\x18\x01 \x01(\x0b\x32W.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategyH\x00R\x17\x63olumnInSourceNotMapped\x88\x01\x01\x12\x9a\x01\n\x1b\x63olumn_mapped_not_in_source\x18\x02 \x01(\x0b\x32W.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategyH\x01R\x17\x63olumnMappedNotInSource\x88\x01\x01\x12\xc3\x01\n*column_in_source_mapped_not_in_destination\x18\x03 \x01(\x0b\x32\x64.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategyH\x02R$columnInSourceMappedNotInDestination\x88\x01\x01\x12\xbb\x01\n)column_in_destination_no_longer_in_source\x18\x04 \x01(\x0b\x32^.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategyH\x03R#columnInDestinationNoLongerInSource\x88\x01\x01\x42\x1e\n\x1c_column_in_source_not_mappedB\x1e\n\x1c_column_mapped_not_in_sourceB-\n+_column_in_source_mapped_not_in_destinationB,\n*_column_in_destination_no_longer_in_source\x1a\xc5\x03\n\x11MapDefinedColumns\x12\x9a\x01\n\x1b\x63olumn_mapped_not_in_source\x18\x01 \x01(\x0b\x32W.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategyH\x00R\x17\x63olumnMappedNotInSource\x88\x01\x01\x12\xc3\x01\n*column_in_source_mapped_not_in_destination\x18\x02 \x01(\x0b\x32\x64.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategyH\x01R$columnInSourceMappedNotInDestination\x88\x01\x01\x42\x1e\n\x1c_column_mapped_not_in_sourceB-\n+_column_in_source_mapped_not_in_destination\x1a\xc7\x04\n\x1f\x43olumnInSourceNotMappedStrategy\x12\x87\x01\n\x0bpassthrough\x18\x01 \x01(\x0b\x32\x63.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.PassthroughH\x00R\x0bpassthrough\x12|\n\x08\x61uto_map\x18\x02 \x01(\x0b\x32_.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMapH\x00R\x07\x61utoMap\x12r\n\x04halt\x18\x03 \x01(\x0b\x32\\.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.HaltH\x00R\x04halt\x12r\n\x04\x64rop\x18\x04 \x01(\x0b\x32\\.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.DropH\x00R\x04\x64rop\x1a\r\n\x0bPassthrough\x1a\t\n\x07\x41utoMap\x1a\x06\n\x04Halt\x1a\x06\n\x04\x44ropB\n\n\x08strategy\x1a\xb5\x02\n\x1f\x43olumnMappedNotInSourceStrategy\x12~\n\x08\x63ontinue\x18\x01 \x01(\x0b\x32`.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.ContinueH\x00R\x08\x63ontinue\x12r\n\x04halt\x18\x02 \x01(\x0b\x32\\.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.HaltH\x00R\x04halt\x1a\n\n\x08\x43ontinue\x1a\x06\n\x04HaltB\n\n\x08strategy\x1a\xe6\x03\n,ColumnInSourceMappedNotInDestinationStrategy\x12\x8b\x01\n\x08\x63ontinue\x18\x01 \x01(\x0b\x32m.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.ContinueH\x00R\x08\x63ontinue\x12\x7f\n\x04\x64rop\x18\x02 \x01(\x0b\x32i.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.DropH\x00R\x04\x64rop\x12\x7f\n\x04halt\x18\x03 \x01(\x0b\x32i.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.HaltH\x00R\x04halt\x1a\n\n\x08\x43ontinue\x1a\x06\n\x04\x44rop\x1a\x06\n\x04HaltB\n\n\x08strategy\x1a\xdc\x03\n&ColumnInDestinationNotInSourceStrategy\x12\x85\x01\n\x08\x63ontinue\x18\x01 \x01(\x0b\x32g.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.ContinueH\x00R\x08\x63ontinue\x12y\n\x04halt\x18\x02 \x01(\x0b\x32\x63.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.HaltH\x00R\x04halt\x12\x83\x01\n\x08\x61uto_map\x18\x03 \x01(\x0b\x32\x66.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMapH\x00R\x07\x61utoMap\x1a\n\n\x08\x43ontinue\x1a\x06\n\x04Halt\x1a\t\n\x07\x41utoMapB\n\n\x08strategyB\n\n\x08strategy\x1a\xd4\x07\n\rSchemaMapping\x12\x1f\n\x06schema\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06schema\x12\x32\n\x12\x64\x65stination_schema\x18\x02 \x01(\tH\x00R\x11\x64\x65stinationSchema\x88\x01\x01\x12j\n\x0etable_mappings\x18\x03 \x03(\x0b\x32\x43.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMappingR\rtableMappings\x12\x62\n\x0etable_strategy\x18\x04 \x01(\x0b\x32\x36.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.TableStrategyH\x01R\rtableStrategy\x88\x01\x01\x12\x65\n\x0f\x63olumn_strategy\x18\x05 \x01(\x0b\x32\x37.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategyH\x02R\x0e\x63olumnStrategy\x88\x01\x01\x1a\xf8\x03\n\x0cTableMapping\x12\x1d\n\x05table\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05table\x12\x30\n\x11\x64\x65stination_table\x18\x02 \x01(\tH\x00R\x10\x64\x65stinationTable\x88\x01\x01\x12z\n\x0f\x63olumn_mappings\x18\x03 \x03(\x0b\x32Q.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMappingR\x0e\x63olumnMappings\x12\x65\n\x0f\x63olumn_strategy\x18\x04 \x01(\x0b\x32\x37.mgmt.v1alpha1.JobTypeConfig.JobTypeSync.ColumnStrategyH\x01R\x0e\x63olumnStrategy\x88\x01\x01\x1a\x89\x01\n\rColumnMapping\x12\x1f\n\x06\x63olumn\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06\x63olumn\x12G\n\x0btransformer\x18\x02 \x01(\x0b\x32 .mgmt.v1alpha1.TransformerConfigH\x00R\x0btransformer\x88\x01\x01\x42\x0e\n\x0c_transformerB\x14\n\x12_destination_tableB\x12\n\x10_column_strategyB\x15\n\x13_destination_schemaB\x11\n\x0f_table_strategyB\x12\n\x10_column_strategyB\x10\n\x0e_schema_change\x1a\xf9\x07\n\x10JobTypePiiDetect\x12_\n\rdata_sampling\x18\x01 \x01(\x0b\x32:.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.DataSamplingR\x0c\x64\x61taSampling\x12i\n\x11table_scan_filter\x18\x02 \x01(\x0b\x32=.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableScanFilterR\x0ftableScanFilter\x12$\n\x0buser_prompt\x18\x03 \x01(\tH\x00R\nuserPrompt\x88\x01\x01\x12`\n\x0bincremental\x18\x04 \x01(\x0b\x32\x39.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.IncrementalH\x01R\x0bincremental\x88\x01\x01\x1a,\n\x0bIncremental\x12\x1d\n\nis_enabled\x18\x01 \x01(\x08R\tisEnabled\x1a-\n\x0c\x44\x61taSampling\x12\x1d\n\nis_enabled\x18\x01 \x01(\x08R\tisEnabled\x1a\xaf\x02\n\x0fTableScanFilter\x12[\n\x0binclude_all\x18\x01 \x01(\x0b\x32\x38.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.IncludeAllH\x00R\nincludeAll\x12W\n\x07include\x18\x02 \x01(\x0b\x32;.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatternsH\x00R\x07include\x12W\n\x07\x65xclude\x18\x03 \x01(\x0b\x32;.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TablePatternsH\x00R\x07\x65xcludeB\r\n\x04mode\x12\x05\xbaH\x02\x08\x01\x1a\x0c\n\nIncludeAll\x1a\x80\x01\n\rTablePatterns\x12\x18\n\x07schemas\x18\x01 \x03(\tR\x07schemas\x12U\n\x06tables\x18\x02 \x03(\x0b\x32=.mgmt.v1alpha1.JobTypeConfig.JobTypePiiDetect.TableIdentifierR\x06tables\x1aQ\n\x0fTableIdentifier\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\x05tableB\x0e\n\x0c_user_promptB\x0e\n\x0c_incrementalB\x11\n\x08job_type\x12\x05\xbaH\x02\x08\x00\"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\"\xb9\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\x12\x37\n\x08job_type\x18\x05 \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobTypeConfigR\x07jobType\"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\"\xa2\x06\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\x12virtualForeignKeys\x12\x37\n\x08job_type\x18\x0f \x01(\x0b\x32\x1c.mgmt.v1alpha1.JobTypeConfigR\x07jobTypeB\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\"n\n\x1cGetPiiDetectionReportRequest\x12%\n\njob_run_id\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x08jobRunId\x12\'\n\naccount_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"Z\n\x1dGetPiiDetectionReportResponse\x12\x39\n\x06report\x18\x01 \x01(\x0b\x32!.mgmt.v1alpha1.PiiDetectionReportR\x06report\"\xee\x04\n\x12PiiDetectionReport\x12\x45\n\x06tables\x18\x01 \x03(\x0b\x32-.mgmt.v1alpha1.PiiDetectionReport.TableReportR\x06tables\x1a\x90\x04\n\x0bTableReport\x12\x16\n\x06schema\x18\x01 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x02 \x01(\tR\x05table\x12T\n\x07\x63olumns\x18\x03 \x03(\x0b\x32:.mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReportR\x07\x63olumns\x1a\xfc\x02\n\x0c\x43olumnReport\x12\x16\n\x06\x63olumn\x18\x01 \x01(\tR\x06\x63olumn\x12h\n\x0cregex_report\x18\x02 \x01(\x0b\x32@.mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.RegexH\x00R\x0bregexReport\x88\x01\x01\x12\x62\n\nllm_report\x18\x03 \x01(\x0b\x32>.mgmt.v1alpha1.PiiDetectionReport.TableReport.ColumnReport.LLMH\x01R\tllmReport\x88\x01\x01\x1a#\n\x05Regex\x12\x1a\n\x08\x63\x61tegory\x18\x01 \x01(\tR\x08\x63\x61tegory\x1a\x41\n\x03LLM\x12\x1a\n\x08\x63\x61tegory\x18\x01 \x01(\tR\x08\x63\x61tegory\x12\x1e\n\nconfidence\x18\x02 \x01(\x02R\nconfidenceB\x0f\n\r_regex_reportB\r\n\x0b_llm_report*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\xb0!\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\x12w\n\x15GetPiiDetectionReport\x12+.mgmt.v1alpha1.GetPiiDetectionReportRequest\x1a,.mgmt.v1alpha1.GetPiiDetectionReportResponse\"\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) @@ -133,7 +133,17 @@ _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']._loaded_options = None - _globals['_CREATEJOBREQUEST']._serialized_options = b'\272H\320\002\032\237\001\n\032mappings_required_for_sync\022/For sync jobs, at least one mapping is required\032P!has(this.job_type) || has(this.job_type.sync) ? size(this.mappings) >= 1 : true\032\253\001\n\036destinations_required_for_sync\0223For sync jobs, at least one destination is required\032T!has(this.job_type) || has(this.job_type.sync) ? size(this.destinations) >= 1 : true' + _globals['_CREATEJOBREQUEST']._serialized_options = b'\272H\256\001\032\253\001\n\036destinations_required_for_sync\0223For sync jobs, at least one destination is required\032T!has(this.job_type) || has(this.job_type.sync) ? size(this.destinations) >= 1 : true' + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMASTRATEGY'].oneofs_by_name['strategy']._loaded_options = None + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMASTRATEGY'].oneofs_by_name['strategy']._serialized_options = b'\272H\002\010\000' + _globals['_JOBTYPECONFIG_JOBTYPESYNC_TABLESTRATEGY'].oneofs_by_name['strategy']._loaded_options = None + _globals['_JOBTYPECONFIG_JOBTYPESYNC_TABLESTRATEGY'].oneofs_by_name['strategy']._serialized_options = b'\272H\002\010\000' + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING_TABLEMAPPING_COLUMNMAPPING'].fields_by_name['column']._loaded_options = None + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING_TABLEMAPPING_COLUMNMAPPING'].fields_by_name['column']._serialized_options = b'\272H\004r\002\020\001' + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING_TABLEMAPPING'].fields_by_name['table']._loaded_options = None + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING_TABLEMAPPING'].fields_by_name['table']._serialized_options = b'\272H\004r\002\020\001' + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING'].fields_by_name['schema']._loaded_options = None + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING'].fields_by_name['schema']._serialized_options = b'\272H\004r\002\020\001' _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLESCANFILTER'].oneofs_by_name['mode']._loaded_options = None _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLESCANFILTER'].oneofs_by_name['mode']._serialized_options = b'\272H\002\010\001' _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLEIDENTIFIER'].fields_by_name['schema']._loaded_options = None @@ -310,16 +320,16 @@ _globals['_JOBSERVICE'].methods_by_name['GetActiveJobHooksByTiming']._serialized_options = b'\220\002\001' _globals['_JOBSERVICE'].methods_by_name['GetPiiDetectionReport']._loaded_options = None _globals['_JOBSERVICE'].methods_by_name['GetPiiDetectionReport']._serialized_options = b'\220\002\001' - _globals['_JOBSTATUS']._serialized_start=30818 - _globals['_JOBSTATUS']._serialized_end=30929 - _globals['_ACTIVITYSTATUS']._serialized_start=30932 - _globals['_ACTIVITYSTATUS']._serialized_end=31099 - _globals['_JOBRUNSTATUS']._serialized_start=31102 - _globals['_JOBRUNSTATUS']._serialized_end=31376 - _globals['_LOGWINDOW']._serialized_start=31378 - _globals['_LOGWINDOW']._serialized_end=31502 - _globals['_LOGLEVEL']._serialized_start=31504 - _globals['_LOGLEVEL']._serialized_end=31623 + _globals['_JOBSTATUS']._serialized_start=36319 + _globals['_JOBSTATUS']._serialized_end=36430 + _globals['_ACTIVITYSTATUS']._serialized_start=36433 + _globals['_ACTIVITYSTATUS']._serialized_end=36600 + _globals['_JOBRUNSTATUS']._serialized_start=36603 + _globals['_JOBRUNSTATUS']._serialized_end=36877 + _globals['_LOGWINDOW']._serialized_start=36879 + _globals['_LOGWINDOW']._serialized_end=37003 + _globals['_LOGLEVEL']._serialized_start=37005 + _globals['_LOGLEVEL']._serialized_end=37124 _globals['_GETJOBSREQUEST']._serialized_start=174 _globals['_GETJOBSREQUEST']._serialized_end=231 _globals['_GETJOBSRESPONSE']._serialized_start=233 @@ -455,291 +465,349 @@ _globals['_BATCHCONFIG']._serialized_start=11440 _globals['_BATCHCONFIG']._serialized_end=11530 _globals['_CREATEJOBREQUEST']._serialized_start=11533 - _globals['_CREATEJOBREQUEST']._serialized_end=12577 - _globals['_JOBTYPECONFIG']._serialized_start=12580 - _globals['_JOBTYPECONFIG']._serialized_end=13793 - _globals['_JOBTYPECONFIG_JOBTYPESYNC']._serialized_start=12741 - _globals['_JOBTYPECONFIG_JOBTYPESYNC']._serialized_end=12754 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT']._serialized_start=12757 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT']._serialized_end=13774 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_INCREMENTAL']._serialized_start=13117 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_INCREMENTAL']._serialized_end=13161 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_DATASAMPLING']._serialized_start=13163 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_DATASAMPLING']._serialized_end=13208 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLESCANFILTER']._serialized_start=13211 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLESCANFILTER']._serialized_end=13514 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_INCLUDEALL']._serialized_start=13516 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_INCLUDEALL']._serialized_end=13528 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLEPATTERNS']._serialized_start=13531 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLEPATTERNS']._serialized_end=13659 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLEIDENTIFIER']._serialized_start=13661 - _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLEIDENTIFIER']._serialized_end=13742 - _globals['_WORKFLOWOPTIONS']._serialized_start=13795 - _globals['_WORKFLOWOPTIONS']._serialized_end=13908 - _globals['_ACTIVITYOPTIONS']._serialized_start=13911 - _globals['_ACTIVITYOPTIONS']._serialized_end=14188 - _globals['_RETRYPOLICY']._serialized_start=14190 - _globals['_RETRYPOLICY']._serialized_end=14281 - _globals['_CREATEJOBRESPONSE']._serialized_start=14283 - _globals['_CREATEJOBRESPONSE']._serialized_end=14340 - _globals['_JOBMAPPINGTRANSFORMER']._serialized_start=14342 - _globals['_JOBMAPPINGTRANSFORMER']._serialized_end=14429 - _globals['_JOBMAPPING']._serialized_start=14432 - _globals['_JOBMAPPING']._serialized_end=14613 - _globals['_GETJOBREQUEST']._serialized_start=14615 - _globals['_GETJOBREQUEST']._serialized_end=14656 - _globals['_GETJOBRESPONSE']._serialized_start=14658 - _globals['_GETJOBRESPONSE']._serialized_end=14712 - _globals['_UPDATEJOBSCHEDULEREQUEST']._serialized_start=14714 - _globals['_UPDATEJOBSCHEDULEREQUEST']._serialized_end=14826 - _globals['_UPDATEJOBSCHEDULERESPONSE']._serialized_start=14828 - _globals['_UPDATEJOBSCHEDULERESPONSE']._serialized_end=14893 - _globals['_PAUSEJOBREQUEST']._serialized_start=14895 - _globals['_PAUSEJOBREQUEST']._serialized_end=14994 - _globals['_PAUSEJOBRESPONSE']._serialized_start=14996 - _globals['_PAUSEJOBRESPONSE']._serialized_end=15052 - _globals['_UPDATEJOBSOURCECONNECTIONREQUEST']._serialized_start=15055 - _globals['_UPDATEJOBSOURCECONNECTIONREQUEST']._serialized_end=15368 - _globals['_UPDATEJOBSOURCECONNECTIONRESPONSE']._serialized_start=15370 - _globals['_UPDATEJOBSOURCECONNECTIONRESPONSE']._serialized_end=15443 - _globals['_POSTGRESSOURCESCHEMASUBSET']._serialized_start=15445 - _globals['_POSTGRESSOURCESCHEMASUBSET']._serialized_end=15559 - _globals['_MYSQLSOURCESCHEMASUBSET']._serialized_start=15561 - _globals['_MYSQLSOURCESCHEMASUBSET']._serialized_end=15663 - _globals['_DYNAMODBSOURCESCHEMASUBSET']._serialized_start=15665 - _globals['_DYNAMODBSOURCESCHEMASUBSET']._serialized_end=15759 - _globals['_MSSQLSOURCESCHEMASUBSET']._serialized_start=15761 - _globals['_MSSQLSOURCESCHEMASUBSET']._serialized_end=15863 - _globals['_JOBSOURCESQLSUBETSCHEMAS']._serialized_start=15866 - _globals['_JOBSOURCESQLSUBETSCHEMAS']._serialized_end=16242 - _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSREQUEST']._serialized_start=16245 - _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSREQUEST']._serialized_end=16453 - _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSRESPONSE']._serialized_start=16455 - _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSRESPONSE']._serialized_end=16535 - _globals['_UPDATEJOBDESTINATIONCONNECTIONREQUEST']._serialized_start=16538 - _globals['_UPDATEJOBDESTINATIONCONNECTIONREQUEST']._serialized_end=16760 - _globals['_UPDATEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_start=16762 - _globals['_UPDATEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_end=16840 - _globals['_DELETEJOBDESTINATIONCONNECTIONREQUEST']._serialized_start=16842 - _globals['_DELETEJOBDESTINATIONCONNECTIONREQUEST']._serialized_end=16930 - _globals['_DELETEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_start=16932 - _globals['_DELETEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_end=16972 - _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST']._serialized_start=16975 - _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST']._serialized_end=17131 - _globals['_CREATEJOBDESTINATIONCONNECTIONSRESPONSE']._serialized_start=17133 - _globals['_CREATEJOBDESTINATIONCONNECTIONSRESPONSE']._serialized_end=17212 - _globals['_DELETEJOBREQUEST']._serialized_start=17214 - _globals['_DELETEJOBREQUEST']._serialized_end=17258 - _globals['_DELETEJOBRESPONSE']._serialized_start=17260 - _globals['_DELETEJOBRESPONSE']._serialized_end=17279 - _globals['_ISJOBNAMEAVAILABLEREQUEST']._serialized_start=17281 - _globals['_ISJOBNAMEAVAILABLEREQUEST']._serialized_end=17396 - _globals['_ISJOBNAMEAVAILABLERESPONSE']._serialized_start=17398 - _globals['_ISJOBNAMEAVAILABLERESPONSE']._serialized_end=17461 - _globals['_GETJOBRUNSREQUEST']._serialized_start=17463 - _globals['_GETJOBRUNSREQUEST']._serialized_end=17566 - _globals['_GETJOBRUNSRESPONSE']._serialized_start=17568 - _globals['_GETJOBRUNSRESPONSE']._serialized_end=17638 - _globals['_GETJOBRUNREQUEST']._serialized_start=17640 - _globals['_GETJOBRUNREQUEST']._serialized_end=17729 - _globals['_GETJOBRUNRESPONSE']._serialized_start=17731 - _globals['_GETJOBRUNRESPONSE']._serialized_end=17798 - _globals['_CREATEJOBRUNREQUEST']._serialized_start=17800 - _globals['_CREATEJOBRUNREQUEST']._serialized_end=17854 - _globals['_CREATEJOBRUNRESPONSE']._serialized_start=17856 - _globals['_CREATEJOBRUNRESPONSE']._serialized_end=17878 - _globals['_CANCELJOBRUNREQUEST']._serialized_start=17880 - _globals['_CANCELJOBRUNREQUEST']._serialized_end=17972 - _globals['_CANCELJOBRUNRESPONSE']._serialized_start=17974 - _globals['_CANCELJOBRUNRESPONSE']._serialized_end=17996 - _globals['_JOB']._serialized_start=17999 - _globals['_JOB']._serialized_end=18801 - _globals['_JOBRECENTRUN']._serialized_start=18803 - _globals['_JOBRECENTRUN']._serialized_end=18906 - _globals['_GETJOBRECENTRUNSREQUEST']._serialized_start=18908 - _globals['_GETJOBRECENTRUNSREQUEST']._serialized_end=18966 - _globals['_GETJOBRECENTRUNSRESPONSE']._serialized_start=18968 - _globals['_GETJOBRECENTRUNSRESPONSE']._serialized_end=19056 - _globals['_JOBNEXTRUNS']._serialized_start=19058 - _globals['_JOBNEXTRUNS']._serialized_end=19137 - _globals['_GETJOBNEXTRUNSREQUEST']._serialized_start=19139 - _globals['_GETJOBNEXTRUNSREQUEST']._serialized_end=19195 - _globals['_GETJOBNEXTRUNSRESPONSE']._serialized_start=19197 - _globals['_GETJOBNEXTRUNSRESPONSE']._serialized_end=19278 - _globals['_GETJOBSTATUSREQUEST']._serialized_start=19280 - _globals['_GETJOBSTATUSREQUEST']._serialized_end=19334 - _globals['_GETJOBSTATUSRESPONSE']._serialized_start=19336 - _globals['_GETJOBSTATUSRESPONSE']._serialized_end=19408 - _globals['_JOBSTATUSRECORD']._serialized_start=19410 - _globals['_JOBSTATUSRECORD']._serialized_end=19510 - _globals['_GETJOBSTATUSESREQUEST']._serialized_start=19512 - _globals['_GETJOBSTATUSESREQUEST']._serialized_end=19576 - _globals['_GETJOBSTATUSESRESPONSE']._serialized_start=19578 - _globals['_GETJOBSTATUSESRESPONSE']._serialized_end=19662 - _globals['_ACTIVITYFAILURE']._serialized_start=19664 - _globals['_ACTIVITYFAILURE']._serialized_end=19707 - _globals['_PENDINGACTIVITY']._serialized_start=19710 - _globals['_PENDINGACTIVITY']._serialized_end=19908 - _globals['_JOBRUN']._serialized_start=19911 - _globals['_JOBRUN']._serialized_end=20260 - _globals['_JOBRUNEVENTTASKERROR']._serialized_start=20262 - _globals['_JOBRUNEVENTTASKERROR']._serialized_end=20343 - _globals['_JOBRUNEVENTTASK']._serialized_start=20346 - _globals['_JOBRUNEVENTTASK']._serialized_end=20517 - _globals['_JOBRUNSYNCMETADATA']._serialized_start=20519 - _globals['_JOBRUNSYNCMETADATA']._serialized_end=20585 - _globals['_JOBRUNEVENTMETADATA']._serialized_start=20587 - _globals['_JOBRUNEVENTMETADATA']._serialized_end=20701 - _globals['_JOBRUNEVENT']._serialized_start=20704 - _globals['_JOBRUNEVENT']._serialized_end=20989 - _globals['_GETJOBRUNEVENTSREQUEST']._serialized_start=20991 - _globals['_GETJOBRUNEVENTSREQUEST']._serialized_end=21086 - _globals['_GETJOBRUNEVENTSRESPONSE']._serialized_start=21088 - _globals['_GETJOBRUNEVENTSRESPONSE']._serialized_end=21205 - _globals['_DELETEJOBRUNREQUEST']._serialized_start=21207 - _globals['_DELETEJOBRUNREQUEST']._serialized_end=21299 - _globals['_DELETEJOBRUNRESPONSE']._serialized_start=21301 - _globals['_DELETEJOBRUNRESPONSE']._serialized_end=21323 - _globals['_TERMINATEJOBRUNREQUEST']._serialized_start=21325 - _globals['_TERMINATEJOBRUNREQUEST']._serialized_end=21420 - _globals['_TERMINATEJOBRUNRESPONSE']._serialized_start=21422 - _globals['_TERMINATEJOBRUNRESPONSE']._serialized_end=21447 - _globals['_GETJOBRUNLOGSSTREAMREQUEST']._serialized_start=21450 - _globals['_GETJOBRUNLOGSSTREAMREQUEST']._serialized_end=21756 - _globals['_GETJOBRUNLOGSSTREAMRESPONSE']._serialized_start=21759 - _globals['_GETJOBRUNLOGSSTREAMRESPONSE']._serialized_end=22031 - _globals['_GETJOBRUNLOGSSTREAMRESPONSE_LABELSENTRY']._serialized_start=21960 - _globals['_GETJOBRUNLOGSSTREAMRESPONSE_LABELSENTRY']._serialized_end=22017 - _globals['_GETJOBRUNLOGSREQUEST']._serialized_start=22034 - _globals['_GETJOBRUNLOGSREQUEST']._serialized_end=22301 - _globals['_GETJOBRUNLOGSRESPONSE']._serialized_start=22304 - _globals['_GETJOBRUNLOGSRESPONSE']._serialized_end=22659 - _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE']._serialized_start=22405 - _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE']._serialized_end=22659 - _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE_LABELSENTRY']._serialized_start=21960 - _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE_LABELSENTRY']._serialized_end=22017 - _globals['_SETJOBWORKFLOWOPTIONSREQUEST']._serialized_start=22662 - _globals['_SETJOBWORKFLOWOPTIONSREQUEST']._serialized_end=22793 - _globals['_SETJOBWORKFLOWOPTIONSRESPONSE']._serialized_start=22795 - _globals['_SETJOBWORKFLOWOPTIONSRESPONSE']._serialized_end=22864 - _globals['_SETJOBSYNCOPTIONSREQUEST']._serialized_start=22866 - _globals['_SETJOBSYNCOPTIONSREQUEST']._serialized_end=22985 - _globals['_SETJOBSYNCOPTIONSRESPONSE']._serialized_start=22987 - _globals['_SETJOBSYNCOPTIONSRESPONSE']._serialized_end=23052 - _globals['_VALIDATEJOBMAPPINGSREQUEST']._serialized_start=23055 - _globals['_VALIDATEJOBMAPPINGSREQUEST']._serialized_end=23394 - _globals['_COLUMNERROR']._serialized_start=23397 - _globals['_COLUMNERROR']._serialized_end=24396 - _globals['_COLUMNERROR_COLUMNERRORREPORT']._serialized_start=23593 - _globals['_COLUMNERROR_COLUMNERRORREPORT']._serialized_end=23702 - _globals['_COLUMNERROR_COLUMNERRORCODE']._serialized_start=23705 - _globals['_COLUMNERROR_COLUMNERRORCODE']._serialized_end=24396 - _globals['_COLUMNWARNING']._serialized_start=24399 - _globals['_COLUMNWARNING']._serialized_end=24874 - _globals['_COLUMNWARNING_COLUMNWARNINGREPORT']._serialized_start=24609 - _globals['_COLUMNWARNING_COLUMNWARNINGREPORT']._serialized_end=24724 - _globals['_COLUMNWARNING_COLUMNWARNINGCODE']._serialized_start=24727 - _globals['_COLUMNWARNING_COLUMNWARNINGCODE']._serialized_end=24874 - _globals['_DATABASEERROR']._serialized_start=24877 - _globals['_DATABASEERROR']._serialized_end=25307 - _globals['_DATABASEERROR_DATABASEERRORREPORT']._serialized_start=25009 - _globals['_DATABASEERROR_DATABASEERRORREPORT']._serialized_end=25124 - _globals['_DATABASEERROR_DATABASEERRORCODE']._serialized_start=25127 - _globals['_DATABASEERROR_DATABASEERRORCODE']._serialized_end=25307 - _globals['_TABLEERROR']._serialized_start=25310 - _globals['_TABLEERROR']._serialized_end=25896 - _globals['_TABLEERROR_TABLEERRORREPORT']._serialized_start=25451 - _globals['_TABLEERROR_TABLEERRORREPORT']._serialized_end=25557 - _globals['_TABLEERROR_TABLEERRORCODE']._serialized_start=25560 - _globals['_TABLEERROR_TABLEERRORCODE']._serialized_end=25896 - _globals['_VALIDATEJOBMAPPINGSRESPONSE']._serialized_start=25899 - _globals['_VALIDATEJOBMAPPINGSRESPONSE']._serialized_end=26197 - _globals['_VALIDATESCHEMAREQUEST']._serialized_start=26199 - _globals['_VALIDATESCHEMAREQUEST']._serialized_end=26324 - _globals['_VALIDATESCHEMARESPONSE']._serialized_start=26327 - _globals['_VALIDATESCHEMARESPONSE']._serialized_end=26671 - _globals['_VALIDATESCHEMARESPONSE_TABLE']._serialized_start=26618 - _globals['_VALIDATESCHEMARESPONSE_TABLE']._serialized_end=26671 - _globals['_VIRTUALFOREIGNKEY']._serialized_start=26673 - _globals['_VIRTUALFOREIGNKEY']._serialized_end=26764 - _globals['_VIRTUALFOREIGNCONSTRAINT']._serialized_start=26767 - _globals['_VIRTUALFOREIGNCONSTRAINT']._serialized_end=26932 - _globals['_RUNCONTEXTKEY']._serialized_start=26935 - _globals['_RUNCONTEXTKEY']._serialized_end=27071 - _globals['_GETRUNCONTEXTREQUEST']._serialized_start=27073 - _globals['_GETRUNCONTEXTREQUEST']._serialized_end=27141 - _globals['_GETRUNCONTEXTRESPONSE']._serialized_start=27143 - _globals['_GETRUNCONTEXTRESPONSE']._serialized_end=27188 - _globals['_SETRUNCONTEXTREQUEST']._serialized_start=27190 - _globals['_SETRUNCONTEXTREQUEST']._serialized_end=27280 - _globals['_SETRUNCONTEXTRESPONSE']._serialized_start=27282 - _globals['_SETRUNCONTEXTRESPONSE']._serialized_end=27305 - _globals['_SETRUNCONTEXTSREQUEST']._serialized_start=27307 - _globals['_SETRUNCONTEXTSREQUEST']._serialized_end=27398 - _globals['_SETRUNCONTEXTSRESPONSE']._serialized_start=27400 - _globals['_SETRUNCONTEXTSRESPONSE']._serialized_end=27424 - _globals['_JOBHOOK']._serialized_start=27427 - _globals['_JOBHOOK']._serialized_end=27856 - _globals['_NEWJOBHOOK']._serialized_start=27859 - _globals['_NEWJOBHOOK']._serialized_end=28080 - _globals['_JOBHOOKCONFIG']._serialized_start=28083 - _globals['_JOBHOOKCONFIG']._serialized_end=28528 - _globals['_JOBHOOKCONFIG_JOBSQLHOOK']._serialized_start=28162 - _globals['_JOBHOOKCONFIG_JOBSQLHOOK']._serialized_end=28487 - _globals['_JOBHOOKCONFIG_JOBSQLHOOK_TIMING']._serialized_start=28327 - _globals['_JOBHOOKCONFIG_JOBSQLHOOK_TIMING']._serialized_end=28487 - _globals['_JOBHOOKTIMINGPRESYNC']._serialized_start=28530 - _globals['_JOBHOOKTIMINGPRESYNC']._serialized_end=28552 - _globals['_JOBHOOKTIMINGPOSTSYNC']._serialized_start=28554 - _globals['_JOBHOOKTIMINGPOSTSYNC']._serialized_end=28577 - _globals['_GETJOBHOOKSREQUEST']._serialized_start=28579 - _globals['_GETJOBHOOKSREQUEST']._serialized_end=28632 - _globals['_GETJOBHOOKSRESPONSE']._serialized_start=28634 - _globals['_GETJOBHOOKSRESPONSE']._serialized_end=28701 - _globals['_GETJOBHOOKREQUEST']._serialized_start=28703 - _globals['_GETJOBHOOKREQUEST']._serialized_end=28748 - _globals['_GETJOBHOOKRESPONSE']._serialized_start=28750 - _globals['_GETJOBHOOKRESPONSE']._serialized_end=28814 - _globals['_CREATEJOBHOOKREQUEST']._serialized_start=28816 - _globals['_CREATEJOBHOOKREQUEST']._serialized_end=28908 - _globals['_CREATEJOBHOOKRESPONSE']._serialized_start=28910 - _globals['_CREATEJOBHOOKRESPONSE']._serialized_end=28977 - _globals['_DELETEJOBHOOKREQUEST']._serialized_start=28979 - _globals['_DELETEJOBHOOKREQUEST']._serialized_end=29027 - _globals['_DELETEJOBHOOKRESPONSE']._serialized_start=29029 - _globals['_DELETEJOBHOOKRESPONSE']._serialized_end=29052 - _globals['_ISJOBHOOKNAMEAVAILABLEREQUEST']._serialized_start=29054 - _globals['_ISJOBHOOKNAMEAVAILABLEREQUEST']._serialized_end=29128 - _globals['_ISJOBHOOKNAMEAVAILABLERESPONSE']._serialized_start=29130 - _globals['_ISJOBHOOKNAMEAVAILABLERESPONSE']._serialized_end=29197 - _globals['_UPDATEJOBHOOKREQUEST']._serialized_start=29200 - _globals['_UPDATEJOBHOOKREQUEST']._serialized_end=29457 - _globals['_UPDATEJOBHOOKRESPONSE']._serialized_start=29459 - _globals['_UPDATEJOBHOOKRESPONSE']._serialized_end=29526 - _globals['_SETJOBHOOKENABLEDREQUEST']._serialized_start=29528 - _globals['_SETJOBHOOKENABLEDREQUEST']._serialized_end=29606 - _globals['_SETJOBHOOKENABLEDRESPONSE']._serialized_start=29608 - _globals['_SETJOBHOOKENABLEDRESPONSE']._serialized_end=29679 - _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST']._serialized_start=29682 - _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST']._serialized_end=29904 - _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST_TIMING']._serialized_start=29831 - _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST_TIMING']._serialized_end=29904 - _globals['_GETACTIVEJOBHOOKSBYTIMINGRESPONSE']._serialized_start=29906 - _globals['_GETACTIVEJOBHOOKSBYTIMINGRESPONSE']._serialized_end=29987 - _globals['_GETPIIDETECTIONREPORTREQUEST']._serialized_start=29989 - _globals['_GETPIIDETECTIONREPORTREQUEST']._serialized_end=30099 - _globals['_GETPIIDETECTIONREPORTRESPONSE']._serialized_start=30101 - _globals['_GETPIIDETECTIONREPORTRESPONSE']._serialized_end=30191 - _globals['_PIIDETECTIONREPORT']._serialized_start=30194 - _globals['_PIIDETECTIONREPORT']._serialized_end=30816 - _globals['_PIIDETECTIONREPORT_TABLEREPORT']._serialized_start=30288 - _globals['_PIIDETECTIONREPORT_TABLEREPORT']._serialized_end=30816 - _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT']._serialized_start=30436 - _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT']._serialized_end=30816 - _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT_REGEX']._serialized_start=30682 - _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT_REGEX']._serialized_end=30717 - _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT_LLM']._serialized_start=30719 - _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT_LLM']._serialized_end=30784 - _globals['_JOBSERVICE']._serialized_start=31626 - _globals['_JOBSERVICE']._serialized_end=35898 + _globals['_CREATEJOBREQUEST']._serialized_end=12415 + _globals['_JOBTYPECONFIG']._serialized_start=12418 + _globals['_JOBTYPECONFIG']._serialized_end=19294 + _globals['_JOBTYPECONFIG_JOBTYPESYNC']._serialized_start=12580 + _globals['_JOBTYPECONFIG_JOBTYPESYNC']._serialized_end=18255 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMACHANGE']._serialized_start=12790 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMACHANGE']._serialized_end=13169 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMASTRATEGY']._serialized_start=13172 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMASTRATEGY']._serialized_end=13483 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMASTRATEGY_MAPALLSCHEMAS']._serialized_start=13428 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMASTRATEGY_MAPALLSCHEMAS']._serialized_end=13443 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMASTRATEGY_MAPDEFINEDSCHEMAS']._serialized_start=13445 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMASTRATEGY_MAPDEFINEDSCHEMAS']._serialized_end=13464 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_TABLESTRATEGY']._serialized_start=13486 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_TABLESTRATEGY']._serialized_end=13786 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_TABLESTRATEGY_MAPALLTABLES']._serialized_start=13733 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_TABLESTRATEGY_MAPALLTABLES']._serialized_end=13747 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_TABLESTRATEGY_MAPDEFINEDTABLES']._serialized_start=13749 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_TABLESTRATEGY_MAPDEFINEDTABLES']._serialized_end=13767 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY']._serialized_start=13789 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY']._serialized_end=17254 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_MAPALLCOLUMNS']._serialized_start=14046 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_MAPALLCOLUMNS']._serialized_end=14920 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_MAPDEFINEDCOLUMNS']._serialized_start=14923 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_MAPDEFINEDCOLUMNS']._serialized_end=15376 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCENOTMAPPEDSTRATEGY']._serialized_start=15379 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCENOTMAPPEDSTRATEGY']._serialized_end=15962 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCENOTMAPPEDSTRATEGY_PASSTHROUGH']._serialized_start=4075 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCENOTMAPPEDSTRATEGY_PASSTHROUGH']._serialized_end=4088 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCENOTMAPPEDSTRATEGY_AUTOMAP']._serialized_start=4064 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCENOTMAPPEDSTRATEGY_AUTOMAP']._serialized_end=4073 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCENOTMAPPEDSTRATEGY_HALT']._serialized_start=15936 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCENOTMAPPEDSTRATEGY_HALT']._serialized_end=15942 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCENOTMAPPEDSTRATEGY_DROP']._serialized_start=15944 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCENOTMAPPEDSTRATEGY_DROP']._serialized_end=15950 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNMAPPEDNOTINSOURCESTRATEGY']._serialized_start=15965 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNMAPPEDNOTINSOURCESTRATEGY']._serialized_end=16274 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNMAPPEDNOTINSOURCESTRATEGY_CONTINUE']._serialized_start=16244 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNMAPPEDNOTINSOURCESTRATEGY_CONTINUE']._serialized_end=16254 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNMAPPEDNOTINSOURCESTRATEGY_HALT']._serialized_start=15936 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNMAPPEDNOTINSOURCESTRATEGY_HALT']._serialized_end=15942 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCEMAPPEDNOTINDESTINATIONSTRATEGY']._serialized_start=16277 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCEMAPPEDNOTINDESTINATIONSTRATEGY']._serialized_end=16763 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCEMAPPEDNOTINDESTINATIONSTRATEGY_CONTINUE']._serialized_start=16244 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCEMAPPEDNOTINDESTINATIONSTRATEGY_CONTINUE']._serialized_end=16254 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCEMAPPEDNOTINDESTINATIONSTRATEGY_DROP']._serialized_start=15944 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCEMAPPEDNOTINDESTINATIONSTRATEGY_DROP']._serialized_end=15950 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCEMAPPEDNOTINDESTINATIONSTRATEGY_HALT']._serialized_start=15936 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINSOURCEMAPPEDNOTINDESTINATIONSTRATEGY_HALT']._serialized_end=15942 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINDESTINATIONNOTINSOURCESTRATEGY']._serialized_start=16766 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINDESTINATIONNOTINSOURCESTRATEGY']._serialized_end=17242 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINDESTINATIONNOTINSOURCESTRATEGY_CONTINUE']._serialized_start=16244 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINDESTINATIONNOTINSOURCESTRATEGY_CONTINUE']._serialized_end=16254 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINDESTINATIONNOTINSOURCESTRATEGY_HALT']._serialized_start=15936 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINDESTINATIONNOTINSOURCESTRATEGY_HALT']._serialized_end=15942 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINDESTINATIONNOTINSOURCESTRATEGY_AUTOMAP']._serialized_start=4064 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_COLUMNSTRATEGY_COLUMNINDESTINATIONNOTINSOURCESTRATEGY_AUTOMAP']._serialized_end=4073 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING']._serialized_start=17257 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING']._serialized_end=18237 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING_TABLEMAPPING']._serialized_start=17671 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING_TABLEMAPPING']._serialized_end=18175 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING_TABLEMAPPING_COLUMNMAPPING']._serialized_start=17996 + _globals['_JOBTYPECONFIG_JOBTYPESYNC_SCHEMAMAPPING_TABLEMAPPING_COLUMNMAPPING']._serialized_end=18133 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT']._serialized_start=18258 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT']._serialized_end=19275 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_INCREMENTAL']._serialized_start=18618 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_INCREMENTAL']._serialized_end=18662 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_DATASAMPLING']._serialized_start=18664 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_DATASAMPLING']._serialized_end=18709 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLESCANFILTER']._serialized_start=18712 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLESCANFILTER']._serialized_end=19015 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_INCLUDEALL']._serialized_start=19017 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_INCLUDEALL']._serialized_end=19029 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLEPATTERNS']._serialized_start=19032 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLEPATTERNS']._serialized_end=19160 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLEIDENTIFIER']._serialized_start=19162 + _globals['_JOBTYPECONFIG_JOBTYPEPIIDETECT_TABLEIDENTIFIER']._serialized_end=19243 + _globals['_WORKFLOWOPTIONS']._serialized_start=19296 + _globals['_WORKFLOWOPTIONS']._serialized_end=19409 + _globals['_ACTIVITYOPTIONS']._serialized_start=19412 + _globals['_ACTIVITYOPTIONS']._serialized_end=19689 + _globals['_RETRYPOLICY']._serialized_start=19691 + _globals['_RETRYPOLICY']._serialized_end=19782 + _globals['_CREATEJOBRESPONSE']._serialized_start=19784 + _globals['_CREATEJOBRESPONSE']._serialized_end=19841 + _globals['_JOBMAPPINGTRANSFORMER']._serialized_start=19843 + _globals['_JOBMAPPINGTRANSFORMER']._serialized_end=19930 + _globals['_JOBMAPPING']._serialized_start=19933 + _globals['_JOBMAPPING']._serialized_end=20114 + _globals['_GETJOBREQUEST']._serialized_start=20116 + _globals['_GETJOBREQUEST']._serialized_end=20157 + _globals['_GETJOBRESPONSE']._serialized_start=20159 + _globals['_GETJOBRESPONSE']._serialized_end=20213 + _globals['_UPDATEJOBSCHEDULEREQUEST']._serialized_start=20215 + _globals['_UPDATEJOBSCHEDULEREQUEST']._serialized_end=20327 + _globals['_UPDATEJOBSCHEDULERESPONSE']._serialized_start=20329 + _globals['_UPDATEJOBSCHEDULERESPONSE']._serialized_end=20394 + _globals['_PAUSEJOBREQUEST']._serialized_start=20396 + _globals['_PAUSEJOBREQUEST']._serialized_end=20495 + _globals['_PAUSEJOBRESPONSE']._serialized_start=20497 + _globals['_PAUSEJOBRESPONSE']._serialized_end=20553 + _globals['_UPDATEJOBSOURCECONNECTIONREQUEST']._serialized_start=20556 + _globals['_UPDATEJOBSOURCECONNECTIONREQUEST']._serialized_end=20869 + _globals['_UPDATEJOBSOURCECONNECTIONRESPONSE']._serialized_start=20871 + _globals['_UPDATEJOBSOURCECONNECTIONRESPONSE']._serialized_end=20944 + _globals['_POSTGRESSOURCESCHEMASUBSET']._serialized_start=20946 + _globals['_POSTGRESSOURCESCHEMASUBSET']._serialized_end=21060 + _globals['_MYSQLSOURCESCHEMASUBSET']._serialized_start=21062 + _globals['_MYSQLSOURCESCHEMASUBSET']._serialized_end=21164 + _globals['_DYNAMODBSOURCESCHEMASUBSET']._serialized_start=21166 + _globals['_DYNAMODBSOURCESCHEMASUBSET']._serialized_end=21260 + _globals['_MSSQLSOURCESCHEMASUBSET']._serialized_start=21262 + _globals['_MSSQLSOURCESCHEMASUBSET']._serialized_end=21364 + _globals['_JOBSOURCESQLSUBETSCHEMAS']._serialized_start=21367 + _globals['_JOBSOURCESQLSUBETSCHEMAS']._serialized_end=21743 + _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSREQUEST']._serialized_start=21746 + _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSREQUEST']._serialized_end=21954 + _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSRESPONSE']._serialized_start=21956 + _globals['_SETJOBSOURCESQLCONNECTIONSUBSETSRESPONSE']._serialized_end=22036 + _globals['_UPDATEJOBDESTINATIONCONNECTIONREQUEST']._serialized_start=22039 + _globals['_UPDATEJOBDESTINATIONCONNECTIONREQUEST']._serialized_end=22261 + _globals['_UPDATEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_start=22263 + _globals['_UPDATEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_end=22341 + _globals['_DELETEJOBDESTINATIONCONNECTIONREQUEST']._serialized_start=22343 + _globals['_DELETEJOBDESTINATIONCONNECTIONREQUEST']._serialized_end=22431 + _globals['_DELETEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_start=22433 + _globals['_DELETEJOBDESTINATIONCONNECTIONRESPONSE']._serialized_end=22473 + _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST']._serialized_start=22476 + _globals['_CREATEJOBDESTINATIONCONNECTIONSREQUEST']._serialized_end=22632 + _globals['_CREATEJOBDESTINATIONCONNECTIONSRESPONSE']._serialized_start=22634 + _globals['_CREATEJOBDESTINATIONCONNECTIONSRESPONSE']._serialized_end=22713 + _globals['_DELETEJOBREQUEST']._serialized_start=22715 + _globals['_DELETEJOBREQUEST']._serialized_end=22759 + _globals['_DELETEJOBRESPONSE']._serialized_start=22761 + _globals['_DELETEJOBRESPONSE']._serialized_end=22780 + _globals['_ISJOBNAMEAVAILABLEREQUEST']._serialized_start=22782 + _globals['_ISJOBNAMEAVAILABLEREQUEST']._serialized_end=22897 + _globals['_ISJOBNAMEAVAILABLERESPONSE']._serialized_start=22899 + _globals['_ISJOBNAMEAVAILABLERESPONSE']._serialized_end=22962 + _globals['_GETJOBRUNSREQUEST']._serialized_start=22964 + _globals['_GETJOBRUNSREQUEST']._serialized_end=23067 + _globals['_GETJOBRUNSRESPONSE']._serialized_start=23069 + _globals['_GETJOBRUNSRESPONSE']._serialized_end=23139 + _globals['_GETJOBRUNREQUEST']._serialized_start=23141 + _globals['_GETJOBRUNREQUEST']._serialized_end=23230 + _globals['_GETJOBRUNRESPONSE']._serialized_start=23232 + _globals['_GETJOBRUNRESPONSE']._serialized_end=23299 + _globals['_CREATEJOBRUNREQUEST']._serialized_start=23301 + _globals['_CREATEJOBRUNREQUEST']._serialized_end=23355 + _globals['_CREATEJOBRUNRESPONSE']._serialized_start=23357 + _globals['_CREATEJOBRUNRESPONSE']._serialized_end=23379 + _globals['_CANCELJOBRUNREQUEST']._serialized_start=23381 + _globals['_CANCELJOBRUNREQUEST']._serialized_end=23473 + _globals['_CANCELJOBRUNRESPONSE']._serialized_start=23475 + _globals['_CANCELJOBRUNRESPONSE']._serialized_end=23497 + _globals['_JOB']._serialized_start=23500 + _globals['_JOB']._serialized_end=24302 + _globals['_JOBRECENTRUN']._serialized_start=24304 + _globals['_JOBRECENTRUN']._serialized_end=24407 + _globals['_GETJOBRECENTRUNSREQUEST']._serialized_start=24409 + _globals['_GETJOBRECENTRUNSREQUEST']._serialized_end=24467 + _globals['_GETJOBRECENTRUNSRESPONSE']._serialized_start=24469 + _globals['_GETJOBRECENTRUNSRESPONSE']._serialized_end=24557 + _globals['_JOBNEXTRUNS']._serialized_start=24559 + _globals['_JOBNEXTRUNS']._serialized_end=24638 + _globals['_GETJOBNEXTRUNSREQUEST']._serialized_start=24640 + _globals['_GETJOBNEXTRUNSREQUEST']._serialized_end=24696 + _globals['_GETJOBNEXTRUNSRESPONSE']._serialized_start=24698 + _globals['_GETJOBNEXTRUNSRESPONSE']._serialized_end=24779 + _globals['_GETJOBSTATUSREQUEST']._serialized_start=24781 + _globals['_GETJOBSTATUSREQUEST']._serialized_end=24835 + _globals['_GETJOBSTATUSRESPONSE']._serialized_start=24837 + _globals['_GETJOBSTATUSRESPONSE']._serialized_end=24909 + _globals['_JOBSTATUSRECORD']._serialized_start=24911 + _globals['_JOBSTATUSRECORD']._serialized_end=25011 + _globals['_GETJOBSTATUSESREQUEST']._serialized_start=25013 + _globals['_GETJOBSTATUSESREQUEST']._serialized_end=25077 + _globals['_GETJOBSTATUSESRESPONSE']._serialized_start=25079 + _globals['_GETJOBSTATUSESRESPONSE']._serialized_end=25163 + _globals['_ACTIVITYFAILURE']._serialized_start=25165 + _globals['_ACTIVITYFAILURE']._serialized_end=25208 + _globals['_PENDINGACTIVITY']._serialized_start=25211 + _globals['_PENDINGACTIVITY']._serialized_end=25409 + _globals['_JOBRUN']._serialized_start=25412 + _globals['_JOBRUN']._serialized_end=25761 + _globals['_JOBRUNEVENTTASKERROR']._serialized_start=25763 + _globals['_JOBRUNEVENTTASKERROR']._serialized_end=25844 + _globals['_JOBRUNEVENTTASK']._serialized_start=25847 + _globals['_JOBRUNEVENTTASK']._serialized_end=26018 + _globals['_JOBRUNSYNCMETADATA']._serialized_start=26020 + _globals['_JOBRUNSYNCMETADATA']._serialized_end=26086 + _globals['_JOBRUNEVENTMETADATA']._serialized_start=26088 + _globals['_JOBRUNEVENTMETADATA']._serialized_end=26202 + _globals['_JOBRUNEVENT']._serialized_start=26205 + _globals['_JOBRUNEVENT']._serialized_end=26490 + _globals['_GETJOBRUNEVENTSREQUEST']._serialized_start=26492 + _globals['_GETJOBRUNEVENTSREQUEST']._serialized_end=26587 + _globals['_GETJOBRUNEVENTSRESPONSE']._serialized_start=26589 + _globals['_GETJOBRUNEVENTSRESPONSE']._serialized_end=26706 + _globals['_DELETEJOBRUNREQUEST']._serialized_start=26708 + _globals['_DELETEJOBRUNREQUEST']._serialized_end=26800 + _globals['_DELETEJOBRUNRESPONSE']._serialized_start=26802 + _globals['_DELETEJOBRUNRESPONSE']._serialized_end=26824 + _globals['_TERMINATEJOBRUNREQUEST']._serialized_start=26826 + _globals['_TERMINATEJOBRUNREQUEST']._serialized_end=26921 + _globals['_TERMINATEJOBRUNRESPONSE']._serialized_start=26923 + _globals['_TERMINATEJOBRUNRESPONSE']._serialized_end=26948 + _globals['_GETJOBRUNLOGSSTREAMREQUEST']._serialized_start=26951 + _globals['_GETJOBRUNLOGSSTREAMREQUEST']._serialized_end=27257 + _globals['_GETJOBRUNLOGSSTREAMRESPONSE']._serialized_start=27260 + _globals['_GETJOBRUNLOGSSTREAMRESPONSE']._serialized_end=27532 + _globals['_GETJOBRUNLOGSSTREAMRESPONSE_LABELSENTRY']._serialized_start=27461 + _globals['_GETJOBRUNLOGSSTREAMRESPONSE_LABELSENTRY']._serialized_end=27518 + _globals['_GETJOBRUNLOGSREQUEST']._serialized_start=27535 + _globals['_GETJOBRUNLOGSREQUEST']._serialized_end=27802 + _globals['_GETJOBRUNLOGSRESPONSE']._serialized_start=27805 + _globals['_GETJOBRUNLOGSRESPONSE']._serialized_end=28160 + _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE']._serialized_start=27906 + _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE']._serialized_end=28160 + _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE_LABELSENTRY']._serialized_start=27461 + _globals['_GETJOBRUNLOGSRESPONSE_LOGLINE_LABELSENTRY']._serialized_end=27518 + _globals['_SETJOBWORKFLOWOPTIONSREQUEST']._serialized_start=28163 + _globals['_SETJOBWORKFLOWOPTIONSREQUEST']._serialized_end=28294 + _globals['_SETJOBWORKFLOWOPTIONSRESPONSE']._serialized_start=28296 + _globals['_SETJOBWORKFLOWOPTIONSRESPONSE']._serialized_end=28365 + _globals['_SETJOBSYNCOPTIONSREQUEST']._serialized_start=28367 + _globals['_SETJOBSYNCOPTIONSREQUEST']._serialized_end=28486 + _globals['_SETJOBSYNCOPTIONSRESPONSE']._serialized_start=28488 + _globals['_SETJOBSYNCOPTIONSRESPONSE']._serialized_end=28553 + _globals['_VALIDATEJOBMAPPINGSREQUEST']._serialized_start=28556 + _globals['_VALIDATEJOBMAPPINGSREQUEST']._serialized_end=28895 + _globals['_COLUMNERROR']._serialized_start=28898 + _globals['_COLUMNERROR']._serialized_end=29897 + _globals['_COLUMNERROR_COLUMNERRORREPORT']._serialized_start=29094 + _globals['_COLUMNERROR_COLUMNERRORREPORT']._serialized_end=29203 + _globals['_COLUMNERROR_COLUMNERRORCODE']._serialized_start=29206 + _globals['_COLUMNERROR_COLUMNERRORCODE']._serialized_end=29897 + _globals['_COLUMNWARNING']._serialized_start=29900 + _globals['_COLUMNWARNING']._serialized_end=30375 + _globals['_COLUMNWARNING_COLUMNWARNINGREPORT']._serialized_start=30110 + _globals['_COLUMNWARNING_COLUMNWARNINGREPORT']._serialized_end=30225 + _globals['_COLUMNWARNING_COLUMNWARNINGCODE']._serialized_start=30228 + _globals['_COLUMNWARNING_COLUMNWARNINGCODE']._serialized_end=30375 + _globals['_DATABASEERROR']._serialized_start=30378 + _globals['_DATABASEERROR']._serialized_end=30808 + _globals['_DATABASEERROR_DATABASEERRORREPORT']._serialized_start=30510 + _globals['_DATABASEERROR_DATABASEERRORREPORT']._serialized_end=30625 + _globals['_DATABASEERROR_DATABASEERRORCODE']._serialized_start=30628 + _globals['_DATABASEERROR_DATABASEERRORCODE']._serialized_end=30808 + _globals['_TABLEERROR']._serialized_start=30811 + _globals['_TABLEERROR']._serialized_end=31397 + _globals['_TABLEERROR_TABLEERRORREPORT']._serialized_start=30952 + _globals['_TABLEERROR_TABLEERRORREPORT']._serialized_end=31058 + _globals['_TABLEERROR_TABLEERRORCODE']._serialized_start=31061 + _globals['_TABLEERROR_TABLEERRORCODE']._serialized_end=31397 + _globals['_VALIDATEJOBMAPPINGSRESPONSE']._serialized_start=31400 + _globals['_VALIDATEJOBMAPPINGSRESPONSE']._serialized_end=31698 + _globals['_VALIDATESCHEMAREQUEST']._serialized_start=31700 + _globals['_VALIDATESCHEMAREQUEST']._serialized_end=31825 + _globals['_VALIDATESCHEMARESPONSE']._serialized_start=31828 + _globals['_VALIDATESCHEMARESPONSE']._serialized_end=32172 + _globals['_VALIDATESCHEMARESPONSE_TABLE']._serialized_start=32119 + _globals['_VALIDATESCHEMARESPONSE_TABLE']._serialized_end=32172 + _globals['_VIRTUALFOREIGNKEY']._serialized_start=32174 + _globals['_VIRTUALFOREIGNKEY']._serialized_end=32265 + _globals['_VIRTUALFOREIGNCONSTRAINT']._serialized_start=32268 + _globals['_VIRTUALFOREIGNCONSTRAINT']._serialized_end=32433 + _globals['_RUNCONTEXTKEY']._serialized_start=32436 + _globals['_RUNCONTEXTKEY']._serialized_end=32572 + _globals['_GETRUNCONTEXTREQUEST']._serialized_start=32574 + _globals['_GETRUNCONTEXTREQUEST']._serialized_end=32642 + _globals['_GETRUNCONTEXTRESPONSE']._serialized_start=32644 + _globals['_GETRUNCONTEXTRESPONSE']._serialized_end=32689 + _globals['_SETRUNCONTEXTREQUEST']._serialized_start=32691 + _globals['_SETRUNCONTEXTREQUEST']._serialized_end=32781 + _globals['_SETRUNCONTEXTRESPONSE']._serialized_start=32783 + _globals['_SETRUNCONTEXTRESPONSE']._serialized_end=32806 + _globals['_SETRUNCONTEXTSREQUEST']._serialized_start=32808 + _globals['_SETRUNCONTEXTSREQUEST']._serialized_end=32899 + _globals['_SETRUNCONTEXTSRESPONSE']._serialized_start=32901 + _globals['_SETRUNCONTEXTSRESPONSE']._serialized_end=32925 + _globals['_JOBHOOK']._serialized_start=32928 + _globals['_JOBHOOK']._serialized_end=33357 + _globals['_NEWJOBHOOK']._serialized_start=33360 + _globals['_NEWJOBHOOK']._serialized_end=33581 + _globals['_JOBHOOKCONFIG']._serialized_start=33584 + _globals['_JOBHOOKCONFIG']._serialized_end=34029 + _globals['_JOBHOOKCONFIG_JOBSQLHOOK']._serialized_start=33663 + _globals['_JOBHOOKCONFIG_JOBSQLHOOK']._serialized_end=33988 + _globals['_JOBHOOKCONFIG_JOBSQLHOOK_TIMING']._serialized_start=33828 + _globals['_JOBHOOKCONFIG_JOBSQLHOOK_TIMING']._serialized_end=33988 + _globals['_JOBHOOKTIMINGPRESYNC']._serialized_start=34031 + _globals['_JOBHOOKTIMINGPRESYNC']._serialized_end=34053 + _globals['_JOBHOOKTIMINGPOSTSYNC']._serialized_start=34055 + _globals['_JOBHOOKTIMINGPOSTSYNC']._serialized_end=34078 + _globals['_GETJOBHOOKSREQUEST']._serialized_start=34080 + _globals['_GETJOBHOOKSREQUEST']._serialized_end=34133 + _globals['_GETJOBHOOKSRESPONSE']._serialized_start=34135 + _globals['_GETJOBHOOKSRESPONSE']._serialized_end=34202 + _globals['_GETJOBHOOKREQUEST']._serialized_start=34204 + _globals['_GETJOBHOOKREQUEST']._serialized_end=34249 + _globals['_GETJOBHOOKRESPONSE']._serialized_start=34251 + _globals['_GETJOBHOOKRESPONSE']._serialized_end=34315 + _globals['_CREATEJOBHOOKREQUEST']._serialized_start=34317 + _globals['_CREATEJOBHOOKREQUEST']._serialized_end=34409 + _globals['_CREATEJOBHOOKRESPONSE']._serialized_start=34411 + _globals['_CREATEJOBHOOKRESPONSE']._serialized_end=34478 + _globals['_DELETEJOBHOOKREQUEST']._serialized_start=34480 + _globals['_DELETEJOBHOOKREQUEST']._serialized_end=34528 + _globals['_DELETEJOBHOOKRESPONSE']._serialized_start=34530 + _globals['_DELETEJOBHOOKRESPONSE']._serialized_end=34553 + _globals['_ISJOBHOOKNAMEAVAILABLEREQUEST']._serialized_start=34555 + _globals['_ISJOBHOOKNAMEAVAILABLEREQUEST']._serialized_end=34629 + _globals['_ISJOBHOOKNAMEAVAILABLERESPONSE']._serialized_start=34631 + _globals['_ISJOBHOOKNAMEAVAILABLERESPONSE']._serialized_end=34698 + _globals['_UPDATEJOBHOOKREQUEST']._serialized_start=34701 + _globals['_UPDATEJOBHOOKREQUEST']._serialized_end=34958 + _globals['_UPDATEJOBHOOKRESPONSE']._serialized_start=34960 + _globals['_UPDATEJOBHOOKRESPONSE']._serialized_end=35027 + _globals['_SETJOBHOOKENABLEDREQUEST']._serialized_start=35029 + _globals['_SETJOBHOOKENABLEDREQUEST']._serialized_end=35107 + _globals['_SETJOBHOOKENABLEDRESPONSE']._serialized_start=35109 + _globals['_SETJOBHOOKENABLEDRESPONSE']._serialized_end=35180 + _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST']._serialized_start=35183 + _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST']._serialized_end=35405 + _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST_TIMING']._serialized_start=35332 + _globals['_GETACTIVEJOBHOOKSBYTIMINGREQUEST_TIMING']._serialized_end=35405 + _globals['_GETACTIVEJOBHOOKSBYTIMINGRESPONSE']._serialized_start=35407 + _globals['_GETACTIVEJOBHOOKSBYTIMINGRESPONSE']._serialized_end=35488 + _globals['_GETPIIDETECTIONREPORTREQUEST']._serialized_start=35490 + _globals['_GETPIIDETECTIONREPORTREQUEST']._serialized_end=35600 + _globals['_GETPIIDETECTIONREPORTRESPONSE']._serialized_start=35602 + _globals['_GETPIIDETECTIONREPORTRESPONSE']._serialized_end=35692 + _globals['_PIIDETECTIONREPORT']._serialized_start=35695 + _globals['_PIIDETECTIONREPORT']._serialized_end=36317 + _globals['_PIIDETECTIONREPORT_TABLEREPORT']._serialized_start=35789 + _globals['_PIIDETECTIONREPORT_TABLEREPORT']._serialized_end=36317 + _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT']._serialized_start=35937 + _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT']._serialized_end=36317 + _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT_REGEX']._serialized_start=36183 + _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT_REGEX']._serialized_end=36218 + _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT_LLM']._serialized_start=36220 + _globals['_PIIDETECTIONREPORT_TABLEREPORT_COLUMNREPORT_LLM']._serialized_end=36285 + _globals['_JOBSERVICE']._serialized_start=37127 + _globals['_JOBSERVICE']._serialized_end=41399 # @@protoc_insertion_point(module_scope) diff --git a/python/src/neosync/mgmt/v1alpha1/job_pb2.pyi b/python/src/neosync/mgmt/v1alpha1/job_pb2.pyi index bbec6e6cbd..a60c59be6b 100644 --- a/python/src/neosync/mgmt/v1alpha1/job_pb2.pyi +++ b/python/src/neosync/mgmt/v1alpha1/job_pb2.pyi @@ -630,8 +630,172 @@ class CreateJobRequest(_message.Message): class JobTypeConfig(_message.Message): __slots__ = ("sync", "pii_detect") class JobTypeSync(_message.Message): - __slots__ = () - def __init__(self) -> None: ... + __slots__ = ("schema_change", "schema_mappings") + class SchemaChange(_message.Message): + __slots__ = ("schema_strategy", "table_strategy", "column_strategy") + SCHEMA_STRATEGY_FIELD_NUMBER: _ClassVar[int] + TABLE_STRATEGY_FIELD_NUMBER: _ClassVar[int] + COLUMN_STRATEGY_FIELD_NUMBER: _ClassVar[int] + schema_strategy: JobTypeConfig.JobTypeSync.SchemaStrategy + table_strategy: JobTypeConfig.JobTypeSync.TableStrategy + column_strategy: JobTypeConfig.JobTypeSync.ColumnStrategy + def __init__(self, schema_strategy: _Optional[_Union[JobTypeConfig.JobTypeSync.SchemaStrategy, _Mapping]] = ..., table_strategy: _Optional[_Union[JobTypeConfig.JobTypeSync.TableStrategy, _Mapping]] = ..., column_strategy: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy, _Mapping]] = ...) -> None: ... + class SchemaStrategy(_message.Message): + __slots__ = ("map_all_schemas", "map_defined_schemas") + class MapAllSchemas(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + class MapDefinedSchemas(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + MAP_ALL_SCHEMAS_FIELD_NUMBER: _ClassVar[int] + MAP_DEFINED_SCHEMAS_FIELD_NUMBER: _ClassVar[int] + map_all_schemas: JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas + map_defined_schemas: JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas + def __init__(self, map_all_schemas: _Optional[_Union[JobTypeConfig.JobTypeSync.SchemaStrategy.MapAllSchemas, _Mapping]] = ..., map_defined_schemas: _Optional[_Union[JobTypeConfig.JobTypeSync.SchemaStrategy.MapDefinedSchemas, _Mapping]] = ...) -> None: ... + class TableStrategy(_message.Message): + __slots__ = ("map_all_tables", "map_defined_tables") + class MapAllTables(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + class MapDefinedTables(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + MAP_ALL_TABLES_FIELD_NUMBER: _ClassVar[int] + MAP_DEFINED_TABLES_FIELD_NUMBER: _ClassVar[int] + map_all_tables: JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables + map_defined_tables: JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables + def __init__(self, map_all_tables: _Optional[_Union[JobTypeConfig.JobTypeSync.TableStrategy.MapAllTables, _Mapping]] = ..., map_defined_tables: _Optional[_Union[JobTypeConfig.JobTypeSync.TableStrategy.MapDefinedTables, _Mapping]] = ...) -> None: ... + class ColumnStrategy(_message.Message): + __slots__ = ("map_all_columns", "map_defined_columns") + class MapAllColumns(_message.Message): + __slots__ = ("column_in_source_not_mapped", "column_mapped_not_in_source", "column_in_source_mapped_not_in_destination", "column_in_destination_no_longer_in_source") + COLUMN_IN_SOURCE_NOT_MAPPED_FIELD_NUMBER: _ClassVar[int] + COLUMN_MAPPED_NOT_IN_SOURCE_FIELD_NUMBER: _ClassVar[int] + COLUMN_IN_SOURCE_MAPPED_NOT_IN_DESTINATION_FIELD_NUMBER: _ClassVar[int] + COLUMN_IN_DESTINATION_NO_LONGER_IN_SOURCE_FIELD_NUMBER: _ClassVar[int] + column_in_source_not_mapped: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy + column_mapped_not_in_source: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy + column_in_source_mapped_not_in_destination: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy + column_in_destination_no_longer_in_source: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy + def __init__(self, column_in_source_not_mapped: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy, _Mapping]] = ..., column_mapped_not_in_source: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy, _Mapping]] = ..., column_in_source_mapped_not_in_destination: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy, _Mapping]] = ..., column_in_destination_no_longer_in_source: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy, _Mapping]] = ...) -> None: ... + class MapDefinedColumns(_message.Message): + __slots__ = ("column_mapped_not_in_source", "column_in_source_mapped_not_in_destination") + COLUMN_MAPPED_NOT_IN_SOURCE_FIELD_NUMBER: _ClassVar[int] + COLUMN_IN_SOURCE_MAPPED_NOT_IN_DESTINATION_FIELD_NUMBER: _ClassVar[int] + column_mapped_not_in_source: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy + column_in_source_mapped_not_in_destination: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy + def __init__(self, column_mapped_not_in_source: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy, _Mapping]] = ..., column_in_source_mapped_not_in_destination: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy, _Mapping]] = ...) -> None: ... + class ColumnInSourceNotMappedStrategy(_message.Message): + __slots__ = ("passthrough", "auto_map", "halt", "drop") + class Passthrough(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + class AutoMap(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + class Halt(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + class Drop(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + PASSTHROUGH_FIELD_NUMBER: _ClassVar[int] + AUTO_MAP_FIELD_NUMBER: _ClassVar[int] + HALT_FIELD_NUMBER: _ClassVar[int] + DROP_FIELD_NUMBER: _ClassVar[int] + passthrough: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough + auto_map: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap + halt: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt + drop: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop + def __init__(self, passthrough: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Passthrough, _Mapping]] = ..., auto_map: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.AutoMap, _Mapping]] = ..., halt: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Halt, _Mapping]] = ..., drop: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceNotMappedStrategy.Drop, _Mapping]] = ...) -> None: ... + class ColumnMappedNotInSourceStrategy(_message.Message): + __slots__ = ("halt",) + class Continue(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + class Halt(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + CONTINUE_FIELD_NUMBER: _ClassVar[int] + HALT_FIELD_NUMBER: _ClassVar[int] + halt: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt + def __init__(self, halt: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnMappedNotInSourceStrategy.Halt, _Mapping]] = ..., **kwargs) -> None: ... + class ColumnInSourceMappedNotInDestinationStrategy(_message.Message): + __slots__ = ("drop", "halt") + class Continue(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + class Drop(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + class Halt(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + CONTINUE_FIELD_NUMBER: _ClassVar[int] + DROP_FIELD_NUMBER: _ClassVar[int] + HALT_FIELD_NUMBER: _ClassVar[int] + drop: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop + halt: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt + def __init__(self, drop: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Drop, _Mapping]] = ..., halt: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInSourceMappedNotInDestinationStrategy.Halt, _Mapping]] = ..., **kwargs) -> None: ... + class ColumnInDestinationNotInSourceStrategy(_message.Message): + __slots__ = ("halt", "auto_map") + class Continue(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + class Halt(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + class AutoMap(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + CONTINUE_FIELD_NUMBER: _ClassVar[int] + HALT_FIELD_NUMBER: _ClassVar[int] + AUTO_MAP_FIELD_NUMBER: _ClassVar[int] + halt: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt + auto_map: JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap + def __init__(self, halt: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.Halt, _Mapping]] = ..., auto_map: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.ColumnInDestinationNotInSourceStrategy.AutoMap, _Mapping]] = ..., **kwargs) -> None: ... + MAP_ALL_COLUMNS_FIELD_NUMBER: _ClassVar[int] + MAP_DEFINED_COLUMNS_FIELD_NUMBER: _ClassVar[int] + map_all_columns: JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns + map_defined_columns: JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns + def __init__(self, map_all_columns: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.MapAllColumns, _Mapping]] = ..., map_defined_columns: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy.MapDefinedColumns, _Mapping]] = ...) -> None: ... + class SchemaMapping(_message.Message): + __slots__ = ("schema", "destination_schema", "table_mappings", "table_strategy", "column_strategy") + class TableMapping(_message.Message): + __slots__ = ("table", "destination_table", "column_mappings", "column_strategy") + class ColumnMapping(_message.Message): + __slots__ = ("column", "transformer") + COLUMN_FIELD_NUMBER: _ClassVar[int] + TRANSFORMER_FIELD_NUMBER: _ClassVar[int] + column: str + transformer: _transformer_pb2.TransformerConfig + def __init__(self, column: _Optional[str] = ..., transformer: _Optional[_Union[_transformer_pb2.TransformerConfig, _Mapping]] = ...) -> None: ... + TABLE_FIELD_NUMBER: _ClassVar[int] + DESTINATION_TABLE_FIELD_NUMBER: _ClassVar[int] + COLUMN_MAPPINGS_FIELD_NUMBER: _ClassVar[int] + COLUMN_STRATEGY_FIELD_NUMBER: _ClassVar[int] + table: str + destination_table: str + column_mappings: _containers.RepeatedCompositeFieldContainer[JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping] + column_strategy: JobTypeConfig.JobTypeSync.ColumnStrategy + def __init__(self, table: _Optional[str] = ..., destination_table: _Optional[str] = ..., column_mappings: _Optional[_Iterable[_Union[JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping.ColumnMapping, _Mapping]]] = ..., column_strategy: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy, _Mapping]] = ...) -> None: ... + SCHEMA_FIELD_NUMBER: _ClassVar[int] + DESTINATION_SCHEMA_FIELD_NUMBER: _ClassVar[int] + TABLE_MAPPINGS_FIELD_NUMBER: _ClassVar[int] + TABLE_STRATEGY_FIELD_NUMBER: _ClassVar[int] + COLUMN_STRATEGY_FIELD_NUMBER: _ClassVar[int] + schema: str + destination_schema: str + table_mappings: _containers.RepeatedCompositeFieldContainer[JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping] + table_strategy: JobTypeConfig.JobTypeSync.TableStrategy + column_strategy: JobTypeConfig.JobTypeSync.ColumnStrategy + def __init__(self, schema: _Optional[str] = ..., destination_schema: _Optional[str] = ..., table_mappings: _Optional[_Iterable[_Union[JobTypeConfig.JobTypeSync.SchemaMapping.TableMapping, _Mapping]]] = ..., table_strategy: _Optional[_Union[JobTypeConfig.JobTypeSync.TableStrategy, _Mapping]] = ..., column_strategy: _Optional[_Union[JobTypeConfig.JobTypeSync.ColumnStrategy, _Mapping]] = ...) -> None: ... + SCHEMA_CHANGE_FIELD_NUMBER: _ClassVar[int] + SCHEMA_MAPPINGS_FIELD_NUMBER: _ClassVar[int] + schema_change: JobTypeConfig.JobTypeSync.SchemaChange + schema_mappings: _containers.RepeatedCompositeFieldContainer[JobTypeConfig.JobTypeSync.SchemaMapping] + def __init__(self, schema_change: _Optional[_Union[JobTypeConfig.JobTypeSync.SchemaChange, _Mapping]] = ..., schema_mappings: _Optional[_Iterable[_Union[JobTypeConfig.JobTypeSync.SchemaMapping, _Mapping]]] = ...) -> None: ... class JobTypePiiDetect(_message.Message): __slots__ = ("data_sampling", "table_scan_filter", "user_prompt", "incremental") class Incremental(_message.Message): diff --git a/worker/pkg/workflows/datasync/activities/shared/shared.go b/worker/pkg/workflows/datasync/activities/shared/shared.go index 6c310e1762..10948d4c74 100644 --- a/worker/pkg/workflows/datasync/activities/shared/shared.go +++ b/worker/pkg/workflows/datasync/activities/shared/shared.go @@ -92,15 +92,28 @@ func GetUniqueSchemasFromJob(job *mgmtv1alpha1.Job) []string { } return schemas default: - return GetUniqueSchemasFromMappings(job.GetMappings()) + jtms := make([]*JobTransformationMapping, 0, len(job.GetMappings())) + for _, mapping := range job.GetMappings() { + jtms = append(jtms, &JobTransformationMapping{ + JobMapping: mapping, + }) + } + return GetUniqueSchemasFromMappings(jtms) } } +type JobTransformationMapping struct { + *mgmtv1alpha1.JobMapping + + DestinationSchema string + DestinationTable string +} + // Parses the job mappings and returns the unique set of schemas found -func GetUniqueSchemasFromMappings(mappings []*mgmtv1alpha1.JobMapping) []string { +func GetUniqueSchemasFromMappings(mappings []*JobTransformationMapping) []string { schemas := map[string]struct{}{} for _, mapping := range mappings { - schemas[mapping.Schema] = struct{}{} + schemas[mapping.GetSchema()] = struct{}{} } output := make([]string, 0, len(schemas)) @@ -148,7 +161,7 @@ func GetUniqueTablesFromMappings(mappings []*mgmtv1alpha1.JobMapping) map[string return filteredTables } -func GetSchemaTablesMapFromMappings(mappings []*mgmtv1alpha1.JobMapping) map[string][]string { +func GetSchemaTablesMapFromMappings(mappings []*JobTransformationMapping) map[string][]string { schemaTablesMap := map[string]map[string]struct{}{} for _, mapping := range mappings { _, ok := schemaTablesMap[mapping.Schema]