diff --git a/pkg/jobs/jobspb/jobs.pb.go b/pkg/jobs/jobspb/jobs.pb.go index e8e03b72bfe9..f18d5db3960c 100644 --- a/pkg/jobs/jobspb/jobs.pb.go +++ b/pkg/jobs/jobspb/jobs.pb.go @@ -12,6 +12,7 @@ import hlc "github.com/cockroachdb/cockroach/pkg/util/hlc" import github_com_cockroachdb_cockroach_pkg_roachpb "github.com/cockroachdb/cockroach/pkg/roachpb" import github_com_cockroachdb_cockroach_pkg_sql_sqlbase "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" +import github_com_cockroachdb_cockroach_pkg_sql_sem_tree "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" import encoding_binary "encoding/binary" @@ -55,7 +56,7 @@ func (x Status) String() string { return proto.EnumName(Status_name, int32(x)) } func (Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{0} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{0} } type Type int32 @@ -67,6 +68,7 @@ const ( TypeSchemaChange Type = 3 TypeImport Type = 4 TypeChangefeed Type = 5 + TypeCreateStats Type = 6 ) var Type_name = map[int32]string{ @@ -76,6 +78,7 @@ var Type_name = map[int32]string{ 3: "SCHEMA_CHANGE", 4: "IMPORT", 5: "CHANGEFEED", + 6: "CREATE_STATS", } var Type_value = map[string]int32{ "UNSPECIFIED": 0, @@ -84,10 +87,11 @@ var Type_value = map[string]int32{ "SCHEMA_CHANGE": 3, "IMPORT": 4, "CHANGEFEED": 5, + "CREATE_STATS": 6, } func (Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{1} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{1} } type Lease struct { @@ -103,7 +107,7 @@ func (m *Lease) Reset() { *m = Lease{} } func (m *Lease) String() string { return proto.CompactTextString(m) } func (*Lease) ProtoMessage() {} func (*Lease) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{0} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{0} } func (m *Lease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -141,7 +145,7 @@ func (m *BackupDetails) Reset() { *m = BackupDetails{} } func (m *BackupDetails) String() string { return proto.CompactTextString(m) } func (*BackupDetails) ProtoMessage() {} func (*BackupDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{1} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{1} } func (m *BackupDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -175,7 +179,7 @@ func (m *BackupProgress) Reset() { *m = BackupProgress{} } func (m *BackupProgress) String() string { return proto.CompactTextString(m) } func (*BackupProgress) ProtoMessage() {} func (*BackupProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{2} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{2} } func (m *BackupProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -214,7 +218,7 @@ func (m *RestoreDetails) Reset() { *m = RestoreDetails{} } func (m *RestoreDetails) String() string { return proto.CompactTextString(m) } func (*RestoreDetails) ProtoMessage() {} func (*RestoreDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{3} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{3} } func (m *RestoreDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -250,7 +254,7 @@ func (m *RestoreDetails_TableRewrite) Reset() { *m = RestoreDetails_Tabl func (m *RestoreDetails_TableRewrite) String() string { return proto.CompactTextString(m) } func (*RestoreDetails_TableRewrite) ProtoMessage() {} func (*RestoreDetails_TableRewrite) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{3, 0} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{3, 0} } func (m *RestoreDetails_TableRewrite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -285,7 +289,7 @@ func (m *RestoreProgress) Reset() { *m = RestoreProgress{} } func (m *RestoreProgress) String() string { return proto.CompactTextString(m) } func (*RestoreProgress) ProtoMessage() {} func (*RestoreProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{4} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{4} } func (m *RestoreProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -333,7 +337,7 @@ func (m *ImportDetails) Reset() { *m = ImportDetails{} } func (m *ImportDetails) String() string { return proto.CompactTextString(m) } func (*ImportDetails) ProtoMessage() {} func (*ImportDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{5} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{5} } func (m *ImportDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -370,7 +374,7 @@ func (m *ImportDetails_Table) Reset() { *m = ImportDetails_Table{} } func (m *ImportDetails_Table) String() string { return proto.CompactTextString(m) } func (*ImportDetails_Table) ProtoMessage() {} func (*ImportDetails_Table) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{5, 0} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{5, 0} } func (m *ImportDetails_Table) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -411,7 +415,7 @@ func (m *ImportProgress) Reset() { *m = ImportProgress{} } func (m *ImportProgress) String() string { return proto.CompactTextString(m) } func (*ImportProgress) ProtoMessage() {} func (*ImportProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{6} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{6} } func (m *ImportProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -446,7 +450,7 @@ func (m *ResumeSpanList) Reset() { *m = ResumeSpanList{} } func (m *ResumeSpanList) String() string { return proto.CompactTextString(m) } func (*ResumeSpanList) ProtoMessage() {} func (*ResumeSpanList) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{7} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{7} } func (m *ResumeSpanList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -483,7 +487,7 @@ func (m *DroppedTableDetails) Reset() { *m = DroppedTableDetails{} } func (m *DroppedTableDetails) String() string { return proto.CompactTextString(m) } func (*DroppedTableDetails) ProtoMessage() {} func (*DroppedTableDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{8} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{8} } func (m *DroppedTableDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -527,7 +531,7 @@ func (m *SchemaChangeDetails) Reset() { *m = SchemaChangeDetails{} } func (m *SchemaChangeDetails) String() string { return proto.CompactTextString(m) } func (*SchemaChangeDetails) ProtoMessage() {} func (*SchemaChangeDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{9} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{9} } func (m *SchemaChangeDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -561,7 +565,7 @@ func (m *SchemaChangeProgress) Reset() { *m = SchemaChangeProgress{} } func (m *SchemaChangeProgress) String() string { return proto.CompactTextString(m) } func (*SchemaChangeProgress) ProtoMessage() {} func (*SchemaChangeProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{10} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{10} } func (m *SchemaChangeProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -596,7 +600,7 @@ func (m *ChangefeedTarget) Reset() { *m = ChangefeedTarget{} } func (m *ChangefeedTarget) String() string { return proto.CompactTextString(m) } func (*ChangefeedTarget) ProtoMessage() {} func (*ChangefeedTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{11} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{11} } func (m *ChangefeedTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -651,7 +655,7 @@ func (m *ChangefeedDetails) Reset() { *m = ChangefeedDetails{} } func (m *ChangefeedDetails) String() string { return proto.CompactTextString(m) } func (*ChangefeedDetails) ProtoMessage() {} func (*ChangefeedDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{12} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{12} } func (m *ChangefeedDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -687,7 +691,7 @@ func (m *ResolvedSpan) Reset() { *m = ResolvedSpan{} } func (m *ResolvedSpan) String() string { return proto.CompactTextString(m) } func (*ResolvedSpan) ProtoMessage() {} func (*ResolvedSpan) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{13} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{13} } func (m *ResolvedSpan) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -722,7 +726,7 @@ func (m *ChangefeedProgress) Reset() { *m = ChangefeedProgress{} } func (m *ChangefeedProgress) String() string { return proto.CompactTextString(m) } func (*ChangefeedProgress) ProtoMessage() {} func (*ChangefeedProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{14} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{14} } func (m *ChangefeedProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -747,6 +751,113 @@ func (m *ChangefeedProgress) XXX_DiscardUnknown() { var xxx_messageInfo_ChangefeedProgress proto.InternalMessageInfo +type CreateStatsDetails struct { + Name github_com_cockroachdb_cockroach_pkg_sql_sem_tree.Name `protobuf:"bytes,1,opt,name=name,proto3,casttype=github.com/cockroachdb/cockroach/pkg/sql/sem/tree.Name" json:"name,omitempty"` + Table sqlbase.TableDescriptor `protobuf:"bytes,2,opt,name=table,proto3" json:"table"` + ColumnLists []CreateStatsDetails_ColList `protobuf:"bytes,3,rep,name=column_lists,json=columnLists,proto3" json:"column_lists"` + Statement string `protobuf:"bytes,4,opt,name=Statement,proto3" json:"Statement,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateStatsDetails) Reset() { *m = CreateStatsDetails{} } +func (m *CreateStatsDetails) String() string { return proto.CompactTextString(m) } +func (*CreateStatsDetails) ProtoMessage() {} +func (*CreateStatsDetails) Descriptor() ([]byte, []int) { + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{15} +} +func (m *CreateStatsDetails) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CreateStatsDetails) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *CreateStatsDetails) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateStatsDetails.Merge(dst, src) +} +func (m *CreateStatsDetails) XXX_Size() int { + return m.Size() +} +func (m *CreateStatsDetails) XXX_DiscardUnknown() { + xxx_messageInfo_CreateStatsDetails.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateStatsDetails proto.InternalMessageInfo + +type CreateStatsDetails_ColList struct { + IDs []github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID `protobuf:"varint,1,rep,packed,name=ids,proto3,casttype=github.com/cockroachdb/cockroach/pkg/sql/sqlbase.ColumnID" json:"ids,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateStatsDetails_ColList) Reset() { *m = CreateStatsDetails_ColList{} } +func (m *CreateStatsDetails_ColList) String() string { return proto.CompactTextString(m) } +func (*CreateStatsDetails_ColList) ProtoMessage() {} +func (*CreateStatsDetails_ColList) Descriptor() ([]byte, []int) { + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{15, 0} +} +func (m *CreateStatsDetails_ColList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CreateStatsDetails_ColList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *CreateStatsDetails_ColList) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateStatsDetails_ColList.Merge(dst, src) +} +func (m *CreateStatsDetails_ColList) XXX_Size() int { + return m.Size() +} +func (m *CreateStatsDetails_ColList) XXX_DiscardUnknown() { + xxx_messageInfo_CreateStatsDetails_ColList.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateStatsDetails_ColList proto.InternalMessageInfo + +type CreateStatsProgress struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateStatsProgress) Reset() { *m = CreateStatsProgress{} } +func (m *CreateStatsProgress) String() string { return proto.CompactTextString(m) } +func (*CreateStatsProgress) ProtoMessage() {} +func (*CreateStatsProgress) Descriptor() ([]byte, []int) { + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{16} +} +func (m *CreateStatsProgress) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CreateStatsProgress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *CreateStatsProgress) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateStatsProgress.Merge(dst, src) +} +func (m *CreateStatsProgress) XXX_Size() int { + return m.Size() +} +func (m *CreateStatsProgress) XXX_DiscardUnknown() { + xxx_messageInfo_CreateStatsProgress.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateStatsProgress proto.InternalMessageInfo + type Payload struct { Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` @@ -765,6 +876,7 @@ type Payload struct { // *Payload_SchemaChange // *Payload_Import // *Payload_Changefeed + // *Payload_CreateStats Details isPayload_Details `protobuf_oneof:"details"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_sizecache int32 `json:"-"` @@ -774,7 +886,7 @@ func (m *Payload) Reset() { *m = Payload{} } func (m *Payload) String() string { return proto.CompactTextString(m) } func (*Payload) ProtoMessage() {} func (*Payload) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{15} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{17} } func (m *Payload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -820,12 +932,16 @@ type Payload_Import struct { type Payload_Changefeed struct { Changefeed *ChangefeedDetails `protobuf:"bytes,14,opt,name=changefeed,proto3,oneof"` } +type Payload_CreateStats struct { + CreateStats *CreateStatsDetails `protobuf:"bytes,15,opt,name=createStats,proto3,oneof"` +} func (*Payload_Backup) isPayload_Details() {} func (*Payload_Restore) isPayload_Details() {} func (*Payload_SchemaChange) isPayload_Details() {} func (*Payload_Import) isPayload_Details() {} func (*Payload_Changefeed) isPayload_Details() {} +func (*Payload_CreateStats) isPayload_Details() {} func (m *Payload) GetDetails() isPayload_Details { if m != nil { @@ -869,6 +985,13 @@ func (m *Payload) GetChangefeed() *ChangefeedDetails { return nil } +func (m *Payload) GetCreateStats() *CreateStatsDetails { + if x, ok := m.GetDetails().(*Payload_CreateStats); ok { + return x.CreateStats + } + return nil +} + // XXX_OneofFuncs is for the internal use of the proto package. func (*Payload) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { return _Payload_OneofMarshaler, _Payload_OneofUnmarshaler, _Payload_OneofSizer, []interface{}{ @@ -877,6 +1000,7 @@ func (*Payload) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error (*Payload_SchemaChange)(nil), (*Payload_Import)(nil), (*Payload_Changefeed)(nil), + (*Payload_CreateStats)(nil), } } @@ -909,6 +1033,11 @@ func _Payload_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { if err := b.EncodeMessage(x.Changefeed); err != nil { return err } + case *Payload_CreateStats: + _ = b.EncodeVarint(15<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.CreateStats); err != nil { + return err + } case nil: default: return fmt.Errorf("Payload.Details has unexpected type %T", x) @@ -959,6 +1088,14 @@ func _Payload_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer err := b.DecodeMessage(msg) m.Details = &Payload_Changefeed{msg} return true, err + case 15: // details.createStats + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(CreateStatsDetails) + err := b.DecodeMessage(msg) + m.Details = &Payload_CreateStats{msg} + return true, err default: return false, nil } @@ -993,6 +1130,11 @@ func _Payload_OneofSizer(msg proto.Message) (n int) { n += 1 // tag and wire n += proto.SizeVarint(uint64(s)) n += s + case *Payload_CreateStats: + s := proto.Size(x.CreateStats) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s case nil: default: panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) @@ -1013,6 +1155,7 @@ type Progress struct { // *Progress_SchemaChange // *Progress_Import // *Progress_Changefeed + // *Progress_CreateStats Details isProgress_Details `protobuf_oneof:"details"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1022,7 +1165,7 @@ func (m *Progress) Reset() { *m = Progress{} } func (m *Progress) String() string { return proto.CompactTextString(m) } func (*Progress) ProtoMessage() {} func (*Progress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_7f594aaf3aa20aa4, []int{16} + return fileDescriptor_jobs_ebddd3799e9c24d1, []int{18} } func (m *Progress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1079,6 +1222,9 @@ type Progress_Import struct { type Progress_Changefeed struct { Changefeed *ChangefeedProgress `protobuf:"bytes,14,opt,name=changefeed,proto3,oneof"` } +type Progress_CreateStats struct { + CreateStats *CreateStatsProgress `protobuf:"bytes,15,opt,name=createStats,proto3,oneof"` +} func (*Progress_FractionCompleted) isProgress_Progress() {} func (*Progress_HighWater) isProgress_Progress() {} @@ -1087,6 +1233,7 @@ func (*Progress_Restore) isProgress_Details() {} func (*Progress_SchemaChange) isProgress_Details() {} func (*Progress_Import) isProgress_Details() {} func (*Progress_Changefeed) isProgress_Details() {} +func (*Progress_CreateStats) isProgress_Details() {} func (m *Progress) GetProgress() isProgress_Progress { if m != nil { @@ -1150,6 +1297,13 @@ func (m *Progress) GetChangefeed() *ChangefeedProgress { return nil } +func (m *Progress) GetCreateStats() *CreateStatsProgress { + if x, ok := m.GetDetails().(*Progress_CreateStats); ok { + return x.CreateStats + } + return nil +} + // XXX_OneofFuncs is for the internal use of the proto package. func (*Progress) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { return _Progress_OneofMarshaler, _Progress_OneofUnmarshaler, _Progress_OneofSizer, []interface{}{ @@ -1160,6 +1314,7 @@ func (*Progress) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) erro (*Progress_SchemaChange)(nil), (*Progress_Import)(nil), (*Progress_Changefeed)(nil), + (*Progress_CreateStats)(nil), } } @@ -1206,6 +1361,11 @@ func _Progress_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { if err := b.EncodeMessage(x.Changefeed); err != nil { return err } + case *Progress_CreateStats: + _ = b.EncodeVarint(15<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.CreateStats); err != nil { + return err + } case nil: default: return fmt.Errorf("Progress.Details has unexpected type %T", x) @@ -1271,6 +1431,14 @@ func _Progress_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Details = &Progress_Changefeed{msg} return true, err + case 15: // details.createStats + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(CreateStatsProgress) + err := b.DecodeMessage(msg) + m.Details = &Progress_CreateStats{msg} + return true, err default: return false, nil } @@ -1319,6 +1487,11 @@ func _Progress_OneofSizer(msg proto.Message) (n int) { n += 1 // tag and wire n += proto.SizeVarint(uint64(s)) n += s + case *Progress_CreateStats: + s := proto.Size(x.CreateStats) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s case nil: default: panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) @@ -1347,6 +1520,9 @@ func init() { proto.RegisterMapType((ChangefeedTargets)(nil), "cockroach.sql.jobs.jobspb.ChangefeedDetails.TargetsEntry") proto.RegisterType((*ResolvedSpan)(nil), "cockroach.sql.jobs.jobspb.ResolvedSpan") proto.RegisterType((*ChangefeedProgress)(nil), "cockroach.sql.jobs.jobspb.ChangefeedProgress") + proto.RegisterType((*CreateStatsDetails)(nil), "cockroach.sql.jobs.jobspb.CreateStatsDetails") + proto.RegisterType((*CreateStatsDetails_ColList)(nil), "cockroach.sql.jobs.jobspb.CreateStatsDetails.ColList") + proto.RegisterType((*CreateStatsProgress)(nil), "cockroach.sql.jobs.jobspb.CreateStatsProgress") proto.RegisterType((*Payload)(nil), "cockroach.sql.jobs.jobspb.Payload") proto.RegisterType((*Progress)(nil), "cockroach.sql.jobs.jobspb.Progress") proto.RegisterEnum("cockroach.sql.jobs.jobspb.Status", Status_name, Status_value) @@ -2115,6 +2291,109 @@ func (m *ChangefeedProgress) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *CreateStatsDetails) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateStatsDetails) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintJobs(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + dAtA[i] = 0x12 + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.Table.Size())) + n14, err := m.Table.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n14 + if len(m.ColumnLists) > 0 { + for _, msg := range m.ColumnLists { + dAtA[i] = 0x1a + i++ + i = encodeVarintJobs(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Statement) > 0 { + dAtA[i] = 0x22 + i++ + i = encodeVarintJobs(dAtA, i, uint64(len(m.Statement))) + i += copy(dAtA[i:], m.Statement) + } + return i, nil +} + +func (m *CreateStatsDetails_ColList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateStatsDetails_ColList) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.IDs) > 0 { + dAtA16 := make([]byte, len(m.IDs)*10) + var j15 int + for _, num := range m.IDs { + for num >= 1<<7 { + dAtA16[j15] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j15++ + } + dAtA16[j15] = uint8(num) + j15++ + } + dAtA[i] = 0xa + i++ + i = encodeVarintJobs(dAtA, i, uint64(j15)) + i += copy(dAtA[i:], dAtA16[:j15]) + } + return i, nil +} + +func (m *CreateStatsProgress) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateStatsProgress) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + func (m *Payload) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2153,21 +2432,21 @@ func (m *Payload) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintJobs(dAtA, i, uint64(m.FinishedMicros)) } if len(m.DescriptorIDs) > 0 { - dAtA15 := make([]byte, len(m.DescriptorIDs)*10) - var j14 int + dAtA18 := make([]byte, len(m.DescriptorIDs)*10) + var j17 int for _, num := range m.DescriptorIDs { for num >= 1<<7 { - dAtA15[j14] = uint8(uint64(num)&0x7f | 0x80) + dAtA18[j17] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j14++ + j17++ } - dAtA15[j14] = uint8(num) - j14++ + dAtA18[j17] = uint8(num) + j17++ } dAtA[i] = 0x32 i++ - i = encodeVarintJobs(dAtA, i, uint64(j14)) - i += copy(dAtA[i:], dAtA15[:j14]) + i = encodeVarintJobs(dAtA, i, uint64(j17)) + i += copy(dAtA[i:], dAtA18[:j17]) } if len(m.Error) > 0 { dAtA[i] = 0x42 @@ -2179,18 +2458,18 @@ func (m *Payload) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Lease.Size())) - n16, err := m.Lease.MarshalTo(dAtA[i:]) + n19, err := m.Lease.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n16 + i += n19 } if m.Details != nil { - nn17, err := m.Details.MarshalTo(dAtA[i:]) + nn20, err := m.Details.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn17 + i += nn20 } return i, nil } @@ -2201,11 +2480,11 @@ func (m *Payload_Backup) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Backup.Size())) - n18, err := m.Backup.MarshalTo(dAtA[i:]) + n21, err := m.Backup.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n18 + i += n21 } return i, nil } @@ -2215,11 +2494,11 @@ func (m *Payload_Restore) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x5a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Restore.Size())) - n19, err := m.Restore.MarshalTo(dAtA[i:]) + n22, err := m.Restore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n19 + i += n22 } return i, nil } @@ -2229,11 +2508,11 @@ func (m *Payload_SchemaChange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x62 i++ i = encodeVarintJobs(dAtA, i, uint64(m.SchemaChange.Size())) - n20, err := m.SchemaChange.MarshalTo(dAtA[i:]) + n23, err := m.SchemaChange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n20 + i += n23 } return i, nil } @@ -2243,11 +2522,11 @@ func (m *Payload_Import) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x6a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Import.Size())) - n21, err := m.Import.MarshalTo(dAtA[i:]) + n24, err := m.Import.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n21 + i += n24 } return i, nil } @@ -2257,11 +2536,25 @@ func (m *Payload_Changefeed) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Changefeed.Size())) - n22, err := m.Changefeed.MarshalTo(dAtA[i:]) + n25, err := m.Changefeed.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n22 + i += n25 + } + return i, nil +} +func (m *Payload_CreateStats) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.CreateStats != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.CreateStats.Size())) + n26, err := m.CreateStats.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n26 } return i, nil } @@ -2281,11 +2574,11 @@ func (m *Progress) MarshalTo(dAtA []byte) (int, error) { var l int _ = l if m.Progress != nil { - nn23, err := m.Progress.MarshalTo(dAtA[i:]) + nn27, err := m.Progress.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn23 + i += nn27 } if m.ModifiedMicros != 0 { dAtA[i] = 0x10 @@ -2299,11 +2592,11 @@ func (m *Progress) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.RunningStatus) } if m.Details != nil { - nn24, err := m.Details.MarshalTo(dAtA[i:]) + nn28, err := m.Details.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn24 + i += nn28 } return i, nil } @@ -2322,11 +2615,11 @@ func (m *Progress_HighWater) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintJobs(dAtA, i, uint64(m.HighWater.Size())) - n25, err := m.HighWater.MarshalTo(dAtA[i:]) + n29, err := m.HighWater.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n29 } return i, nil } @@ -2336,11 +2629,11 @@ func (m *Progress_Backup) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Backup.Size())) - n26, err := m.Backup.MarshalTo(dAtA[i:]) + n30, err := m.Backup.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n30 } return i, nil } @@ -2350,11 +2643,11 @@ func (m *Progress_Restore) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x5a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Restore.Size())) - n27, err := m.Restore.MarshalTo(dAtA[i:]) + n31, err := m.Restore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n31 } return i, nil } @@ -2364,11 +2657,11 @@ func (m *Progress_SchemaChange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x62 i++ i = encodeVarintJobs(dAtA, i, uint64(m.SchemaChange.Size())) - n28, err := m.SchemaChange.MarshalTo(dAtA[i:]) + n32, err := m.SchemaChange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n32 } return i, nil } @@ -2378,11 +2671,11 @@ func (m *Progress_Import) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x6a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Import.Size())) - n29, err := m.Import.MarshalTo(dAtA[i:]) + n33, err := m.Import.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n33 } return i, nil } @@ -2392,11 +2685,25 @@ func (m *Progress_Changefeed) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Changefeed.Size())) - n30, err := m.Changefeed.MarshalTo(dAtA[i:]) + n34, err := m.Changefeed.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n30 + i += n34 + } + return i, nil +} +func (m *Progress_CreateStats) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.CreateStats != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.CreateStats.Size())) + n35, err := m.CreateStats.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n35 } return i, nil } @@ -2754,6 +3061,56 @@ func (m *ChangefeedProgress) Size() (n int) { return n } +func (m *CreateStatsDetails) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovJobs(uint64(l)) + } + l = m.Table.Size() + n += 1 + l + sovJobs(uint64(l)) + if len(m.ColumnLists) > 0 { + for _, e := range m.ColumnLists { + l = e.Size() + n += 1 + l + sovJobs(uint64(l)) + } + } + l = len(m.Statement) + if l > 0 { + n += 1 + l + sovJobs(uint64(l)) + } + return n +} + +func (m *CreateStatsDetails_ColList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.IDs) > 0 { + l = 0 + for _, e := range m.IDs { + l += sovJobs(uint64(e)) + } + n += 1 + sovJobs(uint64(l)) + l + } + return n +} + +func (m *CreateStatsProgress) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func (m *Payload) Size() (n int) { if m == nil { return 0 @@ -2855,6 +3212,18 @@ func (m *Payload_Changefeed) Size() (n int) { } return n } +func (m *Payload_CreateStats) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CreateStats != nil { + l = m.CreateStats.Size() + n += 1 + l + sovJobs(uint64(l)) + } + return n +} func (m *Progress) Size() (n int) { if m == nil { return 0 @@ -2958,6 +3327,18 @@ func (m *Progress_Changefeed) Size() (n int) { } return n } +func (m *Progress_CreateStats) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CreateStats != nil { + l = m.CreateStats.Size() + n += 1 + l + sovJobs(uint64(l)) + } + return n +} func sovJobs(x uint64) (n int) { for { @@ -5377,7 +5758,7 @@ func (m *ChangefeedProgress) Unmarshal(dAtA []byte) error { } return nil } -func (m *Payload) Unmarshal(dAtA []byte) error { +func (m *CreateStatsDetails) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5400,7 +5781,349 @@ func (m *Payload) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Payload: wiretype end group for non-group") + return fmt.Errorf("proto: CreateStatsDetails: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateStatsDetails: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = github_com_cockroachdb_cockroach_pkg_sql_sem_tree.Name(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Table", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Table.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ColumnLists", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ColumnLists = append(m.ColumnLists, CreateStatsDetails_ColList{}) + if err := m.ColumnLists[len(m.ColumnLists)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Statement", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Statement = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipJobs(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthJobs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CreateStatsDetails_ColList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ColList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ColList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 0 { + var v github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IDs = append(m.IDs, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.IDs) == 0 { + m.IDs = make([]github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID, 0, elementCount) + } + for iNdEx < postIndex { + var v github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IDs = append(m.IDs, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field IDs", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipJobs(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthJobs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CreateStatsProgress) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateStatsProgress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateStatsProgress: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipJobs(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthJobs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Payload) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Payload: wiretype end group for non-group") } if fieldNum <= 0 { return fmt.Errorf("proto: Payload: illegal tag %d (wire type %d)", fieldNum, wire) @@ -5797,6 +6520,38 @@ func (m *Payload) Unmarshal(dAtA []byte) error { } m.Details = &Payload_Changefeed{v} iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateStats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &CreateStatsDetails{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &Payload_CreateStats{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipJobs(dAtA[iNdEx:]) @@ -6098,6 +6853,38 @@ func (m *Progress) Unmarshal(dAtA []byte) error { } m.Details = &Progress_Changefeed{v} iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateStats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowJobs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthJobs + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &CreateStatsProgress{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &Progress_CreateStats{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipJobs(dAtA[iNdEx:]) @@ -6224,142 +7011,154 @@ var ( ErrIntOverflowJobs = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("jobs/jobspb/jobs.proto", fileDescriptor_jobs_7f594aaf3aa20aa4) } +func init() { proto.RegisterFile("jobs/jobspb/jobs.proto", fileDescriptor_jobs_ebddd3799e9c24d1) } -var fileDescriptor_jobs_7f594aaf3aa20aa4 = []byte{ - // 2144 bytes of a gzipped FileDescriptorProto +var fileDescriptor_jobs_ebddd3799e9c24d1 = []byte{ + // 2326 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x5f, 0x6f, 0xe3, 0x58, - 0x15, 0x8f, 0x13, 0x27, 0x71, 0x4e, 0xfe, 0xd4, 0xbd, 0xad, 0x66, 0xbd, 0xd1, 0x6c, 0x13, 0x02, - 0xec, 0x74, 0x66, 0xd8, 0x04, 0xba, 0xd2, 0x0e, 0x3b, 0x82, 0x15, 0xcd, 0x9f, 0x4e, 0x9d, 0xe9, - 0x24, 0x95, 0x93, 0xee, 0xc2, 0x22, 0x64, 0x9c, 0xf8, 0xb6, 0x31, 0x4d, 0x62, 0x8f, 0xaf, 0x33, - 0xc3, 0xac, 0x90, 0x90, 0x10, 0x0f, 0x68, 0x9e, 0xf8, 0x00, 0x8c, 0x84, 0x04, 0x48, 0xbc, 0x20, - 0xde, 0xf8, 0x0c, 0xf3, 0x82, 0x58, 0xde, 0x58, 0x81, 0x02, 0x84, 0x17, 0x3e, 0xc3, 0x3e, 0xa1, - 0x7b, 0xaf, 0xed, 0x38, 0x9d, 0xd2, 0x76, 0x2a, 0xed, 0x4b, 0x6b, 0x9f, 0x7b, 0xce, 0xcf, 0xf7, - 0x9c, 0xf3, 0x3b, 0xe7, 0x9e, 0x1b, 0xb8, 0xf1, 0x23, 0x7b, 0x40, 0x6a, 0xf4, 0x8f, 0x33, 0x60, - 0xff, 0xaa, 0x8e, 0x6b, 0x7b, 0x36, 0x7a, 0x73, 0x68, 0x0f, 0x4f, 0x5d, 0xdb, 0x18, 0x8e, 0xaa, - 0xe4, 0xf1, 0xb8, 0xca, 0x56, 0xb8, 0x56, 0x71, 0xf3, 0xc4, 0x3e, 0xb1, 0x99, 0x56, 0x8d, 0x3e, - 0x71, 0x83, 0x22, 0x62, 0xca, 0xce, 0xa0, 0x66, 0x1a, 0x9e, 0xe1, 0xcb, 0x94, 0x40, 0x66, 0xd9, - 0xef, 0x1c, 0xdb, 0xee, 0xc4, 0xf0, 0x7c, 0xf8, 0xe2, 0x4d, 0xf2, 0x78, 0x5c, 0x23, 0x8f, 0xc7, - 0x03, 0x83, 0xe0, 0x1a, 0xf1, 0xdc, 0xd9, 0xd0, 0x9b, 0xb9, 0xd8, 0x0c, 0xec, 0x66, 0x9e, 0x35, - 0xae, 0x8d, 0xc6, 0xc3, 0x9a, 0x67, 0x4d, 0x30, 0xf1, 0x8c, 0x89, 0xc3, 0x57, 0x2a, 0x3f, 0x85, - 0xe4, 0x01, 0x36, 0x08, 0x46, 0x1f, 0x43, 0x7a, 0x6a, 0x9b, 0x58, 0xb7, 0x4c, 0x45, 0x28, 0x0b, - 0xdb, 0xf9, 0xfa, 0xee, 0x62, 0x5e, 0x4a, 0x75, 0x6c, 0x13, 0xab, 0xcd, 0xcf, 0xe7, 0xa5, 0x77, - 0x4f, 0x2c, 0x6f, 0x34, 0x1b, 0x54, 0x87, 0xf6, 0xa4, 0x16, 0x7a, 0x62, 0x0e, 0x96, 0xcf, 0x35, - 0xe7, 0xf4, 0xa4, 0xe6, 0x6f, 0xaf, 0xca, 0xcd, 0xb4, 0x14, 0x45, 0x54, 0x4d, 0xb4, 0x09, 0x49, - 0xec, 0xd8, 0xc3, 0x91, 0x12, 0x2f, 0x0b, 0xdb, 0x09, 0x8d, 0xbf, 0xdc, 0x17, 0xff, 0xfb, 0xeb, - 0x92, 0x50, 0xf9, 0xbb, 0x00, 0xf9, 0xba, 0x31, 0x3c, 0x9d, 0x39, 0x4d, 0xec, 0x19, 0xd6, 0x98, - 0xa0, 0x3a, 0x00, 0xf1, 0x0c, 0xd7, 0xd3, 0xe9, 0x5e, 0xd9, 0x66, 0xb2, 0x3b, 0x6f, 0x55, 0x97, - 0xe1, 0xa3, 0xbe, 0x54, 0x47, 0xe3, 0x61, 0xb5, 0x1f, 0xf8, 0x52, 0x17, 0x5f, 0xce, 0x4b, 0x31, - 0x2d, 0xc3, 0xcc, 0xa8, 0x14, 0x7d, 0x00, 0x12, 0x9e, 0x9a, 0x1c, 0x21, 0x7e, 0x75, 0x84, 0x34, - 0x9e, 0x9a, 0xcc, 0xfe, 0x4d, 0x48, 0xcc, 0x5c, 0x4b, 0x49, 0x94, 0x85, 0xed, 0x4c, 0x3d, 0xbd, - 0x98, 0x97, 0x12, 0x47, 0x9a, 0xaa, 0x51, 0x19, 0xba, 0x0b, 0xeb, 0x03, 0xb6, 0x5f, 0xdd, 0xc4, - 0x64, 0xe8, 0x5a, 0x8e, 0x67, 0xbb, 0x8a, 0x58, 0x16, 0xb6, 0x73, 0x9a, 0x3c, 0xf0, 0x1d, 0x09, - 0xe4, 0x15, 0x19, 0x0a, 0xdc, 0xb9, 0x43, 0xd7, 0x3e, 0x71, 0x31, 0x21, 0x95, 0xcf, 0x92, 0x50, - 0xd0, 0x30, 0xf1, 0x6c, 0x17, 0x07, 0x0e, 0xff, 0x4a, 0x80, 0x82, 0x67, 0x0c, 0xc6, 0x58, 0x77, - 0xf1, 0x53, 0xd7, 0xf2, 0x30, 0x51, 0xe2, 0xe5, 0xc4, 0x76, 0x76, 0xe7, 0x5b, 0xd5, 0xff, 0x4b, - 0x9a, 0xea, 0x2a, 0x46, 0xb5, 0x4f, 0xed, 0x35, 0xdf, 0xbc, 0x35, 0xf5, 0xdc, 0x67, 0xf5, 0x7b, - 0x3f, 0xfb, 0xe7, 0x15, 0xd3, 0x16, 0xe1, 0x4e, 0x55, 0x6d, 0x6a, 0x79, 0x2f, 0x0a, 0x86, 0x6e, - 0x82, 0x38, 0x73, 0x2d, 0xa2, 0x24, 0xca, 0x89, 0xed, 0x4c, 0x5d, 0x5a, 0xcc, 0x4b, 0xe2, 0x91, - 0xa6, 0x12, 0x8d, 0x49, 0x57, 0x22, 0x2d, 0x5e, 0x23, 0xd2, 0x0f, 0x20, 0xcb, 0x7d, 0xa7, 0xd1, - 0x24, 0x4a, 0x92, 0x39, 0xfe, 0xf6, 0x19, 0xc7, 0x83, 0xcd, 0x31, 0x2f, 0x97, 0xe1, 0xd5, 0xc0, - 0x0b, 0x04, 0x04, 0xd5, 0x20, 0x6b, 0x3f, 0xc1, 0xae, 0x6b, 0x99, 0x58, 0x37, 0x07, 0x4a, 0x8a, - 0xa5, 0xae, 0xb0, 0x98, 0x97, 0xa0, 0xeb, 0x8b, 0x9b, 0x75, 0x0d, 0x02, 0x95, 0xe6, 0xa0, 0xf8, - 0x17, 0x01, 0x72, 0xd1, 0xb0, 0xa1, 0x1f, 0x80, 0xc4, 0xb7, 0x12, 0xd6, 0x40, 0x7d, 0x31, 0x2f, - 0xa5, 0x99, 0xce, 0x6b, 0x14, 0xc1, 0x99, 0x68, 0xa6, 0x19, 0xa6, 0x6a, 0xa2, 0x1f, 0x42, 0xc6, - 0x31, 0x5c, 0x3c, 0xf5, 0x28, 0x7e, 0x9c, 0xe1, 0x37, 0x16, 0xf3, 0x92, 0x74, 0xc8, 0x84, 0xd7, - 0xff, 0x80, 0xc4, 0x51, 0x55, 0xb3, 0xf8, 0x63, 0x40, 0xaf, 0xf2, 0x00, 0xc9, 0x90, 0x38, 0xc5, - 0xcf, 0xb8, 0x47, 0x1a, 0x7d, 0x44, 0x07, 0x90, 0x7c, 0x62, 0x8c, 0x67, 0x41, 0x69, 0xbc, 0x77, - 0x3d, 0x9a, 0x69, 0x1c, 0xe4, 0x7e, 0xfc, 0x9b, 0x42, 0x5b, 0x94, 0x04, 0x39, 0x5e, 0xf9, 0x3a, - 0xac, 0xf9, 0xfa, 0x01, 0xdd, 0xd1, 0x5b, 0x00, 0x23, 0xeb, 0x64, 0xa4, 0x3f, 0x35, 0x3c, 0xec, - 0xb2, 0x3d, 0xe4, 0xb4, 0x0c, 0x95, 0x7c, 0x44, 0x05, 0x95, 0x3f, 0x25, 0x21, 0xaf, 0x4e, 0x1c, - 0xdb, 0xf5, 0x82, 0x62, 0x38, 0x80, 0x14, 0x0b, 0x18, 0x51, 0x04, 0x46, 0x85, 0xea, 0x05, 0x9b, - 0x5b, 0xb1, 0xe4, 0x7b, 0xf3, 0xe9, 0xe5, 0x63, 0x84, 0xdc, 0x8d, 0x9f, 0xcb, 0xdd, 0x6f, 0x43, - 0x8a, 0x77, 0x51, 0x56, 0xe8, 0xd9, 0x9d, 0x52, 0xe4, 0x5b, 0x41, 0x2b, 0x53, 0xbb, 0x7b, 0xd6, - 0x18, 0xef, 0x31, 0xb5, 0x00, 0x9c, 0x1b, 0xa1, 0xb7, 0x41, 0x22, 0xc4, 0xd3, 0x89, 0xf5, 0x09, - 0xa7, 0x7e, 0xa2, 0x9e, 0xa5, 0x7c, 0xe9, 0xf5, 0xfa, 0x3d, 0xeb, 0x13, 0xac, 0xa5, 0x09, 0xf1, - 0xe8, 0x03, 0x2a, 0x82, 0xf4, 0xd4, 0x18, 0x8f, 0x59, 0x89, 0x24, 0x59, 0x07, 0x0c, 0xdf, 0x57, - 0x49, 0x91, 0xfa, 0x02, 0x48, 0x81, 0x4a, 0x90, 0xf5, 0xfb, 0x95, 0x63, 0x78, 0x23, 0x25, 0x4d, - 0xeb, 0x42, 0x03, 0x2e, 0x3a, 0x34, 0xbc, 0x11, 0x52, 0x20, 0x4d, 0x8c, 0x89, 0x43, 0x43, 0x2e, - 0x95, 0x13, 0xdb, 0x39, 0x2d, 0x78, 0x45, 0x5b, 0xc0, 0xea, 0x85, 0xbf, 0x2a, 0x19, 0xb6, 0xf5, - 0x88, 0x84, 0x05, 0xe0, 0xd4, 0x72, 0xf4, 0xe3, 0x53, 0xa2, 0x40, 0x59, 0xd8, 0x96, 0xfc, 0x00, - 0x9c, 0x5a, 0xce, 0xde, 0x43, 0xa2, 0xa5, 0xe9, 0xe2, 0xde, 0x29, 0x29, 0x7e, 0x2a, 0x40, 0x92, - 0x65, 0x07, 0xdd, 0x07, 0x91, 0xd6, 0xb9, 0xdf, 0xd5, 0xaf, 0x5a, 0xe6, 0xcc, 0x06, 0x21, 0x10, - 0xa7, 0xc6, 0x04, 0x2b, 0x88, 0x79, 0xc0, 0x9e, 0xd1, 0x1b, 0x90, 0x26, 0xf8, 0xb1, 0xfe, 0xc4, - 0x18, 0x2b, 0x1b, 0x6c, 0x7b, 0x29, 0x82, 0x1f, 0x7f, 0x68, 0x8c, 0xdb, 0xa2, 0x14, 0x97, 0x13, - 0x6d, 0x51, 0x4a, 0xc8, 0x62, 0x5b, 0x94, 0x44, 0x39, 0xd9, 0x16, 0xa5, 0xa4, 0x9c, 0x6a, 0x8b, - 0x52, 0x4a, 0x4e, 0xb7, 0x45, 0x29, 0x2d, 0x4b, 0x6d, 0x51, 0x92, 0xe4, 0x4c, 0x5b, 0x94, 0x32, - 0x32, 0xb4, 0x45, 0x09, 0xe4, 0x6c, 0x5b, 0x94, 0xb2, 0x72, 0xae, 0x2d, 0x4a, 0x39, 0x39, 0xdf, - 0x16, 0xa5, 0xbc, 0x5c, 0x68, 0x8b, 0x52, 0x41, 0x5e, 0x6b, 0x8b, 0xd2, 0x9a, 0x2c, 0xb7, 0x45, - 0x49, 0x96, 0xd7, 0xdb, 0xa2, 0xb4, 0x2e, 0xa3, 0xca, 0x9f, 0x05, 0x28, 0x70, 0xfa, 0x85, 0x54, - 0xbf, 0x0b, 0xeb, 0x2c, 0x2e, 0xd6, 0xf4, 0x44, 0x77, 0x7c, 0x21, 0x23, 0x71, 0x5c, 0x93, 0x83, - 0x85, 0x50, 0xf9, 0xcb, 0x90, 0x77, 0xb1, 0x61, 0x2e, 0x15, 0xe3, 0x4c, 0x31, 0x47, 0x85, 0xa1, - 0xd2, 0x57, 0xa1, 0xc0, 0x2a, 0x6d, 0xa9, 0x95, 0x60, 0x5a, 0x79, 0x26, 0x0d, 0xd5, 0xea, 0x90, - 0x27, 0x8e, 0x31, 0x5d, 0x6a, 0x89, 0xac, 0x72, 0xde, 0x38, 0x87, 0xcd, 0x3d, 0xc7, 0x98, 0xfa, - 0x2c, 0xce, 0x51, 0x9b, 0xf0, 0x58, 0xd2, 0xd8, 0xa9, 0x34, 0x9b, 0x60, 0xaa, 0x71, 0x60, 0x11, - 0x0f, 0x7d, 0x07, 0x72, 0x2e, 0x93, 0xe8, 0x54, 0x31, 0x28, 0xc7, 0x4b, 0x40, 0xb3, 0x6e, 0x08, - 0x42, 0x2a, 0x7f, 0x10, 0x60, 0xa3, 0xe9, 0xda, 0x8e, 0x83, 0x4d, 0x3f, 0xa3, 0xbc, 0xc4, 0x83, - 0x44, 0x0a, 0x91, 0x44, 0x3e, 0x80, 0xb8, 0xda, 0xf4, 0xbb, 0xe2, 0xbd, 0xeb, 0x92, 0x3e, 0xae, - 0x36, 0xd1, 0xfb, 0x90, 0x22, 0x9e, 0xe1, 0xcd, 0x08, 0xab, 0xe9, 0xc2, 0xce, 0x97, 0x2e, 0xe8, - 0x1f, 0x3d, 0xa6, 0xa8, 0xf9, 0x06, 0x95, 0xbf, 0xc6, 0x61, 0xa3, 0x37, 0x1c, 0xe1, 0x89, 0xd1, - 0x18, 0x19, 0xd3, 0x93, 0x70, 0xbf, 0xdf, 0x03, 0x39, 0x12, 0x09, 0x7d, 0x6c, 0x11, 0xcf, 0x3f, - 0xa0, 0x6f, 0x5f, 0xdc, 0x39, 0x23, 0xe1, 0xf4, 0xe3, 0x53, 0x70, 0x57, 0x83, 0xfc, 0x7d, 0x28, - 0x98, 0x3c, 0x42, 0xba, 0xdf, 0xf5, 0x12, 0x97, 0x76, 0xbd, 0x73, 0x42, 0xea, 0xa3, 0xe7, 0xcd, - 0xc8, 0x12, 0x41, 0x3f, 0x81, 0x8d, 0x00, 0x9c, 0xce, 0x90, 0x34, 0x4a, 0xb4, 0xcb, 0x88, 0x2c, - 0xc8, 0x07, 0x8b, 0x79, 0x69, 0xdd, 0x87, 0x6a, 0xfa, 0xab, 0xd7, 0x6f, 0x37, 0xeb, 0xe6, 0x19, - 0x24, 0xd3, 0x3f, 0x12, 0x6e, 0xc0, 0x66, 0x34, 0xa4, 0x21, 0xdf, 0xea, 0x20, 0x73, 0xc9, 0x31, - 0xa6, 0xfb, 0x75, 0x4f, 0xb0, 0x87, 0xaa, 0xb0, 0x41, 0x33, 0x81, 0x27, 0xb4, 0x1d, 0xd2, 0xee, - 0xa8, 0x47, 0x68, 0xb2, 0x1e, 0x2e, 0xd1, 0xb1, 0xa1, 0x63, 0x4c, 0x70, 0xe5, 0x8f, 0x22, 0xac, - 0x2f, 0x41, 0x82, 0x6c, 0xd1, 0xa6, 0x64, 0x4d, 0x4f, 0xf5, 0xe5, 0xfc, 0xc6, 0x9b, 0x92, 0x35, - 0x3d, 0xa5, 0x33, 0x5c, 0x9a, 0x2e, 0x1e, 0xb9, 0x16, 0x6a, 0x83, 0x68, 0x3b, 0x5e, 0x50, 0x2c, - 0x17, 0x9d, 0x81, 0xaf, 0x7c, 0xa3, 0xda, 0x75, 0x3c, 0x7e, 0xb8, 0x6a, 0x0c, 0x03, 0xfd, 0x4e, - 0x80, 0xb4, 0xc7, 0x9c, 0x20, 0x4a, 0x8a, 0xe1, 0xbd, 0xff, 0x5a, 0x78, 0x3c, 0x00, 0xfe, 0xdc, - 0x76, 0x48, 0x73, 0xf9, 0xf9, 0xbc, 0xb4, 0x7e, 0x36, 0x40, 0xe4, 0xba, 0x03, 0x5d, 0xb0, 0x37, - 0xd4, 0x86, 0xc2, 0x6a, 0x84, 0xd9, 0x71, 0x70, 0xc5, 0x91, 0x2d, 0xbf, 0x92, 0x81, 0xe2, 0x09, - 0x9d, 0x9e, 0x96, 0xdb, 0x3e, 0x67, 0xcc, 0xd8, 0x5d, 0x1d, 0x33, 0xee, 0x5e, 0x29, 0x24, 0x1c, - 0x33, 0x32, 0x5b, 0x14, 0xef, 0x41, 0x26, 0x8c, 0x77, 0xf4, 0x2b, 0x19, 0xfe, 0x95, 0xcd, 0xe8, - 0x57, 0x32, 0xaf, 0x0c, 0x25, 0xe1, 0x49, 0x90, 0x94, 0x53, 0x95, 0x9f, 0x0b, 0x90, 0xd3, 0x30, - 0xb1, 0xc7, 0x4f, 0xb0, 0x49, 0x6b, 0x10, 0x7d, 0x03, 0x44, 0x5a, 0xd3, 0xfe, 0x79, 0x74, 0x49, - 0x73, 0x63, 0xaa, 0x68, 0x17, 0x32, 0xe1, 0x25, 0xea, 0x75, 0xee, 0x16, 0x4b, 0xab, 0x8a, 0x03, - 0x68, 0xe9, 0x70, 0xd8, 0xc6, 0xfb, 0x40, 0xbb, 0x03, 0xdb, 0x9b, 0xdf, 0x72, 0x79, 0x93, 0xb9, - 0x75, 0x71, 0x93, 0x09, 0x9d, 0x09, 0xd2, 0xe4, 0x46, 0x64, 0xc4, 0x2f, 0xc3, 0x45, 0x12, 0xd2, - 0x87, 0xc6, 0xb3, 0xb1, 0x6d, 0x98, 0xa8, 0x0c, 0xd9, 0xe0, 0xe6, 0x62, 0xd9, 0x53, 0x3f, 0x94, - 0x51, 0x11, 0x1d, 0x58, 0x66, 0x04, 0xbb, 0xac, 0xfa, 0x78, 0x54, 0xc3, 0x77, 0x7a, 0x26, 0xb1, - 0x6b, 0x16, 0x36, 0xf5, 0x89, 0x35, 0x74, 0x6d, 0xde, 0x67, 0x13, 0x8c, 0x1d, 0x54, 0xfa, 0x88, - 0x09, 0xd1, 0x2d, 0x58, 0x3b, 0xb6, 0xa6, 0x16, 0x19, 0x2d, 0xf5, 0xd8, 0x88, 0xa4, 0x15, 0x02, - 0xb1, 0xaf, 0x68, 0x43, 0x61, 0x79, 0x8f, 0xd2, 0x2d, 0x93, 0x17, 0x50, 0xbe, 0xbe, 0xbf, 0x98, - 0x97, 0xf2, 0xcb, 0x19, 0x40, 0x6d, 0x92, 0xeb, 0xf6, 0xa6, 0xfc, 0x12, 0x5f, 0x35, 0x09, 0xbb, - 0x8c, 0xba, 0xae, 0xed, 0x2a, 0x12, 0xe7, 0x0b, 0x7b, 0x41, 0xef, 0x41, 0x72, 0x4c, 0xef, 0xc1, - 0x6c, 0xca, 0xc9, 0xee, 0x94, 0x2f, 0x88, 0x39, 0xbb, 0x2f, 0x6b, 0x5c, 0x1d, 0xd5, 0x21, 0xc5, - 0x47, 0x29, 0x36, 0x00, 0x65, 0x77, 0xb6, 0x2f, 0x30, 0x5c, 0xb9, 0xe6, 0xee, 0xc7, 0x34, 0xdf, - 0x12, 0xb5, 0x20, 0xed, 0xf2, 0xb1, 0x59, 0xc9, 0x32, 0x90, 0xdb, 0x57, 0x1e, 0xc8, 0xf7, 0x63, - 0x5a, 0x60, 0x8b, 0xfa, 0x90, 0x23, 0x91, 0x56, 0xab, 0xe4, 0x18, 0xd6, 0x45, 0x27, 0xc9, 0x39, - 0x87, 0xdd, 0x3e, 0x1d, 0x0c, 0x22, 0x62, 0xea, 0xa0, 0xc5, 0xe6, 0x1c, 0x25, 0x7f, 0xa9, 0x83, - 0x2b, 0xf3, 0x38, 0x75, 0x90, 0x5b, 0xa2, 0x0e, 0xc0, 0x30, 0xe4, 0xbb, 0x52, 0x60, 0x38, 0x5f, - 0x7b, 0x9d, 0x06, 0xb9, 0x1f, 0xd3, 0x22, 0x08, 0xf5, 0x0c, 0xa4, 0x4d, 0xbe, 0x10, 0x4e, 0x75, - 0x69, 0x59, 0xaa, 0xfc, 0x43, 0x04, 0x29, 0xac, 0xa6, 0x1a, 0xa0, 0x63, 0xd7, 0x18, 0x52, 0x3e, - 0xeb, 0x43, 0x9b, 0x8e, 0xab, 0x1e, 0xe6, 0xd7, 0xba, 0xf8, 0x7e, 0x4c, 0x5b, 0x0f, 0xd6, 0x1a, - 0xc1, 0x12, 0x65, 0xec, 0xc4, 0x36, 0xad, 0x63, 0x6b, 0xc9, 0x58, 0xfe, 0x73, 0x45, 0x21, 0x10, - 0xfb, 0x8c, 0xfd, 0x60, 0xe5, 0x4a, 0x93, 0xb8, 0x42, 0x07, 0xd8, 0x8f, 0x45, 0xee, 0x3c, 0xb4, - 0x82, 0xdc, 0xd9, 0x74, 0x4a, 0xc7, 0x44, 0x7f, 0x52, 0x11, 0x19, 0x13, 0xf3, 0xbe, 0x94, 0x4f, - 0x25, 0xa8, 0x71, 0x86, 0x59, 0xb7, 0x2f, 0x65, 0x56, 0xe0, 0xfb, 0xbe, 0x10, 0x52, 0x6b, 0xef, - 0x2c, 0xb5, 0xee, 0x5c, 0x4e, 0xad, 0x08, 0x4c, 0xc8, 0xad, 0xa3, 0x73, 0xb9, 0x55, 0xbb, 0x22, - 0xb7, 0x22, 0x88, 0xab, 0xe4, 0x6a, 0x9c, 0x21, 0xd7, 0xed, 0x4b, 0xc9, 0x15, 0xf5, 0xd1, 0x67, - 0x57, 0xf7, 0x1c, 0x76, 0xbd, 0x73, 0x25, 0x76, 0x45, 0xc0, 0xa2, 0xf4, 0x02, 0x90, 0x82, 0x51, - 0x3a, 0x42, 0xb5, 0x3b, 0xdf, 0x85, 0x94, 0x9f, 0x1a, 0x04, 0x85, 0xa6, 0xb6, 0xab, 0x76, 0xd4, - 0xce, 0x03, 0xbd, 0xb3, 0xfb, 0xa8, 0xd5, 0x93, 0x63, 0x48, 0x81, 0xcd, 0x8f, 0x76, 0xd5, 0xbe, - 0xbe, 0xd7, 0xd5, 0xf4, 0x07, 0x0d, 0x5d, 0xed, 0xf4, 0x5b, 0xda, 0x87, 0xbb, 0x07, 0xb2, 0x80, - 0x6e, 0x00, 0xd2, 0xba, 0x8d, 0x87, 0xbd, 0x66, 0x5d, 0x6f, 0x74, 0x1f, 0x1d, 0xee, 0x36, 0xfa, - 0x6a, 0xb7, 0x23, 0xc7, 0x91, 0x04, 0x62, 0xb3, 0xdb, 0x69, 0xc9, 0x70, 0xe7, 0x33, 0x01, 0xc4, - 0xfe, 0x33, 0x07, 0xa3, 0xaf, 0x40, 0xf6, 0xa8, 0xd3, 0x3b, 0x6c, 0x35, 0xd4, 0x3d, 0xb5, 0xd5, - 0x94, 0x63, 0xc5, 0x8d, 0xe7, 0x2f, 0xca, 0x6b, 0x74, 0xe9, 0x68, 0x4a, 0x1c, 0x3c, 0x64, 0x34, - 0x44, 0x45, 0x48, 0xd5, 0x77, 0x1b, 0x0f, 0x8f, 0x0e, 0x65, 0xa1, 0x58, 0x78, 0xfe, 0xa2, 0x0c, - 0x54, 0x81, 0x53, 0x00, 0xdd, 0x84, 0xb4, 0xd6, 0xea, 0xf5, 0xbb, 0x5a, 0x4b, 0x8e, 0x17, 0xd7, - 0x9e, 0xbf, 0x28, 0x67, 0xe9, 0xa2, 0x9f, 0x59, 0x74, 0x0b, 0xf2, 0xbd, 0xc6, 0x7e, 0xeb, 0xd1, - 0xae, 0xde, 0xd8, 0xdf, 0xed, 0x3c, 0x68, 0xc9, 0x89, 0xe2, 0xe6, 0xf3, 0x17, 0x65, 0x99, 0xea, - 0x44, 0x13, 0x46, 0x3f, 0xa1, 0x3e, 0x3a, 0xec, 0x6a, 0x7d, 0x59, 0x5c, 0x7e, 0x82, 0x67, 0x00, - 0x55, 0x00, 0xb8, 0xf5, 0x5e, 0xab, 0xd5, 0x94, 0x93, 0x45, 0xf4, 0xfc, 0x45, 0xb9, 0x40, 0xd7, - 0x97, 0x81, 0x2d, 0x4a, 0xbf, 0xf8, 0xcd, 0x56, 0xec, 0xf7, 0xbf, 0xdd, 0x8a, 0xd5, 0xcb, 0x2f, - 0xff, 0xbd, 0x15, 0x7b, 0xb9, 0xd8, 0x12, 0x3e, 0x5d, 0x6c, 0x09, 0x7f, 0x5b, 0x6c, 0x09, 0xff, - 0x5a, 0x6c, 0x09, 0xbf, 0xfc, 0xcf, 0x56, 0xec, 0xe3, 0x14, 0xcf, 0xc7, 0x20, 0xc5, 0x7e, 0x89, - 0x7c, 0xf7, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x14, 0xe5, 0x00, 0x44, 0x3a, 0x15, 0x00, 0x00, + 0x15, 0x8f, 0x13, 0x27, 0x71, 0x4e, 0xfe, 0xd4, 0xbd, 0x2d, 0xbb, 0xde, 0x68, 0xb7, 0x09, 0x81, + 0xdd, 0xed, 0xec, 0xb2, 0x09, 0x74, 0xc5, 0x0c, 0x33, 0x82, 0x15, 0xf9, 0xd7, 0x69, 0x32, 0x9d, + 0xb4, 0x38, 0xe9, 0x2c, 0x2c, 0x02, 0xe3, 0xc4, 0xb7, 0x8d, 0x69, 0x12, 0x7b, 0x7c, 0x9d, 0x19, + 0x66, 0x85, 0x04, 0x42, 0x3c, 0xc0, 0x3c, 0xf1, 0x01, 0x18, 0x09, 0x09, 0x90, 0x78, 0x41, 0xf0, + 0x02, 0x9f, 0x61, 0x5e, 0x10, 0xcb, 0x1b, 0x08, 0x29, 0x40, 0x78, 0xe1, 0x33, 0xcc, 0x13, 0xba, + 0xf7, 0xda, 0x8e, 0xd3, 0x29, 0x6d, 0x5a, 0x89, 0x97, 0x36, 0x3e, 0xf7, 0x9c, 0x9f, 0xef, 0x39, + 0xe7, 0x77, 0xce, 0x3d, 0xd7, 0xf0, 0xca, 0x77, 0xad, 0x3e, 0xa9, 0xd0, 0x3f, 0x76, 0x9f, 0xfd, + 0x2b, 0xdb, 0x8e, 0xe5, 0x5a, 0xe8, 0xb5, 0x81, 0x35, 0x38, 0x75, 0x2c, 0x7d, 0x30, 0x2c, 0x93, + 0x87, 0xa3, 0x32, 0x5b, 0xe1, 0x5a, 0xf9, 0xcd, 0x13, 0xeb, 0xc4, 0x62, 0x5a, 0x15, 0xfa, 0x8b, + 0x1b, 0xe4, 0x11, 0x53, 0xb6, 0xfb, 0x15, 0x43, 0x77, 0x75, 0x4f, 0xa6, 0xf8, 0x32, 0xd3, 0x7a, + 0xef, 0xd8, 0x72, 0xc6, 0xba, 0xeb, 0xc1, 0xe7, 0x5f, 0x27, 0x0f, 0x47, 0x15, 0xf2, 0x70, 0xd4, + 0xd7, 0x09, 0xae, 0x10, 0xd7, 0x99, 0x0e, 0xdc, 0xa9, 0x83, 0x0d, 0xdf, 0x6e, 0xea, 0x9a, 0xa3, + 0xca, 0x70, 0x34, 0xa8, 0xb8, 0xe6, 0x18, 0x13, 0x57, 0x1f, 0xdb, 0x7c, 0xa5, 0xf4, 0x03, 0x88, + 0xef, 0x63, 0x9d, 0x60, 0xf4, 0x11, 0x24, 0x27, 0x96, 0x81, 0x35, 0xd3, 0x50, 0x84, 0xa2, 0xb0, + 0x9d, 0xad, 0x55, 0xe7, 0xb3, 0x42, 0xa2, 0x63, 0x19, 0xb8, 0xd5, 0x78, 0x31, 0x2b, 0xbc, 0x7f, + 0x62, 0xba, 0xc3, 0x69, 0xbf, 0x3c, 0xb0, 0xc6, 0x95, 0xc0, 0x13, 0xa3, 0xbf, 0xf8, 0x5d, 0xb1, + 0x4f, 0x4f, 0x2a, 0xde, 0xf6, 0xca, 0xdc, 0x4c, 0x4d, 0x50, 0xc4, 0x96, 0x81, 0x36, 0x21, 0x8e, + 0x6d, 0x6b, 0x30, 0x54, 0xa2, 0x45, 0x61, 0x3b, 0xa6, 0xf2, 0x87, 0x3b, 0xe2, 0x7f, 0x7e, 0x51, + 0x10, 0x4a, 0x7f, 0x17, 0x20, 0x5b, 0xd3, 0x07, 0xa7, 0x53, 0xbb, 0x81, 0x5d, 0xdd, 0x1c, 0x11, + 0x54, 0x03, 0x20, 0xae, 0xee, 0xb8, 0x1a, 0xdd, 0x2b, 0xdb, 0x4c, 0x7a, 0xe7, 0x8d, 0xf2, 0x22, + 0x7c, 0xd4, 0x97, 0xf2, 0x70, 0x34, 0x28, 0xf7, 0x7c, 0x5f, 0x6a, 0xe2, 0xf3, 0x59, 0x21, 0xa2, + 0xa6, 0x98, 0x19, 0x95, 0xa2, 0x0f, 0x40, 0xc2, 0x13, 0x83, 0x23, 0x44, 0x57, 0x47, 0x48, 0xe2, + 0x89, 0xc1, 0xec, 0x5f, 0x83, 0xd8, 0xd4, 0x31, 0x95, 0x58, 0x51, 0xd8, 0x4e, 0xd5, 0x92, 0xf3, + 0x59, 0x21, 0x76, 0xa4, 0xb6, 0x54, 0x2a, 0x43, 0xef, 0xc2, 0x7a, 0x9f, 0xed, 0x57, 0x33, 0x30, + 0x19, 0x38, 0xa6, 0xed, 0x5a, 0x8e, 0x22, 0x16, 0x85, 0xed, 0x8c, 0x2a, 0xf7, 0x3d, 0x47, 0x7c, + 0x79, 0x49, 0x86, 0x1c, 0x77, 0xee, 0xd0, 0xb1, 0x4e, 0x1c, 0x4c, 0x48, 0xe9, 0x6f, 0x71, 0xc8, + 0xa9, 0x98, 0xb8, 0x96, 0x83, 0x7d, 0x87, 0x7f, 0x2e, 0x40, 0xce, 0xd5, 0xfb, 0x23, 0xac, 0x39, + 0xf8, 0xb1, 0x63, 0xba, 0x98, 0x28, 0xd1, 0x62, 0x6c, 0x3b, 0xbd, 0xf3, 0xe5, 0xf2, 0xff, 0x24, + 0x4d, 0x79, 0x19, 0xa3, 0xdc, 0xa3, 0xf6, 0xaa, 0x67, 0xde, 0x9c, 0xb8, 0xce, 0x93, 0xda, 0xad, + 0x1f, 0xfd, 0x63, 0xc5, 0xb4, 0x85, 0xb8, 0x53, 0x6e, 0x35, 0xd4, 0xac, 0x1b, 0x06, 0x43, 0xaf, + 0x83, 0x38, 0x75, 0x4c, 0xa2, 0xc4, 0x8a, 0xb1, 0xed, 0x54, 0x4d, 0x9a, 0xcf, 0x0a, 0xe2, 0x91, + 0xda, 0x22, 0x2a, 0x93, 0x2e, 0x45, 0x5a, 0xbc, 0x46, 0xa4, 0xef, 0x42, 0x9a, 0xfb, 0x4e, 0xa3, + 0x49, 0x94, 0x38, 0x73, 0xfc, 0xad, 0x33, 0x8e, 0xfb, 0x9b, 0x63, 0x5e, 0x2e, 0xc2, 0xab, 0x82, + 0xeb, 0x0b, 0x08, 0xaa, 0x40, 0xda, 0x7a, 0x84, 0x1d, 0xc7, 0x34, 0xb0, 0x66, 0xf4, 0x95, 0x04, + 0x4b, 0x5d, 0x6e, 0x3e, 0x2b, 0xc0, 0x81, 0x27, 0x6e, 0xd4, 0x54, 0xf0, 0x55, 0x1a, 0xfd, 0xfc, + 0x9f, 0x05, 0xc8, 0x84, 0xc3, 0x86, 0xbe, 0x05, 0x12, 0xdf, 0x4a, 0x50, 0x03, 0xb5, 0xf9, 0xac, + 0x90, 0x64, 0x3a, 0x57, 0x28, 0x82, 0x33, 0xd1, 0x4c, 0x32, 0xcc, 0x96, 0x81, 0xbe, 0x03, 0x29, + 0x5b, 0x77, 0xf0, 0xc4, 0xa5, 0xf8, 0x51, 0x86, 0x5f, 0x9f, 0xcf, 0x0a, 0xd2, 0x21, 0x13, 0x5e, + 0xff, 0x05, 0x12, 0x47, 0x6d, 0x19, 0xf9, 0xef, 0x01, 0x7a, 0x99, 0x07, 0x48, 0x86, 0xd8, 0x29, + 0x7e, 0xc2, 0x3d, 0x52, 0xe9, 0x4f, 0xb4, 0x0f, 0xf1, 0x47, 0xfa, 0x68, 0xea, 0x97, 0xc6, 0xcd, + 0xeb, 0xd1, 0x4c, 0xe5, 0x20, 0x77, 0xa2, 0x5f, 0x12, 0xda, 0xa2, 0x24, 0xc8, 0xd1, 0xd2, 0xe7, + 0x61, 0xcd, 0xd3, 0xf7, 0xe9, 0x8e, 0xde, 0x00, 0x18, 0x9a, 0x27, 0x43, 0xed, 0xb1, 0xee, 0x62, + 0x87, 0xed, 0x21, 0xa3, 0xa6, 0xa8, 0xe4, 0x43, 0x2a, 0x28, 0xfd, 0x31, 0x0e, 0xd9, 0xd6, 0xd8, + 0xb6, 0x1c, 0xd7, 0x2f, 0x86, 0x7d, 0x48, 0xb0, 0x80, 0x11, 0x45, 0x60, 0x54, 0x28, 0x5f, 0xb0, + 0xb9, 0x25, 0x4b, 0xbe, 0x37, 0x8f, 0x5e, 0x1e, 0x46, 0xc0, 0xdd, 0xe8, 0xb9, 0xdc, 0xfd, 0x0a, + 0x24, 0x78, 0x17, 0x65, 0x85, 0x9e, 0xde, 0x29, 0x84, 0xde, 0xe5, 0xb7, 0xb2, 0xd6, 0xc1, 0xae, + 0x39, 0xc2, 0xbb, 0x4c, 0xcd, 0x07, 0xe7, 0x46, 0xe8, 0x2d, 0x90, 0x08, 0x71, 0x35, 0x62, 0x7e, + 0xcc, 0xa9, 0x1f, 0xab, 0xa5, 0x29, 0x5f, 0xba, 0xdd, 0x5e, 0xd7, 0xfc, 0x18, 0xab, 0x49, 0x42, + 0x5c, 0xfa, 0x03, 0xe5, 0x41, 0x7a, 0xac, 0x8f, 0x46, 0xac, 0x44, 0xe2, 0xac, 0x03, 0x06, 0xcf, + 0xcb, 0xa4, 0x48, 0xfc, 0x1f, 0x48, 0x81, 0x0a, 0x90, 0xf6, 0xfa, 0x95, 0xad, 0xbb, 0x43, 0x25, + 0x49, 0xeb, 0x42, 0x05, 0x2e, 0x3a, 0xd4, 0xdd, 0x21, 0x52, 0x20, 0x49, 0xf4, 0xb1, 0x4d, 0x43, + 0x2e, 0x15, 0x63, 0xdb, 0x19, 0xd5, 0x7f, 0x44, 0x5b, 0xc0, 0xea, 0x85, 0x3f, 0x2a, 0x29, 0xb6, + 0xf5, 0x90, 0x84, 0x05, 0xe0, 0xd4, 0xb4, 0xb5, 0xe3, 0x53, 0xa2, 0x40, 0x51, 0xd8, 0x96, 0xbc, + 0x00, 0x9c, 0x9a, 0xf6, 0xee, 0x3d, 0xa2, 0x26, 0xe9, 0xe2, 0xee, 0x29, 0xc9, 0x7f, 0x22, 0x40, + 0x9c, 0x65, 0x07, 0xdd, 0x01, 0x91, 0xd6, 0xb9, 0xd7, 0xd5, 0x57, 0x2d, 0x73, 0x66, 0x83, 0x10, + 0x88, 0x13, 0x7d, 0x8c, 0x15, 0xc4, 0x3c, 0x60, 0xbf, 0xd1, 0xab, 0x90, 0x24, 0xf8, 0xa1, 0xf6, + 0x48, 0x1f, 0x29, 0x1b, 0x6c, 0x7b, 0x09, 0x82, 0x1f, 0x3e, 0xd0, 0x47, 0x6d, 0x51, 0x8a, 0xca, + 0xb1, 0xb6, 0x28, 0xc5, 0x64, 0xb1, 0x2d, 0x4a, 0xa2, 0x1c, 0x6f, 0x8b, 0x52, 0x5c, 0x4e, 0xb4, + 0x45, 0x29, 0x21, 0x27, 0xdb, 0xa2, 0x94, 0x94, 0xa5, 0xb6, 0x28, 0x49, 0x72, 0xaa, 0x2d, 0x4a, + 0x29, 0x19, 0xda, 0xa2, 0x04, 0x72, 0xba, 0x2d, 0x4a, 0x69, 0x39, 0xd3, 0x16, 0xa5, 0x8c, 0x9c, + 0x6d, 0x8b, 0x52, 0x56, 0xce, 0xb5, 0x45, 0x29, 0x27, 0xaf, 0xb5, 0x45, 0x69, 0x4d, 0x96, 0xdb, + 0xa2, 0x24, 0xcb, 0xeb, 0x6d, 0x51, 0x5a, 0x97, 0x51, 0xe9, 0x4f, 0x02, 0xe4, 0x38, 0xfd, 0x02, + 0xaa, 0xbf, 0x0b, 0xeb, 0x2c, 0x2e, 0xe6, 0xe4, 0x44, 0xb3, 0x3d, 0x21, 0x23, 0x71, 0x54, 0x95, + 0xfd, 0x85, 0x40, 0xf9, 0x33, 0x90, 0x75, 0xb0, 0x6e, 0x2c, 0x14, 0xa3, 0x4c, 0x31, 0x43, 0x85, + 0x81, 0xd2, 0x9b, 0x90, 0x63, 0x95, 0xb6, 0xd0, 0x8a, 0x31, 0xad, 0x2c, 0x93, 0x06, 0x6a, 0x35, + 0xc8, 0x12, 0x5b, 0x9f, 0x2c, 0xb4, 0x44, 0x56, 0x39, 0xaf, 0x9e, 0xc3, 0xe6, 0xae, 0xad, 0x4f, + 0x3c, 0x16, 0x67, 0xa8, 0x4d, 0x70, 0x2c, 0xa9, 0xec, 0x54, 0x9a, 0x8e, 0x31, 0xd5, 0xd8, 0x37, + 0x89, 0x8b, 0xbe, 0x0a, 0x19, 0x87, 0x49, 0x34, 0xaa, 0xe8, 0x97, 0xe3, 0x25, 0xa0, 0x69, 0x27, + 0x00, 0x21, 0xa5, 0xdf, 0x0a, 0xb0, 0xd1, 0x70, 0x2c, 0xdb, 0xc6, 0x86, 0x97, 0x51, 0x5e, 0xe2, + 0x7e, 0x22, 0x85, 0x50, 0x22, 0xef, 0x42, 0xb4, 0xd5, 0xf0, 0xba, 0xe2, 0xad, 0xeb, 0x92, 0x3e, + 0xda, 0x6a, 0xa0, 0xdb, 0x90, 0x20, 0xae, 0xee, 0x4e, 0x09, 0xab, 0xe9, 0xdc, 0xce, 0xa7, 0x2f, + 0xe8, 0x1f, 0x5d, 0xa6, 0xa8, 0x7a, 0x06, 0xa5, 0xbf, 0x44, 0x61, 0xa3, 0x3b, 0x18, 0xe2, 0xb1, + 0x5e, 0x1f, 0xea, 0x93, 0x93, 0x60, 0xbf, 0xdf, 0x00, 0x39, 0x14, 0x09, 0x6d, 0x64, 0x12, 0xd7, + 0x3b, 0xa0, 0x6f, 0x5c, 0xdc, 0x39, 0x43, 0xe1, 0xf4, 0xe2, 0x93, 0x73, 0x96, 0x83, 0xfc, 0x4d, + 0xc8, 0x19, 0x3c, 0x42, 0x9a, 0xd7, 0xf5, 0x62, 0x97, 0x76, 0xbd, 0x73, 0x42, 0xea, 0xa1, 0x67, + 0x8d, 0xd0, 0x12, 0x41, 0xdf, 0x87, 0x0d, 0x1f, 0x9c, 0xce, 0x90, 0x34, 0x4a, 0xb4, 0xcb, 0x88, + 0x2c, 0xc8, 0xfb, 0xf3, 0x59, 0x61, 0xdd, 0x83, 0x6a, 0x78, 0xab, 0xd7, 0x6f, 0x37, 0xeb, 0xc6, + 0x19, 0x24, 0xc3, 0x3b, 0x12, 0x5e, 0x81, 0xcd, 0x70, 0x48, 0x03, 0xbe, 0xd5, 0x40, 0xe6, 0x92, + 0x63, 0x4c, 0xf7, 0xeb, 0x9c, 0x60, 0x17, 0x95, 0x61, 0x83, 0x66, 0x02, 0x8f, 0x69, 0x3b, 0xa4, + 0xdd, 0x51, 0x0b, 0xd1, 0x64, 0x3d, 0x58, 0xa2, 0x63, 0x43, 0x47, 0x1f, 0xe3, 0xd2, 0xef, 0x44, + 0x58, 0x5f, 0x80, 0xf8, 0xd9, 0xa2, 0x4d, 0xc9, 0x9c, 0x9c, 0x6a, 0x8b, 0xf9, 0x8d, 0x37, 0x25, + 0x73, 0x72, 0x4a, 0x67, 0xb8, 0x24, 0x5d, 0x3c, 0x72, 0x4c, 0xd4, 0x06, 0xd1, 0xb2, 0x5d, 0xbf, + 0x58, 0x2e, 0x3a, 0x03, 0x5f, 0x7a, 0x47, 0xf9, 0xc0, 0x76, 0xf9, 0xe1, 0xaa, 0x32, 0x0c, 0xf4, + 0x6b, 0x01, 0x92, 0x2e, 0x73, 0x82, 0x28, 0x09, 0x86, 0x77, 0xfb, 0x4a, 0x78, 0x3c, 0x00, 0xde, + 0xdc, 0x76, 0x48, 0x73, 0xf9, 0x62, 0x56, 0x58, 0x3f, 0x1b, 0x20, 0x72, 0xdd, 0x81, 0xce, 0xdf, + 0x1b, 0x6a, 0x43, 0x6e, 0x39, 0xc2, 0xec, 0x38, 0x58, 0x71, 0x64, 0xcb, 0x2e, 0x65, 0x20, 0x7f, + 0x42, 0xa7, 0xa7, 0xc5, 0xb6, 0xcf, 0x19, 0x33, 0xaa, 0xcb, 0x63, 0xc6, 0xbb, 0x2b, 0x85, 0x84, + 0x63, 0x86, 0x66, 0x8b, 0xfc, 0x2d, 0x48, 0x05, 0xf1, 0x0e, 0xbf, 0x25, 0xc5, 0xdf, 0xb2, 0x19, + 0x7e, 0x4b, 0xea, 0xa5, 0xa1, 0x24, 0x38, 0x09, 0xe2, 0x72, 0xa2, 0xf4, 0x63, 0x01, 0x32, 0x2a, + 0x26, 0xd6, 0xe8, 0x11, 0x36, 0x68, 0x0d, 0xa2, 0x2f, 0x80, 0x48, 0x6b, 0xda, 0x3b, 0x8f, 0x2e, + 0x69, 0x6e, 0x4c, 0x15, 0x55, 0x21, 0x15, 0x5c, 0xa2, 0xae, 0x72, 0xb7, 0x58, 0x58, 0x95, 0x6c, + 0x40, 0x0b, 0x87, 0x83, 0x36, 0xde, 0x03, 0xda, 0x1d, 0xd8, 0xde, 0xbc, 0x96, 0xcb, 0x9b, 0xcc, + 0xdb, 0x17, 0x37, 0x99, 0xc0, 0x19, 0x3f, 0x4d, 0x4e, 0x48, 0x46, 0xbc, 0x32, 0xfc, 0x69, 0x0c, + 0x50, 0xdd, 0xc1, 0xba, 0x8b, 0x69, 0xcf, 0x23, 0x7e, 0xad, 0x74, 0xc2, 0x9d, 0xb8, 0x76, 0xe7, + 0xc5, 0xac, 0x70, 0x73, 0x75, 0x7e, 0xe1, 0x71, 0xc5, 0x75, 0x30, 0x2e, 0xd3, 0x5a, 0xf4, 0xba, + 0x78, 0x0d, 0xe2, 0xac, 0x8d, 0x79, 0x71, 0x59, 0xf1, 0x7c, 0xf7, 0x36, 0xce, 0x4d, 0xd1, 0xb7, + 0x21, 0x33, 0xb0, 0x46, 0xd3, 0x31, 0x6f, 0xb4, 0x7e, 0x43, 0xfc, 0xe2, 0x45, 0xe4, 0x79, 0xc9, + 0xb1, 0x72, 0xdd, 0x1a, 0x85, 0xba, 0x6e, 0x9a, 0x03, 0x52, 0x09, 0x1d, 0x09, 0x53, 0x5d, 0x9f, + 0xc8, 0xac, 0x17, 0xa6, 0xd4, 0x85, 0x20, 0xaf, 0x43, 0xd2, 0xb3, 0x45, 0x0f, 0x20, 0x66, 0x1a, + 0xfc, 0xdc, 0xcb, 0xd6, 0x1a, 0xf4, 0x0e, 0xd8, 0x6a, 0x90, 0x17, 0xb3, 0xc2, 0xed, 0x2b, 0x97, + 0x60, 0x9d, 0xbd, 0xbe, 0xd5, 0x50, 0x29, 0x60, 0xe9, 0x53, 0xb0, 0x11, 0xda, 0x71, 0xd0, 0x11, + 0xff, 0x90, 0x80, 0xe4, 0xa1, 0xfe, 0x64, 0x64, 0xe9, 0x06, 0x2a, 0x42, 0xda, 0xbf, 0x5c, 0x9a, + 0xd6, 0xc4, 0x63, 0x7b, 0x58, 0x44, 0x67, 0xca, 0x29, 0xc1, 0x0e, 0xcb, 0x1e, 0x27, 0x7e, 0xf0, + 0x4c, 0xc7, 0x06, 0x76, 0x13, 0xc6, 0x86, 0x36, 0x36, 0x07, 0x8e, 0xc5, 0x8f, 0xc2, 0x18, 0x2b, + 0x60, 0x2a, 0xbd, 0xcf, 0x84, 0xe8, 0x6d, 0x58, 0x3b, 0x36, 0x27, 0x26, 0x19, 0x2e, 0xf4, 0xd8, + 0x14, 0xab, 0xe6, 0x7c, 0xb1, 0xa7, 0x68, 0x41, 0x6e, 0x71, 0xd5, 0xd5, 0x68, 0x4c, 0x12, 0x2c, + 0x26, 0x7b, 0xf3, 0x59, 0x21, 0xbb, 0x48, 0x23, 0x8f, 0xce, 0xf5, 0x6e, 0x9c, 0x0b, 0xfc, 0x96, + 0x41, 0xd8, 0xf7, 0x02, 0xc7, 0xb1, 0x1c, 0x45, 0xe2, 0x25, 0xcd, 0x1e, 0xd0, 0x4d, 0x88, 0x8f, + 0xb0, 0x4e, 0xf8, 0x20, 0x9a, 0xde, 0x29, 0x5e, 0xc0, 0x08, 0xf6, 0x49, 0x43, 0xe5, 0xea, 0xa8, + 0x06, 0x09, 0x3e, 0xed, 0xb2, 0x19, 0x35, 0xbd, 0xb3, 0x7d, 0x81, 0xe1, 0xd2, 0x97, 0x88, 0xbd, + 0x88, 0xea, 0x59, 0xa2, 0x26, 0x24, 0x1d, 0x7e, 0xb3, 0x51, 0xd2, 0x0c, 0xe4, 0xc6, 0xca, 0x77, + 0xa6, 0xbd, 0x88, 0xea, 0xdb, 0xa2, 0x1e, 0x64, 0x48, 0xe8, 0x34, 0x54, 0x32, 0x0c, 0xeb, 0xa2, + 0xc3, 0xfe, 0x9c, 0x79, 0x64, 0x8f, 0xce, 0x6e, 0x21, 0x31, 0x75, 0xd0, 0x64, 0xa3, 0xa8, 0x92, + 0xbd, 0xd4, 0xc1, 0xa5, 0x2b, 0x13, 0x75, 0x90, 0x5b, 0xa2, 0x0e, 0xc0, 0x20, 0x68, 0x49, 0x4a, + 0x8e, 0xe1, 0x7c, 0xee, 0x2a, 0x67, 0xd8, 0x5e, 0x44, 0x0d, 0x21, 0xa0, 0xaf, 0x41, 0x7a, 0xb0, + 0x20, 0xb9, 0xb2, 0xc6, 0x00, 0xdf, 0xbb, 0x52, 0x11, 0xef, 0xd1, 0xc2, 0x5d, 0x48, 0x6b, 0x29, + 0x48, 0x1a, 0x7c, 0x25, 0x98, 0xe5, 0x93, 0xb2, 0x54, 0xfa, 0x7d, 0x1c, 0xa4, 0xa0, 0x87, 0x56, + 0x00, 0x1d, 0x3b, 0xfa, 0x80, 0x96, 0x88, 0x36, 0xb0, 0xe8, 0x25, 0xc5, 0xc5, 0xfc, 0x32, 0x1f, + 0xdd, 0x8b, 0xa8, 0xeb, 0xfe, 0x5a, 0xdd, 0x5f, 0xa2, 0x45, 0x30, 0xb6, 0x0c, 0xf3, 0xd8, 0x5c, + 0x14, 0x01, 0xff, 0x48, 0x95, 0xf3, 0xc5, 0x5e, 0x11, 0x7c, 0xb0, 0x74, 0x91, 0x8d, 0xad, 0xd0, + 0xf7, 0xf7, 0x22, 0xa1, 0x9b, 0x2e, 0x2d, 0x4a, 0x67, 0x3a, 0x99, 0xd0, 0xcb, 0x81, 0x37, 0x9f, + 0xf2, 0xde, 0x93, 0xf5, 0xa4, 0x7c, 0x16, 0x45, 0xf5, 0x33, 0x64, 0xbd, 0x71, 0x29, 0x59, 0x7d, + 0xdf, 0xf7, 0x84, 0x80, 0xad, 0xbb, 0x67, 0xd9, 0xfa, 0xce, 0xe5, 0x6c, 0x0d, 0xc1, 0x04, 0x74, + 0x3d, 0x3a, 0x97, 0xae, 0x95, 0x15, 0xe9, 0x1a, 0x42, 0x5c, 0xe6, 0x6b, 0xfd, 0x0c, 0x5f, 0x6f, + 0x5c, 0xca, 0xd7, 0xb0, 0x8f, 0x1e, 0x61, 0x0f, 0xce, 0x21, 0xec, 0x7b, 0x2b, 0x11, 0x36, 0x04, + 0x16, 0x66, 0xac, 0x7a, 0x1e, 0x63, 0xcb, 0xab, 0x31, 0x36, 0x04, 0xb9, 0x44, 0x59, 0x00, 0xc9, + 0xbf, 0x94, 0x85, 0xe8, 0xfb, 0xce, 0xd7, 0x21, 0xe1, 0xa5, 0x1b, 0x41, 0xae, 0xa1, 0x56, 0x5b, + 0x9d, 0x56, 0xe7, 0xae, 0xd6, 0xa9, 0xde, 0x6f, 0x76, 0xe5, 0x08, 0x52, 0x60, 0xf3, 0xc3, 0x6a, + 0xab, 0xa7, 0xed, 0x1e, 0xa8, 0xda, 0xdd, 0xba, 0xd6, 0xea, 0xf4, 0x9a, 0xea, 0x83, 0xea, 0xbe, + 0x2c, 0xa0, 0x57, 0x00, 0xa9, 0x07, 0xf5, 0x7b, 0xdd, 0x46, 0x4d, 0xab, 0x1f, 0xdc, 0x3f, 0xac, + 0xd6, 0x7b, 0xad, 0x83, 0x8e, 0x1c, 0x45, 0x12, 0x88, 0x8d, 0x83, 0x4e, 0x53, 0x86, 0x77, 0x7e, + 0x18, 0x05, 0xb1, 0xf7, 0xc4, 0xc6, 0xe8, 0xb3, 0x90, 0x3e, 0xea, 0x74, 0x0f, 0x9b, 0xf5, 0xd6, + 0x6e, 0xab, 0xd9, 0x90, 0x23, 0xf9, 0x8d, 0xa7, 0xcf, 0x8a, 0x6b, 0x74, 0xe9, 0x68, 0x42, 0x6c, + 0x3c, 0x60, 0xd4, 0x46, 0x79, 0x48, 0xd4, 0xaa, 0xf5, 0x7b, 0x47, 0x87, 0xb2, 0x90, 0xcf, 0x3d, + 0x7d, 0x56, 0x04, 0xaa, 0xc0, 0x69, 0x85, 0x5e, 0x87, 0xa4, 0xda, 0xec, 0xf6, 0x0e, 0xd4, 0xa6, + 0x1c, 0xcd, 0xaf, 0x3d, 0x7d, 0x56, 0x4c, 0xd3, 0x45, 0x8f, 0x2d, 0xe8, 0x6d, 0xc8, 0x76, 0xeb, + 0x7b, 0xcd, 0xfb, 0x55, 0xad, 0xbe, 0x57, 0xed, 0xdc, 0x6d, 0xca, 0xb1, 0xfc, 0xe6, 0xd3, 0x67, + 0x45, 0x99, 0xea, 0x84, 0x49, 0x40, 0x5f, 0xd1, 0xba, 0x7f, 0x78, 0xa0, 0xf6, 0x64, 0x71, 0xf1, + 0x0a, 0x9e, 0x55, 0x54, 0x02, 0xe0, 0xd6, 0xbb, 0xcd, 0x66, 0x43, 0x8e, 0xe7, 0xd1, 0xd3, 0x67, + 0xc5, 0x1c, 0x5d, 0x5f, 0x24, 0x0b, 0xbd, 0x09, 0x99, 0xba, 0xda, 0xac, 0xf6, 0x9a, 0x5a, 0xb7, + 0x57, 0xed, 0x75, 0xe5, 0xc4, 0xc2, 0x93, 0x50, 0x02, 0xf2, 0xd2, 0x4f, 0x7e, 0xb9, 0x15, 0xf9, + 0xcd, 0xaf, 0xb6, 0x22, 0xb5, 0xe2, 0xf3, 0x7f, 0x6d, 0x45, 0x9e, 0xcf, 0xb7, 0x84, 0x4f, 0xe6, + 0x5b, 0xc2, 0x5f, 0xe7, 0x5b, 0xc2, 0x3f, 0xe7, 0x5b, 0xc2, 0xcf, 0xfe, 0xbd, 0x15, 0xf9, 0x28, + 0xc1, 0x13, 0xd7, 0x4f, 0xb0, 0x4f, 0xdf, 0xef, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xe4, 0x97, + 0x9d, 0xb7, 0xab, 0x17, 0x00, 0x00, } diff --git a/pkg/jobs/jobspb/jobs.proto b/pkg/jobs/jobspb/jobs.proto index abca56f4eb57..a47f35310dee 100644 --- a/pkg/jobs/jobspb/jobs.proto +++ b/pkg/jobs/jobspb/jobs.proto @@ -192,6 +192,25 @@ message ChangefeedProgress { repeated ResolvedSpan resolved_spans = 2 [(gogoproto.nullable) = false]; } +message CreateStatsDetails { + message ColList { + repeated uint32 ids = 1 [ + (gogoproto.customname) = "IDs", + (gogoproto.casttype) = "github.com/cockroachdb/cockroach/pkg/sql/sqlbase.ColumnID" + ]; + } + string name = 1 [ + (gogoproto.casttype) = "github.com/cockroachdb/cockroach/pkg/sql/sem/tree.Name" + ]; + sqlbase.TableDescriptor table = 2 [(gogoproto.nullable) = false]; + repeated ColList column_lists = 3 [(gogoproto.nullable) = false]; + string Statement = 4; +} + +message CreateStatsProgress { + +} + message Payload { string description = 1; string username = 2; @@ -215,6 +234,7 @@ message Payload { SchemaChangeDetails schemaChange = 12; ImportDetails import = 13; ChangefeedDetails changefeed = 14; + CreateStatsDetails createStats = 15; } } @@ -232,6 +252,7 @@ message Progress { SchemaChangeProgress schemaChange = 12; ImportProgress import = 13; ChangefeedProgress changefeed = 14; + CreateStatsProgress createStats = 15; } } @@ -245,4 +266,5 @@ enum Type { SCHEMA_CHANGE = 3 [(gogoproto.enumvalue_customname) = "TypeSchemaChange"]; IMPORT = 4 [(gogoproto.enumvalue_customname) = "TypeImport"]; CHANGEFEED = 5 [(gogoproto.enumvalue_customname) = "TypeChangefeed"]; + CREATE_STATS = 6 [(gogoproto.enumvalue_customname) = "TypeCreateStats"]; } diff --git a/pkg/jobs/jobspb/wrap.go b/pkg/jobs/jobspb/wrap.go index a4f1f1334798..ca69434cfd37 100644 --- a/pkg/jobs/jobspb/wrap.go +++ b/pkg/jobs/jobspb/wrap.go @@ -28,6 +28,7 @@ var _ Details = BackupDetails{} var _ Details = RestoreDetails{} var _ Details = SchemaChangeDetails{} var _ Details = ChangefeedDetails{} +var _ Details = CreateStatsDetails{} // ProgressDetails is a marker interface for job progress details proto structs. type ProgressDetails interface{} @@ -36,6 +37,7 @@ var _ ProgressDetails = BackupProgress{} var _ ProgressDetails = RestoreProgress{} var _ ProgressDetails = SchemaChangeProgress{} var _ ProgressDetails = ChangefeedProgress{} +var _ ProgressDetails = CreateStatsProgress{} // Type returns the payload's job type. func (p *Payload) Type() Type { @@ -55,6 +57,8 @@ func DetailsType(d isPayload_Details) Type { return TypeImport case *Payload_Changefeed: return TypeChangefeed + case *Payload_CreateStats: + return TypeCreateStats default: panic(fmt.Sprintf("Payload.Type called on a payload with an unknown details type: %T", d)) } @@ -79,6 +83,8 @@ func WrapProgressDetails(details ProgressDetails) interface { return &Progress_Import{Import: &d} case ChangefeedProgress: return &Progress_Changefeed{Changefeed: &d} + case CreateStatsProgress: + return &Progress_CreateStats{CreateStats: &d} default: panic(fmt.Sprintf("WrapProgressDetails: unknown details type %T", d)) } @@ -98,6 +104,8 @@ func (p *Payload) UnwrapDetails() Details { return *d.Import case *Payload_Changefeed: return *d.Changefeed + case *Payload_CreateStats: + return *d.CreateStats default: return nil } @@ -117,6 +125,8 @@ func (p *Progress) UnwrapDetails() ProgressDetails { return *d.Import case *Progress_Changefeed: return *d.Changefeed + case *Progress_CreateStats: + return *d.CreateStats default: return nil } @@ -149,6 +159,8 @@ func WrapPayloadDetails(details Details) interface { return &Payload_Import{Import: &d} case ChangefeedDetails: return &Payload_Changefeed{Changefeed: &d} + case CreateStatsDetails: + return &Payload_CreateStats{CreateStats: &d} default: panic(fmt.Sprintf("jobs.WrapPayloadDetails: unknown details type %T", d)) } diff --git a/pkg/sql/create_stats.go b/pkg/sql/create_stats.go index c00181ea6276..8570afd33103 100644 --- a/pkg/sql/create_stats.go +++ b/pkg/sql/create_stats.go @@ -17,73 +17,142 @@ package sql import ( "context" - "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgerror" + "github.com/cockroachdb/cockroach/pkg/internal/client" + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" + "github.com/cockroachdb/cockroach/pkg/settings/cluster" "github.com/cockroachdb/cockroach/pkg/sql/privilege" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" "github.com/cockroachdb/cockroach/pkg/util" "github.com/pkg/errors" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) +// createStatsNode is a planNode implemented in terms of a function. The +// function starts a Job during Start, and the remainder of the CREATE +// STATISTICS planning and execution is performed within the jobs framework. type createStatsNode struct { tree.CreateStats - tableDesc *sqlbase.ImmutableTableDescriptor - columns [][]sqlbase.ColumnID + f func(ctx context.Context, resultsCh chan<- tree.Datums) error + + run createStatsRun +} + +// createStatsRun contains the run-time state of createStatsNode during local +// execution. +type createStatsRun struct { + resultsCh chan tree.Datums + errCh chan error +} + +func (n *createStatsNode) startExec(params runParams) error { + n.run.resultsCh = make(chan tree.Datums) + n.run.errCh = make(chan error) + go func() { + err := n.f(params.ctx, n.run.resultsCh) + select { + case <-params.ctx.Done(): + case n.run.errCh <- err: + } + close(n.run.errCh) + close(n.run.resultsCh) + }() + return nil +} + +func (n *createStatsNode) Next(params runParams) (bool, error) { + select { + case <-params.ctx.Done(): + return false, params.ctx.Err() + case err := <-n.run.errCh: + return false, err + case <-n.run.resultsCh: + return true, nil + } } +func (*createStatsNode) Close(context.Context) {} +func (*createStatsNode) Values() tree.Datums { return nil } + func (p *planner) CreateStatistics(ctx context.Context, n *tree.CreateStats) (planNode, error) { - var tableDesc *ImmutableTableDescriptor - var err error - switch t := n.Table.(type) { - case *tree.TableName: - // TODO(anyone): if CREATE STATISTICS is meant to be able to operate - // within a transaction, then the following should probably run with - // caching disabled, like other DDL statements. - tableDesc, err = ResolveExistingObject(ctx, p, t, true /*required*/, requireTableDesc) - if err != nil { - return nil, err + fn := func(ctx context.Context, resultsCh chan<- tree.Datums) error { + var tableDesc *ImmutableTableDescriptor + var err error + switch t := n.Table.(type) { + case *tree.TableName: + // TODO(anyone): if CREATE STATISTICS is meant to be able to operate + // within a transaction, then the following should probably run with + // caching disabled, like other DDL statements. + tableDesc, err = ResolveExistingObject(ctx, p, t, true /*required*/, requireTableDesc) + if err != nil { + return err + } + + case *tree.TableRef: + flags := ObjectLookupFlags{CommonLookupFlags: CommonLookupFlags{ + avoidCached: p.avoidCachedDescriptors, + }} + tableDesc, err = p.Tables().getTableVersionByID(ctx, p.txn, sqlbase.ID(t.TableID), flags) + if err != nil { + return err + } } - case *tree.TableRef: - flags := ObjectLookupFlags{CommonLookupFlags: CommonLookupFlags{ - avoidCached: p.avoidCachedDescriptors, - }} - tableDesc, err = p.Tables().getTableVersionByID(ctx, p.txn, sqlbase.ID(t.TableID), flags) - if err != nil { - return nil, err + if tableDesc.IsVirtualTable() { + return errors.Errorf("cannot create statistics on virtual tables") } - } - if tableDesc.IsVirtualTable() { - return nil, errors.Errorf("cannot create statistics on virtual tables") - } + if err := p.CheckPrivilege(ctx, tableDesc, privilege.SELECT); err != nil { + return err + } - if err := p.CheckPrivilege(ctx, tableDesc, privilege.SELECT); err != nil { - return nil, err - } + // Identify which columns we should create statistics for. + var createStatsColLists []jobspb.CreateStatsDetails_ColList + if len(n.ColumnNames) == 0 { + if createStatsColLists, err = createStatsDefaultColumns(tableDesc); err != nil { + return err + } + } else { + columns, err := tableDesc.FindActiveColumnsByNames(n.ColumnNames) + if err != nil { + return err + } - if len(n.ColumnNames) == 0 { - return createStatsDefaultColumns(n, tableDesc) - } + columnIDs := make([]sqlbase.ColumnID, len(columns)) + for i := range columns { + columnIDs[i] = columns[i].ID + } + createStatsColLists = []jobspb.CreateStatsDetails_ColList{{IDs: columnIDs}} + } - columns, err := tableDesc.FindActiveColumnsByNames(n.ColumnNames) - if err != nil { - return nil, err - } - columnIDs := make([]sqlbase.ColumnID, len(columns)) - for i := range columns { - columnIDs[i] = columns[i].ID + // Create a job to run statistics creation. + _, errCh, err := p.ExecCfg().JobRegistry.StartJob(ctx, resultsCh, jobs.Record{ + Description: tree.AsStringWithFlags(n, tree.FmtAlwaysQualifyTableNames), + Username: p.User(), + Details: jobspb.CreateStatsDetails{ + Name: n.Name, + Table: tableDesc.TableDescriptor, + ColumnLists: createStatsColLists, + Statement: n.String(), + }, + Progress: jobspb.CreateStatsProgress{}, + }) + if err != nil { + return err + } + return <-errCh } return &createStatsNode{ CreateStats: *n, - tableDesc: tableDesc, - columns: [][]sqlbase.ColumnID{columnIDs}, + f: fn, }, nil } // createStatsDefaultColumns creates column statistics on a default set of -// columns when no columns were specified by the caller. +// column lists when no columns were specified by the caller. // // To determine a useful set of default column statistics, we rely on // information provided by the schema. In particular, the presence of an index @@ -95,20 +164,16 @@ func (p *planner) CreateStatistics(ctx context.Context, n *tree.CreateStats) (pl // TODO(rytaft): This currently only generates one single-column stat per // index. Add code to collect multi-column stats once they are supported. func createStatsDefaultColumns( - n *tree.CreateStats, desc *ImmutableTableDescriptor, -) (planNode, error) { - pn := &createStatsNode{ - CreateStats: *n, - tableDesc: desc, - columns: make([][]sqlbase.ColumnID, 0, len(desc.Indexes)+1), - } + desc *ImmutableTableDescriptor, +) ([]jobspb.CreateStatsDetails_ColList, error) { + columns := make([]jobspb.CreateStatsDetails_ColList, 0, len(desc.Indexes)+1) var requestedCols util.FastIntSet // If the primary key is not the hidden rowid column, collect stats on it. pkCol := desc.PrimaryIndex.ColumnIDs[0] if !isHidden(desc, pkCol) { - pn.columns = append(pn.columns, []sqlbase.ColumnID{pkCol}) + columns = append(columns, jobspb.CreateStatsDetails_ColList{IDs: []sqlbase.ColumnID{pkCol}}) requestedCols.Add(int(pkCol)) } @@ -116,28 +181,32 @@ func createStatsDefaultColumns( for i := range desc.Indexes { idxCol := desc.Indexes[i].ColumnIDs[0] if !requestedCols.Contains(int(idxCol)) { - pn.columns = append(pn.columns, []sqlbase.ColumnID{idxCol}) + columns = append( + columns, jobspb.CreateStatsDetails_ColList{IDs: []sqlbase.ColumnID{idxCol}}, + ) requestedCols.Add(int(idxCol)) } } // If there are no non-hidden index columns, collect stats on the first // non-hidden column in the table. - if len(pn.columns) == 0 { + if len(columns) == 0 { for i := range desc.Columns { if !desc.Columns[i].IsHidden() { - pn.columns = append(pn.columns, []sqlbase.ColumnID{desc.Columns[i].ID}) + columns = append( + columns, jobspb.CreateStatsDetails_ColList{IDs: []sqlbase.ColumnID{desc.Columns[i].ID}}, + ) break } } } // If there are still no columns, return an error. - if len(pn.columns) == 0 { + if len(columns) == 0 { return nil, errors.New("CREATE STATISTICS called on a table with no visible columns") } - return pn, nil + return columns, nil } func isHidden(desc *ImmutableTableDescriptor, columnID sqlbase.ColumnID) bool { @@ -149,12 +218,116 @@ func isHidden(desc *ImmutableTableDescriptor, columnID sqlbase.ColumnID) bool { panic("column not found in table") } -func (*createStatsNode) startExec(runParams) error { - return pgerror.NewAssertionErrorf("createStatsNode cannot be executed locally") +type createStatsResumer struct { + evalCtx *extendedEvalContext +} + +var _ jobs.Resumer = &createStatsResumer{} + +// Resume is part of the jobs.Resumer interface. +func (r *createStatsResumer) Resume( + ctx context.Context, job *jobs.Job, phs interface{}, resultsCh chan<- tree.Datums, +) error { + // TODO(rytaft): If this job is for automatic stats creation, use the + // Job ID to lock automatic stats creation with a lock manager. If the + // lock succeeds, proceed to the next step (but first check the stats + // cache to make sure a new statistic was not just added for this table). + // If the lock fails, cancel this job and return an error. + + p := phs.(*planner) + r.evalCtx = p.ExtendedEvalContext() + + ci := sqlbase.ColTypeInfoFromColTypes([]sqlbase.ColumnType{}) + rows := sqlbase.NewRowContainer(r.evalCtx.Mon.MakeBoundAccount(), ci, 0) + defer func() { + if rows != nil { + rows.Close(ctx) + } + }() + + dsp := p.DistSQLPlanner() + err := r.evalCtx.ExecCfg.DB.Txn(ctx, func(ctx context.Context, txn *client.Txn) error { + if err := dsp.planAndRunCreateStats( + ctx, r.evalCtx, txn, job, NewRowResultWriter(rows), + ); err != nil { + // Check if this was a context canceled error and restart if it was. + if s, ok := status.FromError(errors.Cause(err)); ok { + if s.Code() == codes.Canceled && s.Message() == context.Canceled.Error() { + return jobs.NewRetryJobError("node failure") + } + } + + // If the job was canceled, any of the distsql processors could have been + // the first to encounter the .Progress error. This error's string is sent + // through distsql back here, so we can't examine the err type in this case + // to see if it's a jobs.InvalidStatusError. Instead, attempt to update the + // job progress to coerce out the correct error type. If the update succeeds + // then return the original error, otherwise return this error instead so + // it can be cleaned up at a higher level. + if err := job.FractionProgressed( + ctx, + func(ctx context.Context, _ jobspb.ProgressDetails) float32 { + // The job failed so the progress value here doesn't really matter. + return 0 + }, + ); err != nil { + return err + } + return err + } + + return nil + }) + + return err +} + +// OnFailOrCancel is part of the jobs.Resumer interface. +func (r *createStatsResumer) OnFailOrCancel( + ctx context.Context, txn *client.Txn, job *jobs.Job, +) error { + return nil } -func (*createStatsNode) Next(runParams) (bool, error) { - return false, pgerror.NewAssertionErrorf("createStatsNode cannot be executed locally") +// OnSuccess is part of the jobs.Resumer interface. +func (r *createStatsResumer) OnSuccess(ctx context.Context, txn *client.Txn, job *jobs.Job) error { + details := job.Details().(jobspb.CreateStatsDetails) + // Record this statistics creation in the event log. + // TODO(rytaft): This creates a new transaction for the CREATE STATISTICS + // event. It must be different from the CREATE STATISTICS transaction, + // because that transaction must be read-only. In the future we may want + // to use the transaction that inserted the new stats into the + // system.table_statistics table, but that would require calling + // MakeEventLogger from the distsqlrun package. + return r.evalCtx.ExecCfg.DB.Txn(ctx, func(ctx context.Context, txn *client.Txn) error { + return MakeEventLogger(r.evalCtx.ExecCfg).InsertEventRecord( + ctx, + txn, + EventLogCreateStatistics, + int32(details.Table.ID), + int32(r.evalCtx.NodeID), + struct { + StatisticName string + Statement string + }{details.Name.String(), details.Statement}, + ) + }) +} + +// OnTerminal is part of the jobs.Resumer interface. +func (r *createStatsResumer) OnTerminal( + ctx context.Context, job *jobs.Job, status jobs.Status, resultsCh chan<- tree.Datums, +) { +} + +func createStatsResumeHook(typ jobspb.Type, settings *cluster.Settings) jobs.Resumer { + if typ != jobspb.TypeCreateStats { + return nil + } + + return &createStatsResumer{} +} + +func init() { + jobs.AddResumeHook(createStatsResumeHook) } -func (*createStatsNode) Close(context.Context) {} -func (*createStatsNode) Values() tree.Datums { return nil } diff --git a/pkg/sql/distsql_physical_planner.go b/pkg/sql/distsql_physical_planner.go index bbbf7162206f..3f75bc5b4619 100644 --- a/pkg/sql/distsql_physical_planner.go +++ b/pkg/sql/distsql_physical_planner.go @@ -296,7 +296,6 @@ func (dsp *DistSQLPlanner) mustWrapNode(node planNode) bool { case *unionNode: case *valuesNode: case *virtualTableNode: - case *createStatsNode: case *projectSetNode: case *unaryNode: case *zeroNode: @@ -451,8 +450,6 @@ func (dsp *DistSQLPlanner) checkSupportForNode(node planNode) (distRecommendatio } } return canDistribute, nil - case *createStatsNode: - return shouldDistribute, nil case *insertNode, *updateNode, *deleteNode, *upsertNode: // This is a potential hot path. @@ -2355,8 +2352,6 @@ func (dsp *DistSQLPlanner) createPlanForNode( } else { plan, err = dsp.createPlanForValues(planCtx, n) } - case *createStatsNode: - plan, err = dsp.createPlanForCreateStats(planCtx, n) case *projectSetNode: plan, err = dsp.createPlanForProjectSet(planCtx, n) diff --git a/pkg/sql/distsql_plan_stats.go b/pkg/sql/distsql_plan_stats.go index c34e3547405a..c3a953953b0c 100644 --- a/pkg/sql/distsql_plan_stats.go +++ b/pkg/sql/distsql_plan_stats.go @@ -15,9 +15,17 @@ package sql import ( + "context" + + "github.com/cockroachdb/cockroach/pkg/internal/client" + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" "github.com/cockroachdb/cockroach/pkg/sql/distsqlpb" + "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" "github.com/cockroachdb/cockroach/pkg/util" + "github.com/cockroachdb/cockroach/pkg/util/hlc" + "github.com/cockroachdb/cockroach/pkg/util/log/logtags" "github.com/pkg/errors" ) @@ -32,7 +40,10 @@ const histogramSamples = 10000 const histogramBuckets = 200 func (dsp *DistSQLPlanner) createStatsPlan( - planCtx *PlanningCtx, desc *sqlbase.ImmutableTableDescriptor, stats []requestedStat, + planCtx *PlanningCtx, + desc *sqlbase.ImmutableTableDescriptor, + stats []requestedStat, + job *jobs.Job, ) (PhysicalPlan, error) { if len(stats) == 0 { return PhysicalPlan{}, errors.New("no stats requested") @@ -144,6 +155,7 @@ func (dsp *DistSQLPlanner) createStatsPlan( SampleSize: sampler.SampleSize, SampledColumnIDs: sampledColumnIDs, TableID: desc.ID, + JobID: *job.ID(), } // Plan the SampleAggregator on the gateway, unless we have a single Sampler. node := dsp.nodeDesc.NodeID @@ -161,17 +173,54 @@ func (dsp *DistSQLPlanner) createStatsPlan( } func (dsp *DistSQLPlanner) createPlanForCreateStats( - planCtx *PlanningCtx, n *createStatsNode, + planCtx *PlanningCtx, job *jobs.Job, ) (PhysicalPlan, error) { - stats := make([]requestedStat, len(n.columns)) + details := job.Details().(jobspb.CreateStatsDetails) + stats := make([]requestedStat, len(details.ColumnLists)) for i := 0; i < len(stats); i++ { stats[i] = requestedStat{ - columns: n.columns[i], - histogram: len(n.columns[i]) == 1, + columns: details.ColumnLists[i].IDs, + histogram: len(details.ColumnLists[i].IDs) == 1, histogramMaxBuckets: histogramBuckets, - name: string(n.Name), + name: string(details.Name), } } - return dsp.createStatsPlan(planCtx, n.tableDesc, stats) + tableDesc := sqlbase.NewImmutableTableDescriptor(details.Table) + return dsp.createStatsPlan(planCtx, tableDesc, stats, job) +} + +func (dsp *DistSQLPlanner) planAndRunCreateStats( + ctx context.Context, + evalCtx *extendedEvalContext, + txn *client.Txn, + job *jobs.Job, + resultRows *RowResultWriter, +) error { + ctx = logtags.AddTag(ctx, "create-stats-distsql", nil) + planCtx := dsp.NewPlanningCtx(ctx, evalCtx, txn) + + physPlan, err := dsp.createPlanForCreateStats(planCtx, job) + if err != nil { + return err + } + + dsp.FinalizePlan(planCtx, &physPlan) + + recv := MakeDistSQLReceiver( + ctx, + resultRows, + tree.DDL, + evalCtx.ExecCfg.RangeDescriptorCache, + evalCtx.ExecCfg.LeaseHolderCache, + txn, + func(ts hlc.Timestamp) { + _ = evalCtx.ExecCfg.Clock.Update(ts) + }, + evalCtx.Tracing, + ) + defer recv.Release() + + dsp.Run(planCtx, txn, &physPlan, recv, evalCtx, nil /* finishedSetupFn */) + return resultRows.Err() } diff --git a/pkg/sql/distsql_running.go b/pkg/sql/distsql_running.go index 2246df5acd8a..797d1e75c475 100644 --- a/pkg/sql/distsql_running.go +++ b/pkg/sql/distsql_running.go @@ -792,41 +792,4 @@ func (dsp *DistSQLPlanner) PlanAndRun( } dsp.FinalizePlan(planCtx, &physPlan) dsp.Run(planCtx, txn, &physPlan, recv, evalCtx, nil /* finishedSetupFn */) - if recv.resultWriter.Err() == nil { - if err := dsp.logEvents(ctx, evalCtx, plan); err != nil { - recv.SetError(err) - return - } - } -} - -// logEvents logs events in the system.eventlog table for successful completion -// of some types of operations. -func (dsp *DistSQLPlanner) logEvents( - ctx context.Context, evalCtx *extendedEvalContext, plan planNode, -) error { - switch n := plan.(type) { - case *createStatsNode: - // Record this statistics creation in the event log. - // TODO(rytaft): This creates a new transaction for the CREATE STATISTICS - // event. It must be different from the CREATE STATISTICS transaction, - // because that transaction must be read-only. In the future we may want - // to use the transaction that inserted the new stats into the - // system.table_statistics table, but that would require calling - // MakeEventLogger from the distsqlrun package. - return evalCtx.ExecCfg.DB.Txn(ctx, func(ctx context.Context, txn *client.Txn) error { - return MakeEventLogger(evalCtx.ExecCfg).InsertEventRecord( - ctx, - txn, - EventLogCreateStatistics, - int32(n.tableDesc.ID), - int32(evalCtx.NodeID), - struct { - StatisticName string - Statement string - }{n.Name.String(), n.String()}, - ) - }) - } - return nil } diff --git a/pkg/sql/distsqlpb/data.pb.go b/pkg/sql/distsqlpb/data.pb.go index ea3a4f260e17..8fb9e1f4eeae 100644 --- a/pkg/sql/distsqlpb/data.pb.go +++ b/pkg/sql/distsqlpb/data.pb.go @@ -6,6 +6,7 @@ package distsqlpb import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" +import jobspb "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" import roachpb "github.com/cockroachdb/cockroach/pkg/roachpb" import pgerror "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgerror" import sqlbase "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" @@ -60,7 +61,7 @@ func (x *Ordering_Column_Direction) UnmarshalJSON(data []byte) error { return nil } func (Ordering_Column_Direction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{2, 0, 0} + return fileDescriptor_data_ae4a37a55599096a, []int{2, 0, 0} } type StreamEndpointSpec_Type int32 @@ -105,7 +106,7 @@ func (x *StreamEndpointSpec_Type) UnmarshalJSON(data []byte) error { return nil } func (StreamEndpointSpec_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{3, 0} + return fileDescriptor_data_ae4a37a55599096a, []int{3, 0} } type InputSyncSpec_Type int32 @@ -145,7 +146,7 @@ func (x *InputSyncSpec_Type) UnmarshalJSON(data []byte) error { return nil } func (InputSyncSpec_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{4, 0} + return fileDescriptor_data_ae4a37a55599096a, []int{4, 0} } type OutputRouterSpec_Type int32 @@ -193,7 +194,7 @@ func (x *OutputRouterSpec_Type) UnmarshalJSON(data []byte) error { return nil } func (OutputRouterSpec_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{5, 0} + return fileDescriptor_data_ae4a37a55599096a, []int{5, 0} } // Error is a generic representation including a string message. @@ -209,7 +210,7 @@ type Error struct { func (m *Error) Reset() { *m = Error{} } func (*Error) ProtoMessage() {} func (*Error) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{0} + return fileDescriptor_data_ae4a37a55599096a, []int{0} } func (m *Error) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -348,7 +349,7 @@ func _Error_OneofSizer(msg proto.Message) (n int) { func (m *Expression) Reset() { *m = Expression{} } func (*Expression) ProtoMessage() {} func (*Expression) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{1} + return fileDescriptor_data_ae4a37a55599096a, []int{1} } func (m *Expression) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -385,7 +386,7 @@ func (m *Ordering) Reset() { *m = Ordering{} } func (m *Ordering) String() string { return proto.CompactTextString(m) } func (*Ordering) ProtoMessage() {} func (*Ordering) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{2} + return fileDescriptor_data_ae4a37a55599096a, []int{2} } func (m *Ordering) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -421,7 +422,7 @@ func (m *Ordering_Column) Reset() { *m = Ordering_Column{} } func (m *Ordering_Column) String() string { return proto.CompactTextString(m) } func (*Ordering_Column) ProtoMessage() {} func (*Ordering_Column) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{2, 0} + return fileDescriptor_data_ae4a37a55599096a, []int{2, 0} } func (m *Ordering_Column) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -473,7 +474,7 @@ func (m *StreamEndpointSpec) Reset() { *m = StreamEndpointSpec{} } func (m *StreamEndpointSpec) String() string { return proto.CompactTextString(m) } func (*StreamEndpointSpec) ProtoMessage() {} func (*StreamEndpointSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{3} + return fileDescriptor_data_ae4a37a55599096a, []int{3} } func (m *StreamEndpointSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -514,7 +515,7 @@ func (m *InputSyncSpec) Reset() { *m = InputSyncSpec{} } func (m *InputSyncSpec) String() string { return proto.CompactTextString(m) } func (*InputSyncSpec) ProtoMessage() {} func (*InputSyncSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{4} + return fileDescriptor_data_ae4a37a55599096a, []int{4} } func (m *InputSyncSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -560,7 +561,7 @@ func (m *OutputRouterSpec) Reset() { *m = OutputRouterSpec{} } func (m *OutputRouterSpec) String() string { return proto.CompactTextString(m) } func (*OutputRouterSpec) ProtoMessage() {} func (*OutputRouterSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{5} + return fileDescriptor_data_ae4a37a55599096a, []int{5} } func (m *OutputRouterSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -605,7 +606,7 @@ func (m *OutputRouterSpec_RangeRouterSpec) Reset() { *m = OutputRouterSp func (m *OutputRouterSpec_RangeRouterSpec) String() string { return proto.CompactTextString(m) } func (*OutputRouterSpec_RangeRouterSpec) ProtoMessage() {} func (*OutputRouterSpec_RangeRouterSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{5, 0} + return fileDescriptor_data_ae4a37a55599096a, []int{5, 0} } func (m *OutputRouterSpec_RangeRouterSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -649,7 +650,7 @@ func (m *OutputRouterSpec_RangeRouterSpec_ColumnEncoding) String() string { } func (*OutputRouterSpec_RangeRouterSpec_ColumnEncoding) ProtoMessage() {} func (*OutputRouterSpec_RangeRouterSpec_ColumnEncoding) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{5, 0, 0} + return fileDescriptor_data_ae4a37a55599096a, []int{5, 0, 0} } func (m *OutputRouterSpec_RangeRouterSpec_ColumnEncoding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -688,7 +689,7 @@ func (m *OutputRouterSpec_RangeRouterSpec_Span) Reset() { *m = OutputRou func (m *OutputRouterSpec_RangeRouterSpec_Span) String() string { return proto.CompactTextString(m) } func (*OutputRouterSpec_RangeRouterSpec_Span) ProtoMessage() {} func (*OutputRouterSpec_RangeRouterSpec_Span) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{5, 0, 1} + return fileDescriptor_data_ae4a37a55599096a, []int{5, 0, 1} } func (m *OutputRouterSpec_RangeRouterSpec_Span) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -724,7 +725,7 @@ func (m *DatumInfo) Reset() { *m = DatumInfo{} } func (m *DatumInfo) String() string { return proto.CompactTextString(m) } func (*DatumInfo) ProtoMessage() {} func (*DatumInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{6} + return fileDescriptor_data_ae4a37a55599096a, []int{6} } func (m *DatumInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -761,7 +762,7 @@ func (m *ProducerHeader) Reset() { *m = ProducerHeader{} } func (m *ProducerHeader) String() string { return proto.CompactTextString(m) } func (*ProducerHeader) ProtoMessage() {} func (*ProducerHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{7} + return fileDescriptor_data_ae4a37a55599096a, []int{7} } func (m *ProducerHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -806,7 +807,7 @@ func (m *ProducerData) Reset() { *m = ProducerData{} } func (m *ProducerData) String() string { return proto.CompactTextString(m) } func (*ProducerData) ProtoMessage() {} func (*ProducerData) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{8} + return fileDescriptor_data_ae4a37a55599096a, []int{8} } func (m *ProducerData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -850,7 +851,7 @@ func (m *ProducerMessage) Reset() { *m = ProducerMessage{} } func (m *ProducerMessage) String() string { return proto.CompactTextString(m) } func (*ProducerMessage) ProtoMessage() {} func (*ProducerMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{9} + return fileDescriptor_data_ae4a37a55599096a, []int{9} } func (m *ProducerMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -886,6 +887,7 @@ type RemoteProducerMetadata struct { // *RemoteProducerMetadata_TraceData_ // *RemoteProducerMetadata_TxnCoordMeta // *RemoteProducerMetadata_RowNum_ + // *RemoteProducerMetadata_Progress Value isRemoteProducerMetadata_Value `protobuf_oneof:"value"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_sizecache int32 `json:"-"` @@ -895,7 +897,7 @@ func (m *RemoteProducerMetadata) Reset() { *m = RemoteProducerMetadata{} func (m *RemoteProducerMetadata) String() string { return proto.CompactTextString(m) } func (*RemoteProducerMetadata) ProtoMessage() {} func (*RemoteProducerMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{10} + return fileDescriptor_data_ae4a37a55599096a, []int{10} } func (m *RemoteProducerMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -941,12 +943,16 @@ type RemoteProducerMetadata_TxnCoordMeta struct { type RemoteProducerMetadata_RowNum_ struct { RowNum *RemoteProducerMetadata_RowNum `protobuf:"bytes,5,opt,name=row_num,json=rowNum,oneof"` } +type RemoteProducerMetadata_Progress struct { + Progress *jobspb.Progress `protobuf:"bytes,6,opt,name=progress,oneof"` +} func (*RemoteProducerMetadata_RangeInfo) isRemoteProducerMetadata_Value() {} func (*RemoteProducerMetadata_Error) isRemoteProducerMetadata_Value() {} func (*RemoteProducerMetadata_TraceData_) isRemoteProducerMetadata_Value() {} func (*RemoteProducerMetadata_TxnCoordMeta) isRemoteProducerMetadata_Value() {} func (*RemoteProducerMetadata_RowNum_) isRemoteProducerMetadata_Value() {} +func (*RemoteProducerMetadata_Progress) isRemoteProducerMetadata_Value() {} func (m *RemoteProducerMetadata) GetValue() isRemoteProducerMetadata_Value { if m != nil { @@ -990,6 +996,13 @@ func (m *RemoteProducerMetadata) GetRowNum() *RemoteProducerMetadata_RowNum { return nil } +func (m *RemoteProducerMetadata) GetProgress() *jobspb.Progress { + if x, ok := m.GetValue().(*RemoteProducerMetadata_Progress); ok { + return x.Progress + } + return nil +} + // XXX_OneofFuncs is for the internal use of the proto package. func (*RemoteProducerMetadata) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { return _RemoteProducerMetadata_OneofMarshaler, _RemoteProducerMetadata_OneofUnmarshaler, _RemoteProducerMetadata_OneofSizer, []interface{}{ @@ -998,6 +1011,7 @@ func (*RemoteProducerMetadata) XXX_OneofFuncs() (func(msg proto.Message, b *prot (*RemoteProducerMetadata_TraceData_)(nil), (*RemoteProducerMetadata_TxnCoordMeta)(nil), (*RemoteProducerMetadata_RowNum_)(nil), + (*RemoteProducerMetadata_Progress)(nil), } } @@ -1030,6 +1044,11 @@ func _RemoteProducerMetadata_OneofMarshaler(msg proto.Message, b *proto.Buffer) if err := b.EncodeMessage(x.RowNum); err != nil { return err } + case *RemoteProducerMetadata_Progress: + _ = b.EncodeVarint(6<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Progress); err != nil { + return err + } case nil: default: return fmt.Errorf("RemoteProducerMetadata.Value has unexpected type %T", x) @@ -1080,6 +1099,14 @@ func _RemoteProducerMetadata_OneofUnmarshaler(msg proto.Message, tag, wire int, err := b.DecodeMessage(msg) m.Value = &RemoteProducerMetadata_RowNum_{msg} return true, err + case 6: // value.progress + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(jobspb.Progress) + err := b.DecodeMessage(msg) + m.Value = &RemoteProducerMetadata_Progress{msg} + return true, err default: return false, nil } @@ -1114,6 +1141,11 @@ func _RemoteProducerMetadata_OneofSizer(msg proto.Message) (n int) { n += 1 // tag and wire n += proto.SizeVarint(uint64(s)) n += s + case *RemoteProducerMetadata_Progress: + s := proto.Size(x.Progress) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s case nil: default: panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) @@ -1131,7 +1163,7 @@ func (m *RemoteProducerMetadata_RangeInfos) Reset() { *m = RemoteProduce func (m *RemoteProducerMetadata_RangeInfos) String() string { return proto.CompactTextString(m) } func (*RemoteProducerMetadata_RangeInfos) ProtoMessage() {} func (*RemoteProducerMetadata_RangeInfos) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{10, 0} + return fileDescriptor_data_ae4a37a55599096a, []int{10, 0} } func (m *RemoteProducerMetadata_RangeInfos) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1166,7 +1198,7 @@ func (m *RemoteProducerMetadata_TraceData) Reset() { *m = RemoteProducer func (m *RemoteProducerMetadata_TraceData) String() string { return proto.CompactTextString(m) } func (*RemoteProducerMetadata_TraceData) ProtoMessage() {} func (*RemoteProducerMetadata_TraceData) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{10, 1} + return fileDescriptor_data_ae4a37a55599096a, []int{10, 1} } func (m *RemoteProducerMetadata_TraceData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1209,7 +1241,7 @@ func (m *RemoteProducerMetadata_RowNum) Reset() { *m = RemoteProducerMet func (m *RemoteProducerMetadata_RowNum) String() string { return proto.CompactTextString(m) } func (*RemoteProducerMetadata_RowNum) ProtoMessage() {} func (*RemoteProducerMetadata_RowNum) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{10, 2} + return fileDescriptor_data_ae4a37a55599096a, []int{10, 2} } func (m *RemoteProducerMetadata_RowNum) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1251,7 +1283,7 @@ func (m *DistSQLVersionGossipInfo) Reset() { *m = DistSQLVersionGossipIn func (m *DistSQLVersionGossipInfo) String() string { return proto.CompactTextString(m) } func (*DistSQLVersionGossipInfo) ProtoMessage() {} func (*DistSQLVersionGossipInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{11} + return fileDescriptor_data_ae4a37a55599096a, []int{11} } func (m *DistSQLVersionGossipInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1289,7 +1321,7 @@ func (m *DistSQLDrainingInfo) Reset() { *m = DistSQLDrainingInfo{} } func (m *DistSQLDrainingInfo) String() string { return proto.CompactTextString(m) } func (*DistSQLDrainingInfo) ProtoMessage() {} func (*DistSQLDrainingInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_data_f33d9406823eb329, []int{12} + return fileDescriptor_data_ae4a37a55599096a, []int{12} } func (m *DistSQLDrainingInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2013,6 +2045,20 @@ func (m *RemoteProducerMetadata_RowNum_) MarshalTo(dAtA []byte) (int, error) { } return i, nil } +func (m *RemoteProducerMetadata_Progress) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.Progress != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintData(dAtA, i, uint64(m.Progress.Size())) + n16, err := m.Progress.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n16 + } + return i, nil +} func (m *RemoteProducerMetadata_RangeInfos) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2492,6 +2538,18 @@ func (m *RemoteProducerMetadata_RowNum_) Size() (n int) { } return n } +func (m *RemoteProducerMetadata_Progress) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Progress != nil { + l = m.Progress.Size() + n += 1 + l + sovData(uint64(l)) + } + return n +} func (m *RemoteProducerMetadata_RangeInfos) Size() (n int) { if m == nil { return 0 @@ -4493,6 +4551,38 @@ func (m *RemoteProducerMetadata) Unmarshal(dAtA []byte) error { } m.Value = &RemoteProducerMetadata_RowNum_{v} iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Progress", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowData + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthData + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &jobspb.Progress{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &RemoteProducerMetadata_Progress{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipData(dAtA[iNdEx:]) @@ -5057,114 +5147,116 @@ var ( ErrIntOverflowData = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("sql/distsqlpb/data.proto", fileDescriptor_data_f33d9406823eb329) } +func init() { proto.RegisterFile("sql/distsqlpb/data.proto", fileDescriptor_data_ae4a37a55599096a) } -var fileDescriptor_data_f33d9406823eb329 = []byte{ - // 1681 bytes of a gzipped FileDescriptorProto +var fileDescriptor_data_ae4a37a55599096a = []byte{ + // 1723 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0x4f, 0x6f, 0x1b, 0xb9, - 0x15, 0xd7, 0xc8, 0xfa, 0xfb, 0x24, 0x2b, 0x32, 0x1b, 0xa4, 0x82, 0x9a, 0x4a, 0xde, 0x69, 0x8b, - 0x06, 0xbb, 0xa8, 0x94, 0x75, 0x81, 0x2d, 0xe2, 0x02, 0x4d, 0x2d, 0x4b, 0x6b, 0x79, 0x37, 0xb1, - 0x9c, 0x91, 0xb3, 0x40, 0xd2, 0xc3, 0x74, 0x3c, 0xa4, 0xc7, 0x83, 0x8c, 0x66, 0xc6, 0x24, 0x27, - 0xb2, 0x2f, 0x3d, 0xf4, 0x13, 0xec, 0xa9, 0xe8, 0x71, 0x7b, 0xe8, 0xa5, 0x5f, 0xa0, 0x5f, 0xa0, - 0x87, 0x1c, 0x7b, 0x29, 0xb0, 0xd8, 0x83, 0xd1, 0xba, 0x97, 0x1e, 0x7b, 0xe8, 0x69, 0xd1, 0x43, - 0x41, 0x0e, 0xa9, 0x3f, 0x76, 0xd4, 0xdd, 0x24, 0x97, 0x01, 0xf9, 0xf8, 0xde, 0x8f, 0x3f, 0xfe, - 0xf8, 0xf8, 0x38, 0x84, 0x06, 0x3b, 0x0b, 0xba, 0xd8, 0x67, 0x9c, 0x9d, 0x05, 0xf1, 0x71, 0x17, - 0x3b, 0xdc, 0xe9, 0xc4, 0x34, 0xe2, 0x11, 0xfa, 0xae, 0x1b, 0xb9, 0x2f, 0x68, 0xe4, 0xb8, 0xa7, - 0x1d, 0x76, 0x16, 0x74, 0x66, 0x3e, 0xcd, 0x0d, 0x69, 0x8c, 0x8f, 0xbb, 0x4e, 0xec, 0xa7, 0xbe, - 0x4d, 0xa4, 0x4d, 0xf3, 0xf8, 0xe6, 0x6d, 0x6d, 0x23, 0x94, 0x46, 0x94, 0x29, 0x6b, 0x5b, 0xcc, - 0x17, 0x7b, 0x53, 0x9f, 0x92, 0x6e, 0xec, 0xc9, 0xa1, 0x65, 0x87, 0xbb, 0xc2, 0x81, 0x9d, 0x05, - 0xc7, 0x0e, 0x23, 0x5d, 0xc6, 0x69, 0xe2, 0xf2, 0x84, 0x12, 0xbc, 0x18, 0xae, 0x47, 0x49, 0xe8, - 0x46, 0x98, 0x60, 0x1b, 0x3b, 0x3c, 0x99, 0x28, 0x87, 0xcd, 0x84, 0xfb, 0x41, 0x97, 0x53, 0xc7, - 0xf5, 0x43, 0xaf, 0x4b, 0x89, 0x1b, 0x51, 0xe1, 0xc2, 0x62, 0x27, 0xd4, 0xbc, 0xbc, 0xc8, 0x8b, - 0x64, 0xb3, 0x2b, 0x5a, 0xa9, 0xd5, 0xfc, 0xb3, 0x01, 0xf9, 0x81, 0xe0, 0x81, 0x7a, 0x50, 0x8a, - 0x3d, 0x5b, 0x72, 0x6a, 0x18, 0x9b, 0xc6, 0xbd, 0xca, 0x56, 0xa3, 0x33, 0x97, 0x42, 0x71, 0xee, - 0x48, 0xdf, 0x5e, 0xe5, 0xea, 0xb2, 0x5d, 0x3c, 0xdc, 0x93, 0x9d, 0x61, 0xc6, 0x2a, 0xc6, 0x5e, - 0x8a, 0xf1, 0x1c, 0x36, 0x28, 0xe1, 0xf4, 0xc2, 0x39, 0x0e, 0xc8, 0xd1, 0x79, 0x28, 0x8d, 0x8d, - 0xac, 0x04, 0x7b, 0x7f, 0x01, 0x4c, 0x29, 0xd4, 0x79, 0x1a, 0x9e, 0x3a, 0x21, 0x0e, 0x08, 0xb6, - 0x74, 0x90, 0x46, 0xbc, 0x09, 0xb3, 0x9d, 0xfb, 0xfd, 0x17, 0xed, 0x4c, 0xaf, 0x04, 0x05, 0x4c, - 0xb8, 0xe3, 0x07, 0xe6, 0x21, 0xc0, 0xe0, 0x3c, 0xa6, 0x84, 0x31, 0x3f, 0x0a, 0x51, 0x0b, 0x8a, - 0x2f, 0x09, 0x15, 0x4d, 0x49, 0xbe, 0xdc, 0xcb, 0xbd, 0xba, 0x6c, 0x67, 0x2c, 0x6d, 0x44, 0x0d, - 0xc8, 0x91, 0xf3, 0x38, 0x25, 0xa3, 0x07, 0xa5, 0x65, 0xbb, 0x24, 0x70, 0xff, 0xfd, 0x87, 0x76, - 0xc6, 0xfc, 0x6d, 0x16, 0x4a, 0x23, 0x8a, 0x09, 0xf5, 0x43, 0x0f, 0x0d, 0xa1, 0xe8, 0x46, 0x41, - 0x32, 0x09, 0x59, 0xc3, 0xd8, 0x5c, 0xbb, 0x57, 0xd9, 0xba, 0xd7, 0x59, 0x91, 0x18, 0x1d, 0x1d, - 0xd3, 0xd9, 0x95, 0x01, 0x7a, 0x6a, 0x15, 0xde, 0xfc, 0xa3, 0x01, 0x85, 0x74, 0x04, 0x7d, 0x5f, - 0x82, 0xda, 0x3e, 0x3e, 0x97, 0x2c, 0xd7, 0x95, 0x6b, 0xc1, 0x8d, 0x82, 0x7d, 0x7c, 0x8e, 0x3e, - 0x83, 0x32, 0xf6, 0x29, 0x71, 0xb9, 0x58, 0x86, 0x60, 0x5a, 0xdb, 0xda, 0xfa, 0xb6, 0xb3, 0x76, - 0xfa, 0x3a, 0x52, 0x81, 0xce, 0xa1, 0xcc, 0x16, 0x94, 0x67, 0xa3, 0xa8, 0x08, 0x6b, 0x3b, 0xe3, - 0xdd, 0x7a, 0x06, 0x95, 0x20, 0xd7, 0x1f, 0x8c, 0x77, 0xeb, 0xc6, 0x76, 0xee, 0x5f, 0x5f, 0xb4, - 0xd5, 0xd7, 0xfc, 0x6f, 0x16, 0xd0, 0x98, 0x53, 0xe2, 0x4c, 0x06, 0x21, 0x8e, 0x23, 0x3f, 0xe4, - 0xe3, 0x98, 0xb8, 0xe8, 0x13, 0xc8, 0xf1, 0x8b, 0x98, 0x48, 0xda, 0xb5, 0xad, 0xfb, 0x2b, 0x59, - 0xdd, 0x0c, 0xed, 0x1c, 0x5d, 0xc4, 0x44, 0x2b, 0x2e, 0x30, 0xd0, 0x03, 0x28, 0x33, 0xe9, 0x66, - 0xfb, 0x58, 0x2e, 0x33, 0xdf, 0xbb, 0x2b, 0x86, 0xaf, 0x2e, 0xdb, 0xa5, 0x34, 0x7e, 0xbf, 0xff, - 0xf5, 0x42, 0xdb, 0x2a, 0xa5, 0xee, 0xfb, 0x18, 0x6d, 0xc3, 0x1d, 0x4c, 0x62, 0x4a, 0x5c, 0x87, - 0x13, 0x6c, 0x73, 0x87, 0x7a, 0x84, 0xdb, 0x0e, 0xc6, 0xb4, 0xb1, 0xb6, 0xb0, 0xb1, 0xb7, 0xe7, - 0x3e, 0x47, 0xd2, 0x65, 0x07, 0x63, 0x8a, 0xce, 0xa0, 0xa6, 0x02, 0xc2, 0x08, 0x13, 0x31, 0x77, - 0x4e, 0xce, 0xfd, 0xa9, 0x9a, 0xbb, 0x9a, 0xfa, 0x1e, 0x44, 0x98, 0xc8, 0xf9, 0x7f, 0xea, 0xf9, - 0xfc, 0x34, 0x39, 0xee, 0xb8, 0xd1, 0xa4, 0x3b, 0x5b, 0x2e, 0x3e, 0x9e, 0xb7, 0xbb, 0xf1, 0x0b, - 0xaf, 0xab, 0x73, 0x39, 0x0d, 0xb3, 0xaa, 0x7c, 0x0e, 0x82, 0xcd, 0xfb, 0x90, 0x13, 0xab, 0x47, - 0x65, 0xc8, 0x3f, 0x1a, 0xed, 0xee, 0x3c, 0xaa, 0x67, 0x10, 0x40, 0xc1, 0x1a, 0x3c, 0x1e, 0x1d, - 0x0d, 0xea, 0x06, 0xda, 0x80, 0xf5, 0xf1, 0xb3, 0x83, 0x5d, 0xdb, 0x1a, 0x8c, 0x0f, 0x47, 0x07, - 0xe3, 0x41, 0x3d, 0x6b, 0x7e, 0x99, 0x85, 0xf5, 0xfd, 0x30, 0x4e, 0xf8, 0xf8, 0x22, 0x74, 0xa5, - 0xf2, 0x83, 0x25, 0xe5, 0x3f, 0x58, 0xa9, 0xfc, 0x52, 0xd4, 0x4d, 0xd1, 0x77, 0xa1, 0x14, 0xa9, - 0x8c, 0x51, 0x27, 0xf2, 0xbd, 0x6f, 0x4c, 0x2d, 0x05, 0x30, 0x0b, 0x44, 0x9f, 0x42, 0x31, 0xdd, - 0x0a, 0xd6, 0x58, 0x93, 0x87, 0xe2, 0x83, 0x37, 0x48, 0x04, 0x7d, 0x2e, 0x14, 0x02, 0xfa, 0x04, - 0xaa, 0xe9, 0x11, 0xb1, 0x05, 0x41, 0xd6, 0xc8, 0x49, 0xc4, 0xeb, 0xac, 0x54, 0xd1, 0x53, 0x59, - 0xbe, 0xb0, 0xac, 0x8a, 0x3b, 0xb3, 0x30, 0xd3, 0x54, 0x42, 0xaf, 0x43, 0xf9, 0xe9, 0xc1, 0xc8, - 0xea, 0x0f, 0xac, 0x41, 0xbf, 0x9e, 0x41, 0x15, 0x28, 0xea, 0x8e, 0x61, 0xfe, 0xa7, 0x00, 0xf5, - 0x51, 0xc2, 0xe3, 0x84, 0x5b, 0x51, 0xc2, 0x09, 0x95, 0xea, 0x0e, 0x97, 0xd4, 0xed, 0xac, 0x96, - 0xe4, 0x5a, 0xe0, 0x4d, 0x81, 0x17, 0xb4, 0xc9, 0xbe, 0xb3, 0x36, 0xef, 0x41, 0xf5, 0xd4, 0x61, - 0xa7, 0xb6, 0x2e, 0x41, 0x42, 0xed, 0x75, 0xab, 0x22, 0x6c, 0xa9, 0x10, 0x0c, 0xbd, 0x80, 0x0d, - 0xea, 0x84, 0x1e, 0xb1, 0xa9, 0x24, 0x65, 0xb3, 0x98, 0xb8, 0x32, 0xa3, 0x2b, 0x5b, 0x0f, 0xbe, - 0xfd, 0x32, 0x2c, 0x01, 0x31, 0xef, 0x2b, 0x1e, 0xb7, 0xe8, 0xb2, 0x19, 0x7d, 0x08, 0x1b, 0xd8, - 0x67, 0xa2, 0x1e, 0xdb, 0xc7, 0xc9, 0xc9, 0x49, 0x9a, 0x46, 0xf9, 0x4d, 0xe3, 0x5e, 0x49, 0x45, - 0xd4, 0xd5, 0x70, 0x4f, 0x8f, 0x36, 0xff, 0xb2, 0x06, 0xb7, 0xae, 0xa1, 0xa3, 0xe7, 0x90, 0x17, - 0x37, 0x92, 0x2e, 0xa9, 0xbf, 0x78, 0x6b, 0x9e, 0x9d, 0x71, 0xec, 0xe8, 0x42, 0x97, 0x42, 0x0a, - 0xc9, 0x30, 0x39, 0x71, 0x92, 0x80, 0xdb, 0x98, 0x30, 0x9e, 0x16, 0x16, 0xab, 0xa2, 0x6c, 0x7d, - 0xc2, 0x38, 0x0a, 0xa0, 0x2c, 0xef, 0x4e, 0x3f, 0xf4, 0x74, 0x02, 0x0f, 0xdf, 0x9e, 0x42, 0xba, - 0x11, 0x03, 0x05, 0xa8, 0xab, 0xee, 0x6c, 0x82, 0xe6, 0x4b, 0xa8, 0x2d, 0xbb, 0xa0, 0xbb, 0x50, - 0x48, 0x37, 0xf4, 0x46, 0xf5, 0x17, 0x97, 0xc3, 0xc7, 0x50, 0xd2, 0xc1, 0xaa, 0xf8, 0xff, 0x70, - 0xc5, 0x59, 0xe8, 0x8b, 0x8b, 0xff, 0xda, 0xc4, 0xb3, 0xd8, 0xe6, 0x23, 0xc8, 0x09, 0x75, 0xd0, - 0x6d, 0xc8, 0x33, 0xee, 0x50, 0x2e, 0x27, 0xab, 0x5a, 0x69, 0x07, 0xd5, 0x61, 0x8d, 0x84, 0x69, - 0xd9, 0xad, 0x5a, 0xa2, 0x29, 0x58, 0xa5, 0x69, 0x27, 0x6b, 0x68, 0x5e, 0xb3, 0x4a, 0x6d, 0xe6, - 0x43, 0x75, 0xb2, 0xea, 0x50, 0x3d, 0xdc, 0x19, 0x8f, 0xed, 0xa3, 0xa1, 0x35, 0x7a, 0xba, 0x37, - 0x4c, 0x2b, 0xd9, 0xe3, 0x7d, 0xcb, 0x1a, 0x59, 0x75, 0x43, 0x1c, 0xb4, 0xde, 0x33, 0x7b, 0xb8, - 0x33, 0x1e, 0xd6, 0xb3, 0xa8, 0x0a, 0xa5, 0xde, 0x33, 0xdb, 0xda, 0x39, 0xd8, 0x1b, 0xd4, 0xd7, - 0xcc, 0xcf, 0x0d, 0x28, 0x4b, 0xc2, 0xfb, 0xe1, 0x49, 0xb4, 0xb4, 0x48, 0xe3, 0xed, 0x17, 0x89, - 0x7e, 0xae, 0xce, 0xed, 0xeb, 0x4b, 0xd9, 0xca, 0xa2, 0x21, 0x83, 0xcc, 0xdf, 0x40, 0xed, 0x90, - 0x46, 0x38, 0x71, 0x09, 0x1d, 0x12, 0x07, 0x13, 0x8a, 0x3e, 0x84, 0xe2, 0x49, 0x10, 0x4d, 0xc5, - 0xa5, 0x20, 0xd5, 0xea, 0x35, 0x84, 0xfb, 0x57, 0x97, 0xed, 0xc2, 0xc7, 0x41, 0x34, 0xdd, 0xef, - 0x5f, 0xcd, 0x5a, 0x56, 0x41, 0x38, 0xee, 0xe3, 0x77, 0xb8, 0xc5, 0xcc, 0x3f, 0x19, 0x50, 0xd5, - 0x04, 0xfa, 0x0e, 0x77, 0xd0, 0xf7, 0xa0, 0x4c, 0x9d, 0xa9, 0x7d, 0x7c, 0xc1, 0x09, 0x53, 0xdb, - 0x55, 0xa2, 0xce, 0xb4, 0x27, 0xfa, 0xe8, 0x09, 0x94, 0x26, 0x84, 0x3b, 0xe2, 0x17, 0x53, 0x55, - 0x96, 0xee, 0xca, 0xa4, 0xb5, 0xc8, 0x24, 0xe2, 0x44, 0x63, 0x3f, 0x56, 0x61, 0x5a, 0x3d, 0x0d, - 0x83, 0xde, 0x87, 0x5a, 0x98, 0x4c, 0x6c, 0x32, 0x89, 0xf9, 0x85, 0x4d, 0xa3, 0x29, 0x5b, 0xda, - 0xfa, 0x6a, 0x98, 0x4c, 0x06, 0x62, 0xc8, 0x8a, 0xa6, 0xcc, 0xfc, 0x9b, 0x01, 0xb7, 0xe6, 0x80, - 0x8c, 0x39, 0x1e, 0x41, 0x0f, 0xa1, 0x70, 0x2a, 0x85, 0x53, 0x7f, 0x8a, 0x3f, 0x5e, 0x49, 0x68, - 0x59, 0x67, 0x4b, 0x85, 0xa1, 0x5f, 0x42, 0x81, 0x5f, 0xc4, 0x69, 0xa6, 0x8b, 0x15, 0x99, 0x2b, - 0x01, 0x66, 0xa9, 0xa3, 0xf3, 0x32, 0x8d, 0x43, 0x0f, 0x21, 0x27, 0x15, 0x59, 0x93, 0x04, 0x7e, - 0xf4, 0x8d, 0x04, 0xfa, 0x73, 0x1d, 0x64, 0xa0, 0xf9, 0x55, 0x1e, 0xee, 0xbc, 0x5e, 0x2e, 0xf4, - 0x2b, 0x80, 0xb4, 0xb4, 0xfa, 0xe1, 0x49, 0xa4, 0x96, 0xb8, 0xfd, 0x86, 0x9a, 0xa7, 0xe5, 0x42, - 0x10, 0x67, 0xc3, 0x8c, 0x55, 0xa6, 0xba, 0x87, 0x3e, 0x82, 0x3c, 0x59, 0xf8, 0x2f, 0x6e, 0xad, - 0xc4, 0xd5, 0xff, 0xc2, 0xa9, 0x3b, 0x7a, 0x0e, 0x20, 0x7e, 0xef, 0x89, 0xbd, 0xb0, 0xec, 0x07, - 0x6f, 0x4a, 0xea, 0x48, 0x20, 0x08, 0x29, 0x04, 0x27, 0xae, 0x3b, 0x68, 0x0f, 0x6a, 0xfc, 0x3c, - 0xb4, 0xdd, 0x28, 0xa2, 0xd8, 0x16, 0x59, 0xa2, 0x2e, 0x92, 0xf6, 0x6b, 0x7e, 0xda, 0x8f, 0xce, - 0xc3, 0x5d, 0xe1, 0x27, 0x30, 0x87, 0x19, 0xab, 0xca, 0x17, 0xfa, 0xe8, 0x09, 0x14, 0x69, 0x34, - 0xb5, 0xc3, 0x64, 0x22, 0x6f, 0x87, 0xca, 0xd6, 0x47, 0x6f, 0x2c, 0x5b, 0x34, 0x3d, 0x48, 0x26, - 0xc3, 0x8c, 0x55, 0xa0, 0xb2, 0xd5, 0x1c, 0x01, 0xcc, 0xa5, 0x44, 0x3b, 0xd7, 0xb6, 0x46, 0x24, - 0xcf, 0xdd, 0xd7, 0xb0, 0x9c, 0x85, 0xe8, 0xba, 0x3c, 0xdb, 0x80, 0xe6, 0xaf, 0xa1, 0x3c, 0x93, - 0x01, 0x8d, 0xe1, 0x96, 0x1b, 0x05, 0x01, 0x71, 0xb9, 0x7a, 0x2d, 0xe9, 0xbb, 0x69, 0xb1, 0x2c, - 0x89, 0xb7, 0x55, 0x47, 0xbd, 0xad, 0x3a, 0x96, 0x7a, 0x5b, 0x2d, 0xdc, 0x40, 0xb5, 0x19, 0x84, - 0x30, 0xb2, 0xe6, 0x14, 0x0a, 0xe9, 0x32, 0xd0, 0x4f, 0xa0, 0xcc, 0x48, 0x88, 0x09, 0xd5, 0x95, - 0xa5, 0xdc, 0xab, 0xcf, 0x8a, 0x84, 0x1c, 0x90, 0x85, 0x21, 0x6d, 0x61, 0xf1, 0x3e, 0xd0, 0xf2, - 0x65, 0x17, 0x6b, 0x71, 0x2a, 0x05, 0x6a, 0x43, 0x29, 0x70, 0x18, 0xb7, 0x27, 0xcc, 0x93, 0x09, - 0xa0, 0x2f, 0xdf, 0xa2, 0xb0, 0x3e, 0x66, 0x5e, 0xaf, 0x08, 0xf9, 0x97, 0x4e, 0x90, 0x10, 0xf3, - 0x77, 0x06, 0x34, 0xfa, 0x3e, 0xe3, 0xe3, 0x27, 0x8f, 0x3e, 0x4b, 0x5f, 0x40, 0x7b, 0x11, 0x63, - 0x7e, 0x2c, 0x33, 0xf0, 0xfe, 0xf2, 0x5b, 0x69, 0xbd, 0x77, 0x47, 0xa0, 0x7c, 0x7d, 0xd9, 0xae, - 0x2d, 0x87, 0xcc, 0x5f, 0x4f, 0x43, 0xb8, 0x3d, 0xf1, 0x43, 0xdb, 0x71, 0x5d, 0x12, 0x0b, 0xa1, - 0x74, 0x78, 0xf6, 0xff, 0x86, 0xa3, 0x89, 0x1f, 0xee, 0xa8, 0x10, 0x65, 0x33, 0x7f, 0x06, 0xdf, - 0x51, 0x5e, 0x7d, 0xea, 0xf8, 0xa1, 0x1f, 0x7a, 0x92, 0xd2, 0x26, 0x94, 0xb0, 0xea, 0x4b, 0x4e, - 0x7a, 0x65, 0x33, 0x6b, 0xef, 0x07, 0xaf, 0xfe, 0xd1, 0xca, 0xbc, 0xba, 0x6a, 0x19, 0x7f, 0xbd, - 0x6a, 0x19, 0x5f, 0x5e, 0xb5, 0x8c, 0xbf, 0x5f, 0xb5, 0x8c, 0xcf, 0xff, 0xd9, 0xca, 0x3c, 0x2f, - 0xcf, 0x72, 0xea, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x60, 0x4d, 0xe0, 0xde, 0xd6, 0x0f, 0x00, - 0x00, + 0x15, 0xd7, 0xd8, 0xb2, 0xfe, 0x3c, 0xc9, 0x8a, 0xcc, 0x06, 0xa9, 0xa0, 0xa6, 0x92, 0x77, 0xb6, + 0x45, 0x83, 0x5d, 0x54, 0xca, 0xba, 0xc0, 0x16, 0x71, 0x81, 0xa6, 0x92, 0xa5, 0xb5, 0xbc, 0x9b, + 0x58, 0xce, 0xc8, 0x59, 0x20, 0xe9, 0x61, 0x3a, 0x1a, 0xd2, 0xe3, 0x69, 0x46, 0x33, 0x63, 0x92, + 0x13, 0xd9, 0x97, 0x1e, 0xfa, 0x09, 0xf6, 0x54, 0xf4, 0x52, 0x60, 0x7b, 0xe8, 0xa5, 0x5f, 0xa0, + 0x5f, 0xa0, 0x87, 0x1c, 0x7b, 0x29, 0xb0, 0xe8, 0xc1, 0x68, 0xdd, 0x4b, 0x8f, 0x3d, 0xf4, 0xb4, + 0xe8, 0xa1, 0x20, 0x87, 0xd4, 0x1f, 0x3b, 0xea, 0x6e, 0xb2, 0x17, 0x89, 0x7c, 0x7c, 0xef, 0xc7, + 0x1f, 0x7f, 0x7c, 0x7c, 0x1c, 0x42, 0x8d, 0x9d, 0x05, 0x6d, 0xec, 0x33, 0xce, 0xce, 0x82, 0x78, + 0xdc, 0xc6, 0x0e, 0x77, 0x5a, 0x31, 0x8d, 0x78, 0x84, 0xbe, 0xed, 0x46, 0xee, 0x0b, 0x1a, 0x39, + 0xee, 0x69, 0x8b, 0x9d, 0x05, 0xad, 0x99, 0x4f, 0xfd, 0xce, 0x2f, 0xa3, 0x31, 0x6b, 0x8b, 0x9f, + 0x78, 0x2c, 0xff, 0xd2, 0x80, 0xfa, 0x96, 0x74, 0x8e, 0xc7, 0x6d, 0x27, 0xf6, 0x95, 0x09, 0x69, + 0xd3, 0x1c, 0xb7, 0x7e, 0x5b, 0xdb, 0x08, 0xa5, 0x11, 0xd5, 0xc1, 0x4d, 0xc1, 0x23, 0xf6, 0xa6, + 0x3e, 0x25, 0xed, 0xd8, 0x93, 0x43, 0xcb, 0x0e, 0x77, 0x85, 0x03, 0x3b, 0x0b, 0xc6, 0x0e, 0x23, + 0x6d, 0xc6, 0x69, 0xe2, 0xf2, 0x84, 0x12, 0xbc, 0x18, 0xae, 0x47, 0x49, 0xe8, 0x46, 0x98, 0x60, + 0x1b, 0x3b, 0x3c, 0x99, 0x28, 0x87, 0xed, 0x84, 0xfb, 0x41, 0x9b, 0x53, 0xc7, 0xf5, 0x43, 0xaf, + 0x4d, 0x89, 0x1b, 0x51, 0xe1, 0xc2, 0x62, 0x27, 0xd4, 0xbc, 0xbc, 0xc8, 0x8b, 0x64, 0xb3, 0x2d, + 0x5a, 0xa9, 0xd5, 0xfc, 0x93, 0x01, 0x1b, 0x7d, 0xc1, 0x03, 0x75, 0xa1, 0x10, 0x7b, 0xb6, 0xe4, + 0x54, 0x33, 0xb6, 0x8d, 0x7b, 0xa5, 0x9d, 0x5a, 0x6b, 0x2e, 0x91, 0xe2, 0xdc, 0x92, 0xbe, 0xdd, + 0xd2, 0xd5, 0x65, 0x33, 0x7f, 0xb4, 0x2f, 0x3b, 0x83, 0x8c, 0x95, 0x8f, 0xbd, 0x14, 0xe3, 0x39, + 0x6c, 0x51, 0xc2, 0xe9, 0x85, 0x33, 0x0e, 0xc8, 0xf1, 0x79, 0x28, 0x8d, 0xb5, 0x35, 0x09, 0xf6, + 0xde, 0x02, 0x98, 0x52, 0xa8, 0xf5, 0x34, 0x3c, 0x75, 0x42, 0x1c, 0x10, 0x6c, 0xe9, 0x20, 0x8d, + 0x78, 0x13, 0x66, 0x37, 0xfb, 0xdb, 0xcf, 0x9b, 0x99, 0x6e, 0x01, 0x72, 0x98, 0x70, 0xc7, 0x0f, + 0xcc, 0x23, 0x80, 0xfe, 0x79, 0x4c, 0x09, 0x63, 0x7e, 0x14, 0xa2, 0x06, 0xe4, 0x5f, 0x12, 0x2a, + 0x9a, 0x92, 0x7c, 0xb1, 0x9b, 0x7d, 0x75, 0xd9, 0xcc, 0x58, 0xda, 0x88, 0x6a, 0x90, 0x25, 0xe7, + 0x71, 0x4a, 0x46, 0x0f, 0x4a, 0xcb, 0x6e, 0x41, 0xe0, 0xfe, 0xfb, 0xf7, 0xcd, 0x8c, 0xf9, 0xeb, + 0x35, 0x28, 0x0c, 0x29, 0x26, 0xd4, 0x0f, 0x3d, 0x34, 0x80, 0xbc, 0x1b, 0x05, 0xc9, 0x24, 0x64, + 0x35, 0x63, 0x7b, 0xfd, 0x5e, 0x69, 0xe7, 0x5e, 0x6b, 0x45, 0xc2, 0xb4, 0x74, 0x4c, 0x6b, 0x4f, + 0x06, 0xe8, 0xa9, 0x55, 0x78, 0xfd, 0x0f, 0x06, 0xe4, 0xd2, 0x11, 0xf4, 0x5d, 0x09, 0x6a, 0xfb, + 0xf8, 0x5c, 0xb2, 0xdc, 0x54, 0xae, 0x39, 0x37, 0x0a, 0x0e, 0xf0, 0x39, 0xfa, 0x14, 0x8a, 0xd8, + 0xa7, 0xc4, 0xe5, 0x62, 0x19, 0x82, 0x69, 0x65, 0x67, 0xe7, 0xeb, 0xce, 0xda, 0xea, 0xe9, 0x48, + 0x05, 0x3a, 0x87, 0x32, 0x1b, 0x50, 0x9c, 0x8d, 0xa2, 0x3c, 0xac, 0x77, 0x46, 0x7b, 0xd5, 0x0c, + 0x2a, 0x40, 0xb6, 0xd7, 0x1f, 0xed, 0x55, 0x8d, 0xdd, 0xec, 0xbf, 0x3e, 0x6f, 0xaa, 0x5f, 0xf3, + 0xbf, 0x6b, 0x80, 0x46, 0x9c, 0x12, 0x67, 0xd2, 0x0f, 0x71, 0x1c, 0xf9, 0x21, 0x1f, 0xc5, 0xc4, + 0x45, 0x1f, 0x43, 0x96, 0x5f, 0xc4, 0x44, 0xd2, 0xae, 0xec, 0xdc, 0x5f, 0xc9, 0xea, 0x66, 0x68, + 0xeb, 0xf8, 0x22, 0x26, 0x5a, 0x71, 0x81, 0x81, 0x1e, 0x40, 0x91, 0x49, 0x37, 0xdb, 0xc7, 0x72, + 0x99, 0x1b, 0xdd, 0xbb, 0x62, 0xf8, 0xea, 0xb2, 0x59, 0x48, 0xe3, 0x0f, 0x7a, 0x5f, 0x2e, 0xb4, + 0xad, 0x42, 0xea, 0x7e, 0x80, 0xd1, 0x2e, 0xdc, 0xc1, 0x24, 0xa6, 0xc4, 0x75, 0x38, 0xc1, 0x36, + 0x77, 0xa8, 0x47, 0xb8, 0xed, 0x60, 0x4c, 0x6b, 0xeb, 0x0b, 0x1b, 0x7b, 0x7b, 0xee, 0x73, 0x2c, + 0x5d, 0x3a, 0x18, 0x53, 0x74, 0x06, 0x15, 0x15, 0x10, 0x46, 0x98, 0x88, 0xb9, 0xb3, 0x72, 0xee, + 0x4f, 0xd4, 0xdc, 0xe5, 0xd4, 0xf7, 0x30, 0xc2, 0x44, 0xce, 0xff, 0x23, 0xcf, 0xe7, 0xa7, 0xc9, + 0xb8, 0xe5, 0x46, 0x93, 0xf6, 0x6c, 0xb9, 0x78, 0x3c, 0x6f, 0xb7, 0xe3, 0x17, 0x5e, 0x5b, 0xe7, + 0x72, 0x1a, 0x66, 0x95, 0xf9, 0x1c, 0x04, 0x9b, 0xf7, 0x21, 0x2b, 0x56, 0x8f, 0x8a, 0xb0, 0xf1, + 0x68, 0xb8, 0xd7, 0x79, 0x54, 0xcd, 0x20, 0x80, 0x9c, 0xd5, 0x7f, 0x3c, 0x3c, 0xee, 0x57, 0x0d, + 0xb4, 0x05, 0x9b, 0xa3, 0x67, 0x87, 0x7b, 0xb6, 0xd5, 0x1f, 0x1d, 0x0d, 0x0f, 0x47, 0xfd, 0xea, + 0x9a, 0xf9, 0xc5, 0x1a, 0x6c, 0x1e, 0x84, 0x71, 0xc2, 0x47, 0x17, 0xa1, 0x2b, 0x95, 0xef, 0x2f, + 0x29, 0xff, 0xfe, 0x4a, 0xe5, 0x97, 0xa2, 0x6e, 0x8a, 0xbe, 0x07, 0x85, 0x48, 0x65, 0x8c, 0x3a, + 0x91, 0xef, 0x7c, 0x65, 0x6a, 0x29, 0x80, 0x59, 0x20, 0xfa, 0x04, 0xf2, 0xe9, 0x56, 0xb0, 0xda, + 0xba, 0x3c, 0x14, 0xef, 0xbf, 0x41, 0x22, 0xe8, 0x73, 0xa1, 0x10, 0xd0, 0xc7, 0x50, 0x4e, 0x8f, + 0x88, 0x2d, 0x08, 0xb2, 0x5a, 0x56, 0x22, 0x5e, 0x67, 0xa5, 0x8a, 0x9e, 0xca, 0xf2, 0x85, 0x65, + 0x95, 0xdc, 0x99, 0x85, 0x99, 0xa6, 0x12, 0x7a, 0x13, 0x8a, 0x4f, 0x0f, 0x87, 0x56, 0xaf, 0x6f, + 0xf5, 0x7b, 0xd5, 0x0c, 0x2a, 0x41, 0x5e, 0x77, 0x0c, 0xf3, 0x3f, 0x39, 0xa8, 0x0e, 0x13, 0x1e, + 0x27, 0xdc, 0x8a, 0x12, 0x4e, 0xa8, 0x54, 0x77, 0xb0, 0xa4, 0x6e, 0x6b, 0xb5, 0x24, 0xd7, 0x02, + 0x6f, 0x0a, 0xbc, 0xa0, 0xcd, 0xda, 0x37, 0xd6, 0xe6, 0x1d, 0x28, 0x9f, 0x3a, 0xec, 0xd4, 0xd6, + 0x25, 0x48, 0xa8, 0xbd, 0x69, 0x95, 0x84, 0x2d, 0x15, 0x82, 0xa1, 0x17, 0xb0, 0x45, 0x9d, 0xd0, + 0x23, 0x36, 0x95, 0xa4, 0x6c, 0x16, 0x13, 0x57, 0x66, 0x74, 0x69, 0xe7, 0xc1, 0xd7, 0x5f, 0x86, + 0x25, 0x20, 0xe6, 0x7d, 0xc5, 0xe3, 0x16, 0x5d, 0x36, 0xa3, 0x0f, 0x60, 0x0b, 0xfb, 0x4c, 0xd4, + 0x63, 0x7b, 0x9c, 0x9c, 0x9c, 0xa4, 0x69, 0xb4, 0xb1, 0x6d, 0xdc, 0x2b, 0xa8, 0x88, 0xaa, 0x1a, + 0xee, 0xea, 0xd1, 0xfa, 0x9f, 0xd7, 0xe1, 0xd6, 0x35, 0x74, 0xf4, 0x1c, 0x36, 0xc4, 0x8d, 0xa4, + 0x4b, 0xea, 0x4f, 0xdf, 0x9a, 0x67, 0x6b, 0x14, 0x3b, 0xba, 0xd0, 0xa5, 0x90, 0x42, 0x32, 0x4c, + 0x4e, 0x9c, 0x24, 0xe0, 0x36, 0x26, 0x8c, 0xa7, 0x85, 0xc5, 0x2a, 0x29, 0x5b, 0x8f, 0x30, 0x8e, + 0x02, 0x28, 0xca, 0xbb, 0xd3, 0x0f, 0x3d, 0x9d, 0xc0, 0x83, 0xb7, 0xa7, 0x90, 0x6e, 0x44, 0x5f, + 0x01, 0xea, 0xaa, 0x3b, 0x9b, 0xa0, 0xfe, 0x12, 0x2a, 0xcb, 0x2e, 0xe8, 0x2e, 0xe4, 0xd2, 0x0d, + 0xbd, 0x51, 0xfd, 0xc5, 0xe5, 0xf0, 0x11, 0x14, 0x74, 0xb0, 0x2a, 0xfe, 0xdf, 0x5b, 0x71, 0x16, + 0x7a, 0xe2, 0xe2, 0xbf, 0x36, 0xf1, 0x2c, 0xb6, 0xfe, 0x08, 0xb2, 0x42, 0x1d, 0x74, 0x1b, 0x36, + 0x18, 0x77, 0x28, 0x97, 0x93, 0x95, 0xad, 0xb4, 0x83, 0xaa, 0xb0, 0x4e, 0xc2, 0xb4, 0xec, 0x96, + 0x2d, 0xd1, 0x14, 0xac, 0xd2, 0xb4, 0x93, 0x35, 0x74, 0x43, 0xb3, 0x4a, 0x6d, 0xe6, 0x43, 0x75, + 0xb2, 0xaa, 0x50, 0x3e, 0xea, 0x8c, 0x46, 0xf6, 0xf1, 0xc0, 0x1a, 0x3e, 0xdd, 0x1f, 0xa4, 0x95, + 0xec, 0xf1, 0x81, 0x65, 0x0d, 0xad, 0xaa, 0x21, 0x0e, 0x5a, 0xf7, 0x99, 0x3d, 0xe8, 0x8c, 0x06, + 0xd5, 0x35, 0x54, 0x86, 0x42, 0xf7, 0x99, 0x6d, 0x75, 0x0e, 0xf7, 0xfb, 0xd5, 0x75, 0xf3, 0x33, + 0x03, 0x8a, 0x92, 0xf0, 0x41, 0x78, 0x12, 0x2d, 0x2d, 0xd2, 0x78, 0xfb, 0x45, 0xa2, 0x9f, 0xa8, + 0x73, 0xfb, 0xfa, 0x52, 0xb6, 0xb2, 0x68, 0xc8, 0x20, 0xf3, 0x57, 0x50, 0x39, 0xa2, 0x11, 0x4e, + 0x5c, 0x42, 0x07, 0xc4, 0xc1, 0x84, 0xa2, 0x0f, 0x20, 0x7f, 0x12, 0x44, 0x53, 0x71, 0x29, 0x48, + 0xb5, 0xba, 0x35, 0xe1, 0xfe, 0xb7, 0xcb, 0x66, 0xee, 0xa3, 0x20, 0x9a, 0x1e, 0xf4, 0xae, 0x66, + 0x2d, 0x2b, 0x27, 0x1c, 0x0f, 0xf0, 0x37, 0xb8, 0xc5, 0xcc, 0x3f, 0x1a, 0x50, 0xd6, 0x04, 0x7a, + 0x0e, 0x77, 0xd0, 0x77, 0xa0, 0x48, 0x9d, 0xa9, 0x3d, 0xbe, 0xe0, 0x84, 0xa9, 0xed, 0x2a, 0x50, + 0x67, 0xda, 0x15, 0x7d, 0xf4, 0x04, 0x0a, 0x13, 0xc2, 0x1d, 0xf1, 0x89, 0xa9, 0x2a, 0x4b, 0x7b, + 0x65, 0xd2, 0x5a, 0x64, 0x12, 0x71, 0xa2, 0xb1, 0x1f, 0xab, 0x30, 0xad, 0x9e, 0x86, 0x41, 0xef, + 0x41, 0x25, 0x4c, 0x26, 0x36, 0x99, 0xc4, 0xfc, 0xc2, 0xa6, 0xd1, 0x94, 0x2d, 0x6d, 0x7d, 0x39, + 0x4c, 0x26, 0x7d, 0x31, 0x64, 0x45, 0x53, 0x66, 0xfe, 0xd5, 0x80, 0x5b, 0x73, 0x40, 0xc6, 0x1c, + 0x8f, 0xa0, 0x87, 0x90, 0x3b, 0x95, 0xc2, 0xa9, 0x2f, 0xc5, 0x1f, 0xac, 0x24, 0xb4, 0xac, 0xb3, + 0xa5, 0xc2, 0xd0, 0xcf, 0x20, 0xc7, 0x2f, 0xe2, 0x34, 0xd3, 0xc5, 0x8a, 0xcc, 0x95, 0x00, 0xb3, + 0xd4, 0xd1, 0x79, 0x99, 0xc6, 0xa1, 0x87, 0x90, 0x95, 0x8a, 0xac, 0x4b, 0x02, 0xdf, 0xff, 0x4a, + 0x02, 0xbd, 0xb9, 0x0e, 0x32, 0xd0, 0xfc, 0x5d, 0x0e, 0xee, 0xbc, 0x5e, 0x2e, 0xf4, 0x73, 0x80, + 0xb4, 0xb4, 0xfa, 0xe1, 0x49, 0xa4, 0x96, 0xb8, 0xfb, 0x86, 0x9a, 0xa7, 0xe5, 0x42, 0x10, 0x67, + 0x83, 0x8c, 0x55, 0xa4, 0xba, 0x87, 0x3e, 0x84, 0x0d, 0xb2, 0xf0, 0x5d, 0xdc, 0x58, 0x89, 0xab, + 0xbf, 0x85, 0x53, 0x77, 0xf4, 0x1c, 0x40, 0x7c, 0xde, 0x13, 0x7b, 0x61, 0xd9, 0x0f, 0xde, 0x94, + 0xd4, 0xb1, 0x40, 0x10, 0x52, 0x08, 0x4e, 0x5c, 0x77, 0xd0, 0x3e, 0x54, 0xf8, 0x79, 0x68, 0xbb, + 0x51, 0x44, 0xb1, 0x2d, 0xb2, 0x44, 0x5d, 0x24, 0xcd, 0xd7, 0x7c, 0xb4, 0x1f, 0x9f, 0x87, 0x7b, + 0xc2, 0x4f, 0x60, 0x0e, 0x32, 0x56, 0x99, 0x2f, 0xf4, 0xd1, 0x13, 0xc8, 0xd3, 0x68, 0x6a, 0x87, + 0xc9, 0x44, 0xde, 0x0e, 0xa5, 0x9d, 0x0f, 0xdf, 0x58, 0xb6, 0x68, 0x7a, 0x98, 0x4c, 0x06, 0x19, + 0x2b, 0x47, 0x65, 0x0b, 0x75, 0xa0, 0x10, 0xd3, 0xc8, 0x13, 0x1f, 0xfa, 0xb5, 0x9c, 0xc4, 0x7c, + 0xf7, 0x1a, 0xa6, 0x7c, 0xa3, 0xa5, 0xef, 0x35, 0xb1, 0xdd, 0xd2, 0x75, 0x90, 0xb1, 0x66, 0x61, + 0xf5, 0x21, 0xc0, 0x7c, 0x37, 0x50, 0xe7, 0xda, 0xee, 0x8a, 0xfc, 0xbb, 0xfb, 0x9a, 0x85, 0xce, + 0x42, 0x74, 0x69, 0x9f, 0xed, 0x61, 0xfd, 0x17, 0x50, 0x9c, 0x29, 0x89, 0x46, 0x70, 0xcb, 0x8d, + 0x82, 0x80, 0xb8, 0x5c, 0x3d, 0xb8, 0xf4, 0xf5, 0xb6, 0x58, 0xd9, 0xc4, 0xf3, 0xac, 0xa5, 0x9e, + 0x67, 0x2d, 0x4b, 0x3d, 0xcf, 0x16, 0x2e, 0xb1, 0xca, 0x0c, 0x42, 0x18, 0x59, 0x7d, 0x0a, 0xb9, + 0x54, 0x09, 0xf4, 0x43, 0x28, 0x32, 0x12, 0x62, 0x42, 0x75, 0x71, 0x2a, 0x76, 0xab, 0xb3, 0x3a, + 0x23, 0x07, 0x64, 0x6d, 0x49, 0x5b, 0x58, 0x3c, 0x31, 0xf4, 0x0e, 0xac, 0x2d, 0x96, 0x73, 0xa5, + 0x66, 0x13, 0x0a, 0x81, 0xc3, 0xb8, 0x3d, 0x61, 0x9e, 0xcc, 0x21, 0x7d, 0x7f, 0xe7, 0x85, 0xf5, + 0x31, 0xf3, 0xba, 0x79, 0xd8, 0x78, 0xe9, 0x04, 0x09, 0x31, 0x7f, 0x63, 0x40, 0xad, 0xe7, 0x33, + 0x3e, 0x7a, 0xf2, 0xe8, 0xd3, 0xf4, 0x11, 0xb5, 0x1f, 0x31, 0xe6, 0xc7, 0x32, 0x89, 0xef, 0x2f, + 0x3f, 0xb7, 0x36, 0xbb, 0x77, 0x04, 0xca, 0x97, 0x97, 0xcd, 0xca, 0x72, 0xc8, 0xfc, 0x01, 0x36, + 0x80, 0xdb, 0x13, 0x3f, 0xb4, 0x1d, 0xd7, 0x25, 0xb1, 0x10, 0x4a, 0x87, 0xaf, 0xfd, 0xdf, 0x70, + 0x34, 0xf1, 0xc3, 0x8e, 0x0a, 0x51, 0x36, 0xf3, 0xc7, 0xf0, 0x2d, 0xe5, 0xd5, 0xa3, 0x8e, 0x1f, + 0xfa, 0xa1, 0x27, 0x29, 0x6d, 0x43, 0x01, 0xab, 0xbe, 0xe4, 0xa4, 0x57, 0x36, 0xb3, 0x76, 0xdf, + 0x7d, 0xf5, 0x8f, 0x46, 0xe6, 0xd5, 0x55, 0xc3, 0xf8, 0xcb, 0x55, 0xc3, 0xf8, 0xe2, 0xaa, 0x61, + 0xfc, 0xfd, 0xaa, 0x61, 0x7c, 0xf6, 0xcf, 0x46, 0xe6, 0x79, 0x71, 0x96, 0x96, 0xff, 0x0b, 0x00, + 0x00, 0xff, 0xff, 0x62, 0x5c, 0x43, 0x1c, 0x31, 0x10, 0x00, 0x00, } diff --git a/pkg/sql/distsqlpb/data.proto b/pkg/sql/distsqlpb/data.proto index b367ac1bdbe3..d5e8752da38a 100644 --- a/pkg/sql/distsqlpb/data.proto +++ b/pkg/sql/distsqlpb/data.proto @@ -20,6 +20,7 @@ syntax = "proto2"; package cockroach.sql.distsqlpb; option go_package = "distsqlpb"; +import "jobs/jobspb/jobs.proto"; import "roachpb/api.proto"; import "roachpb/data.proto"; import "roachpb/errors.proto"; @@ -266,6 +267,7 @@ message RemoteProducerMetadata { TraceData trace_data = 3; roachpb.TxnCoordMeta txn_coord_meta = 4; RowNum row_num = 5; + cockroach.sql.jobs.jobspb.Progress progress = 6; } } diff --git a/pkg/sql/distsqlpb/processors.pb.go b/pkg/sql/distsqlpb/processors.pb.go index 1ea140912eb8..b64b2a0f1ff2 100644 --- a/pkg/sql/distsqlpb/processors.pb.go +++ b/pkg/sql/distsqlpb/processors.pb.go @@ -67,7 +67,7 @@ func (x *ScanVisibility) UnmarshalJSON(data []byte) error { return nil } func (ScanVisibility) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{0} + return fileDescriptor_processors_61091ee42c44342e, []int{0} } type SketchType int32 @@ -102,7 +102,7 @@ func (x *SketchType) UnmarshalJSON(data []byte) error { return nil } func (SketchType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{1} + return fileDescriptor_processors_61091ee42c44342e, []int{1} } // These mirror the aggregate functions supported by sql/parser. See @@ -198,7 +198,7 @@ func (x *AggregatorSpec_Func) UnmarshalJSON(data []byte) error { return nil } func (AggregatorSpec_Func) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{17, 0} + return fileDescriptor_processors_61091ee42c44342e, []int{17, 0} } type AggregatorSpec_Type int32 @@ -244,7 +244,7 @@ func (x *AggregatorSpec_Type) UnmarshalJSON(data []byte) error { return nil } func (AggregatorSpec_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{17, 1} + return fileDescriptor_processors_61091ee42c44342e, []int{17, 1} } type BackfillerSpec_Type int32 @@ -283,7 +283,7 @@ func (x *BackfillerSpec_Type) UnmarshalJSON(data []byte) error { return nil } func (BackfillerSpec_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{18, 0} + return fileDescriptor_processors_61091ee42c44342e, []int{18, 0} } type WindowerSpec_WindowFunc int32 @@ -347,7 +347,7 @@ func (x *WindowerSpec_WindowFunc) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_WindowFunc) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 0} + return fileDescriptor_processors_61091ee42c44342e, []int{29, 0} } // Mode indicates which mode of framing is used. @@ -391,7 +391,7 @@ func (x *WindowerSpec_Frame_Mode) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_Frame_Mode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 1, 0} + return fileDescriptor_processors_61091ee42c44342e, []int{29, 1, 0} } // BoundType indicates which type of boundary is used. @@ -438,7 +438,7 @@ func (x *WindowerSpec_Frame_BoundType) UnmarshalJSON(data []byte) error { return nil } func (WindowerSpec_Frame_BoundType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 1, 1} + return fileDescriptor_processors_61091ee42c44342e, []int{29, 1, 1} } // Each processor has the following components: @@ -487,7 +487,7 @@ func (m *ProcessorSpec) Reset() { *m = ProcessorSpec{} } func (m *ProcessorSpec) String() string { return proto.CompactTextString(m) } func (*ProcessorSpec) ProtoMessage() {} func (*ProcessorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{0} + return fileDescriptor_processors_61091ee42c44342e, []int{0} } func (m *ProcessorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -548,7 +548,7 @@ func (m *PostProcessSpec) Reset() { *m = PostProcessSpec{} } func (m *PostProcessSpec) String() string { return proto.CompactTextString(m) } func (*PostProcessSpec) ProtoMessage() {} func (*PostProcessSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{1} + return fileDescriptor_processors_61091ee42c44342e, []int{1} } func (m *PostProcessSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -606,7 +606,7 @@ func (m *ProcessorCoreUnion) Reset() { *m = ProcessorCoreUnion{} } func (m *ProcessorCoreUnion) String() string { return proto.CompactTextString(m) } func (*ProcessorCoreUnion) ProtoMessage() {} func (*ProcessorCoreUnion) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{2} + return fileDescriptor_processors_61091ee42c44342e, []int{2} } func (m *ProcessorCoreUnion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -643,7 +643,7 @@ func (m *NoopCoreSpec) Reset() { *m = NoopCoreSpec{} } func (m *NoopCoreSpec) String() string { return proto.CompactTextString(m) } func (*NoopCoreSpec) ProtoMessage() {} func (*NoopCoreSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{3} + return fileDescriptor_processors_61091ee42c44342e, []int{3} } func (m *NoopCoreSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -678,7 +678,7 @@ func (m *MetadataTestSenderSpec) Reset() { *m = MetadataTestSenderSpec{} func (m *MetadataTestSenderSpec) String() string { return proto.CompactTextString(m) } func (*MetadataTestSenderSpec) ProtoMessage() {} func (*MetadataTestSenderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{4} + return fileDescriptor_processors_61091ee42c44342e, []int{4} } func (m *MetadataTestSenderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -713,7 +713,7 @@ func (m *MetadataTestReceiverSpec) Reset() { *m = MetadataTestReceiverSp func (m *MetadataTestReceiverSpec) String() string { return proto.CompactTextString(m) } func (*MetadataTestReceiverSpec) ProtoMessage() {} func (*MetadataTestReceiverSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{5} + return fileDescriptor_processors_61091ee42c44342e, []int{5} } func (m *MetadataTestReceiverSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -757,7 +757,7 @@ func (m *ValuesCoreSpec) Reset() { *m = ValuesCoreSpec{} } func (m *ValuesCoreSpec) String() string { return proto.CompactTextString(m) } func (*ValuesCoreSpec) ProtoMessage() {} func (*ValuesCoreSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{6} + return fileDescriptor_processors_61091ee42c44342e, []int{6} } func (m *ValuesCoreSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -795,7 +795,7 @@ func (m *TableReaderSpan) Reset() { *m = TableReaderSpan{} } func (m *TableReaderSpan) String() string { return proto.CompactTextString(m) } func (*TableReaderSpan) ProtoMessage() {} func (*TableReaderSpan) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{7} + return fileDescriptor_processors_61091ee42c44342e, []int{7} } func (m *TableReaderSpan) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -865,7 +865,7 @@ func (m *TableReaderSpec) Reset() { *m = TableReaderSpec{} } func (m *TableReaderSpec) String() string { return proto.CompactTextString(m) } func (*TableReaderSpec) ProtoMessage() {} func (*TableReaderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{8} + return fileDescriptor_processors_61091ee42c44342e, []int{8} } func (m *TableReaderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -950,7 +950,7 @@ func (m *JoinReaderSpec) Reset() { *m = JoinReaderSpec{} } func (m *JoinReaderSpec) String() string { return proto.CompactTextString(m) } func (*JoinReaderSpec) ProtoMessage() {} func (*JoinReaderSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{9} + return fileDescriptor_processors_61091ee42c44342e, []int{9} } func (m *JoinReaderSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -996,7 +996,7 @@ func (m *SorterSpec) Reset() { *m = SorterSpec{} } func (m *SorterSpec) String() string { return proto.CompactTextString(m) } func (*SorterSpec) ProtoMessage() {} func (*SorterSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{10} + return fileDescriptor_processors_61091ee42c44342e, []int{10} } func (m *SorterSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1042,7 +1042,7 @@ func (m *DistinctSpec) Reset() { *m = DistinctSpec{} } func (m *DistinctSpec) String() string { return proto.CompactTextString(m) } func (*DistinctSpec) ProtoMessage() {} func (*DistinctSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{11} + return fileDescriptor_processors_61091ee42c44342e, []int{11} } func (m *DistinctSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1100,7 +1100,7 @@ func (m *ZigzagJoinerSpec) Reset() { *m = ZigzagJoinerSpec{} } func (m *ZigzagJoinerSpec) String() string { return proto.CompactTextString(m) } func (*ZigzagJoinerSpec) ProtoMessage() {} func (*ZigzagJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{12} + return fileDescriptor_processors_61091ee42c44342e, []int{12} } func (m *ZigzagJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1144,7 +1144,7 @@ func (m *LocalPlanNodeSpec) Reset() { *m = LocalPlanNodeSpec{} } func (m *LocalPlanNodeSpec) String() string { return proto.CompactTextString(m) } func (*LocalPlanNodeSpec) ProtoMessage() {} func (*LocalPlanNodeSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{13} + return fileDescriptor_processors_61091ee42c44342e, []int{13} } func (m *LocalPlanNodeSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1179,7 +1179,7 @@ func (m *Columns) Reset() { *m = Columns{} } func (m *Columns) String() string { return proto.CompactTextString(m) } func (*Columns) ProtoMessage() {} func (*Columns) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{14} + return fileDescriptor_processors_61091ee42c44342e, []int{14} } func (m *Columns) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1249,7 +1249,7 @@ func (m *MergeJoinerSpec) Reset() { *m = MergeJoinerSpec{} } func (m *MergeJoinerSpec) String() string { return proto.CompactTextString(m) } func (*MergeJoinerSpec) ProtoMessage() {} func (*MergeJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{15} + return fileDescriptor_processors_61091ee42c44342e, []int{15} } func (m *MergeJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1338,7 +1338,7 @@ func (m *HashJoinerSpec) Reset() { *m = HashJoinerSpec{} } func (m *HashJoinerSpec) String() string { return proto.CompactTextString(m) } func (*HashJoinerSpec) ProtoMessage() {} func (*HashJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{16} + return fileDescriptor_processors_61091ee42c44342e, []int{16} } func (m *HashJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1386,7 +1386,7 @@ func (m *AggregatorSpec) Reset() { *m = AggregatorSpec{} } func (m *AggregatorSpec) String() string { return proto.CompactTextString(m) } func (*AggregatorSpec) ProtoMessage() {} func (*AggregatorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{17} + return fileDescriptor_processors_61091ee42c44342e, []int{17} } func (m *AggregatorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1439,7 +1439,7 @@ func (m *AggregatorSpec_Aggregation) Reset() { *m = AggregatorSpec_Aggre func (m *AggregatorSpec_Aggregation) String() string { return proto.CompactTextString(m) } func (*AggregatorSpec_Aggregation) ProtoMessage() {} func (*AggregatorSpec_Aggregation) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{17, 0} + return fileDescriptor_processors_61091ee42c44342e, []int{17, 0} } func (m *AggregatorSpec_Aggregation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1499,7 +1499,7 @@ func (m *BackfillerSpec) Reset() { *m = BackfillerSpec{} } func (m *BackfillerSpec) String() string { return proto.CompactTextString(m) } func (*BackfillerSpec) ProtoMessage() {} func (*BackfillerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{18} + return fileDescriptor_processors_61091ee42c44342e, []int{18} } func (m *BackfillerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1539,7 +1539,7 @@ func (m *FlowSpec) Reset() { *m = FlowSpec{} } func (m *FlowSpec) String() string { return proto.CompactTextString(m) } func (*FlowSpec) ProtoMessage() {} func (*FlowSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{19} + return fileDescriptor_processors_61091ee42c44342e, []int{19} } func (m *FlowSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1581,7 +1581,7 @@ func (m *JobProgress) Reset() { *m = JobProgress{} } func (m *JobProgress) String() string { return proto.CompactTextString(m) } func (*JobProgress) ProtoMessage() {} func (*JobProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{20} + return fileDescriptor_processors_61091ee42c44342e, []int{20} } func (m *JobProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1635,7 +1635,7 @@ func (m *ReadImportDataSpec) Reset() { *m = ReadImportDataSpec{} } func (m *ReadImportDataSpec) String() string { return proto.CompactTextString(m) } func (*ReadImportDataSpec) ProtoMessage() {} func (*ReadImportDataSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{21} + return fileDescriptor_processors_61091ee42c44342e, []int{21} } func (m *ReadImportDataSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1682,7 +1682,7 @@ func (m *SSTWriterSpec) Reset() { *m = SSTWriterSpec{} } func (m *SSTWriterSpec) String() string { return proto.CompactTextString(m) } func (*SSTWriterSpec) ProtoMessage() {} func (*SSTWriterSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{22} + return fileDescriptor_processors_61091ee42c44342e, []int{22} } func (m *SSTWriterSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1720,7 +1720,7 @@ func (m *SSTWriterSpec_SpanName) Reset() { *m = SSTWriterSpec_SpanName{} func (m *SSTWriterSpec_SpanName) String() string { return proto.CompactTextString(m) } func (*SSTWriterSpec_SpanName) ProtoMessage() {} func (*SSTWriterSpec_SpanName) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{22, 0} + return fileDescriptor_processors_61091ee42c44342e, []int{22, 0} } func (m *SSTWriterSpec_SpanName) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1764,7 +1764,7 @@ func (m *CSVWriterSpec) Reset() { *m = CSVWriterSpec{} } func (m *CSVWriterSpec) String() string { return proto.CompactTextString(m) } func (*CSVWriterSpec) ProtoMessage() {} func (*CSVWriterSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{23} + return fileDescriptor_processors_61091ee42c44342e, []int{23} } func (m *CSVWriterSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1811,7 +1811,7 @@ func (m *SketchSpec) Reset() { *m = SketchSpec{} } func (m *SketchSpec) String() string { return proto.CompactTextString(m) } func (*SketchSpec) ProtoMessage() {} func (*SketchSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{24} + return fileDescriptor_processors_61091ee42c44342e, []int{24} } func (m *SketchSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1878,7 +1878,7 @@ func (m *SamplerSpec) Reset() { *m = SamplerSpec{} } func (m *SamplerSpec) String() string { return proto.CompactTextString(m) } func (*SamplerSpec) ProtoMessage() {} func (*SamplerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{25} + return fileDescriptor_processors_61091ee42c44342e, []int{25} } func (m *SamplerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1925,17 +1925,19 @@ type SampleAggregatorSpec struct { SampleSize uint32 `protobuf:"varint,2,opt,name=sample_size,json=sampleSize" json:"sample_size"` // The i-th value indicates the ColumnID of the i-th sampled row column. // These are necessary for writing out the statistic data. - SampledColumnIDs []github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID `protobuf:"varint,3,rep,name=sampled_column_ids,json=sampledColumnIds,casttype=github.com/cockroachdb/cockroach/pkg/sql/sqlbase.ColumnID" json:"sampled_column_ids,omitempty"` - TableID github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ID `protobuf:"varint,4,opt,name=table_id,json=tableId,casttype=github.com/cockroachdb/cockroach/pkg/sql/sqlbase.ID" json:"table_id"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_sizecache int32 `json:"-"` + SampledColumnIDs []github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ColumnID `protobuf:"varint,3,rep,name=sampled_column_ids,json=sampledColumnIds,casttype=github.com/cockroachdb/cockroach/pkg/sql/sqlbase.ColumnID" json:"sampled_column_ids,omitempty"` + TableID github_com_cockroachdb_cockroach_pkg_sql_sqlbase.ID `protobuf:"varint,4,opt,name=table_id,json=tableId,casttype=github.com/cockroachdb/cockroach/pkg/sql/sqlbase.ID" json:"table_id"` + // JobID is the id of the CREATE STATISTICS job. + JobID int64 `protobuf:"varint,5,opt,name=job_id,json=jobId" json:"job_id"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SampleAggregatorSpec) Reset() { *m = SampleAggregatorSpec{} } func (m *SampleAggregatorSpec) String() string { return proto.CompactTextString(m) } func (*SampleAggregatorSpec) ProtoMessage() {} func (*SampleAggregatorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{26} + return fileDescriptor_processors_61091ee42c44342e, []int{26} } func (m *SampleAggregatorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2000,7 +2002,7 @@ func (m *InterleavedReaderJoinerSpec) Reset() { *m = InterleavedReaderJo func (m *InterleavedReaderJoinerSpec) String() string { return proto.CompactTextString(m) } func (*InterleavedReaderJoinerSpec) ProtoMessage() {} func (*InterleavedReaderJoinerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{27} + return fileDescriptor_processors_61091ee42c44342e, []int{27} } func (m *InterleavedReaderJoinerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2058,7 +2060,7 @@ func (m *InterleavedReaderJoinerSpec_Table) Reset() { *m = InterleavedRe func (m *InterleavedReaderJoinerSpec_Table) String() string { return proto.CompactTextString(m) } func (*InterleavedReaderJoinerSpec_Table) ProtoMessage() {} func (*InterleavedReaderJoinerSpec_Table) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{27, 0} + return fileDescriptor_processors_61091ee42c44342e, []int{27, 0} } func (m *InterleavedReaderJoinerSpec_Table) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2100,7 +2102,7 @@ func (m *ProjectSetSpec) Reset() { *m = ProjectSetSpec{} } func (m *ProjectSetSpec) String() string { return proto.CompactTextString(m) } func (*ProjectSetSpec) ProtoMessage() {} func (*ProjectSetSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{28} + return fileDescriptor_processors_61091ee42c44342e, []int{28} } func (m *ProjectSetSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2144,7 +2146,7 @@ func (m *WindowerSpec) Reset() { *m = WindowerSpec{} } func (m *WindowerSpec) String() string { return proto.CompactTextString(m) } func (*WindowerSpec) ProtoMessage() {} func (*WindowerSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29} + return fileDescriptor_processors_61091ee42c44342e, []int{29} } func (m *WindowerSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2182,7 +2184,7 @@ func (m *WindowerSpec_Func) Reset() { *m = WindowerSpec_Func{} } func (m *WindowerSpec_Func) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Func) ProtoMessage() {} func (*WindowerSpec_Func) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 0} + return fileDescriptor_processors_61091ee42c44342e, []int{29, 0} } func (m *WindowerSpec_Func) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2219,7 +2221,7 @@ func (m *WindowerSpec_Frame) Reset() { *m = WindowerSpec_Frame{} } func (m *WindowerSpec_Frame) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame) ProtoMessage() {} func (*WindowerSpec_Frame) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 1} + return fileDescriptor_processors_61091ee42c44342e, []int{29, 1} } func (m *WindowerSpec_Frame) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2261,7 +2263,7 @@ func (m *WindowerSpec_Frame_Bound) Reset() { *m = WindowerSpec_Frame_Bou func (m *WindowerSpec_Frame_Bound) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame_Bound) ProtoMessage() {} func (*WindowerSpec_Frame_Bound) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 1, 0} + return fileDescriptor_processors_61091ee42c44342e, []int{29, 1, 0} } func (m *WindowerSpec_Frame_Bound) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2299,7 +2301,7 @@ func (m *WindowerSpec_Frame_Bounds) Reset() { *m = WindowerSpec_Frame_Bo func (m *WindowerSpec_Frame_Bounds) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_Frame_Bounds) ProtoMessage() {} func (*WindowerSpec_Frame_Bounds) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 1, 1} + return fileDescriptor_processors_61091ee42c44342e, []int{29, 1, 1} } func (m *WindowerSpec_Frame_Bounds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2349,7 +2351,7 @@ func (m *WindowerSpec_WindowFn) Reset() { *m = WindowerSpec_WindowFn{} } func (m *WindowerSpec_WindowFn) String() string { return proto.CompactTextString(m) } func (*WindowerSpec_WindowFn) ProtoMessage() {} func (*WindowerSpec_WindowFn) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{29, 2} + return fileDescriptor_processors_61091ee42c44342e, []int{29, 2} } func (m *WindowerSpec_WindowFn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2388,7 +2390,7 @@ func (m *ChangeAggregatorSpec) Reset() { *m = ChangeAggregatorSpec{} } func (m *ChangeAggregatorSpec) String() string { return proto.CompactTextString(m) } func (*ChangeAggregatorSpec) ProtoMessage() {} func (*ChangeAggregatorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{30} + return fileDescriptor_processors_61091ee42c44342e, []int{30} } func (m *ChangeAggregatorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2424,7 +2426,7 @@ func (m *ChangeAggregatorSpec_Watch) Reset() { *m = ChangeAggregatorSpec func (m *ChangeAggregatorSpec_Watch) String() string { return proto.CompactTextString(m) } func (*ChangeAggregatorSpec_Watch) ProtoMessage() {} func (*ChangeAggregatorSpec_Watch) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{30, 0} + return fileDescriptor_processors_61091ee42c44342e, []int{30, 0} } func (m *ChangeAggregatorSpec_Watch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2469,7 +2471,7 @@ func (m *ChangeFrontierSpec) Reset() { *m = ChangeFrontierSpec{} } func (m *ChangeFrontierSpec) String() string { return proto.CompactTextString(m) } func (*ChangeFrontierSpec) ProtoMessage() {} func (*ChangeFrontierSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_processors_70a1db6f0e60b948, []int{31} + return fileDescriptor_processors_61091ee42c44342e, []int{31} } func (m *ChangeFrontierSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4167,6 +4169,9 @@ func (m *SampleAggregatorSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x20 i++ i = encodeVarintProcessors(dAtA, i, uint64(m.TableID)) + dAtA[i] = 0x28 + i++ + i = encodeVarintProcessors(dAtA, i, uint64(m.JobID)) return i, nil } @@ -5349,6 +5354,7 @@ func (m *SampleAggregatorSpec) Size() (n int) { } } n += 1 + sovProcessors(uint64(m.TableID)) + n += 1 + sovProcessors(uint64(m.JobID)) return n } @@ -11430,6 +11436,25 @@ func (m *SampleAggregatorSpec) Unmarshal(dAtA []byte) error { break } } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field JobID", wireType) + } + m.JobID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProcessors + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.JobID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipProcessors(dAtA[iNdEx:]) @@ -13257,262 +13282,263 @@ var ( ) func init() { - proto.RegisterFile("sql/distsqlpb/processors.proto", fileDescriptor_processors_70a1db6f0e60b948) + proto.RegisterFile("sql/distsqlpb/processors.proto", fileDescriptor_processors_61091ee42c44342e) } -var fileDescriptor_processors_70a1db6f0e60b948 = []byte{ - // 4047 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x3d, 0x70, 0x1b, 0x59, - 0x72, 0x16, 0x80, 0xc1, 0x5f, 0xe3, 0x87, 0xb3, 0x4f, 0xd4, 0x0a, 0xcb, 0x5d, 0x8b, 0xd2, 0xec, +var fileDescriptor_processors_61091ee42c44342e = []byte{ + // 4053 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x3d, 0x70, 0x1b, 0x49, + 0x76, 0x16, 0x80, 0xc1, 0xdf, 0xc3, 0x0f, 0x67, 0x5b, 0xd4, 0x0a, 0xcb, 0x5d, 0x8b, 0xd2, 0xec, 0xde, 0xea, 0xe7, 0xf6, 0xc8, 0x93, 0x76, 0x7d, 0x77, 0xbb, 0x77, 0xe7, 0x35, 0x7e, 0xa9, 0xa1, - 0x40, 0x80, 0x37, 0x00, 0xa4, 0xdd, 0xab, 0x72, 0x4d, 0x0d, 0x30, 0x8f, 0xe0, 0x88, 0x83, 0x79, - 0xd0, 0xcc, 0x40, 0x24, 0xe5, 0xc0, 0x89, 0x9d, 0xd8, 0xc9, 0x95, 0xcb, 0x91, 0xcb, 0x81, 0x93, - 0x0b, 0x9d, 0x38, 0x70, 0xe2, 0xc4, 0x81, 0xcb, 0xde, 0xc0, 0xc1, 0x25, 0xae, 0xb2, 0x1d, 0xa8, - 0x7c, 0x74, 0x60, 0x97, 0x73, 0x57, 0xd9, 0x17, 0xb9, 0xde, 0xcf, 0x0c, 0x06, 0x20, 0x41, 0x90, - 0x94, 0xea, 0x2e, 0x21, 0x31, 0xfd, 0xba, 0xbf, 0xe9, 0xd7, 0xaf, 0x5f, 0xbf, 0xee, 0x7e, 0x03, - 0xb7, 0xbc, 0x17, 0xf6, 0xa6, 0x69, 0x79, 0xbe, 0xf7, 0xc2, 0x1e, 0xf7, 0x37, 0xc7, 0x2e, 0x19, - 0x60, 0xcf, 0x23, 0xae, 0xb7, 0x31, 0x76, 0x89, 0x4f, 0xd0, 0xcd, 0x01, 0x19, 0x1c, 0xb8, 0xc4, - 0x18, 0xec, 0x6f, 0x78, 0x2f, 0xec, 0x8d, 0x90, 0x73, 0xed, 0xdd, 0xe7, 0xa4, 0xef, 0x6d, 0xd2, - 0x3f, 0xe3, 0x3e, 0xfb, 0xc7, 0x05, 0xd6, 0x10, 0x63, 0x1e, 0xf7, 0x37, 0x4d, 0xc3, 0x37, 0x04, - 0xad, 0x14, 0xd0, 0x2c, 0xf2, 0x9d, 0x3d, 0xe2, 0x8e, 0x0c, 0x3f, 0xe0, 0xfe, 0x80, 0xbe, 0xde, - 0x7b, 0x61, 0xf7, 0x0d, 0x0f, 0x6f, 0x7a, 0xbe, 0x3b, 0x19, 0xf8, 0x13, 0x17, 0x9b, 0x62, 0xf4, - 0xfd, 0xe8, 0xe8, 0x73, 0x62, 0x39, 0xba, 0x7f, 0x3c, 0xc6, 0x01, 0xe8, 0xac, 0xe6, 0xd1, 0xd7, - 0x4d, 0x7c, 0xcb, 0xde, 0xdc, 0xb7, 0x07, 0x9b, 0xbe, 0x35, 0xc2, 0x9e, 0x6f, 0x8c, 0xc6, 0x62, - 0x64, 0x75, 0x48, 0x86, 0x84, 0xfd, 0xdc, 0xa4, 0xbf, 0x38, 0x55, 0xf9, 0x93, 0x04, 0x14, 0x76, - 0x83, 0x89, 0x77, 0xc6, 0x78, 0x80, 0x2a, 0x90, 0xb4, 0x9c, 0xf1, 0xc4, 0x2f, 0xc5, 0x6e, 0x27, - 0xee, 0xe5, 0x1e, 0x7d, 0xbc, 0xb1, 0xc0, 0x0a, 0x1b, 0x2a, 0xe5, 0xea, 0x1c, 0x3b, 0x03, 0x2a, - 0x56, 0x91, 0xbe, 0x79, 0xbd, 0x7e, 0x4d, 0xe3, 0xa2, 0xa8, 0x0e, 0xd2, 0x80, 0xb8, 0xb8, 0x14, - 0xbf, 0x1d, 0xbb, 0x97, 0x7b, 0xf4, 0xed, 0x85, 0x10, 0xe1, 0x9b, 0xab, 0xc4, 0xc5, 0x3d, 0xc7, - 0x22, 0x8e, 0xc0, 0x61, 0xe2, 0x68, 0x0b, 0x52, 0x64, 0xe2, 0x53, 0x5d, 0x12, 0x4c, 0x97, 0xfb, - 0x0b, 0x81, 0xda, 0x8c, 0x4d, 0x23, 0x13, 0x1f, 0xbb, 0x11, 0x75, 0x84, 0x38, 0xaa, 0x80, 0x34, - 0x26, 0x9e, 0x5f, 0x92, 0x98, 0x3e, 0xf7, 0x16, 0xeb, 0x43, 0x3c, 0x5f, 0xe8, 0x14, 0x41, 0x61, - 0xb2, 0xe8, 0x01, 0x64, 0x3c, 0xdf, 0x18, 0x62, 0xdd, 0x32, 0x4b, 0xc9, 0xdb, 0xb1, 0x7b, 0xc9, - 0xca, 0x0a, 0x1d, 0x3d, 0x79, 0xbd, 0x9e, 0xee, 0x50, 0xba, 0x5a, 0xd3, 0xd2, 0x8c, 0x41, 0x35, - 0xd1, 0xf7, 0x20, 0x1f, 0x7a, 0x13, 0xe5, 0x4f, 0x31, 0xfe, 0xeb, 0x82, 0x3f, 0x17, 0x4e, 0x5b, - 0xad, 0x69, 0xb9, 0x90, 0x51, 0x35, 0x95, 0xbf, 0x8a, 0xc3, 0xca, 0x9c, 0x0e, 0xa8, 0x0c, 0xa9, - 0x3d, 0xcb, 0xf6, 0xb1, 0x5b, 0x8a, 0x31, 0xed, 0x3f, 0x5c, 0xa8, 0x7d, 0xfd, 0x68, 0xec, 0x62, - 0xcf, 0x9b, 0x5a, 0x51, 0x08, 0xa2, 0x8f, 0x00, 0xc6, 0x2e, 0x79, 0x8e, 0x07, 0xbe, 0x45, 0x1c, - 0xb6, 0x28, 0x19, 0xc1, 0x11, 0xa1, 0xa3, 0xfb, 0x50, 0xe4, 0xe6, 0xd2, 0x07, 0xc4, 0x9e, 0x8c, - 0x1c, 0x8f, 0x59, 0xbd, 0x50, 0x89, 0xcb, 0x31, 0xad, 0xc0, 0x47, 0xaa, 0x7c, 0x00, 0x35, 0x21, - 0xef, 0x62, 0xc7, 0xc4, 0xae, 0x8e, 0x8f, 0xc6, 0xae, 0x57, 0x92, 0xd8, 0xf2, 0x5c, 0x42, 0xb3, - 0x1c, 0x17, 0xa7, 0x74, 0x0f, 0x7d, 0x00, 0x29, 0xb2, 0xb7, 0xe7, 0x61, 0x9f, 0xd9, 0x55, 0x0a, - 0xd7, 0x8e, 0xd1, 0xd0, 0x1a, 0x24, 0x6d, 0x6b, 0x64, 0xf9, 0xcc, 0x88, 0xc1, 0x20, 0x27, 0x29, - 0xff, 0x59, 0x04, 0x74, 0xda, 0x87, 0xd0, 0xe7, 0x20, 0x39, 0x84, 0x8c, 0x85, 0xc1, 0xbe, 0xb5, - 0x50, 0xad, 0x16, 0x21, 0x63, 0x2a, 0x45, 0xed, 0xac, 0x31, 0x11, 0xb4, 0x0d, 0x39, 0xdf, 0xe8, - 0xdb, 0x58, 0xc3, 0x86, 0x89, 0x5d, 0xe1, 0xc0, 0x8b, 0x1d, 0xa6, 0x3b, 0xe5, 0x65, 0x20, 0x51, - 0x61, 0xb4, 0x05, 0x40, 0x37, 0xae, 0x80, 0x4a, 0x30, 0xa8, 0xbb, 0x0b, 0xa1, 0xb6, 0x43, 0x56, - 0x86, 0x14, 0x11, 0x45, 0x3f, 0x84, 0x94, 0x47, 0x5c, 0xea, 0x02, 0xd2, 0x12, 0x17, 0xe8, 0x30, - 0x36, 0x06, 0x20, 0x44, 0xa8, 0x16, 0xc6, 0x70, 0xe8, 0xe2, 0xa1, 0xe1, 0x13, 0x97, 0x59, 0xf8, - 0x3c, 0x2d, 0xca, 0x21, 0x2b, 0xd7, 0x62, 0x2a, 0x8a, 0xca, 0x90, 0xa1, 0x7c, 0x96, 0x33, 0xf0, - 0x4b, 0xe9, 0x25, 0x96, 0xad, 0x09, 0x46, 0x06, 0x12, 0x8a, 0x51, 0xeb, 0x8e, 0xb0, 0x3b, 0xc4, - 0x74, 0xae, 0xd8, 0x2d, 0x65, 0x96, 0x58, 0x77, 0x67, 0xca, 0xcb, 0xad, 0x1b, 0x11, 0xa6, 0xf3, - 0xda, 0x37, 0xbc, 0x7d, 0x01, 0x95, 0x5d, 0x32, 0xaf, 0xc7, 0x21, 0x2b, 0x9f, 0xd7, 0x54, 0x14, - 0x7d, 0x09, 0xa9, 0x97, 0x86, 0x3d, 0xc1, 0x5e, 0x09, 0x96, 0x80, 0x3c, 0x65, 0x6c, 0xa1, 0xc7, - 0x08, 0x31, 0xaa, 0x49, 0xdf, 0x18, 0x1c, 0xec, 0x59, 0xb6, 0x8d, 0xdd, 0x52, 0x6e, 0x09, 0x48, - 0x25, 0x64, 0xe5, 0x9a, 0x4c, 0x45, 0xd1, 0x13, 0x00, 0x17, 0x1b, 0xa6, 0x3a, 0x1a, 0x13, 0xd7, - 0x2f, 0x15, 0x96, 0x04, 0x4f, 0x2d, 0x64, 0xad, 0x19, 0xbe, 0xc1, 0xc1, 0xa6, 0xe2, 0xa8, 0x06, - 0xd9, 0x4e, 0xa7, 0xfb, 0xcc, 0xb5, 0xa8, 0xdf, 0x14, 0x19, 0xd6, 0xe2, 0x58, 0x1e, 0x72, 0x32, - 0x98, 0xa9, 0x20, 0xfa, 0x1d, 0x48, 0x77, 0x8c, 0xd1, 0x98, 0x4e, 0x6c, 0x85, 0x61, 0x7c, 0xb4, - 0x18, 0x83, 0xf3, 0x31, 0x84, 0x40, 0x08, 0x7d, 0x0d, 0x32, 0xff, 0x39, 0x75, 0xac, 0x92, 0xcc, - 0x80, 0xbe, 0xb3, 0x04, 0x68, 0xce, 0x13, 0x4f, 0xc1, 0x20, 0x07, 0x6e, 0x5a, 0x8e, 0x8f, 0x5d, - 0x1b, 0x1b, 0x2f, 0xb1, 0xc9, 0xb7, 0x8a, 0xf0, 0x86, 0x77, 0xd8, 0x1b, 0x3e, 0x3b, 0xe7, 0xe8, - 0x3a, 0x53, 0x8e, 0xbd, 0x68, 0x11, 0x28, 0xd2, 0x01, 0x8d, 0xb0, 0x6f, 0xd0, 0xc3, 0xb6, 0x8b, - 0x3d, 0xbf, 0xc3, 0x22, 0x58, 0x09, 0xb1, 0x57, 0x6d, 0x9e, 0xe3, 0xc3, 0xf3, 0x22, 0xec, 0x2d, - 0x67, 0x40, 0x21, 0x0c, 0xab, 0x51, 0xaa, 0x86, 0x07, 0xd8, 0x7a, 0x89, 0xdd, 0xd2, 0x75, 0xf6, - 0x8a, 0x87, 0x17, 0x7a, 0x45, 0x20, 0xc4, 0x5e, 0x72, 0x26, 0x1c, 0x75, 0x8c, 0x6a, 0xe7, 0xa9, - 0x70, 0x8c, 0xd5, 0x25, 0x8e, 0x11, 0x72, 0x72, 0xc7, 0x08, 0x1f, 0xd1, 0x0e, 0xe4, 0x5f, 0x59, - 0xc3, 0x57, 0xc6, 0x50, 0x98, 0xfc, 0x06, 0x03, 0x5a, 0x7c, 0x42, 0xff, 0x34, 0xc2, 0xcc, 0xb0, - 0x66, 0xc4, 0xe9, 0x1e, 0x12, 0x47, 0x51, 0x07, 0xfb, 0xa5, 0x77, 0x97, 0xec, 0xa1, 0xdd, 0x90, - 0x95, 0xbb, 0xfd, 0x54, 0x94, 0x46, 0xa9, 0x43, 0xcb, 0x31, 0xc9, 0x21, 0x76, 0x4b, 0x37, 0x97, - 0x44, 0xa9, 0x67, 0x82, 0x91, 0x47, 0xa9, 0x40, 0x0c, 0xed, 0x42, 0xc1, 0x26, 0x03, 0xc3, 0xde, - 0xb5, 0x0d, 0xa7, 0x45, 0x4c, 0x5c, 0x2a, 0x31, 0x9c, 0x07, 0x0b, 0x71, 0x9a, 0x51, 0x6e, 0x06, - 0x36, 0x0b, 0x40, 0x77, 0xc1, 0x60, 0xdf, 0x70, 0x86, 0xd1, 0x5d, 0xf0, 0xde, 0x92, 0x5d, 0x50, - 0x9d, 0x13, 0xe0, 0xbb, 0x60, 0x1e, 0x06, 0x75, 0xa0, 0xc8, 0x69, 0x0d, 0x97, 0x38, 0xbe, 0x85, - 0xdd, 0xd2, 0xda, 0x92, 0xb8, 0x51, 0x9d, 0x61, 0x67, 0xb0, 0x73, 0x10, 0x5f, 0x48, 0xdf, 0xfc, - 0xe5, 0x7a, 0x6c, 0x5b, 0xca, 0xa4, 0xe4, 0xf4, 0xb6, 0x94, 0xc9, 0xcb, 0x05, 0xa5, 0x08, 0xf9, - 0xe8, 0x69, 0xa9, 0x7c, 0x06, 0xef, 0x9e, 0xed, 0xd9, 0x68, 0x0d, 0xe2, 0x96, 0xc9, 0x8e, 0xde, - 0x6c, 0x05, 0x44, 0xc6, 0x13, 0x57, 0x6b, 0x5a, 0xdc, 0x32, 0x95, 0xc7, 0x50, 0x5a, 0xe4, 0xac, - 0xe8, 0x13, 0x00, 0x8f, 0xe7, 0x14, 0x96, 0xe9, 0xb1, 0xe4, 0x33, 0x5b, 0x29, 0x9c, 0xbc, 0x5e, - 0xcf, 0x72, 0x6c, 0xb5, 0xe6, 0x69, 0x59, 0xce, 0xa0, 0x9a, 0x9e, 0xf2, 0xa7, 0x31, 0x28, 0xce, - 0x86, 0x63, 0x54, 0x81, 0x74, 0x90, 0xb8, 0xf0, 0xd4, 0x55, 0x59, 0x7c, 0x3c, 0x19, 0xfe, 0x64, - 0xa4, 0x3a, 0x7b, 0x44, 0xa4, 0x13, 0x81, 0x20, 0x7a, 0x1f, 0xb2, 0xae, 0x71, 0xa8, 0xf7, 0x8f, - 0x7d, 0xec, 0x95, 0xe2, 0xb7, 0x13, 0xf7, 0xf2, 0x5a, 0xc6, 0x35, 0x0e, 0x2b, 0xf4, 0x19, 0xad, - 0x43, 0xc6, 0x99, 0x8c, 0x74, 0x97, 0x1c, 0x7a, 0xec, 0x34, 0x0f, 0x92, 0x91, 0xb4, 0x33, 0x19, - 0x69, 0xe4, 0xd0, 0x53, 0x6a, 0xb0, 0x32, 0x93, 0x10, 0x18, 0x0e, 0x7a, 0x08, 0x92, 0x37, 0x36, - 0x1c, 0x91, 0x8a, 0xdc, 0x8c, 0x68, 0x24, 0xea, 0x82, 0x0d, 0xca, 0x16, 0x24, 0x9a, 0x94, 0x55, - 0xf9, 0xf3, 0xc4, 0x1c, 0x0c, 0x4f, 0xca, 0x59, 0x66, 0x21, 0x70, 0xe6, 0xf7, 0xab, 0xa8, 0x13, - 0x78, 0x3a, 0x52, 0xc3, 0xde, 0xc0, 0xb5, 0xc6, 0x3e, 0x71, 0x83, 0x64, 0x89, 0x89, 0xa2, 0x3b, - 0x90, 0xb5, 0x1c, 0x13, 0x1f, 0xe9, 0x96, 0x79, 0xc4, 0x12, 0x9b, 0x82, 0x18, 0xcf, 0x30, 0xb2, - 0x6a, 0x1e, 0xa1, 0x5b, 0x90, 0x76, 0xf1, 0x4b, 0xec, 0x7a, 0x98, 0x4d, 0x30, 0xc8, 0x12, 0x03, - 0x22, 0xaa, 0x41, 0x92, 0xaa, 0x18, 0x24, 0x7c, 0x17, 0xcc, 0x8b, 0xc2, 0xf9, 0x71, 0x61, 0xf4, - 0x21, 0x00, 0x4b, 0xdf, 0xf4, 0x7d, 0xcb, 0xe1, 0x39, 0x5f, 0x42, 0x30, 0x64, 0x19, 0xfd, 0xb1, - 0xe5, 0xf8, 0xd4, 0xd8, 0x96, 0xa7, 0x0f, 0xf6, 0xf1, 0xe0, 0x80, 0x65, 0x7e, 0xa1, 0x2e, 0x96, - 0x57, 0xa5, 0x44, 0xb4, 0x03, 0xf0, 0xd2, 0xf2, 0xac, 0xbe, 0x65, 0x5b, 0xfe, 0x31, 0x4b, 0x48, - 0x8a, 0xe7, 0x44, 0x8c, 0xce, 0xc0, 0x70, 0x9e, 0x86, 0xec, 0x41, 0xf6, 0x3b, 0x05, 0x40, 0xdf, - 0x82, 0xdc, 0xc8, 0x38, 0xd2, 0x5d, 0xec, 0x4d, 0x6c, 0xdf, 0x63, 0xa9, 0x49, 0xb0, 0xbe, 0x30, - 0x32, 0x8e, 0x34, 0x4e, 0x57, 0xfe, 0x31, 0x01, 0xc5, 0xd9, 0x4c, 0xed, 0xd7, 0xb5, 0x36, 0xf7, - 0xa1, 0x68, 0x13, 0x72, 0x30, 0x19, 0x9f, 0x95, 0x9e, 0xf3, 0x91, 0x20, 0x3d, 0xaf, 0x40, 0x9a, - 0x38, 0x2c, 0x35, 0x5f, 0x9a, 0x30, 0x9e, 0xae, 0x19, 0x88, 0x43, 0x69, 0xa8, 0x07, 0xef, 0x70, - 0x8d, 0x78, 0x0d, 0xc1, 0xd1, 0x92, 0x97, 0x45, 0x5b, 0x61, 0x18, 0x0d, 0x06, 0xc1, 0x60, 0x3f, - 0x07, 0x89, 0xd6, 0xb1, 0x6c, 0x49, 0x8b, 0x8f, 0xd6, 0x17, 0xd8, 0x8a, 0x5a, 0xb8, 0x7b, 0x3c, - 0xc6, 0xc1, 0xbe, 0xa0, 0x22, 0x6f, 0x79, 0xc1, 0x69, 0x04, 0x81, 0x69, 0xba, 0x8c, 0x76, 0x61, - 0x45, 0x54, 0x3f, 0xc4, 0x35, 0xb1, 0x6b, 0x39, 0x43, 0xb1, 0x9e, 0x77, 0x16, 0x17, 0x9d, 0x82, - 0x51, 0x80, 0x8b, 0xea, 0x29, 0xa0, 0xa2, 0x47, 0x80, 0x02, 0x28, 0x7d, 0x64, 0xf8, 0x83, 0x7d, - 0xdd, 0xc6, 0xce, 0xcc, 0xe2, 0xca, 0xc1, 0xf8, 0x0e, 0x1d, 0x6e, 0x62, 0x47, 0xe9, 0x43, 0x3e, - 0x9a, 0x3a, 0xa3, 0xbb, 0xb0, 0xc2, 0x78, 0xb0, 0xa9, 0x47, 0x63, 0x5b, 0x41, 0x2b, 0x0a, 0x72, - 0xb0, 0xe4, 0xf7, 0x41, 0x0e, 0xb2, 0xec, 0x90, 0x33, 0xce, 0x38, 0x57, 0x02, 0xba, 0x60, 0xa5, - 0x25, 0xbf, 0x3c, 0x7f, 0x1a, 0xa3, 0x1a, 0xa4, 0x98, 0x27, 0x7a, 0x0b, 0xca, 0xfe, 0xf3, 0xbd, - 0x58, 0xc8, 0xa2, 0x3a, 0x00, 0x7e, 0x31, 0xf3, 0xfe, 0xdc, 0xa3, 0xdb, 0x8b, 0x0f, 0x22, 0xce, - 0x17, 0xec, 0x7d, 0xfc, 0x22, 0x98, 0xcc, 0xfa, 0x74, 0x37, 0x44, 0xbd, 0x3c, 0xd8, 0x0b, 0x6f, - 0xc7, 0xc1, 0xb7, 0x21, 0xbf, 0x67, 0x1d, 0x61, 0x53, 0x17, 0xc9, 0x7f, 0x92, 0x69, 0x7b, 0xe1, - 0xe4, 0x3f, 0xc7, 0x84, 0x39, 0xf1, 0x0d, 0xbc, 0x5a, 0xb1, 0xe0, 0x9d, 0x53, 0xe9, 0x03, 0x52, - 0x20, 0xaf, 0x91, 0xc3, 0x0e, 0x99, 0xb8, 0x03, 0xac, 0x9a, 0x47, 0xcc, 0x13, 0x0b, 0xda, 0x0c, - 0x0d, 0x7d, 0x00, 0xd9, 0x16, 0x3d, 0xc4, 0xc6, 0x13, 0xdf, 0xe3, 0x5e, 0xa5, 0x4d, 0x09, 0x08, - 0x81, 0xd4, 0x32, 0x46, 0x3c, 0x8c, 0x67, 0x35, 0xf6, 0x5b, 0xb9, 0x0b, 0xe9, 0xc0, 0xc2, 0x1f, - 0xcc, 0x9e, 0x95, 0xdc, 0xbe, 0x01, 0x49, 0xf9, 0xd7, 0x38, 0xac, 0xcc, 0xd5, 0x5e, 0xa8, 0x09, - 0x05, 0x1b, 0xef, 0x5d, 0x7d, 0x77, 0xe4, 0xa9, 0x74, 0xb8, 0x37, 0x5a, 0x50, 0x74, 0xad, 0xe1, - 0x7e, 0x04, 0x2e, 0x7e, 0x39, 0xb8, 0x02, 0x13, 0x0f, 0xf1, 0x22, 0x0e, 0x91, 0xbc, 0xaa, 0x43, - 0xbc, 0x41, 0x68, 0xba, 0x0f, 0x05, 0x67, 0x62, 0xdb, 0x3a, 0x7e, 0x31, 0x31, 0xc2, 0xe8, 0x14, - 0x9c, 0x58, 0x79, 0x3a, 0x54, 0x17, 0x23, 0xca, 0xcf, 0x12, 0x50, 0x9c, 0x2d, 0x46, 0xd1, 0x03, - 0x58, 0x61, 0xa6, 0x8d, 0x6c, 0x9d, 0x58, 0x24, 0xb4, 0xe3, 0x3d, 0xbf, 0x1e, 0x6e, 0x8d, 0x4f, - 0x40, 0xe6, 0x86, 0x9b, 0xdb, 0x67, 0x9c, 0x99, 0x1b, 0x75, 0xca, 0xfd, 0x1b, 0x36, 0xcb, 0xb7, - 0xa1, 0xc8, 0x2a, 0xf6, 0x69, 0xf0, 0x8a, 0xda, 0xa5, 0xc0, 0xc7, 0x02, 0x5d, 0xbf, 0x80, 0x9b, - 0x73, 0x56, 0xd0, 0x0d, 0x17, 0xeb, 0x07, 0xf8, 0x98, 0x1d, 0xc6, 0x81, 0xd4, 0xf5, 0x19, 0x7b, - 0x94, 0x5d, 0xfc, 0x04, 0x1f, 0xa3, 0x1f, 0x41, 0x69, 0xde, 0x2a, 0xa1, 0x70, 0x36, 0x22, 0xbc, - 0x3a, 0x6b, 0x1f, 0x2e, 0xad, 0xfc, 0x77, 0x0a, 0x8a, 0xb3, 0x79, 0x36, 0xba, 0x03, 0x30, 0x74, - 0x09, 0x3f, 0x6b, 0xa3, 0x06, 0xce, 0x32, 0x6a, 0x95, 0xd8, 0x1e, 0xfa, 0x3d, 0xc8, 0x07, 0xcd, - 0x11, 0x8b, 0x88, 0xd3, 0x38, 0xf7, 0xe8, 0xd3, 0x0b, 0x76, 0x56, 0xc2, 0xc7, 0xa9, 0xc1, 0x67, - 0xe0, 0xd0, 0x77, 0xc5, 0xe9, 0x81, 0x4d, 0x3d, 0xa2, 0x89, 0x14, 0x6a, 0x22, 0x8b, 0xd1, 0xad, - 0x50, 0xa1, 0x86, 0x58, 0xa8, 0x24, 0x5b, 0xa8, 0x4f, 0x2e, 0xaa, 0xc8, 0xfc, 0xaa, 0xad, 0xfd, - 0x51, 0x1c, 0x72, 0x11, 0xed, 0x28, 0xee, 0xde, 0xc4, 0x19, 0xb0, 0x0d, 0x7f, 0x09, 0xdc, 0xc6, - 0xc4, 0x09, 0x1b, 0xa8, 0x54, 0x1e, 0xdd, 0x8e, 0xf4, 0x8f, 0xa2, 0x3d, 0xc8, 0x69, 0x7b, 0xe8, - 0x23, 0x28, 0x8a, 0x6c, 0x63, 0x40, 0x6c, 0x96, 0x0a, 0x49, 0x3c, 0xf0, 0x71, 0x6a, 0x95, 0xd8, - 0x34, 0xf0, 0xdd, 0x64, 0xb1, 0x8b, 0x0d, 0x27, 0xd9, 0x09, 0x97, 0x1a, 0xf0, 0x81, 0x2d, 0xc8, - 0x1a, 0xee, 0x70, 0x32, 0xc2, 0x8e, 0xef, 0x95, 0x52, 0x97, 0x6d, 0x49, 0x4e, 0x65, 0xb7, 0xa5, - 0x4c, 0x42, 0x96, 0x94, 0x9f, 0xc7, 0x41, 0xa2, 0x93, 0x40, 0x32, 0xe4, 0xcb, 0xad, 0xaf, 0xf5, - 0x56, 0xbb, 0xab, 0xb7, 0x7a, 0xcd, 0xa6, 0x7c, 0x0d, 0xa5, 0x21, 0x51, 0x7e, 0xba, 0x25, 0xc7, - 0x50, 0x1e, 0x32, 0x95, 0x76, 0xbb, 0xa9, 0x97, 0x5b, 0x35, 0x39, 0x8e, 0x72, 0x90, 0x66, 0x4f, - 0x6d, 0x4d, 0x4e, 0xa0, 0x22, 0x40, 0xb5, 0xdd, 0xaa, 0x96, 0xbb, 0x7a, 0x79, 0x6b, 0x4b, 0x96, - 0x50, 0x16, 0x92, 0xd5, 0x76, 0xaf, 0xd5, 0x95, 0x93, 0x54, 0x7c, 0xa7, 0xfc, 0x95, 0x9c, 0x66, - 0x3f, 0xd4, 0x96, 0x9c, 0x41, 0x00, 0xa9, 0x4e, 0xb7, 0x56, 0xab, 0x3f, 0x95, 0xb3, 0x94, 0xd8, - 0xe9, 0xed, 0xc8, 0x40, 0xe1, 0x3a, 0xbd, 0x1d, 0x5d, 0x6d, 0x75, 0xe5, 0x1c, 0x7d, 0xd3, 0xd3, - 0xb2, 0xa6, 0x96, 0x5b, 0xd5, 0xba, 0x9c, 0xa7, 0x43, 0x5f, 0xb5, 0x35, 0x86, 0x5c, 0xe0, 0x6f, - 0xea, 0xb5, 0xba, 0xba, 0xd6, 0x7e, 0xd6, 0x91, 0x8b, 0x4c, 0xee, 0x27, 0x5a, 0x4d, 0x6d, 0x34, - 0xe4, 0x15, 0x84, 0xa0, 0xd8, 0x50, 0x5b, 0xe5, 0xa6, 0x1e, 0x4a, 0xcb, 0x74, 0x42, 0x9c, 0x26, - 0xde, 0xf9, 0x0e, 0x2a, 0x40, 0xb6, 0xac, 0x69, 0xe5, 0xaf, 0x19, 0x22, 0xa2, 0x2f, 0xdb, 0xee, - 0xb4, 0x5b, 0xec, 0xe9, 0x3a, 0x1d, 0xa4, 0x4f, 0x15, 0xf6, 0xb8, 0x4a, 0x5f, 0xd7, 0xe9, 0x6a, - 0x6a, 0x6b, 0x8b, 0x3d, 0xdf, 0x50, 0x3e, 0x01, 0x89, 0xfa, 0x10, 0xca, 0x80, 0x54, 0xee, 0x75, - 0xdb, 0xf2, 0x35, 0x36, 0x9b, 0x6a, 0xb9, 0x59, 0xd6, 0xe4, 0x18, 0xe5, 0x6e, 0xb5, 0x5b, 0xba, - 0x78, 0x8e, 0x2b, 0xff, 0x9b, 0x80, 0xe2, 0x6c, 0x0b, 0x2c, 0x74, 0xdc, 0x65, 0x0e, 0x36, 0x2b, - 0x76, 0xca, 0x71, 0xa7, 0x89, 0x78, 0xfc, 0xea, 0x89, 0x78, 0x58, 0xe1, 0x24, 0xde, 0xa4, 0xc2, - 0x79, 0x08, 0x19, 0x73, 0xe2, 0xb2, 0xed, 0xc3, 0x5c, 0x38, 0x51, 0xb9, 0x41, 0x87, 0x7f, 0xf5, - 0x7a, 0xbd, 0xe0, 0x5b, 0x23, 0xbc, 0x51, 0x13, 0x83, 0x5a, 0xc8, 0x46, 0x8b, 0xa2, 0xc1, 0xfe, - 0xc4, 0x39, 0xd0, 0x3d, 0xeb, 0x15, 0x9e, 0x2d, 0x8a, 0x18, 0xbd, 0x63, 0xbd, 0xc2, 0xa8, 0x0d, - 0x79, 0xe2, 0xef, 0x63, 0x57, 0x17, 0xb9, 0x5a, 0xea, 0x0a, 0xb9, 0x5a, 0x8e, 0x21, 0x74, 0x79, - 0xc2, 0xf6, 0x25, 0x64, 0x5c, 0x6c, 0x98, 0x65, 0xaf, 0xbd, 0x27, 0x7a, 0xba, 0xbf, 0x15, 0x01, - 0x9b, 0xf8, 0x96, 0xbd, 0xb1, 0x6f, 0x0f, 0x36, 0xba, 0xc1, 0x5d, 0x52, 0xb0, 0x65, 0x03, 0x21, - 0xe5, 0x81, 0x58, 0xfc, 0x1c, 0xa4, 0x55, 0xe7, 0xa5, 0x61, 0x5b, 0x26, 0x5f, 0x7f, 0x1e, 0x61, - 0xe5, 0x18, 0x75, 0x7b, 0x95, 0xa6, 0x6d, 0x72, 0x5c, 0x39, 0x89, 0x41, 0xa6, 0x61, 0x93, 0x43, - 0xb6, 0xe8, 0x0f, 0x21, 0xbd, 0x67, 0x93, 0x43, 0x5d, 0xf4, 0x0a, 0xf2, 0x95, 0x12, 0x45, 0xfe, - 0xb7, 0xd7, 0xeb, 0x29, 0xca, 0xa2, 0xd6, 0x4e, 0xc2, 0x5f, 0x5a, 0x8a, 0x32, 0xaa, 0x26, 0x6a, - 0xb2, 0x1e, 0x91, 0xb8, 0xa3, 0x13, 0xd9, 0xe5, 0xc7, 0xcb, 0xef, 0x96, 0x22, 0x37, 0x39, 0x11, - 0x79, 0xd4, 0x83, 0xf4, 0xd0, 0xf0, 0xf1, 0xa1, 0x71, 0xcc, 0x92, 0xa4, 0x64, 0xe5, 0x87, 0x62, - 0x89, 0x3e, 0x1d, 0x5a, 0xfe, 0xfe, 0xa4, 0xbf, 0x31, 0x20, 0xa3, 0xcd, 0x10, 0xdc, 0xec, 0x4f, - 0x7f, 0x6f, 0x8e, 0x0f, 0x86, 0x9b, 0x41, 0xf9, 0x4e, 0x73, 0x36, 0xb5, 0xa6, 0x05, 0x58, 0xca, - 0x21, 0xe4, 0xb6, 0x49, 0x7f, 0xd7, 0x25, 0x43, 0x1a, 0x5e, 0xd0, 0x47, 0x90, 0x7a, 0x4e, 0xfa, - 0xc1, 0x2c, 0x13, 0x95, 0x82, 0xe8, 0x88, 0x24, 0xb7, 0x49, 0x5f, 0xad, 0x69, 0xc9, 0xe7, 0xa4, - 0xaf, 0x9a, 0xe8, 0x1e, 0xe4, 0x07, 0xc4, 0xf1, 0x5d, 0xab, 0x3f, 0x09, 0xaf, 0x68, 0xe2, 0xc1, - 0xb1, 0x10, 0x1d, 0x41, 0x25, 0x90, 0x3c, 0x9b, 0xf8, 0x42, 0xe5, 0xa0, 0x6d, 0x60, 0x13, 0x5f, - 0xf9, 0x67, 0x09, 0xd0, 0xe9, 0x96, 0x30, 0xad, 0x6b, 0x3d, 0xd6, 0x39, 0xe5, 0x8e, 0x15, 0x8f, - 0xc8, 0x01, 0x1f, 0x60, 0x9e, 0xd5, 0x80, 0xcc, 0x58, 0xe8, 0xcc, 0x4e, 0xfa, 0xf3, 0x1a, 0xbd, - 0x91, 0xf9, 0x05, 0xfe, 0x10, 0xc8, 0xa2, 0x06, 0x24, 0x26, 0xae, 0x55, 0x4a, 0xb3, 0xc5, 0xf9, - 0xec, 0x12, 0xbd, 0xeb, 0x8d, 0x9e, 0x6b, 0xd5, 0x1d, 0xdf, 0x3d, 0xd6, 0x28, 0x00, 0xfa, 0x31, - 0xa4, 0xf8, 0x6d, 0xa9, 0xb8, 0x24, 0x58, 0x3f, 0xa3, 0x73, 0xa2, 0xb6, 0x1b, 0x96, 0x8d, 0x1b, - 0x8c, 0x2d, 0xbc, 0xf1, 0x62, 0x4f, 0xa8, 0x17, 0x96, 0x33, 0x59, 0xa6, 0xc9, 0xf7, 0x2f, 0xa3, - 0x09, 0xdf, 0x1b, 0x4c, 0x19, 0x06, 0x1b, 0x0b, 0xeb, 0x9b, 0x2f, 0xe1, 0x3d, 0xef, 0xc0, 0x1a, - 0xeb, 0x23, 0xcb, 0xf3, 0x68, 0x59, 0xb7, 0x47, 0x5c, 0x6c, 0x0d, 0x1d, 0x9a, 0x67, 0xf0, 0xdb, - 0x83, 0xe0, 0x4c, 0x7b, 0x97, 0xb2, 0xed, 0x70, 0xae, 0x06, 0x67, 0x7a, 0x82, 0x8f, 0xbd, 0x35, - 0x03, 0x72, 0x11, 0x74, 0x24, 0x43, 0x82, 0xa6, 0x28, 0xac, 0x59, 0xa6, 0xd1, 0x9f, 0xe8, 0x47, - 0x90, 0x64, 0xf5, 0xc8, 0xe5, 0x62, 0x98, 0xc6, 0x85, 0xbe, 0x88, 0xff, 0x20, 0xb6, 0xf6, 0x3d, - 0xc8, 0x04, 0xa6, 0x8c, 0xe2, 0x27, 0x39, 0xfe, 0x6a, 0x14, 0x3f, 0x1b, 0x91, 0xdb, 0x96, 0x32, - 0x31, 0x39, 0xce, 0x8f, 0xbe, 0x6d, 0x29, 0x23, 0xc9, 0xc9, 0x6d, 0x29, 0x93, 0x94, 0x53, 0xca, - 0xdf, 0xc4, 0xa1, 0x30, 0x73, 0x3d, 0x80, 0x3e, 0x86, 0x9c, 0x89, 0xe9, 0x91, 0xcd, 0x03, 0x1c, - 0x6f, 0xf5, 0x89, 0xe0, 0x12, 0x19, 0x40, 0x0f, 0xa0, 0x70, 0x68, 0xd8, 0x36, 0x8d, 0x78, 0x2d, - 0xc3, 0x21, 0xbc, 0x69, 0x16, 0x44, 0xb5, 0xd9, 0x21, 0xf4, 0x64, 0xb6, 0xb3, 0xb4, 0x79, 0xb1, - 0x9b, 0x0a, 0xd6, 0x3c, 0xa3, 0xb5, 0xcd, 0x6c, 0xf8, 0x8d, 0x3a, 0x73, 0xf2, 0xea, 0xce, 0x4c, - 0x4d, 0x19, 0xbc, 0x80, 0x6e, 0x3c, 0x87, 0x16, 0x54, 0xd1, 0xd9, 0x32, 0x0a, 0x35, 0x32, 0x76, - 0x4c, 0x66, 0xd0, 0xbc, 0x46, 0x7f, 0x6e, 0x4b, 0x99, 0xb8, 0x9c, 0x50, 0xfe, 0x3e, 0x06, 0x85, - 0x99, 0xf6, 0xf9, 0x85, 0x0d, 0x77, 0x17, 0xf2, 0x14, 0x59, 0x1f, 0x1b, 0xbe, 0x8f, 0x5d, 0x1e, - 0x0e, 0x42, 0x46, 0x3a, 0xb2, 0xcb, 0x07, 0xd0, 0x8f, 0x21, 0x4d, 0xc6, 0x41, 0xfa, 0x39, 0x1f, - 0xbd, 0x83, 0x6d, 0x52, 0xed, 0x3c, 0x6d, 0x73, 0xa6, 0xa0, 0x85, 0x26, 0x64, 0xa6, 0x67, 0x0e, - 0x6b, 0x69, 0x4a, 0xa7, 0xce, 0x1c, 0xd6, 0xd4, 0xfc, 0xc3, 0x38, 0x40, 0xe7, 0x00, 0xfb, 0x83, - 0x7d, 0x36, 0x87, 0x6d, 0xc8, 0x79, 0xec, 0x49, 0x8f, 0x9c, 0xd9, 0xe7, 0x5c, 0x48, 0x32, 0xde, - 0xc8, 0x51, 0x0d, 0x5e, 0x48, 0x41, 0xa5, 0x69, 0x15, 0xca, 0x7b, 0x15, 0x61, 0x1f, 0xf6, 0x53, - 0x40, 0x43, 0xec, 0x60, 0xd7, 0xf0, 0xb1, 0xbe, 0x6f, 0x79, 0x3e, 0x19, 0xba, 0xc6, 0x68, 0xa6, - 0x27, 0xf9, 0x4e, 0x30, 0xfe, 0x38, 0x18, 0x46, 0x3f, 0x80, 0x1b, 0x21, 0xaf, 0x3e, 0x32, 0x8e, - 0xf4, 0xfe, 0x64, 0x70, 0x80, 0x7d, 0x3e, 0xb3, 0xa0, 0xe7, 0x72, 0x3d, 0x64, 0xd9, 0x31, 0x8e, - 0x2a, 0x9c, 0x01, 0xdd, 0x81, 0xac, 0xe7, 0x1b, 0xbe, 0xce, 0x56, 0x38, 0x19, 0xb1, 0x76, 0x86, - 0x92, 0x59, 0xf1, 0xfc, 0xfb, 0x90, 0x8b, 0x5c, 0x70, 0xa1, 0x3a, 0x64, 0xf8, 0x44, 0xc2, 0x8e, - 0xc9, 0x32, 0x1b, 0x44, 0x8e, 0xa1, 0x50, 0xf4, 0xac, 0xe8, 0x5c, 0x38, 0x1d, 0x9d, 0x95, 0xff, - 0x8a, 0xc3, 0xea, 0x59, 0xb7, 0x62, 0xbf, 0x5e, 0x35, 0xd0, 0x1f, 0x00, 0xe2, 0x4f, 0x41, 0x41, - 0x17, 0x69, 0xd0, 0xfc, 0xe4, 0xe4, 0xf5, 0xba, 0xb8, 0xa3, 0x13, 0x25, 0x9d, 0x5a, 0xf3, 0x7e, - 0xf5, 0x7a, 0xfd, 0xf3, 0x0b, 0x9d, 0xa6, 0x91, 0x8f, 0x5d, 0x36, 0x02, 0x69, 0x4d, 0xf6, 0x66, - 0xe0, 0x4c, 0x0f, 0x19, 0x90, 0x61, 0x91, 0x98, 0x9e, 0xa7, 0x7c, 0x51, 0x1b, 0xc1, 0x37, 0x18, - 0x2c, 0x22, 0xaa, 0xb5, 0x0b, 0x9f, 0xdf, 0xd1, 0x37, 0xd2, 0xf3, 0x9b, 0xe1, 0xaa, 0xa6, 0xf2, - 0x7f, 0x12, 0xbc, 0x7f, 0xce, 0xf5, 0x20, 0xfa, 0x6a, 0xae, 0x51, 0xf6, 0xc5, 0x55, 0x2e, 0x19, - 0x79, 0xfc, 0x9e, 0x6b, 0x9e, 0x45, 0x9a, 0xef, 0xf1, 0xb3, 0x9a, 0xef, 0xb3, 0x6d, 0xf3, 0xc4, - 0xd9, 0x6d, 0xf3, 0xb7, 0xd1, 0x19, 0xfb, 0x7c, 0xa6, 0x90, 0xbc, 0x4c, 0xc5, 0xbf, 0xf6, 0xb7, - 0x71, 0x48, 0xb2, 0xb9, 0xa1, 0xdf, 0x05, 0xc9, 0xc4, 0xde, 0xe0, 0x4a, 0x4d, 0x71, 0x26, 0x79, - 0x91, 0x9e, 0x78, 0xf0, 0x5d, 0x4f, 0xe2, 0x0d, 0xbe, 0xeb, 0xa9, 0x42, 0x26, 0x6c, 0x42, 0x49, - 0x97, 0x6b, 0x42, 0x85, 0x82, 0xd3, 0xb2, 0x21, 0xf9, 0x06, 0x65, 0x83, 0xf2, 0x8b, 0x18, 0x14, - 0x67, 0xaf, 0x36, 0xd1, 0x97, 0x90, 0xe4, 0x9f, 0xd8, 0xc4, 0x2e, 0x5b, 0xcf, 0x72, 0x39, 0xd4, - 0x85, 0x30, 0x52, 0x9a, 0x73, 0x9d, 0xd9, 0x3b, 0x0b, 0x16, 0x85, 0xef, 0xb7, 0xc8, 0xda, 0xca, - 0x21, 0x42, 0xd0, 0xac, 0xb9, 0x0b, 0xb2, 0x33, 0x19, 0xb1, 0x9e, 0x84, 0x3e, 0xc6, 0xae, 0x3e, - 0xc4, 0x0e, 0x8f, 0x03, 0x5a, 0xc1, 0x99, 0x8c, 0xaa, 0xc4, 0xf6, 0x76, 0xb1, 0xbb, 0x85, 0x1d, - 0xe5, 0xcf, 0xf2, 0x90, 0x8f, 0x5e, 0xb3, 0xa2, 0xdb, 0x90, 0x1b, 0x1b, 0xae, 0x6f, 0xb1, 0xc6, - 0xc7, 0xb1, 0xe8, 0x66, 0x47, 0x49, 0x48, 0x83, 0x2c, 0xbf, 0x8a, 0x6d, 0x84, 0x9a, 0x6e, 0x5c, - 0xe8, 0x0a, 0x57, 0x3c, 0x34, 0xc2, 0x8a, 0x3e, 0x84, 0x59, 0xfb, 0xeb, 0x98, 0xa8, 0xe5, 0x35, - 0x28, 0x04, 0x6d, 0x16, 0xdc, 0xb8, 0x62, 0x57, 0x43, 0x9b, 0x85, 0x40, 0xbb, 0x00, 0xe2, 0x4d, - 0x14, 0x30, 0xce, 0x00, 0xbf, 0x7b, 0x29, 0x8d, 0x29, 0x68, 0x04, 0x83, 0xdf, 0xbf, 0xae, 0xfd, - 0x32, 0x09, 0xc9, 0x86, 0x4b, 0x53, 0x8c, 0x6d, 0x90, 0x46, 0xc4, 0x0c, 0x4e, 0xdb, 0x0b, 0x62, - 0x33, 0xd1, 0x8d, 0x1d, 0x62, 0x86, 0x5b, 0x94, 0x62, 0xa0, 0x5d, 0x48, 0xf5, 0xc9, 0xc4, 0x31, - 0x3d, 0x91, 0x62, 0x3e, 0xba, 0x0c, 0x5a, 0x85, 0x49, 0x06, 0xf1, 0x82, 0xe3, 0xac, 0xfd, 0x4f, - 0x0c, 0x92, 0x6c, 0x00, 0x7d, 0x0d, 0x59, 0x46, 0xeb, 0x4e, 0x53, 0x83, 0xdf, 0xbe, 0x34, 0x7c, - 0xc4, 0xf1, 0xa6, 0x68, 0x34, 0xfa, 0x59, 0x8e, 0xaf, 0x8b, 0x0f, 0xc5, 0xa2, 0xe1, 0x20, 0x6b, - 0x39, 0x7e, 0x9b, 0x7f, 0x2b, 0x76, 0x07, 0xf2, 0x34, 0x0c, 0x99, 0x01, 0x5b, 0x82, 0xe5, 0x64, - 0x39, 0x46, 0x13, 0x2c, 0x2a, 0xe4, 0xf8, 0x20, 0xcf, 0x5f, 0xf8, 0x8e, 0xbf, 0xf8, 0x4d, 0x31, - 0x70, 0x61, 0xaa, 0xd2, 0xda, 0x5f, 0xc4, 0x20, 0xc5, 0x0d, 0x82, 0x76, 0x20, 0xe9, 0xf9, 0x86, - 0xeb, 0x8b, 0x70, 0xf7, 0xf0, 0xd2, 0x93, 0x0e, 0x03, 0x01, 0x45, 0x41, 0xd5, 0x69, 0x4a, 0x79, - 0x15, 0x30, 0x96, 0x85, 0x2a, 0x77, 0x41, 0xa2, 0x8b, 0x4f, 0x2b, 0x70, 0xad, 0xdc, 0xda, 0xaa, - 0xcb, 0xd7, 0x50, 0x06, 0x24, 0xd6, 0x23, 0x8a, 0xd1, 0x12, 0x7d, 0x4b, 0x6b, 0xf7, 0x76, 0x3b, - 0x72, 0x5c, 0x79, 0x05, 0xd9, 0xd0, 0xf0, 0xe8, 0x26, 0x5c, 0xef, 0xb5, 0x2a, 0xed, 0x5e, 0xab, - 0x56, 0xaf, 0xe9, 0xbb, 0x5a, 0xbd, 0x5a, 0xaf, 0xa9, 0xad, 0x2d, 0xf9, 0xda, 0xec, 0x40, 0xa3, - 0xdd, 0x6c, 0xb6, 0x9f, 0xd1, 0x81, 0x18, 0x5a, 0x05, 0xb9, 0xdd, 0x68, 0x74, 0xea, 0xdd, 0x08, - 0x7b, 0x3c, 0x42, 0x9d, 0xf2, 0x26, 0xd0, 0x0a, 0xe4, 0xaa, 0x3d, 0x4d, 0xab, 0xf3, 0x66, 0x95, - 0x2c, 0xad, 0xfd, 0x53, 0x1c, 0x32, 0xc1, 0xb6, 0x45, 0xb5, 0x48, 0xa7, 0xf1, 0xbc, 0xef, 0x2d, - 0x66, 0xe7, 0x3d, 0xdf, 0x67, 0xfc, 0x18, 0x72, 0x86, 0x3b, 0x54, 0xcd, 0xa3, 0x0e, 0x5b, 0x91, - 0xa8, 0xab, 0x44, 0x07, 0xd0, 0x6d, 0xc8, 0x18, 0xee, 0xb0, 0x4a, 0x26, 0xe2, 0x34, 0x0d, 0x8f, - 0x97, 0x80, 0xfa, 0x76, 0x8e, 0x86, 0x32, 0x24, 0xf7, 0xdc, 0x20, 0xaf, 0x3c, 0xef, 0xbb, 0x8c, - 0xd3, 0xab, 0xa9, 0x71, 0x49, 0x74, 0x0f, 0x66, 0x3a, 0xa0, 0xe2, 0x73, 0x52, 0xd1, 0x1e, 0x88, - 0x8e, 0x28, 0x3f, 0x8f, 0x01, 0x4c, 0x63, 0x0a, 0x2a, 0x02, 0x68, 0xed, 0x67, 0x7a, 0xab, 0xb7, - 0x53, 0xa9, 0x6b, 0x62, 0xfd, 0xcb, 0xad, 0x27, 0xbc, 0x2d, 0x57, 0xab, 0xb7, 0x3a, 0x75, 0x9d, - 0x3d, 0xc7, 0x91, 0x0c, 0xf9, 0xdd, 0xba, 0x56, 0x65, 0x0b, 0x43, 0x29, 0x09, 0x54, 0x80, 0x6c, - 0xb5, 0xb7, 0x53, 0xd7, 0x6b, 0x6a, 0xa7, 0xcb, 0xdb, 0x97, 0xad, 0xae, 0xda, 0xac, 0xf3, 0xf6, - 0x65, 0xb3, 0xbc, 0x25, 0xa7, 0x28, 0x5c, 0xb3, 0x5e, 0xae, 0xc9, 0x69, 0xba, 0xae, 0x0d, 0x55, - 0xeb, 0x74, 0xf5, 0xa7, 0xe5, 0x66, 0xaf, 0x2e, 0x67, 0x28, 0x7e, 0xb3, 0x1c, 0x3e, 0x67, 0x29, - 0x5a, 0xab, 0xfb, 0x58, 0x3c, 0x82, 0xf2, 0x77, 0x71, 0x58, 0x3d, 0xeb, 0x03, 0x17, 0xd4, 0x81, - 0xf4, 0xa1, 0x11, 0xcd, 0x67, 0x3f, 0xbd, 0xd4, 0x07, 0x32, 0x1b, 0xcf, 0xa8, 0x70, 0x90, 0x39, - 0x09, 0x24, 0xd6, 0xc1, 0xc6, 0x38, 0xd8, 0x4f, 0xf3, 0xb1, 0x9e, 0x7d, 0xc0, 0xcd, 0x3f, 0xe6, - 0x16, 0x98, 0x94, 0xb9, 0x86, 0x7d, 0xc3, 0xb2, 0xbd, 0xd0, 0xb3, 0x30, 0x36, 0xd7, 0xfe, 0x38, - 0x06, 0x49, 0xf6, 0x02, 0xd4, 0x02, 0xd9, 0x72, 0x2c, 0xdf, 0x32, 0x6c, 0xdd, 0xc5, 0x1e, 0xb1, - 0x5f, 0x62, 0x53, 0x78, 0xed, 0x85, 0xfa, 0x67, 0x2b, 0x42, 0x58, 0x13, 0xb2, 0xe1, 0x67, 0x22, - 0xf1, 0x8b, 0x7f, 0x26, 0xf2, 0x0f, 0x31, 0x40, 0xa7, 0x3f, 0xe5, 0x41, 0x15, 0x28, 0xf8, 0xae, - 0x31, 0x38, 0xc0, 0xa6, 0xce, 0x33, 0x12, 0x6e, 0xc6, 0x25, 0x90, 0x79, 0x21, 0xd3, 0x11, 0xf5, - 0xf3, 0x5b, 0xb1, 0x57, 0xa4, 0xf9, 0x95, 0x58, 0xdc, 0xfc, 0x7a, 0xf0, 0x7d, 0x28, 0xce, 0x5e, - 0xd6, 0xd3, 0xe0, 0xb4, 0xdb, 0xab, 0x34, 0xd5, 0xaa, 0x7c, 0x0d, 0xbd, 0x07, 0x37, 0xf8, 0x6f, - 0xbd, 0xdc, 0xaa, 0xb1, 0x1e, 0xbc, 0x18, 0x8a, 0x3d, 0x50, 0x82, 0xc2, 0x94, 0x05, 0xae, 0x55, - 0x90, 0x1f, 0x37, 0x9b, 0xfa, 0x6e, 0xb3, 0xd7, 0xe1, 0x7f, 0x9e, 0x3e, 0x94, 0xaf, 0x55, 0x3e, - 0xfc, 0xe6, 0x97, 0xb7, 0xae, 0x7d, 0x73, 0x72, 0x2b, 0xf6, 0x8b, 0x93, 0x5b, 0xb1, 0x7f, 0x39, - 0xb9, 0x15, 0xfb, 0xf7, 0x93, 0x5b, 0xb1, 0x9f, 0xfd, 0xc7, 0xad, 0x6b, 0x3f, 0xcd, 0x86, 0x9e, - 0xf4, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x16, 0x48, 0xed, 0x48, 0x09, 0x30, 0x00, 0x00, + 0x40, 0x80, 0x37, 0x00, 0xa4, 0xdd, 0xab, 0x72, 0x4d, 0x0d, 0x30, 0x4d, 0x70, 0xc4, 0xc1, 0x34, + 0x34, 0x33, 0x10, 0x49, 0x39, 0x70, 0x62, 0x27, 0x76, 0x95, 0xeb, 0xca, 0xe5, 0xc8, 0xe5, 0xc0, + 0xc9, 0x85, 0x4e, 0x1c, 0x38, 0x71, 0xe2, 0xc0, 0x65, 0x6f, 0xe0, 0xe0, 0x12, 0x57, 0xd9, 0x0e, + 0x54, 0x3e, 0x3a, 0x70, 0x95, 0x73, 0x57, 0xd9, 0x17, 0xb9, 0xfa, 0x67, 0x06, 0x03, 0x90, 0x20, + 0x48, 0x4a, 0x75, 0x97, 0x90, 0x98, 0xee, 0xf7, 0xbe, 0x79, 0xfd, 0xfa, 0xf5, 0xfb, 0xeb, 0x81, + 0x5b, 0xde, 0x0b, 0x7b, 0xd3, 0xb4, 0x3c, 0xdf, 0x7b, 0x61, 0x8f, 0xfb, 0x9b, 0x63, 0x97, 0x0c, + 0xb0, 0xe7, 0x11, 0xd7, 0xdb, 0x18, 0xbb, 0xc4, 0x27, 0xe8, 0xe6, 0x80, 0x0c, 0x0e, 0x5c, 0x62, + 0x0c, 0xf6, 0x37, 0xbc, 0x17, 0xf6, 0x46, 0x48, 0xb9, 0xf6, 0xee, 0x73, 0xd2, 0xf7, 0x36, 0xe9, + 0x9f, 0x71, 0x9f, 0xfd, 0xe3, 0x0c, 0x6b, 0x88, 0x11, 0x8f, 0xfb, 0x9b, 0xa6, 0xe1, 0x1b, 0x62, + 0xac, 0x14, 0x8c, 0x59, 0xe4, 0x3b, 0x7b, 0xc4, 0x1d, 0x19, 0x7e, 0x40, 0xfd, 0x01, 0x7d, 0xbd, + 0xf7, 0xc2, 0xee, 0x1b, 0x1e, 0xde, 0xf4, 0x7c, 0x77, 0x32, 0xf0, 0x27, 0x2e, 0x36, 0xc5, 0xec, + 0xfb, 0xd1, 0xd9, 0xe7, 0xc4, 0x72, 0x74, 0xff, 0x78, 0x8c, 0x03, 0xd0, 0x59, 0xc9, 0xa3, 0xaf, + 0x9b, 0xf8, 0x96, 0xbd, 0xb9, 0x6f, 0x0f, 0x36, 0x7d, 0x6b, 0x84, 0x3d, 0xdf, 0x18, 0x8d, 0xc5, + 0xcc, 0xea, 0x90, 0x0c, 0x09, 0xfb, 0xb9, 0x49, 0x7f, 0xf1, 0x51, 0xe5, 0x4f, 0x12, 0x50, 0xd8, + 0x0d, 0x16, 0xde, 0x19, 0xe3, 0x01, 0xaa, 0x40, 0xd2, 0x72, 0xc6, 0x13, 0xbf, 0x14, 0xbb, 0x9d, + 0xb8, 0x97, 0x7b, 0xf4, 0xf1, 0xc6, 0x02, 0x2d, 0x6c, 0xa8, 0x94, 0xaa, 0x73, 0xec, 0x0c, 0x28, + 0x5b, 0x45, 0xfa, 0xe6, 0xf5, 0xfa, 0x35, 0x8d, 0xb3, 0xa2, 0x3a, 0x48, 0x03, 0xe2, 0xe2, 0x52, + 0xfc, 0x76, 0xec, 0x5e, 0xee, 0xd1, 0xb7, 0x17, 0x42, 0x84, 0x6f, 0xae, 0x12, 0x17, 0xf7, 0x1c, + 0x8b, 0x38, 0x02, 0x87, 0xb1, 0xa3, 0x2d, 0x48, 0x91, 0x89, 0x4f, 0x65, 0x49, 0x30, 0x59, 0xee, + 0x2f, 0x04, 0x6a, 0x33, 0x32, 0x8d, 0x4c, 0x7c, 0xec, 0x46, 0xc4, 0x11, 0xec, 0xa8, 0x02, 0xd2, + 0x98, 0x78, 0x7e, 0x49, 0x62, 0xf2, 0xdc, 0x5b, 0x2c, 0x0f, 0xf1, 0x7c, 0x21, 0x53, 0x04, 0x85, + 0xf1, 0xa2, 0x07, 0x90, 0xf1, 0x7c, 0x63, 0x88, 0x75, 0xcb, 0x2c, 0x25, 0x6f, 0xc7, 0xee, 0x25, + 0x2b, 0x2b, 0x74, 0xf6, 0xe4, 0xf5, 0x7a, 0xba, 0x43, 0xc7, 0xd5, 0x9a, 0x96, 0x66, 0x04, 0xaa, + 0x89, 0xbe, 0x07, 0xf9, 0xd0, 0x9a, 0x28, 0x7d, 0x8a, 0xd1, 0x5f, 0x17, 0xf4, 0xb9, 0x70, 0xd9, + 0x6a, 0x4d, 0xcb, 0x85, 0x84, 0xaa, 0xa9, 0xfc, 0x75, 0x1c, 0x56, 0xe6, 0x64, 0x40, 0x65, 0x48, + 0xed, 0x59, 0xb6, 0x8f, 0xdd, 0x52, 0x8c, 0x49, 0xff, 0xe1, 0x42, 0xe9, 0xeb, 0x47, 0x63, 0x17, + 0x7b, 0xde, 0x54, 0x8b, 0x82, 0x11, 0x7d, 0x04, 0x30, 0x76, 0xc9, 0x73, 0x3c, 0xf0, 0x2d, 0xe2, + 0xb0, 0x4d, 0xc9, 0x08, 0x8a, 0xc8, 0x38, 0xba, 0x0f, 0x45, 0xae, 0x2e, 0x7d, 0x40, 0xec, 0xc9, + 0xc8, 0xf1, 0x98, 0xd6, 0x0b, 0x95, 0xb8, 0x1c, 0xd3, 0x0a, 0x7c, 0xa6, 0xca, 0x27, 0x50, 0x13, + 0xf2, 0x2e, 0x76, 0x4c, 0xec, 0xea, 0xf8, 0x68, 0xec, 0x7a, 0x25, 0x89, 0x6d, 0xcf, 0x25, 0x24, + 0xcb, 0x71, 0x76, 0x3a, 0xee, 0xa1, 0x0f, 0x20, 0x45, 0xf6, 0xf6, 0x3c, 0xec, 0x33, 0xbd, 0x4a, + 0xe1, 0xde, 0xb1, 0x31, 0xb4, 0x06, 0x49, 0xdb, 0x1a, 0x59, 0x3e, 0x53, 0x62, 0x30, 0xc9, 0x87, + 0x94, 0xff, 0x2a, 0x02, 0x3a, 0x6d, 0x43, 0xe8, 0x73, 0x90, 0x1c, 0x42, 0xc6, 0x42, 0x61, 0xdf, + 0x5a, 0x28, 0x56, 0x8b, 0x90, 0x31, 0xe5, 0xa2, 0x7a, 0xd6, 0x18, 0x0b, 0xda, 0x86, 0x9c, 0x6f, + 0xf4, 0x6d, 0xac, 0x61, 0xc3, 0xc4, 0xae, 0x30, 0xe0, 0xc5, 0x06, 0xd3, 0x9d, 0xd2, 0x32, 0x90, + 0x28, 0x33, 0xda, 0x02, 0xa0, 0x07, 0x57, 0x40, 0x25, 0x18, 0xd4, 0xdd, 0x85, 0x50, 0xdb, 0x21, + 0x29, 0x43, 0x8a, 0xb0, 0xa2, 0x1f, 0x42, 0xca, 0x23, 0x2e, 0x35, 0x01, 0x69, 0x89, 0x09, 0x74, + 0x18, 0x19, 0x03, 0x10, 0x2c, 0x54, 0x0a, 0x63, 0x38, 0x74, 0xf1, 0xd0, 0xf0, 0x89, 0xcb, 0x34, + 0x7c, 0x9e, 0x14, 0xe5, 0x90, 0x94, 0x4b, 0x31, 0x65, 0x45, 0x65, 0xc8, 0x50, 0x3a, 0xcb, 0x19, + 0xf8, 0xa5, 0xf4, 0x12, 0xcd, 0xd6, 0x04, 0x21, 0x03, 0x09, 0xd9, 0xa8, 0x76, 0x47, 0xd8, 0x1d, + 0x62, 0xba, 0x56, 0xec, 0x96, 0x32, 0x4b, 0xb4, 0xbb, 0x33, 0xa5, 0xe5, 0xda, 0x8d, 0x30, 0xd3, + 0x75, 0xed, 0x1b, 0xde, 0xbe, 0x80, 0xca, 0x2e, 0x59, 0xd7, 0xe3, 0x90, 0x94, 0xaf, 0x6b, 0xca, + 0x8a, 0xbe, 0x84, 0xd4, 0x4b, 0xc3, 0x9e, 0x60, 0xaf, 0x04, 0x4b, 0x40, 0x9e, 0x32, 0xb2, 0xd0, + 0x62, 0x04, 0x1b, 0x95, 0xa4, 0x6f, 0x0c, 0x0e, 0xf6, 0x2c, 0xdb, 0xc6, 0x6e, 0x29, 0xb7, 0x04, + 0xa4, 0x12, 0x92, 0x72, 0x49, 0xa6, 0xac, 0xe8, 0x09, 0x80, 0x8b, 0x0d, 0x53, 0x1d, 0x8d, 0x89, + 0xeb, 0x97, 0x0a, 0x4b, 0x9c, 0xa7, 0x16, 0x92, 0xd6, 0x0c, 0xdf, 0xe0, 0x60, 0x53, 0x76, 0x54, + 0x83, 0x6c, 0xa7, 0xd3, 0x7d, 0xe6, 0x5a, 0xd4, 0x6e, 0x8a, 0x0c, 0x6b, 0xb1, 0x2f, 0x0f, 0x29, + 0x19, 0xcc, 0x94, 0x11, 0xfd, 0x0e, 0xa4, 0x3b, 0xc6, 0x68, 0x4c, 0x17, 0xb6, 0xc2, 0x30, 0x3e, + 0x5a, 0x8c, 0xc1, 0xe9, 0x18, 0x42, 0xc0, 0x84, 0xbe, 0x06, 0x99, 0xff, 0x9c, 0x1a, 0x56, 0x49, + 0x66, 0x40, 0xdf, 0x59, 0x02, 0x34, 0x67, 0x89, 0xa7, 0x60, 0x90, 0x03, 0x37, 0x2d, 0xc7, 0xc7, + 0xae, 0x8d, 0x8d, 0x97, 0xd8, 0xe4, 0x47, 0x45, 0x58, 0xc3, 0x3b, 0xec, 0x0d, 0x9f, 0x9d, 0x13, + 0xba, 0xce, 0xe4, 0x63, 0x2f, 0x5a, 0x04, 0x8a, 0x74, 0x40, 0x23, 0xec, 0x1b, 0x34, 0xd8, 0x76, + 0xb1, 0xe7, 0x77, 0x98, 0x07, 0x2b, 0x21, 0xf6, 0xaa, 0xcd, 0x73, 0x6c, 0x78, 0x9e, 0x85, 0xbd, + 0xe5, 0x0c, 0x28, 0x84, 0x61, 0x35, 0x3a, 0xaa, 0xe1, 0x01, 0xb6, 0x5e, 0x62, 0xb7, 0x74, 0x9d, + 0xbd, 0xe2, 0xe1, 0x85, 0x5e, 0x11, 0x30, 0xb1, 0x97, 0x9c, 0x09, 0x47, 0x0d, 0xa3, 0xda, 0x79, + 0x2a, 0x0c, 0x63, 0x75, 0x89, 0x61, 0x84, 0x94, 0xdc, 0x30, 0xc2, 0x47, 0xb4, 0x03, 0xf9, 0x57, + 0xd6, 0xf0, 0x95, 0x31, 0x14, 0x2a, 0xbf, 0xc1, 0x80, 0x16, 0x47, 0xe8, 0x9f, 0x46, 0x88, 0x19, + 0xd6, 0x0c, 0x3b, 0x3d, 0x43, 0x22, 0x14, 0x75, 0xb0, 0x5f, 0x7a, 0x77, 0xc9, 0x19, 0xda, 0x0d, + 0x49, 0xb9, 0xd9, 0x4f, 0x59, 0xa9, 0x97, 0x3a, 0xb4, 0x1c, 0x93, 0x1c, 0x62, 0xb7, 0x74, 0x73, + 0x89, 0x97, 0x7a, 0x26, 0x08, 0xb9, 0x97, 0x0a, 0xd8, 0xd0, 0x2e, 0x14, 0x6c, 0x32, 0x30, 0xec, + 0x5d, 0xdb, 0x70, 0x5a, 0xc4, 0xc4, 0xa5, 0x12, 0xc3, 0x79, 0xb0, 0x10, 0xa7, 0x19, 0xa5, 0x66, + 0x60, 0xb3, 0x00, 0xf4, 0x14, 0x0c, 0xf6, 0x0d, 0x67, 0x18, 0x3d, 0x05, 0xef, 0x2d, 0x39, 0x05, + 0xd5, 0x39, 0x06, 0x7e, 0x0a, 0xe6, 0x61, 0x50, 0x07, 0x8a, 0x7c, 0xac, 0xe1, 0x12, 0xc7, 0xb7, + 0xb0, 0x5b, 0x5a, 0x5b, 0xe2, 0x37, 0xaa, 0x33, 0xe4, 0x0c, 0x76, 0x0e, 0xe2, 0x0b, 0xe9, 0x9b, + 0xbf, 0x5a, 0x8f, 0x6d, 0x4b, 0x99, 0x94, 0x9c, 0xde, 0x96, 0x32, 0x79, 0xb9, 0xa0, 0x14, 0x21, + 0x1f, 0x8d, 0x96, 0xca, 0x67, 0xf0, 0xee, 0xd9, 0x96, 0x8d, 0xd6, 0x20, 0x6e, 0x99, 0x2c, 0xf4, + 0x66, 0x2b, 0x20, 0x32, 0x9e, 0xb8, 0x5a, 0xd3, 0xe2, 0x96, 0xa9, 0x3c, 0x86, 0xd2, 0x22, 0x63, + 0x45, 0x9f, 0x00, 0x78, 0x3c, 0xa7, 0xb0, 0x4c, 0x8f, 0x25, 0x9f, 0xd9, 0x4a, 0xe1, 0xe4, 0xf5, + 0x7a, 0x96, 0x63, 0xab, 0x35, 0x4f, 0xcb, 0x72, 0x02, 0xd5, 0xf4, 0x94, 0x3f, 0x8b, 0x41, 0x71, + 0xd6, 0x1d, 0xa3, 0x0a, 0xa4, 0x83, 0xc4, 0x85, 0xa7, 0xae, 0xca, 0xe2, 0xf0, 0x64, 0xf8, 0x93, + 0x91, 0xea, 0xec, 0x11, 0x91, 0x4e, 0x04, 0x8c, 0xe8, 0x7d, 0xc8, 0xba, 0xc6, 0xa1, 0xde, 0x3f, + 0xf6, 0xb1, 0x57, 0x8a, 0xdf, 0x4e, 0xdc, 0xcb, 0x6b, 0x19, 0xd7, 0x38, 0xac, 0xd0, 0x67, 0xb4, + 0x0e, 0x19, 0x67, 0x32, 0xd2, 0x5d, 0x72, 0xe8, 0xb1, 0x68, 0x1e, 0x24, 0x23, 0x69, 0x67, 0x32, + 0xd2, 0xc8, 0xa1, 0xa7, 0xd4, 0x60, 0x65, 0x26, 0x21, 0x30, 0x1c, 0xf4, 0x10, 0x24, 0x6f, 0x6c, + 0x38, 0x22, 0x15, 0xb9, 0x19, 0x91, 0x48, 0xd4, 0x05, 0x1b, 0x94, 0x2c, 0x48, 0x34, 0x29, 0xa9, + 0xf2, 0x17, 0x89, 0x39, 0x18, 0x9e, 0x94, 0xb3, 0xcc, 0x42, 0xe0, 0xcc, 0x9f, 0x57, 0x51, 0x27, + 0xf0, 0x74, 0xa4, 0x86, 0xbd, 0x81, 0x6b, 0x8d, 0x7d, 0xe2, 0x06, 0xc9, 0x12, 0x63, 0x45, 0x77, + 0x20, 0x6b, 0x39, 0x26, 0x3e, 0xd2, 0x2d, 0xf3, 0x88, 0x25, 0x36, 0x05, 0x31, 0x9f, 0x61, 0xc3, + 0xaa, 0x79, 0x84, 0x6e, 0x41, 0xda, 0xc5, 0x2f, 0xb1, 0xeb, 0x61, 0xb6, 0xc0, 0x20, 0x4b, 0x0c, + 0x06, 0x51, 0x0d, 0x92, 0x54, 0xc4, 0x20, 0xe1, 0xbb, 0x60, 0x5e, 0x14, 0xae, 0x8f, 0x33, 0xa3, + 0x0f, 0x01, 0x58, 0xfa, 0xa6, 0xef, 0x5b, 0x0e, 0xcf, 0xf9, 0x12, 0x82, 0x20, 0xcb, 0xc6, 0x1f, + 0x5b, 0x8e, 0x4f, 0x95, 0x6d, 0x79, 0xfa, 0x60, 0x1f, 0x0f, 0x0e, 0x58, 0xe6, 0x17, 0xca, 0x62, + 0x79, 0x55, 0x3a, 0x88, 0x76, 0x00, 0x5e, 0x5a, 0x9e, 0xd5, 0xb7, 0x6c, 0xcb, 0x3f, 0x66, 0x09, + 0x49, 0xf1, 0x1c, 0x8f, 0xd1, 0x19, 0x18, 0xce, 0xd3, 0x90, 0x3c, 0xc8, 0x7e, 0xa7, 0x00, 0xe8, + 0x5b, 0x90, 0x1b, 0x19, 0x47, 0xba, 0x8b, 0xbd, 0x89, 0xed, 0x7b, 0x2c, 0x35, 0x09, 0xf6, 0x17, + 0x46, 0xc6, 0x91, 0xc6, 0xc7, 0x95, 0x7f, 0x4a, 0x40, 0x71, 0x36, 0x53, 0xfb, 0x75, 0xed, 0xcd, + 0x7d, 0x28, 0xda, 0x84, 0x1c, 0x4c, 0xc6, 0x67, 0xa5, 0xe7, 0x7c, 0x26, 0x48, 0xcf, 0x2b, 0x90, + 0x26, 0x0e, 0x4b, 0xcd, 0x97, 0x26, 0x8c, 0xa7, 0x6b, 0x06, 0xe2, 0xd0, 0x31, 0xd4, 0x83, 0x77, + 0xb8, 0x44, 0xbc, 0x86, 0xe0, 0x68, 0xc9, 0xcb, 0xa2, 0xad, 0x30, 0x8c, 0x06, 0x83, 0x60, 0xb0, + 0x9f, 0x83, 0x44, 0xeb, 0x58, 0xb6, 0xa5, 0xc5, 0x47, 0xeb, 0x0b, 0x74, 0x45, 0x35, 0xdc, 0x3d, + 0x1e, 0xe3, 0xe0, 0x5c, 0x50, 0x96, 0xb7, 0xbc, 0xe1, 0xd4, 0x83, 0xc0, 0x34, 0x5d, 0x46, 0xbb, + 0xb0, 0x22, 0xaa, 0x1f, 0xe2, 0x9a, 0xd8, 0xb5, 0x9c, 0xa1, 0xd8, 0xcf, 0x3b, 0x8b, 0x8b, 0x4e, + 0x41, 0x28, 0xc0, 0x45, 0xf5, 0x14, 0x8c, 0xa2, 0x47, 0x80, 0x02, 0x28, 0x7d, 0x64, 0xf8, 0x83, + 0x7d, 0xdd, 0xc6, 0xce, 0xcc, 0xe6, 0xca, 0xc1, 0xfc, 0x0e, 0x9d, 0x6e, 0x62, 0x47, 0xe9, 0x43, + 0x3e, 0x9a, 0x3a, 0xa3, 0xbb, 0xb0, 0xc2, 0x68, 0xb0, 0xa9, 0x47, 0x7d, 0x5b, 0x41, 0x2b, 0x8a, + 0xe1, 0x60, 0xcb, 0xef, 0x83, 0x1c, 0x64, 0xd9, 0x21, 0x65, 0x9c, 0x51, 0xae, 0x04, 0xe3, 0x82, + 0x94, 0x96, 0xfc, 0xf2, 0x7c, 0x34, 0x46, 0x35, 0x48, 0x31, 0x4b, 0xf4, 0x16, 0x94, 0xfd, 0xe7, + 0x5b, 0xb1, 0xe0, 0x45, 0x75, 0x00, 0xfc, 0x62, 0xe6, 0xfd, 0xb9, 0x47, 0xb7, 0x17, 0x07, 0x22, + 0x4e, 0x17, 0x9c, 0x7d, 0xfc, 0x22, 0x58, 0xcc, 0xfa, 0xf4, 0x34, 0x44, 0xad, 0x3c, 0x38, 0x0b, + 0x6f, 0xc7, 0xc0, 0xb7, 0x21, 0xbf, 0x67, 0x1d, 0x61, 0x53, 0x17, 0xc9, 0x7f, 0x92, 0x49, 0x7b, + 0xe1, 0xe4, 0x3f, 0xc7, 0x98, 0xf9, 0xe0, 0x1b, 0x58, 0xb5, 0x62, 0xc1, 0x3b, 0xa7, 0xd2, 0x07, + 0xa4, 0x40, 0x5e, 0x23, 0x87, 0x1d, 0x32, 0x71, 0x07, 0x58, 0x35, 0x8f, 0x98, 0x25, 0x16, 0xb4, + 0x99, 0x31, 0xf4, 0x01, 0x64, 0x5b, 0x34, 0x88, 0x8d, 0x27, 0xbe, 0xc7, 0xad, 0x4a, 0x9b, 0x0e, + 0x20, 0x04, 0x52, 0xcb, 0x18, 0x71, 0x37, 0x9e, 0xd5, 0xd8, 0x6f, 0xe5, 0x2e, 0xa4, 0x03, 0x0d, + 0x7f, 0x30, 0x1b, 0x2b, 0xb9, 0x7e, 0x83, 0x21, 0xe5, 0xdf, 0xe2, 0xb0, 0x32, 0x57, 0x7b, 0xa1, + 0x26, 0x14, 0x6c, 0xbc, 0x77, 0xf5, 0xd3, 0x91, 0xa7, 0xdc, 0xe1, 0xd9, 0x68, 0x41, 0xd1, 0xb5, + 0x86, 0xfb, 0x11, 0xb8, 0xf8, 0xe5, 0xe0, 0x0a, 0x8c, 0x3d, 0xc4, 0x8b, 0x18, 0x44, 0xf2, 0xaa, + 0x06, 0xf1, 0x06, 0xae, 0xe9, 0x3e, 0x14, 0x9c, 0x89, 0x6d, 0xeb, 0xf8, 0xc5, 0xc4, 0x08, 0xbd, + 0x53, 0x10, 0xb1, 0xf2, 0x74, 0xaa, 0x2e, 0x66, 0x94, 0x9f, 0x25, 0xa0, 0x38, 0x5b, 0x8c, 0xa2, + 0x07, 0xb0, 0xc2, 0x54, 0x1b, 0x39, 0x3a, 0xb1, 0x88, 0x6b, 0xc7, 0x7b, 0x7e, 0x3d, 0x3c, 0x1a, + 0x9f, 0x80, 0xcc, 0x15, 0x37, 0x77, 0xce, 0x38, 0x31, 0x57, 0xea, 0x94, 0xfa, 0x37, 0xac, 0x96, + 0x6f, 0x43, 0x91, 0x55, 0xec, 0x53, 0xe7, 0x15, 0xd5, 0x4b, 0x81, 0xcf, 0x05, 0xb2, 0x7e, 0x01, + 0x37, 0xe7, 0xb4, 0xa0, 0x1b, 0x2e, 0xd6, 0x0f, 0xf0, 0x31, 0x0b, 0xc6, 0x01, 0xd7, 0xf5, 0x19, + 0x7d, 0x94, 0x5d, 0xfc, 0x04, 0x1f, 0xa3, 0x1f, 0x41, 0x69, 0x5e, 0x2b, 0x21, 0x73, 0x36, 0xc2, + 0xbc, 0x3a, 0xab, 0x1f, 0xce, 0xad, 0xfc, 0x77, 0x0a, 0x8a, 0xb3, 0x79, 0x36, 0xba, 0x03, 0x30, + 0x74, 0x09, 0x8f, 0xb5, 0x51, 0x05, 0x67, 0xd9, 0x68, 0x95, 0xd8, 0x1e, 0xfa, 0x3d, 0xc8, 0x07, + 0xcd, 0x11, 0x8b, 0x88, 0x68, 0x9c, 0x7b, 0xf4, 0xe9, 0x05, 0x3b, 0x2b, 0xe1, 0xe3, 0x54, 0xe1, + 0x33, 0x70, 0xe8, 0xbb, 0x22, 0x7a, 0x60, 0x53, 0x8f, 0x48, 0x22, 0x85, 0x92, 0xc8, 0x62, 0x76, + 0x2b, 0x14, 0xa8, 0x21, 0x36, 0x2a, 0xc9, 0x36, 0xea, 0x93, 0x8b, 0x0a, 0x32, 0xbf, 0x6b, 0x6b, + 0x7f, 0x14, 0x87, 0x5c, 0x44, 0x3a, 0x8a, 0xbb, 0x37, 0x71, 0x06, 0xec, 0xc0, 0x5f, 0x02, 0xb7, + 0x31, 0x71, 0xc2, 0x06, 0x2a, 0xe5, 0x47, 0xb7, 0x23, 0xfd, 0xa3, 0x68, 0x0f, 0x72, 0xda, 0x1e, + 0xfa, 0x08, 0x8a, 0x22, 0xdb, 0x18, 0x10, 0x9b, 0xa5, 0x42, 0x12, 0x77, 0x7c, 0x7c, 0xb4, 0x4a, + 0x6c, 0xea, 0xf8, 0x6e, 0x32, 0xdf, 0xc5, 0xa6, 0x93, 0x2c, 0xc2, 0xa5, 0x06, 0x7c, 0x62, 0x0b, + 0xb2, 0x86, 0x3b, 0x9c, 0x8c, 0xb0, 0xe3, 0x7b, 0xa5, 0xd4, 0x65, 0x5b, 0x92, 0x53, 0xde, 0x6d, + 0x29, 0x93, 0x90, 0x25, 0xe5, 0xe7, 0x71, 0x90, 0xe8, 0x22, 0x90, 0x0c, 0xf9, 0x72, 0xeb, 0x6b, + 0xbd, 0xd5, 0xee, 0xea, 0xad, 0x5e, 0xb3, 0x29, 0x5f, 0x43, 0x69, 0x48, 0x94, 0x9f, 0x6e, 0xc9, + 0x31, 0x94, 0x87, 0x4c, 0xa5, 0xdd, 0x6e, 0xea, 0xe5, 0x56, 0x4d, 0x8e, 0xa3, 0x1c, 0xa4, 0xd9, + 0x53, 0x5b, 0x93, 0x13, 0xa8, 0x08, 0x50, 0x6d, 0xb7, 0xaa, 0xe5, 0xae, 0x5e, 0xde, 0xda, 0x92, + 0x25, 0x94, 0x85, 0x64, 0xb5, 0xdd, 0x6b, 0x75, 0xe5, 0x24, 0x65, 0xdf, 0x29, 0x7f, 0x25, 0xa7, + 0xd9, 0x0f, 0xb5, 0x25, 0x67, 0x10, 0x40, 0xaa, 0xd3, 0xad, 0xd5, 0xea, 0x4f, 0xe5, 0x2c, 0x1d, + 0xec, 0xf4, 0x76, 0x64, 0xa0, 0x70, 0x9d, 0xde, 0x8e, 0xae, 0xb6, 0xba, 0x72, 0x8e, 0xbe, 0xe9, + 0x69, 0x59, 0x53, 0xcb, 0xad, 0x6a, 0x5d, 0xce, 0xd3, 0xa9, 0xaf, 0xda, 0x1a, 0x43, 0x2e, 0xf0, + 0x37, 0xf5, 0x5a, 0x5d, 0x5d, 0x6b, 0x3f, 0xeb, 0xc8, 0x45, 0xc6, 0xf7, 0x13, 0xad, 0xa6, 0x36, + 0x1a, 0xf2, 0x0a, 0x42, 0x50, 0x6c, 0xa8, 0xad, 0x72, 0x53, 0x0f, 0xb9, 0x65, 0xba, 0x20, 0x3e, + 0x26, 0xde, 0xf9, 0x0e, 0x2a, 0x40, 0xb6, 0xac, 0x69, 0xe5, 0xaf, 0x19, 0x22, 0xa2, 0x2f, 0xdb, + 0xee, 0xb4, 0x5b, 0xec, 0xe9, 0x3a, 0x9d, 0xa4, 0x4f, 0x15, 0xf6, 0xb8, 0x4a, 0x5f, 0xd7, 0xe9, + 0x6a, 0x6a, 0x6b, 0x8b, 0x3d, 0xdf, 0x50, 0x3e, 0x01, 0x89, 0xda, 0x10, 0xca, 0x80, 0x54, 0xee, + 0x75, 0xdb, 0xf2, 0x35, 0xb6, 0x9a, 0x6a, 0xb9, 0x59, 0xd6, 0xe4, 0x18, 0xa5, 0x6e, 0xb5, 0x5b, + 0xba, 0x78, 0x8e, 0x2b, 0xff, 0x9b, 0x80, 0xe2, 0x6c, 0x0b, 0x2c, 0x34, 0xdc, 0x65, 0x06, 0x36, + 0xcb, 0x76, 0xca, 0x70, 0xa7, 0x89, 0x78, 0xfc, 0xea, 0x89, 0x78, 0x58, 0xe1, 0x24, 0xde, 0xa4, + 0xc2, 0x79, 0x08, 0x19, 0x73, 0xe2, 0xb2, 0xe3, 0xc3, 0x4c, 0x38, 0x51, 0xb9, 0x41, 0xa7, 0x7f, + 0xf5, 0x7a, 0xbd, 0xe0, 0x5b, 0x23, 0xbc, 0x51, 0x13, 0x93, 0x5a, 0x48, 0x46, 0x8b, 0xa2, 0xc1, + 0xfe, 0xc4, 0x39, 0xd0, 0x3d, 0xeb, 0x15, 0x9e, 0x2d, 0x8a, 0xd8, 0x78, 0xc7, 0x7a, 0x85, 0x51, + 0x1b, 0xf2, 0xc4, 0xdf, 0xc7, 0xae, 0x2e, 0x72, 0xb5, 0xd4, 0x15, 0x72, 0xb5, 0x1c, 0x43, 0xe8, + 0xf2, 0x84, 0xed, 0x4b, 0xc8, 0xb8, 0xd8, 0x30, 0xcb, 0x5e, 0x7b, 0x4f, 0xf4, 0x74, 0x7f, 0x2b, + 0x02, 0x36, 0xf1, 0x2d, 0x7b, 0x63, 0xdf, 0x1e, 0x6c, 0x74, 0x83, 0xbb, 0xa4, 0xe0, 0xc8, 0x06, + 0x4c, 0xca, 0x03, 0xb1, 0xf9, 0x39, 0x48, 0xab, 0xce, 0x4b, 0xc3, 0xb6, 0x4c, 0xbe, 0xff, 0xdc, + 0xc3, 0xca, 0x31, 0x6a, 0xf6, 0x2a, 0x4d, 0xdb, 0xe4, 0xb8, 0x72, 0x12, 0x83, 0x4c, 0xc3, 0x26, + 0x87, 0x6c, 0xd3, 0x1f, 0x42, 0x7a, 0xcf, 0x26, 0x87, 0xba, 0xe8, 0x15, 0xe4, 0x2b, 0x25, 0x8a, + 0xfc, 0xef, 0xaf, 0xd7, 0x53, 0x94, 0x44, 0xad, 0x9d, 0x84, 0xbf, 0xb4, 0x14, 0x25, 0x54, 0x4d, + 0xd4, 0x64, 0x3d, 0x22, 0x71, 0x47, 0x27, 0xb2, 0xcb, 0x8f, 0x97, 0xdf, 0x2d, 0x45, 0x6e, 0x72, + 0x22, 0xfc, 0xa8, 0x07, 0xe9, 0xa1, 0xe1, 0xe3, 0x43, 0xe3, 0x98, 0x25, 0x49, 0xc9, 0xca, 0x0f, + 0xc5, 0x16, 0x7d, 0x3a, 0xb4, 0xfc, 0xfd, 0x49, 0x7f, 0x63, 0x40, 0x46, 0x9b, 0x21, 0xb8, 0xd9, + 0x9f, 0xfe, 0xde, 0x1c, 0x1f, 0x0c, 0x37, 0x83, 0xf2, 0x9d, 0xe6, 0x6c, 0x6a, 0x4d, 0x0b, 0xb0, + 0x94, 0x43, 0xc8, 0x6d, 0x93, 0xfe, 0xae, 0x4b, 0x86, 0xd4, 0xbd, 0xa0, 0x8f, 0x20, 0xf5, 0x9c, + 0xf4, 0x83, 0x55, 0x26, 0x2a, 0x05, 0xd1, 0x11, 0x49, 0x6e, 0x93, 0xbe, 0x5a, 0xd3, 0x92, 0xcf, + 0x49, 0x5f, 0x35, 0xd1, 0x3d, 0xc8, 0x0f, 0x88, 0xe3, 0xbb, 0x56, 0x7f, 0x12, 0x5e, 0xd1, 0xc4, + 0x83, 0xb0, 0x10, 0x9d, 0x41, 0x25, 0x90, 0x3c, 0x9b, 0xf8, 0x42, 0xe4, 0xa0, 0x6d, 0x60, 0x13, + 0x5f, 0xf9, 0x17, 0x09, 0xd0, 0xe9, 0x96, 0x30, 0xad, 0x6b, 0x3d, 0xd6, 0x39, 0xe5, 0x86, 0x15, + 0x8f, 0xf0, 0x01, 0x9f, 0x60, 0x96, 0xd5, 0x80, 0xcc, 0x58, 0xc8, 0xcc, 0x22, 0xfd, 0x79, 0x8d, + 0xde, 0xc8, 0xfa, 0x02, 0x7b, 0x08, 0x78, 0x51, 0x03, 0x12, 0x13, 0xd7, 0x2a, 0xa5, 0xd9, 0xe6, + 0x7c, 0x76, 0x89, 0xde, 0xf5, 0x46, 0xcf, 0xb5, 0xea, 0x8e, 0xef, 0x1e, 0x6b, 0x14, 0x00, 0xfd, + 0x18, 0x52, 0xfc, 0xb6, 0x54, 0x5c, 0x12, 0xac, 0x9f, 0xd1, 0x39, 0x51, 0xdb, 0x0d, 0xcb, 0xc6, + 0x0d, 0x46, 0x16, 0xde, 0x78, 0xb1, 0x27, 0xd4, 0x0b, 0xcb, 0x99, 0x2c, 0x93, 0xe4, 0xfb, 0x97, + 0x91, 0x84, 0x9f, 0x0d, 0x26, 0x0c, 0x83, 0x8d, 0x85, 0xf5, 0xcd, 0x97, 0xf0, 0x9e, 0x77, 0x60, + 0x8d, 0xf5, 0x91, 0xe5, 0x79, 0xb4, 0xac, 0xdb, 0x23, 0x2e, 0xb6, 0x86, 0x0e, 0xcd, 0x33, 0xf8, + 0xed, 0x41, 0x10, 0xd3, 0xde, 0xa5, 0x64, 0x3b, 0x9c, 0xaa, 0xc1, 0x89, 0x9e, 0xe0, 0x63, 0x6f, + 0xcd, 0x80, 0x5c, 0x04, 0x1d, 0xc9, 0x90, 0xa0, 0x29, 0x0a, 0x6b, 0x96, 0x69, 0xf4, 0x27, 0xfa, + 0x11, 0x24, 0x59, 0x3d, 0x72, 0x39, 0x1f, 0xa6, 0x71, 0xa6, 0x2f, 0xe2, 0x3f, 0x88, 0xad, 0x7d, + 0x0f, 0x32, 0x81, 0x2a, 0xa3, 0xf8, 0x49, 0x8e, 0xbf, 0x1a, 0xc5, 0xcf, 0x46, 0xf8, 0xb6, 0xa5, + 0x4c, 0x4c, 0x8e, 0xf3, 0xd0, 0xb7, 0x2d, 0x65, 0x24, 0x39, 0xb9, 0x2d, 0x65, 0x92, 0x72, 0x4a, + 0xf9, 0xdb, 0x38, 0x14, 0x66, 0xae, 0x07, 0xd0, 0xc7, 0x90, 0x33, 0x31, 0x0d, 0xd9, 0xdc, 0xc1, + 0xf1, 0x56, 0x9f, 0x70, 0x2e, 0x91, 0x09, 0xf4, 0x00, 0x0a, 0x87, 0x86, 0x6d, 0x53, 0x8f, 0xd7, + 0x32, 0x1c, 0xc2, 0x9b, 0x66, 0x81, 0x57, 0x9b, 0x9d, 0x42, 0x4f, 0x66, 0x3b, 0x4b, 0x9b, 0x17, + 0xbb, 0xa9, 0x60, 0xcd, 0x33, 0x5a, 0xdb, 0xcc, 0xba, 0xdf, 0xa8, 0x31, 0x27, 0xaf, 0x6e, 0xcc, + 0x54, 0x95, 0xc1, 0x0b, 0xe8, 0xc1, 0x73, 0x68, 0x41, 0x15, 0x5d, 0x2d, 0x1b, 0xa1, 0x4a, 0xc6, + 0x8e, 0xc9, 0x14, 0x9a, 0xd7, 0xe8, 0xcf, 0x6d, 0x29, 0x13, 0x97, 0x13, 0xca, 0x3f, 0xc4, 0xa0, + 0x30, 0xd3, 0x3e, 0xbf, 0xb0, 0xe2, 0xee, 0x42, 0x9e, 0x22, 0xeb, 0x63, 0xc3, 0xf7, 0xb1, 0xcb, + 0xdd, 0x41, 0x48, 0x48, 0x67, 0x76, 0xf9, 0x04, 0xfa, 0x31, 0xa4, 0xc9, 0x38, 0x48, 0x3f, 0xe7, + 0xbd, 0x77, 0x70, 0x4c, 0xaa, 0x9d, 0xa7, 0x6d, 0x4e, 0x14, 0xb4, 0xd0, 0x04, 0xcf, 0x34, 0xe6, + 0xb0, 0x96, 0xa6, 0x74, 0x2a, 0xe6, 0xb0, 0xa6, 0xe6, 0x1f, 0xc6, 0x01, 0x3a, 0x07, 0xd8, 0x1f, + 0xec, 0xb3, 0x35, 0x6c, 0x43, 0xce, 0x63, 0x4f, 0x7a, 0x24, 0x66, 0x9f, 0x73, 0x21, 0xc9, 0x68, + 0x23, 0xa1, 0x1a, 0xbc, 0x70, 0x04, 0x95, 0xa6, 0x55, 0x28, 0xef, 0x55, 0x84, 0x7d, 0xd8, 0x4f, + 0x01, 0x0d, 0xb1, 0x83, 0x5d, 0xc3, 0xc7, 0xfa, 0xbe, 0xe5, 0xf9, 0x64, 0xe8, 0x1a, 0xa3, 0x99, + 0x9e, 0xe4, 0x3b, 0xc1, 0xfc, 0xe3, 0x60, 0x1a, 0xfd, 0x00, 0x6e, 0x84, 0xb4, 0xfa, 0xc8, 0x38, + 0xd2, 0xfb, 0x93, 0xc1, 0x01, 0xf6, 0xf9, 0xca, 0x82, 0x9e, 0xcb, 0xf5, 0x90, 0x64, 0xc7, 0x38, + 0xaa, 0x70, 0x02, 0x74, 0x07, 0xb2, 0x9e, 0x6f, 0xf8, 0x3a, 0xdb, 0xe1, 0x64, 0x44, 0xdb, 0x19, + 0x3a, 0xcc, 0x8a, 0xe7, 0xdf, 0x87, 0x5c, 0xe4, 0x82, 0x0b, 0xd5, 0x21, 0xc3, 0x17, 0x12, 0x76, + 0x4c, 0x96, 0xe9, 0x20, 0x12, 0x86, 0x42, 0xd6, 0xb3, 0xbc, 0x73, 0xe1, 0xb4, 0x77, 0x56, 0xfe, + 0x34, 0x01, 0xab, 0x67, 0xdd, 0x8a, 0xfd, 0x7a, 0xc5, 0x40, 0x7f, 0x00, 0x88, 0x3f, 0x05, 0x05, + 0x5d, 0xa4, 0x41, 0xf3, 0x93, 0x93, 0xd7, 0xeb, 0xe2, 0x8e, 0x4e, 0x94, 0x74, 0x6a, 0xcd, 0xfb, + 0xd5, 0xeb, 0xf5, 0xcf, 0x2f, 0x14, 0x4d, 0x23, 0x1f, 0xbb, 0x6c, 0x04, 0xdc, 0x9a, 0xec, 0xcd, + 0xc0, 0x99, 0x1e, 0x32, 0x20, 0xc3, 0x3c, 0x31, 0x8d, 0xa7, 0x7c, 0x53, 0x1b, 0xc1, 0x37, 0x18, + 0xcc, 0x23, 0xaa, 0xb5, 0x0b, 0xc7, 0xef, 0xe8, 0x1b, 0x69, 0xfc, 0x66, 0xb8, 0xaa, 0x19, 0x09, + 0xd8, 0xc9, 0xc5, 0x01, 0x5b, 0xf9, 0x3f, 0x09, 0xde, 0x3f, 0xe7, 0x12, 0x11, 0x7d, 0x35, 0xd7, + 0x4e, 0xfb, 0xe2, 0x2a, 0x57, 0x91, 0xdc, 0xcb, 0xcf, 0xb5, 0xd8, 0x22, 0x2d, 0xfa, 0xf8, 0x59, + 0x2d, 0xfa, 0xd9, 0xe6, 0x7a, 0xe2, 0xec, 0xe6, 0xfa, 0xdb, 0xe8, 0x9f, 0x7d, 0x3e, 0x53, 0x6e, + 0x5e, 0xa6, 0x2f, 0xb0, 0xf6, 0x77, 0x71, 0x48, 0xb2, 0xb5, 0xa1, 0xdf, 0x05, 0xc9, 0xc4, 0xde, + 0xe0, 0x4a, 0xad, 0x73, 0xc6, 0x79, 0x91, 0xce, 0x79, 0xf0, 0xf5, 0x4f, 0xe2, 0x0d, 0xbe, 0xfe, + 0xa9, 0x42, 0x26, 0x6c, 0x55, 0x49, 0x97, 0x6b, 0x55, 0x85, 0x8c, 0xd3, 0xe2, 0x22, 0xf9, 0x06, + 0xc5, 0x85, 0xf2, 0x8b, 0x18, 0x14, 0x67, 0x2f, 0x40, 0xd1, 0x97, 0x90, 0xe4, 0x1f, 0xe2, 0xc4, + 0x2e, 0x5b, 0xf5, 0x72, 0x3e, 0xd4, 0x85, 0xd0, 0x9f, 0x9a, 0x73, 0xfd, 0xdb, 0x3b, 0x0b, 0x36, + 0x85, 0x9f, 0xca, 0xc8, 0xde, 0xca, 0x21, 0x42, 0xd0, 0xd2, 0xb9, 0x0b, 0xb2, 0x33, 0x19, 0xb1, + 0xce, 0x85, 0x3e, 0xc6, 0xae, 0x3e, 0xc4, 0x0e, 0xf7, 0x16, 0x5a, 0xc1, 0x99, 0x8c, 0xaa, 0xc4, + 0xf6, 0x76, 0xb1, 0xbb, 0x85, 0x1d, 0xe5, 0xcf, 0xf3, 0x90, 0x8f, 0x5e, 0xc6, 0xa2, 0xdb, 0x90, + 0x1b, 0x1b, 0xae, 0x6f, 0xb1, 0xf6, 0xc8, 0xb1, 0xe8, 0x79, 0x47, 0x87, 0x90, 0x06, 0x59, 0x7e, + 0x61, 0xdb, 0x08, 0x25, 0xdd, 0xb8, 0xd0, 0x45, 0xaf, 0x78, 0x68, 0x84, 0x75, 0x7f, 0x08, 0xb3, + 0xf6, 0x37, 0x31, 0x51, 0xf1, 0x6b, 0x50, 0x08, 0x9a, 0x31, 0xb8, 0x71, 0xc5, 0xde, 0x87, 0x36, + 0x0b, 0x81, 0x76, 0x01, 0xc4, 0x9b, 0x28, 0x60, 0x9c, 0x01, 0x7e, 0xf7, 0x52, 0x12, 0x53, 0xd0, + 0x08, 0x06, 0xbf, 0xa5, 0x5d, 0xfb, 0x65, 0x12, 0x92, 0x0d, 0x97, 0x26, 0x22, 0xdb, 0x20, 0x8d, + 0x88, 0x19, 0xc4, 0xe4, 0x0b, 0x62, 0x33, 0xd6, 0x8d, 0x1d, 0x62, 0x86, 0x47, 0x94, 0x62, 0xa0, + 0x5d, 0x48, 0xf5, 0xc9, 0xc4, 0x31, 0x3d, 0x91, 0x88, 0x3e, 0xba, 0x0c, 0x5a, 0x85, 0x71, 0x06, + 0xfe, 0x82, 0xe3, 0xac, 0xfd, 0x4f, 0x0c, 0x92, 0x6c, 0x02, 0x7d, 0x0d, 0x59, 0x36, 0xd6, 0x9d, + 0x26, 0x10, 0xbf, 0x7d, 0x69, 0xf8, 0x88, 0xe1, 0x4d, 0xd1, 0xa8, 0xf7, 0xb3, 0x1c, 0x5f, 0x17, + 0x9f, 0x93, 0x45, 0xdd, 0x41, 0xd6, 0x72, 0xfc, 0x36, 0xff, 0xa2, 0xec, 0x0e, 0xe4, 0xa9, 0x1b, + 0x32, 0x03, 0xb2, 0x04, 0xcb, 0xdc, 0x72, 0x6c, 0x4c, 0x90, 0xa8, 0x90, 0xe3, 0x93, 0x3c, 0xcb, + 0xe1, 0x27, 0xfe, 0xe2, 0xf7, 0xc9, 0xc0, 0x99, 0xa9, 0x48, 0x6b, 0x7f, 0x19, 0x83, 0x14, 0x57, + 0x08, 0xda, 0x81, 0xa4, 0xe7, 0x1b, 0xae, 0x2f, 0xdc, 0xdd, 0xc3, 0x4b, 0x2f, 0x3a, 0x74, 0x04, + 0x14, 0x05, 0x55, 0xa7, 0x89, 0xe7, 0x55, 0xc0, 0x58, 0xae, 0xaa, 0xdc, 0x05, 0x89, 0x6e, 0x3e, + 0xad, 0xd3, 0xb5, 0x72, 0x6b, 0xab, 0x2e, 0x5f, 0x43, 0x19, 0x90, 0x58, 0x27, 0x29, 0x46, 0x0b, + 0xf9, 0x2d, 0xad, 0xdd, 0xdb, 0xed, 0xc8, 0x71, 0xe5, 0x15, 0x64, 0x43, 0xc5, 0xa3, 0x9b, 0x70, + 0xbd, 0xd7, 0xaa, 0xb4, 0x7b, 0xad, 0x5a, 0xbd, 0xa6, 0xef, 0x6a, 0xf5, 0x6a, 0xbd, 0xa6, 0xb6, + 0xb6, 0xe4, 0x6b, 0xb3, 0x13, 0x8d, 0x76, 0xb3, 0xd9, 0x7e, 0x46, 0x27, 0x62, 0x68, 0x15, 0xe4, + 0x76, 0xa3, 0xd1, 0xa9, 0x77, 0x23, 0xe4, 0xf1, 0xc8, 0xe8, 0x94, 0x36, 0x81, 0x56, 0x20, 0x57, + 0xed, 0x69, 0x5a, 0x9d, 0xb7, 0xb4, 0x64, 0x69, 0xed, 0x9f, 0xe3, 0x90, 0x09, 0x8e, 0x2d, 0xaa, + 0x45, 0xfa, 0x91, 0xe7, 0x7d, 0x95, 0x31, 0xbb, 0xee, 0xf9, 0x6e, 0xe4, 0xc7, 0x90, 0x33, 0xdc, + 0xa1, 0x6a, 0x1e, 0x75, 0xd8, 0x8e, 0x44, 0x4d, 0x25, 0x3a, 0x81, 0x6e, 0x43, 0xc6, 0x70, 0x87, + 0x55, 0x32, 0x11, 0xd1, 0x34, 0x0c, 0x2f, 0xc1, 0xe8, 0xdb, 0x09, 0x0d, 0x65, 0x48, 0xee, 0xb9, + 0x41, 0xf6, 0x79, 0xde, 0xd7, 0x1b, 0xa7, 0x77, 0x53, 0xe3, 0x9c, 0xe8, 0x1e, 0xcc, 0xf4, 0x49, + 0xc5, 0x47, 0xa7, 0xa2, 0x89, 0x10, 0x9d, 0x51, 0x7e, 0x1e, 0x03, 0x98, 0xfa, 0x14, 0x54, 0x04, + 0xd0, 0xda, 0xcf, 0xf4, 0x56, 0x6f, 0xa7, 0x52, 0xd7, 0xc4, 0xfe, 0x97, 0x5b, 0x4f, 0x78, 0xf3, + 0xae, 0x56, 0x6f, 0x75, 0xea, 0x3a, 0x7b, 0x8e, 0x23, 0x19, 0xf2, 0xbb, 0x75, 0xad, 0xca, 0x36, + 0x86, 0x8e, 0x24, 0x50, 0x01, 0xb2, 0xd5, 0xde, 0x4e, 0x5d, 0xaf, 0xa9, 0x9d, 0x2e, 0x6f, 0x72, + 0xb6, 0xba, 0x6a, 0xb3, 0xce, 0x9b, 0x9c, 0xcd, 0xf2, 0x96, 0x9c, 0xa2, 0x70, 0xcd, 0x7a, 0xb9, + 0x26, 0xa7, 0xe9, 0xbe, 0x36, 0x54, 0xad, 0xd3, 0xd5, 0x9f, 0x96, 0x9b, 0xbd, 0xba, 0x9c, 0xa1, + 0xf8, 0xcd, 0x72, 0xf8, 0x9c, 0xa5, 0x68, 0xad, 0xee, 0x63, 0xf1, 0x08, 0xca, 0xdf, 0xc7, 0x61, + 0xf5, 0xac, 0xcf, 0x60, 0x50, 0x07, 0xd2, 0x87, 0x46, 0x34, 0xeb, 0xfd, 0xf4, 0x52, 0x9f, 0xd1, + 0x6c, 0x3c, 0xa3, 0xcc, 0x41, 0xe6, 0x24, 0x90, 0x58, 0x9f, 0x1b, 0xe3, 0xe0, 0x3c, 0xcd, 0xfb, + 0x7a, 0xf6, 0x99, 0x37, 0xff, 0xe4, 0x5b, 0x60, 0x52, 0xe2, 0x1a, 0xf6, 0x0d, 0xcb, 0xf6, 0x42, + 0xcb, 0xc2, 0xd8, 0x5c, 0xfb, 0xe3, 0x18, 0x24, 0xd9, 0x0b, 0x50, 0x0b, 0x64, 0xcb, 0xb1, 0x7c, + 0xcb, 0xb0, 0x75, 0x17, 0x7b, 0xc4, 0x7e, 0x89, 0x4d, 0x61, 0xb5, 0x17, 0xea, 0xb2, 0xad, 0x08, + 0x66, 0x4d, 0xf0, 0x86, 0x1f, 0x93, 0xc4, 0x2f, 0xfe, 0x31, 0xc9, 0x3f, 0xc6, 0x00, 0x9d, 0xfe, + 0xe0, 0x07, 0x55, 0xa0, 0xe0, 0xbb, 0xc6, 0xe0, 0x00, 0x9b, 0x3a, 0xcf, 0x48, 0xb8, 0x1a, 0x97, + 0x40, 0xe6, 0x05, 0x4f, 0x47, 0x54, 0xd9, 0x6f, 0x45, 0x5f, 0x91, 0x8c, 0x3b, 0xb1, 0x38, 0xe3, + 0x7e, 0xf0, 0x7d, 0x28, 0xce, 0x5e, 0xe9, 0x53, 0xe7, 0xb4, 0xdb, 0xab, 0x34, 0xd5, 0xaa, 0x7c, + 0x0d, 0xbd, 0x07, 0x37, 0xf8, 0x6f, 0xbd, 0xdc, 0xaa, 0xb1, 0x4e, 0xbd, 0x98, 0x8a, 0x3d, 0x50, + 0x82, 0xf2, 0x95, 0x39, 0xae, 0x55, 0x90, 0x1f, 0x37, 0x9b, 0xfa, 0x6e, 0xb3, 0xd7, 0xe1, 0x7f, + 0x9e, 0x3e, 0x94, 0xaf, 0x55, 0x3e, 0xfc, 0xe6, 0x97, 0xb7, 0xae, 0x7d, 0x73, 0x72, 0x2b, 0xf6, + 0x8b, 0x93, 0x5b, 0xb1, 0x7f, 0x3d, 0xb9, 0x15, 0xfb, 0x8f, 0x93, 0x5b, 0xb1, 0x9f, 0xfd, 0xe7, + 0xad, 0x6b, 0x3f, 0xcd, 0x86, 0x96, 0xf4, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x0a, 0xee, + 0x9f, 0x2f, 0x30, 0x00, 0x00, } diff --git a/pkg/sql/distsqlpb/processors.proto b/pkg/sql/distsqlpb/processors.proto index 08bab49d14b0..8416f2f75803 100644 --- a/pkg/sql/distsqlpb/processors.proto +++ b/pkg/sql/distsqlpb/processors.proto @@ -793,6 +793,12 @@ message SampleAggregatorSpec { (gogoproto.customname) = "TableID", (gogoproto.casttype) = "github.com/cockroachdb/cockroach/pkg/sql/sqlbase.ID" ]; + + // JobID is the id of the CREATE STATISTICS job. + optional int64 job_id = 5 [ + (gogoproto.nullable) = false, + (gogoproto.customname) = "JobID" + ]; } // InterleavedReaderJoinerSpec is the specification for a processor that performs diff --git a/pkg/sql/distsqlrun/base.go b/pkg/sql/distsqlrun/base.go index feb337e9086a..e4f2bbbcc196 100644 --- a/pkg/sql/distsqlrun/base.go +++ b/pkg/sql/distsqlrun/base.go @@ -20,6 +20,7 @@ import ( "sync/atomic" "github.com/cockroachdb/cockroach/pkg/internal/client" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/sql/distsqlpb" "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" @@ -377,6 +378,9 @@ type ProducerMetadata struct { // inputs. It is used in tests to verify that all metadata is forwarded // exactly once to the receiver on the gateway node. RowNum *distsqlpb.RemoteProducerMetadata_RowNum + // Progress contains info about the progress of a job being executed by the + // flow. + Progress *jobspb.Progress } // RowChannel is a thin layer over a RowChannelMsg channel, which can be used to diff --git a/pkg/sql/distsqlrun/processors.go b/pkg/sql/distsqlrun/processors.go index dd09fb3f2ccf..cc23353e9fe9 100644 --- a/pkg/sql/distsqlrun/processors.go +++ b/pkg/sql/distsqlrun/processors.go @@ -255,16 +255,15 @@ func emitHelper( } // Bypass EmitRow() and send directly to output.output. consumerStatus = output.output.Push(nil /* row */, meta) + if meta.Err != nil { + consumerStatus = ConsumerClosed + } } else { var err error consumerStatus, err = output.EmitRow(ctx, row) if err != nil { output.output.Push(nil /* row */, &ProducerMetadata{Err: err}) - for _, input := range inputs { - input.ConsumerClosed() - } - output.Close() - return false + consumerStatus = ConsumerClosed } } switch consumerStatus { diff --git a/pkg/sql/distsqlrun/sample_aggregator.go b/pkg/sql/distsqlrun/sample_aggregator.go index 45c92c92b12f..0740810549e9 100644 --- a/pkg/sql/distsqlrun/sample_aggregator.go +++ b/pkg/sql/distsqlrun/sample_aggregator.go @@ -16,9 +16,12 @@ package distsqlrun import ( "context" + time "time" "github.com/axiomhq/hyperloglog" "github.com/cockroachdb/cockroach/pkg/internal/client" + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" "github.com/cockroachdb/cockroach/pkg/sql/distsqlpb" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" @@ -32,6 +35,7 @@ import ( type sampleAggregator struct { ProcessorBase + spec *distsqlpb.SampleAggregatorSpec input RowSource inTypes []sqlbase.ColumnType sr stats.SampleReservoir @@ -52,6 +56,10 @@ var _ Processor = &sampleAggregator{} const sampleAggregatorProcName = "sample aggregator" +// sampleAggregatorProgressInterval is the frequency at which the +// SampleAggregator processor will report progress. +const sampleAggregatorProgressInterval = time.Second + func newSampleAggregator( flowCtx *FlowCtx, processorID int32, @@ -77,6 +85,7 @@ func newSampleAggregator( rankCol := len(spec.SampledColumnIDs) s := &sampleAggregator{ + spec: spec, input: input, inTypes: input.OutputTypes(), tableID: spec.TableID, @@ -130,10 +139,44 @@ func (s *sampleAggregator) Run(ctx context.Context) { } } -func (s *sampleAggregator) mainLoop(ctx context.Context) (earlyExit bool, _ error) { +func (s *sampleAggregator) mainLoop(ctx context.Context) (earlyExit bool, err error) { + var job *jobs.Job + jobID := s.spec.JobID + if jobID != 0 { + job, err = s.flowCtx.JobRegistry.LoadJob(ctx, s.spec.JobID) + if err != nil { + return false, err + } + } + + progFn := func(pct float32) error { + if jobID == 0 { + return nil + } + return job.FractionProgressed(ctx, func(ctx context.Context, _ jobspb.ProgressDetails) float32 { + return pct + }) + } + + timer := time.NewTimer(sampleAggregatorProgressInterval) var da sqlbase.DatumAlloc var tmpSketch hyperloglog.Sketch for { + select { + case <-timer.C: + // Periodically report fraction progressed. + // TODO(rytaft): We could have more intermediate measures of progress if + // we were to run this at the kv layer where we know how many spans have + // been processed out of the total. For now, report 0 progress until all + // rows have been processed. The purpose of this function call is to + // periodically check that the job has not been paused or canceled. + if err := progFn(0); err != nil { + return false, err + } + timer.Reset(sampleAggregatorProgressInterval) + default: + } + row, meta := s.input.Next() if meta != nil { if !emitHelper(ctx, &s.out, nil /* row */, meta, s.pushTrailingMeta, s.input) { @@ -145,6 +188,7 @@ func (s *sampleAggregator) mainLoop(ctx context.Context) (earlyExit bool, _ erro if row == nil { break } + // The row is either: // - a sampled row, which has NULLs on all columns from sketchIdxCol // onward, or @@ -197,6 +241,11 @@ func (s *sampleAggregator) mainLoop(ctx context.Context) (earlyExit bool, _ erro return false, errors.Wrapf(err, "merging sketch data") } } + // Report progress one last time so we don't write results if the job was + // canceled. + if err = progFn(1.0); err != nil { + return false, err + } return false, s.writeResults(ctx) } diff --git a/pkg/sql/distsqlrun/sampler.go b/pkg/sql/distsqlrun/sampler.go index 155781da7919..25af84b07a6d 100644 --- a/pkg/sql/distsqlrun/sampler.go +++ b/pkg/sql/distsqlrun/sampler.go @@ -18,6 +18,7 @@ import ( "context" "github.com/axiomhq/hyperloglog" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" "github.com/cockroachdb/cockroach/pkg/sql/distsqlpb" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" @@ -58,6 +59,11 @@ var _ Processor = &samplerProcessor{} const samplerProcName = "sampler" +// SamplerProgressInterval corresponds to the number of input rows after which +// point the sampler will report progress by pushing a metadata record. +// It is mutable for testing. +var SamplerProgressInterval = 10000 + var supportedSketchTypes = map[distsqlpb.SketchType]struct{}{ // The code currently hardcodes the use of this single type of sketch // (which avoids the extra complexity until we actually have multiple types). @@ -155,10 +161,11 @@ func (s *samplerProcessor) Run(ctx context.Context) { } } -func (s *samplerProcessor) mainLoop(ctx context.Context) (earlyExit bool, _ error) { +func (s *samplerProcessor) mainLoop(ctx context.Context) (earlyExit bool, err error) { rng, _ := randutil.NewPseudoRand() var da sqlbase.DatumAlloc var buf []byte + rowCount := 0 for { row, meta := s.input.Next() if meta != nil { @@ -172,6 +179,25 @@ func (s *samplerProcessor) mainLoop(ctx context.Context) (earlyExit bool, _ erro break } + rowCount++ + if rowCount%SamplerProgressInterval == 0 { + // Send a metadata record to check that the consumer is still alive. + // (In the future we may choose to send real progress info here, but + // for now just send FractionCompleted=0.) We perform this check + // periodically in case the CREATE STATISTICS job was paused or canceled. + meta := &ProducerMetadata{ + Progress: &jobspb.Progress{Progress: &jobspb.Progress_FractionCompleted{ + FractionCompleted: 0, + }}, + } + if !emitHelper( + ctx, &s.out, nil /* row */, meta, s.pushTrailingMeta, s.input, + ) { + // No cleanup required; emitHelper() took care of it. + return true, nil + } + } + for i := range s.sketches { // TODO(radu): for multi-column sketches, we will need to do this for all // columns. @@ -184,7 +210,6 @@ func (s *samplerProcessor) mainLoop(ctx context.Context) (earlyExit bool, _ erro // We need to use a KEY encoding because equal values should have the same // encoding. // TODO(radu): a fast path for simple columns (like integer)? - var err error buf, err = row[col].Encode(&s.outTypes[col], &da, sqlbase.DatumEncoding_ASCENDING_KEY, buf[:0]) if err != nil { return false, err diff --git a/pkg/sql/distsqlrun/stream_decoder.go b/pkg/sql/distsqlrun/stream_decoder.go index 22828f48abf1..13efb095ae21 100644 --- a/pkg/sql/distsqlrun/stream_decoder.go +++ b/pkg/sql/distsqlrun/stream_decoder.go @@ -115,6 +115,9 @@ func (sd *StreamDecoder) AddMessage(msg *distsqlpb.ProducerMessage) error { case *distsqlpb.RemoteProducerMetadata_RowNum_: meta.RowNum = v.RowNum + case *distsqlpb.RemoteProducerMetadata_Progress: + meta.Progress = v.Progress + case *distsqlpb.RemoteProducerMetadata_Error: meta.Err = v.Error.ErrorDetail() diff --git a/pkg/sql/distsqlrun/stream_encoder.go b/pkg/sql/distsqlrun/stream_encoder.go index 1c2d49ff3fab..f80141819f64 100644 --- a/pkg/sql/distsqlrun/stream_encoder.go +++ b/pkg/sql/distsqlrun/stream_encoder.go @@ -100,6 +100,10 @@ func (se *StreamEncoder) AddMetadata(meta ProducerMetadata) { enc.Value = &distsqlpb.RemoteProducerMetadata_RowNum_{ RowNum: meta.RowNum, } + } else if meta.Progress != nil { + enc.Value = &distsqlpb.RemoteProducerMetadata_Progress{ + Progress: meta.Progress, + } } else { enc.Value = &distsqlpb.RemoteProducerMetadata_Error{ Error: distsqlpb.NewError(meta.Err), diff --git a/pkg/sql/logictest/testdata/planner_test/distsql_misc b/pkg/sql/logictest/testdata/planner_test/distsql_misc index d4c41524f15a..a5ff9b571cf1 100644 --- a/pkg/sql/logictest/testdata/planner_test/distsql_misc +++ b/pkg/sql/logictest/testdata/planner_test/distsql_misc @@ -89,4 +89,4 @@ NULL /1 {1} 1 query T SELECT url FROM [EXPLAIN (DISTSQL) CREATE STATISTICS s1 ON a FROM data] ---- -https://cockroachdb.github.io/distsqlplan/decode.html#eJy0lE2L2zAQhu_9FWJOLcjow042q9P2uJdu2fRWfNBag2uaWEaSoe2S_14cY7YOG1ng9Ggpb56XZ8S8QmsNftFH9KC-gwAKEijkQKEAChsoKXTOVui9dcNPxsCj-QWKU2jarg_DcUmhsg5BvUJowgFBwTf9csBn1AYd40DBYNDN4YzpXHPU7veD0UEDhX2nW69IxgTRrSGC2PADHVB46oMiDwLKEwXbhzeWD7pGUOJE0_vs9bE7oGObeZfxeN_8QUUE53youg86DpZXwW-8vrXOoEMz45Wnq9U-17XDWgfrmODpJclHyTl56aufGPynq5XzWWWRPjuRMjsmMiZXTW-h0TS97c2nJ9NVyCQVMmP5KhULjSYVdzdXkaeryJNU5BkrVqlYaDSp2N1cRZGuokhSUWRss0rFQqNJxf1_XW_vgJ_Rd7b1eLHm3v9nPqw_NDWOu9Lb3lX41dnqjBk_n86584FBH8ZbMX48tuPVUPDfsIiG5SwsLsMyTl5A59F0EQ8Xa3pvouFtnLxdQ76Lhndx8m4N-T4-K77wTOKP7JJdnj78DQAA__-8qfRA +https://cockroachdb.github.io/distsqlplan/decode.html#eJyMj7FqxjAMhPc-RbjZUGf1G2RpS9fiwdgiGFwrWAoUgt-9xB7-NeN9p7tDFyon-gi_JHA_WOENjsaRRLjdaB5s6Q_OGuR6nHpjbxC5EdwFzVoIDoVjKEtsFJQW0aBZNEdZ7LuFQSINuYxoN-BTX0WiYSe4tZvnY98kB1ehR822ewNKO82HhM8W6atxHDNTfo7cAIlEp7tOsdVpdd_f_gMAAP__6dpl3g== diff --git a/pkg/sql/opt/exec/execbuilder/testdata/distsql_misc b/pkg/sql/opt/exec/execbuilder/testdata/distsql_misc index 6c7a7d56484b..44958a0e18d5 100644 --- a/pkg/sql/opt/exec/execbuilder/testdata/distsql_misc +++ b/pkg/sql/opt/exec/execbuilder/testdata/distsql_misc @@ -92,4 +92,4 @@ NULL /1 {1} 1 query T SELECT url FROM [EXPLAIN (DISTSQL) CREATE STATISTICS s1 ON a FROM data] ---- -https://cockroachdb.github.io/distsqlplan/decode.html#eJy0lE2L2zAQhu_9FWJOLcjow042q9P2uJdu2fRWfNBag2uaWEaSoe2S_14cY7YOG1ng9Ggpb56XZ8S8QmsNftFH9KC-gwAKEijkQKEAChsoKXTOVui9dcNPxsCj-QWKU2jarg_DcUmhsg5BvUJowgFBwTf9csBn1AYd40DBYNDN4YzpXHPU7veD0UEDhX2nW69IxgTRrSGC2PADHVB46oMiDwLKEwXbhzeWD7pGUOJE0_vs9bE7oGObeZfxeN_8QUUE53youg86DpZXwW-8vrXOoEMz45Wnq9U-17XDWgfrmODpJclHyTl56aufGPynq5XzWWWRPjuRMjsmMiZXTW-h0TS97c2nJ9NVyCQVMmP5KhULjSYVdzdXkaeryJNU5BkrVqlYaDSp2N1cRZGuokhSUWRss0rFQqNJxf1_XW_vgJ_Rd7b1eLHm3v9nPqw_NDWOu9Lb3lX41dnqjBk_n86584FBH8ZbMX48tuPVUPDfsIiG5SwsLsMyTl5A59F0EQ8Xa3pvouFtnLxdQ76Lhndx8m4N-T4-K77wTOKP7JJdnj78DQAA__-8qfRA +https://cockroachdb.github.io/distsqlplan/decode.html#eJyMj7FqxjAMhPc-RbjZUGf1G2RpS9fiwdgiGFwrWAoUgt-9xB7-NeN9p7tDFyon-gi_JHA_WOENjsaRRLjdaB5s6Q_OGuR6nHpjbxC5EdwFzVoIDoVjKEtsFJQW0aBZNEdZ7LuFQSINuYxoN-BTX0WiYSe4tZvnY98kB1ehR822ewNKO82HhM8W6atxHDNTfo7cAIlEp7tOsdVpdd_f_gMAAP__6dpl3g== diff --git a/pkg/sql/plan.go b/pkg/sql/plan.go index 939e574caada..2bdda16b4460 100644 --- a/pkg/sql/plan.go +++ b/pkg/sql/plan.go @@ -507,8 +507,6 @@ func startExec(params runParams, plan planNode) error { case *showTraceNode: // showTrace needs to override the params struct, and does so in its startExec() method. return false, nil - case *createStatsNode: - return false, errors.Errorf("statistics can only be created via DistSQL") } return true, nil }, diff --git a/pkg/sql/stats/automatic_stats.go b/pkg/sql/stats/automatic_stats.go index 10d6d96d83af..70c8a163d82b 100644 --- a/pkg/sql/stats/automatic_stats.go +++ b/pkg/sql/stats/automatic_stats.go @@ -290,12 +290,6 @@ func (r *Refresher) maybeRefreshStats( return } - // TODO(rytaft): Add logic to create a Job ID for this refresh and use the - // Job ID to lock automatic stats creation for this table with a lock - // manager. If the lock succeeds, check the stats cache one more time to - // make sure a new statistic was not just added. If not, proceed to the next - // step. - if err := r.refreshStats(ctx, tableID, asOf); err != nil { pgerr, ok := errors.Cause(err).(*pgerror.Error) if ok && pgerr.Code == pgerror.CodeUndefinedTableError { diff --git a/pkg/sql/stats/create_stats_job_test.go b/pkg/sql/stats/create_stats_job_test.go new file mode 100644 index 000000000000..7f74988fdce1 --- /dev/null +++ b/pkg/sql/stats/create_stats_job_test.go @@ -0,0 +1,337 @@ +// Copyright 2019 The Cockroach Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +// implied. See the License for the specific language governing +// permissions and limitations under the License. + +package stats_test + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/cockroachdb/cockroach/pkg/base" + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" + "github.com/cockroachdb/cockroach/pkg/roachpb" + "github.com/cockroachdb/cockroach/pkg/sql/distsqlrun" + "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" + "github.com/cockroachdb/cockroach/pkg/storage" + "github.com/cockroachdb/cockroach/pkg/storage/storagebase" + "github.com/cockroachdb/cockroach/pkg/testutils" + "github.com/cockroachdb/cockroach/pkg/testutils/jobutils" + "github.com/cockroachdb/cockroach/pkg/testutils/sqlutils" + "github.com/cockroachdb/cockroach/pkg/testutils/testcluster" + "github.com/cockroachdb/cockroach/pkg/util/encoding" + "github.com/cockroachdb/cockroach/pkg/util/hlc" + "github.com/cockroachdb/cockroach/pkg/util/leaktest" + "github.com/cockroachdb/cockroach/pkg/util/protoutil" +) + +// TestCreateStatsControlJob tests that PAUSE JOB, RESUME JOB, and CANCEL JOB +// work as intended on create statistics jobs. +func TestCreateStatsControlJob(t *testing.T) { + defer leaktest.AfterTest(t)() + + defer func(oldInterval time.Duration) { + jobs.DefaultAdoptInterval = oldInterval + }(jobs.DefaultAdoptInterval) + jobs.DefaultAdoptInterval = 100 * time.Millisecond + + // Test with 3 nodes and distsqlrun.SamplerProgressInterval=100 to ensure + // that progress metadata is sent correctly after every 100 input rows. + const nodes = 3 + defer func(oldInterval int) { + distsqlrun.SamplerProgressInterval = oldInterval + }(distsqlrun.SamplerProgressInterval) + distsqlrun.SamplerProgressInterval = 100 + + var allowRequest chan struct{} + + var serverArgs base.TestServerArgs + params := base.TestClusterArgs{ServerArgs: serverArgs} + params.ServerArgs.Knobs.Store = &storage.StoreTestingKnobs{ + TestingRequestFilter: createStatsRequestFilter(&allowRequest), + } + + ctx := context.Background() + tc := testcluster.StartTestCluster(t, nodes, params) + defer tc.Stopper().Stop(ctx) + sqlDB := sqlutils.MakeSQLRunner(tc.Conns[0]) + sqlDB.Exec(t, `CREATE DATABASE d`) + sqlDB.Exec(t, `CREATE TABLE d.t (x INT)`) + sqlDB.Exec(t, `INSERT INTO d.t SELECT generate_series(1,1000)`) + + t.Run("cancel", func(t *testing.T) { + // Test that CREATE STATISTICS can be canceled. + query := fmt.Sprintf(`CREATE STATISTICS s1 FROM d.t`) + + if _, err := jobutils.RunJob( + t, sqlDB, &allowRequest, []string{"cancel"}, query, + ); !testutils.IsError(err, "job canceled") { + t.Fatalf("expected 'job canceled' error, but got %+v", err) + } + + // There should be no results here. + sqlDB.CheckQueryResults(t, + `SELECT statistics_name, column_names, row_count FROM [SHOW STATISTICS FOR TABLE d.t]`, + [][]string{}) + }) + + t.Run("pause", func(t *testing.T) { + // Test that CREATE STATISTICS can be paused and resumed. + query := fmt.Sprintf(`CREATE STATISTICS s2 FROM d.t`) + + jobID, err := jobutils.RunJob( + t, sqlDB, &allowRequest, []string{"PAUSE"}, query, + ) + if !testutils.IsError(err, "job paused") { + t.Fatalf("unexpected: %v", err) + } + + // There should be no results here. + sqlDB.CheckQueryResults(t, + `SELECT statistics_name, column_names, row_count FROM [SHOW STATISTICS FOR TABLE d.t]`, + [][]string{}) + + sqlDB.Exec(t, fmt.Sprintf(`RESUME JOB %d`, jobID)) + jobutils.WaitForJob(t, sqlDB, jobID) + + // Now the job should have succeeded in producing stats. + sqlDB.CheckQueryResults(t, + `SELECT statistics_name, column_names, row_count FROM [SHOW STATISTICS FOR TABLE d.t]`, + [][]string{ + {"s2", "{x}", "1000"}, + }) + }) +} + +// TestCreateStatsLivenessWithRestart tests that a node liveness transition +// during CREATE STATISTICS correctly resumes after the node executing the job +// becomes non-live (from the perspective of the jobs registry). +func TestCreateStatsLivenessWithRestart(t *testing.T) { + defer leaktest.AfterTest(t)() + + defer func(oldAdoptInterval, oldCancelInterval time.Duration) { + jobs.DefaultAdoptInterval = oldAdoptInterval + jobs.DefaultCancelInterval = oldCancelInterval + }(jobs.DefaultAdoptInterval, jobs.DefaultCancelInterval) + jobs.DefaultAdoptInterval = 100 * time.Millisecond + jobs.DefaultCancelInterval = 100 * time.Millisecond + + const nodes = 1 + nl := jobs.NewFakeNodeLiveness(nodes) + serverArgs := base.TestServerArgs{ + Knobs: base.TestingKnobs{ + RegistryLiveness: nl, + }, + } + + var allowRequest chan struct{} + params := base.TestClusterArgs{ServerArgs: serverArgs} + params.ServerArgs.Knobs.Store = &storage.StoreTestingKnobs{ + TestingRequestFilter: createStatsRequestFilter(&allowRequest), + } + + ctx := context.Background() + tc := testcluster.StartTestCluster(t, nodes, params) + defer tc.Stopper().Stop(ctx) + conn := tc.Conns[0] + sqlDB := sqlutils.MakeSQLRunner(conn) + + sqlDB.Exec(t, `CREATE DATABASE liveness`) + sqlDB.Exec(t, `CREATE TABLE liveness.t (i INT8 PRIMARY KEY)`) + sqlDB.Exec(t, `INSERT INTO liveness.t SELECT generate_series(1,1000)`) + + const query = `CREATE STATISTICS s1 FROM liveness.t` + + // Start a CREATE STATISTICS run and wait until it's done one scan. + allowRequest = make(chan struct{}) + errCh := make(chan error) + go func() { + _, err := conn.Exec(query) + errCh <- err + }() + select { + case allowRequest <- struct{}{}: + case err := <-errCh: + t.Fatal(err) + } + + // Fetch the new job ID and lease since we know it's running now. + var jobID int64 + originalLease := &jobspb.Progress{} + { + var expectedLeaseBytes []byte + sqlDB.QueryRow( + t, `SELECT id, progress FROM system.jobs ORDER BY created DESC LIMIT 1`, + ).Scan(&jobID, &expectedLeaseBytes) + if err := protoutil.Unmarshal(expectedLeaseBytes, originalLease); err != nil { + t.Fatal(err) + } + } + + // Make the node non-live and wait for cancellation. + nl.FakeSetExpiration(1, hlc.MinTimestamp) + // Wait for the registry cancel loop to run and cancel the job. + <-nl.SelfCalledCh + <-nl.SelfCalledCh + close(allowRequest) + err := <-errCh + if !testutils.IsError(err, "job .*: node liveness error") { + t.Fatalf("unexpected: %v", err) + } + + // Ensure that complete progress has not been recorded. + partialProgress := jobutils.GetJobProgress(t, sqlDB, jobID) + if partialProgress.Progress != nil && + partialProgress.Progress.(*jobspb.Progress_FractionCompleted).FractionCompleted == 1 { + t.Fatal("create stats should not have recorded progress") + } + + // Make the node live again. + nl.FakeSetExpiration(1, hlc.MaxTimestamp) + + // The registry should now adopt the job and resume it. + jobutils.WaitForJob(t, sqlDB, jobID) + + // Verify that the job lease was updated. + rescheduledProgress := jobutils.GetJobProgress(t, sqlDB, jobID) + if rescheduledProgress.ModifiedMicros <= originalLease.ModifiedMicros { + t.Fatalf("expecting rescheduled job to have a later modification time: %d vs %d", + rescheduledProgress.ModifiedMicros, originalLease.ModifiedMicros) + } + + // Verify that progress is now recorded. + if rescheduledProgress.Progress.(*jobspb.Progress_FractionCompleted).FractionCompleted != 1 { + t.Fatal("create stats should have recorded progress") + } + + // Now the job should have succeeded in producing stats. + sqlDB.CheckQueryResults(t, + `SELECT statistics_name, column_names, row_count FROM [SHOW STATISTICS FOR TABLE liveness.t]`, + [][]string{ + {"s1", "{i}", "1000"}, + }) +} + +// TestCreateStatsLivenessWithLeniency tests that a temporary node liveness +// transition during CREATE STATISTICS doesn't cancel the job, but allows the +// owning node to continue processing. +func TestCreateStatsLivenessWithLeniency(t *testing.T) { + defer leaktest.AfterTest(t)() + + defer func(oldAdoptInterval, oldCancelInterval time.Duration) { + jobs.DefaultAdoptInterval = oldAdoptInterval + jobs.DefaultCancelInterval = oldCancelInterval + }(jobs.DefaultAdoptInterval, jobs.DefaultCancelInterval) + jobs.DefaultAdoptInterval = 100 * time.Millisecond + jobs.DefaultCancelInterval = 100 * time.Millisecond + + const nodes = 1 + nl := jobs.NewFakeNodeLiveness(nodes) + serverArgs := base.TestServerArgs{ + Knobs: base.TestingKnobs{ + RegistryLiveness: nl, + }, + } + + var allowRequest chan struct{} + params := base.TestClusterArgs{ServerArgs: serverArgs} + params.ServerArgs.Knobs.Store = &storage.StoreTestingKnobs{ + TestingRequestFilter: createStatsRequestFilter(&allowRequest), + } + + ctx := context.Background() + tc := testcluster.StartTestCluster(t, nodes, params) + defer tc.Stopper().Stop(ctx) + conn := tc.Conns[0] + sqlDB := sqlutils.MakeSQLRunner(conn) + + // We want to know exactly how much leniency is configured. + sqlDB.Exec(t, `SET CLUSTER SETTING jobs.registry.leniency = '1m'`) + sqlDB.Exec(t, `CREATE DATABASE liveness`) + sqlDB.Exec(t, `CREATE TABLE liveness.t (i INT8 PRIMARY KEY)`) + sqlDB.Exec(t, `INSERT INTO liveness.t SELECT generate_series(1,1000)`) + + const query = `CREATE STATISTICS s1 FROM liveness.t` + + // Start a CREATE STATISTICS run and wait until it's done one scan. + allowRequest = make(chan struct{}) + errCh := make(chan error) + go func() { + _, err := conn.Exec(query) + errCh <- err + }() + select { + case allowRequest <- struct{}{}: + case err := <-errCh: + t.Fatal(err) + } + + // Fetch the new job ID and lease since we know it's running now. + var jobID int64 + originalLease := &jobspb.Payload{} + { + var expectedLeaseBytes []byte + sqlDB.QueryRow( + t, `SELECT id, payload FROM system.jobs ORDER BY created DESC LIMIT 1`, + ).Scan(&jobID, &expectedLeaseBytes) + if err := protoutil.Unmarshal(expectedLeaseBytes, originalLease); err != nil { + t.Fatal(err) + } + } + + // Make the node slightly tardy. + nl.FakeSetExpiration(1, hlc.Timestamp{ + WallTime: hlc.UnixNano() - (15 * time.Second).Nanoseconds(), + }) + + // Wait for the registry cancel loop to run and not cancel the job. + <-nl.SelfCalledCh + <-nl.SelfCalledCh + close(allowRequest) + + // Set the node to be fully live again. This prevents the registry + // from canceling all of the jobs if the test node is saturated + // and the create stats runs slowly. + nl.FakeSetExpiration(1, hlc.MaxTimestamp) + + // Verify that the client didn't see anything amiss. + if err := <-errCh; err != nil { + t.Fatalf("create stats job should have completed: %s", err) + } + + // The job should have completed normally. + jobutils.WaitForJob(t, sqlDB, jobID) +} + +// Create a blocking request filter for the actions related +// to CREATE STATISTICS, i.e. Scanning a user table. See discussion +// on jobutils.RunJob for where this might be useful. +func createStatsRequestFilter(allowProgressIota *chan struct{}) storagebase.ReplicaRequestFilter { + return func(ba roachpb.BatchRequest) *roachpb.Error { + if req, ok := ba.GetArg(roachpb.Scan); ok { + _, tableID, _ := encoding.DecodeUvarintAscending(req.(*roachpb.ScanRequest).Key) + // Ensure that the tableID is within the expected range for a table, + // but is not a system table. + if tableID > 0 && tableID < 100 && !sqlbase.IsReservedID(sqlbase.ID(tableID)) { + // Read from the channel twice to allow jobutils.RunJob to complete + // even though there is only one ScanRequest. + <-*allowProgressIota + <-*allowProgressIota + } + } + return nil + } +} diff --git a/pkg/ui/src/views/jobs/index.tsx b/pkg/ui/src/views/jobs/index.tsx index 801ef0fb20e9..016a753368b4 100644 --- a/pkg/ui/src/views/jobs/index.tsx +++ b/pkg/ui/src/views/jobs/index.tsx @@ -63,6 +63,7 @@ const typeOptions = [ { value: JobType.IMPORT.toString(), label: "Imports" }, { value: JobType.SCHEMA_CHANGE.toString(), label: "Schema Changes" }, { value: JobType.CHANGEFEED.toString(), label: "Changefeed"}, + { value: JobType.CREATE_STATS.toString(), label: "Statistics Creation"}, ]; const typeSetting = new LocalSetting(