diff --git a/pkg/jobs/adopt.go b/pkg/jobs/adopt.go index c2fde4654f0f..c9ab35edaf9b 100644 --- a/pkg/jobs/adopt.go +++ b/pkg/jobs/adopt.go @@ -25,7 +25,9 @@ import ( "github.com/cockroachdb/errors" ) -const claimableStatusTupleString = `(` + +// NonTerminalStatusTupleString is a sql tuple corresponding to statuses of +// non-terminal jobs. +const NonTerminalStatusTupleString = `(` + `'` + string(StatusRunning) + `', ` + `'` + string(StatusPending) + `', ` + `'` + string(StatusCancelRequested) + `', ` + @@ -42,7 +44,7 @@ func (r *Registry) claimJobs(ctx context.Context, s sqlliveness.Session) error { UPDATE system.jobs SET claim_session_id = $1, claim_instance_id = $2 WHERE claim_session_id IS NULL - AND status IN `+claimableStatusTupleString+` + AND status IN `+NonTerminalStatusTupleString+` ORDER BY created DESC LIMIT $3 RETURNING id;`, diff --git a/pkg/jobs/jobspb/BUILD.bazel b/pkg/jobs/jobspb/BUILD.bazel index 99e4d9544f56..be82a240d4e7 100644 --- a/pkg/jobs/jobspb/BUILD.bazel +++ b/pkg/jobs/jobspb/BUILD.bazel @@ -24,6 +24,7 @@ proto_library( strip_import_prefix = "/pkg", visibility = ["//visibility:public"], deps = [ + "//pkg/clusterversion:clusterversion_proto", "//pkg/roachpb:roachpb_proto", "//pkg/sql/catalog/descpb:descpb_proto", "//pkg/sql/schemachanger/scpb:scpb_proto", @@ -42,6 +43,7 @@ go_proto_library( visibility = ["//visibility:public"], deps = [ "//pkg/ccl/streamingccl", # keep + "//pkg/clusterversion", "//pkg/roachpb", "//pkg/security", # keep "//pkg/sql/catalog/descpb", diff --git a/pkg/jobs/jobspb/jobs.pb.go b/pkg/jobs/jobspb/jobs.pb.go index 02d2aa9d7d31..97886da3a066 100644 --- a/pkg/jobs/jobspb/jobs.pb.go +++ b/pkg/jobs/jobspb/jobs.pb.go @@ -6,6 +6,7 @@ package jobspb import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" +import clusterversion "github.com/cockroachdb/cockroach/pkg/clusterversion" import errorspb "github.com/cockroachdb/errors/errorspb" import roachpb "github.com/cockroachdb/cockroach/pkg/roachpb" import descpb "github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb" @@ -57,7 +58,7 @@ func (x EncryptionMode) String() string { return proto.EnumName(EncryptionMode_name, int32(x)) } func (EncryptionMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{0} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{0} } type Status int32 @@ -86,7 +87,7 @@ func (x Status) String() string { return proto.EnumName(Status_name, int32(x)) } func (Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{1} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{1} } type Type int32 @@ -103,9 +104,10 @@ const ( TypeSchemaChangeGC Type = 8 // We can't name this TYPE_SCHEMA_CHANGE due to how proto generates actual // names for this enum, which cause a conflict with the SCHEMA_CHANGE entry. - TypeTypeSchemaChange Type = 9 - TypeStreamIngestion Type = 10 - TypeNewSchemaChange Type = 11 + TypeTypeSchemaChange Type = 9 + TypeStreamIngestion Type = 10 + TypeNewSchemaChange Type = 11 + TypeLongRunningMigration Type = 12 ) var Type_name = map[int32]string{ @@ -121,6 +123,7 @@ var Type_name = map[int32]string{ 9: "TYPEDESC_SCHEMA_CHANGE", 10: "STREAM_INGESTION", 11: "NEW_SCHEMA_CHANGE", + 12: "LONG_RUNNING_MIGRATION", } var Type_value = map[string]int32{ "UNSPECIFIED": 0, @@ -135,10 +138,11 @@ var Type_value = map[string]int32{ "TYPEDESC_SCHEMA_CHANGE": 9, "STREAM_INGESTION": 10, "NEW_SCHEMA_CHANGE": 11, + "LONG_RUNNING_MIGRATION": 12, } func (Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{2} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{2} } type EncryptionInfo_Scheme int32 @@ -158,7 +162,7 @@ func (x EncryptionInfo_Scheme) String() string { return proto.EnumName(EncryptionInfo_Scheme_name, int32(x)) } func (EncryptionInfo_Scheme) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{2, 0} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{2, 0} } type SchemaChangeGCProgress_Status int32 @@ -188,7 +192,7 @@ func (x SchemaChangeGCProgress_Status) String() string { return proto.EnumName(SchemaChangeGCProgress_Status_name, int32(x)) } func (SchemaChangeGCProgress_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{22, 0} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{22, 0} } type Lease struct { @@ -202,7 +206,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_8b84a7e749431ded, []int{0} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{0} } func (m *Lease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -243,7 +247,7 @@ func (m *BackupEncryptionOptions) Reset() { *m = BackupEncryptionOptions func (m *BackupEncryptionOptions) String() string { return proto.CompactTextString(m) } func (*BackupEncryptionOptions) ProtoMessage() {} func (*BackupEncryptionOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{1} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{1} } func (m *BackupEncryptionOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -277,7 +281,7 @@ func (m *BackupEncryptionOptions_KMSInfo) Reset() { *m = BackupEncryptio func (m *BackupEncryptionOptions_KMSInfo) String() string { return proto.CompactTextString(m) } func (*BackupEncryptionOptions_KMSInfo) ProtoMessage() {} func (*BackupEncryptionOptions_KMSInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{1, 0} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{1, 0} } func (m *BackupEncryptionOptions_KMSInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -317,7 +321,7 @@ func (m *EncryptionInfo) Reset() { *m = EncryptionInfo{} } func (m *EncryptionInfo) String() string { return proto.CompactTextString(m) } func (*EncryptionInfo) ProtoMessage() {} func (*EncryptionInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{2} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{2} } func (m *EncryptionInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -360,7 +364,7 @@ func (m *StreamIngestionDetails) Reset() { *m = StreamIngestionDetails{} func (m *StreamIngestionDetails) String() string { return proto.CompactTextString(m) } func (*StreamIngestionDetails) ProtoMessage() {} func (*StreamIngestionDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{3} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{3} } func (m *StreamIngestionDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -392,7 +396,7 @@ func (m *StreamIngestionProgress) Reset() { *m = StreamIngestionProgress func (m *StreamIngestionProgress) String() string { return proto.CompactTextString(m) } func (*StreamIngestionProgress) ProtoMessage() {} func (*StreamIngestionProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{4} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{4} } func (m *StreamIngestionProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -447,7 +451,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_8b84a7e749431ded, []int{5} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{5} } func (m *BackupDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -479,7 +483,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_8b84a7e749431ded, []int{6} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{6} } func (m *BackupProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -541,7 +545,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_8b84a7e749431ded, []int{7} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{7} } func (m *RestoreDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -578,7 +582,7 @@ func (m *RestoreDetails_DescriptorRewrite) Reset() { *m = RestoreDetails func (m *RestoreDetails_DescriptorRewrite) String() string { return proto.CompactTextString(m) } func (*RestoreDetails_DescriptorRewrite) ProtoMessage() {} func (*RestoreDetails_DescriptorRewrite) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{7, 0} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{7, 0} } func (m *RestoreDetails_DescriptorRewrite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -611,7 +615,7 @@ func (m *RestoreDetails_BackupLocalityInfo) Reset() { *m = RestoreDetail func (m *RestoreDetails_BackupLocalityInfo) String() string { return proto.CompactTextString(m) } func (*RestoreDetails_BackupLocalityInfo) ProtoMessage() {} func (*RestoreDetails_BackupLocalityInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{7, 1} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{7, 1} } func (m *RestoreDetails_BackupLocalityInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -644,7 +648,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_8b84a7e749431ded, []int{8} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{8} } func (m *RestoreProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -705,7 +709,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_8b84a7e749431ded, []int{9} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{9} } func (m *ImportDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -743,7 +747,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_8b84a7e749431ded, []int{9, 0} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{9, 0} } func (m *ImportDetails_Table) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -785,7 +789,7 @@ func (m *SequenceValChunk) Reset() { *m = SequenceValChunk{} } func (m *SequenceValChunk) String() string { return proto.CompactTextString(m) } func (*SequenceValChunk) ProtoMessage() {} func (*SequenceValChunk) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{10} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{10} } func (m *SequenceValChunk) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -821,7 +825,7 @@ func (m *SequenceDetails) Reset() { *m = SequenceDetails{} } func (m *SequenceDetails) String() string { return proto.CompactTextString(m) } func (*SequenceDetails) ProtoMessage() {} func (*SequenceDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{11} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{11} } func (m *SequenceDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -856,7 +860,7 @@ func (m *SequenceDetails_SequenceChunks) Reset() { *m = SequenceDetails_ func (m *SequenceDetails_SequenceChunks) String() string { return proto.CompactTextString(m) } func (*SequenceDetails_SequenceChunks) ProtoMessage() {} func (*SequenceDetails_SequenceChunks) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{11, 0} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{11, 0} } func (m *SequenceDetails_SequenceChunks) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -902,7 +906,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_8b84a7e749431ded, []int{12} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{12} } func (m *ImportProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,7 +949,7 @@ func (m *TypeSchemaChangeDetails) Reset() { *m = TypeSchemaChangeDetails func (m *TypeSchemaChangeDetails) String() string { return proto.CompactTextString(m) } func (*TypeSchemaChangeDetails) ProtoMessage() {} func (*TypeSchemaChangeDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{13} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{13} } func (m *TypeSchemaChangeDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -978,7 +982,7 @@ func (m *TypeSchemaChangeProgress) Reset() { *m = TypeSchemaChangeProgre func (m *TypeSchemaChangeProgress) String() string { return proto.CompactTextString(m) } func (*TypeSchemaChangeProgress) ProtoMessage() {} func (*TypeSchemaChangeProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{14} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{14} } func (m *TypeSchemaChangeProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1012,7 +1016,7 @@ func (m *NewSchemaChangeDetails) Reset() { *m = NewSchemaChangeDetails{} func (m *NewSchemaChangeDetails) String() string { return proto.CompactTextString(m) } func (*NewSchemaChangeDetails) ProtoMessage() {} func (*NewSchemaChangeDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{15} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{15} } func (m *NewSchemaChangeDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1046,7 +1050,7 @@ func (m *NewSchemaChangeProgress) Reset() { *m = NewSchemaChangeProgress func (m *NewSchemaChangeProgress) String() string { return proto.CompactTextString(m) } func (*NewSchemaChangeProgress) ProtoMessage() {} func (*NewSchemaChangeProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{16} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{16} } func (m *NewSchemaChangeProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1079,7 +1083,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_8b84a7e749431ded, []int{17} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{17} } func (m *ResumeSpanList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1114,7 +1118,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_8b84a7e749431ded, []int{18} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{18} } func (m *DroppedTableDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1177,7 +1181,7 @@ func (m *SchemaChangeGCDetails) Reset() { *m = SchemaChangeGCDetails{} } func (m *SchemaChangeGCDetails) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCDetails) ProtoMessage() {} func (*SchemaChangeGCDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{19} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{19} } func (m *SchemaChangeGCDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1211,7 +1215,7 @@ func (m *SchemaChangeGCDetails_DroppedIndex) Reset() { *m = SchemaChange func (m *SchemaChangeGCDetails_DroppedIndex) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCDetails_DroppedIndex) ProtoMessage() {} func (*SchemaChangeGCDetails_DroppedIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{19, 0} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{19, 0} } func (m *SchemaChangeGCDetails_DroppedIndex) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1245,7 +1249,7 @@ func (m *SchemaChangeGCDetails_DroppedID) Reset() { *m = SchemaChangeGCD func (m *SchemaChangeGCDetails_DroppedID) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCDetails_DroppedID) ProtoMessage() {} func (*SchemaChangeGCDetails_DroppedID) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{19, 1} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{19, 1} } func (m *SchemaChangeGCDetails_DroppedID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1279,7 +1283,7 @@ func (m *SchemaChangeGCDetails_DroppedTenant) Reset() { *m = SchemaChang func (m *SchemaChangeGCDetails_DroppedTenant) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCDetails_DroppedTenant) ProtoMessage() {} func (*SchemaChangeGCDetails_DroppedTenant) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{19, 2} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{19, 2} } func (m *SchemaChangeGCDetails_DroppedTenant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1343,7 +1347,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_8b84a7e749431ded, []int{20} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{20} } func (m *SchemaChangeDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1375,7 +1379,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_8b84a7e749431ded, []int{21} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{21} } func (m *SchemaChangeProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1413,7 +1417,7 @@ func (m *SchemaChangeGCProgress) Reset() { *m = SchemaChangeGCProgress{} func (m *SchemaChangeGCProgress) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCProgress) ProtoMessage() {} func (*SchemaChangeGCProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{22} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{22} } func (m *SchemaChangeGCProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1447,7 +1451,7 @@ func (m *SchemaChangeGCProgress_IndexProgress) Reset() { *m = SchemaChan func (m *SchemaChangeGCProgress_IndexProgress) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCProgress_IndexProgress) ProtoMessage() {} func (*SchemaChangeGCProgress_IndexProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{22, 0} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{22, 0} } func (m *SchemaChangeGCProgress_IndexProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1481,7 +1485,7 @@ func (m *SchemaChangeGCProgress_TableProgress) Reset() { *m = SchemaChan func (m *SchemaChangeGCProgress_TableProgress) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCProgress_TableProgress) ProtoMessage() {} func (*SchemaChangeGCProgress_TableProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{22, 1} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{22, 1} } func (m *SchemaChangeGCProgress_TableProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1514,7 +1518,7 @@ func (m *SchemaChangeGCProgress_TenantProgress) Reset() { *m = SchemaCha func (m *SchemaChangeGCProgress_TenantProgress) String() string { return proto.CompactTextString(m) } func (*SchemaChangeGCProgress_TenantProgress) ProtoMessage() {} func (*SchemaChangeGCProgress_TenantProgress) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{22, 2} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{22, 2} } func (m *SchemaChangeGCProgress_TenantProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1547,7 +1551,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_8b84a7e749431ded, []int{23} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{23} } func (m *ChangefeedTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1600,7 +1604,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_8b84a7e749431ded, []int{24} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{24} } func (m *ChangefeedDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1635,7 +1639,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_8b84a7e749431ded, []int{25} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{25} } func (m *ResolvedSpan) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1678,7 +1682,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_8b84a7e749431ded, []int{26} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{26} } func (m *ChangefeedProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1722,7 +1726,7 @@ 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_8b84a7e749431ded, []int{27} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{27} } func (m *CreateStatsDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1763,7 +1767,7 @@ func (m *CreateStatsDetails_ColStat) Reset() { *m = CreateStatsDetails_C func (m *CreateStatsDetails_ColStat) String() string { return proto.CompactTextString(m) } func (*CreateStatsDetails_ColStat) ProtoMessage() {} func (*CreateStatsDetails_ColStat) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{27, 0} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{27, 0} } func (m *CreateStatsDetails_ColStat) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1795,7 +1799,7 @@ 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_8b84a7e749431ded, []int{28} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{28} } func (m *CreateStatsProgress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1820,6 +1824,71 @@ func (m *CreateStatsProgress) XXX_DiscardUnknown() { var xxx_messageInfo_CreateStatsProgress proto.InternalMessageInfo +type LongRunningMigrationDetails struct { + ClusterVersion *clusterversion.ClusterVersion `protobuf:"bytes,1,opt,name=cluster_version,json=clusterVersion,proto3" json:"cluster_version,omitempty"` +} + +func (m *LongRunningMigrationDetails) Reset() { *m = LongRunningMigrationDetails{} } +func (m *LongRunningMigrationDetails) String() string { return proto.CompactTextString(m) } +func (*LongRunningMigrationDetails) ProtoMessage() {} +func (*LongRunningMigrationDetails) Descriptor() ([]byte, []int) { + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{29} +} +func (m *LongRunningMigrationDetails) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LongRunningMigrationDetails) 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 *LongRunningMigrationDetails) XXX_Merge(src proto.Message) { + xxx_messageInfo_LongRunningMigrationDetails.Merge(dst, src) +} +func (m *LongRunningMigrationDetails) XXX_Size() int { + return m.Size() +} +func (m *LongRunningMigrationDetails) XXX_DiscardUnknown() { + xxx_messageInfo_LongRunningMigrationDetails.DiscardUnknown(m) +} + +var xxx_messageInfo_LongRunningMigrationDetails proto.InternalMessageInfo + +type LongRunningMigrationProgress struct { +} + +func (m *LongRunningMigrationProgress) Reset() { *m = LongRunningMigrationProgress{} } +func (m *LongRunningMigrationProgress) String() string { return proto.CompactTextString(m) } +func (*LongRunningMigrationProgress) ProtoMessage() {} +func (*LongRunningMigrationProgress) Descriptor() ([]byte, []int) { + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{30} +} +func (m *LongRunningMigrationProgress) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LongRunningMigrationProgress) 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 *LongRunningMigrationProgress) XXX_Merge(src proto.Message) { + xxx_messageInfo_LongRunningMigrationProgress.Merge(dst, src) +} +func (m *LongRunningMigrationProgress) XXX_Size() int { + return m.Size() +} +func (m *LongRunningMigrationProgress) XXX_DiscardUnknown() { + xxx_messageInfo_LongRunningMigrationProgress.DiscardUnknown(m) +} + +var xxx_messageInfo_LongRunningMigrationProgress proto.InternalMessageInfo + type Payload struct { Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` // If empty, the description is assumed to be the statement. @@ -1857,6 +1926,7 @@ type Payload struct { // *Payload_TypeSchemaChange // *Payload_StreamIngestion // *Payload_NewSchemaChange + // *Payload_LongRunningMigration Details isPayload_Details `protobuf_oneof:"details"` } @@ -1864,7 +1934,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_8b84a7e749431ded, []int{29} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{31} } func (m *Payload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1925,17 +1995,21 @@ type Payload_StreamIngestion struct { type Payload_NewSchemaChange struct { NewSchemaChange *NewSchemaChangeDetails `protobuf:"bytes,24,opt,name=newSchemaChange,proto3,oneof"` } +type Payload_LongRunningMigration struct { + LongRunningMigration *LongRunningMigrationDetails `protobuf:"bytes,25,opt,name=longRunningMigration,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 (*Payload_SchemaChangeGC) isPayload_Details() {} -func (*Payload_TypeSchemaChange) isPayload_Details() {} -func (*Payload_StreamIngestion) isPayload_Details() {} -func (*Payload_NewSchemaChange) isPayload_Details() {} +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 (*Payload_SchemaChangeGC) isPayload_Details() {} +func (*Payload_TypeSchemaChange) isPayload_Details() {} +func (*Payload_StreamIngestion) isPayload_Details() {} +func (*Payload_NewSchemaChange) isPayload_Details() {} +func (*Payload_LongRunningMigration) isPayload_Details() {} func (m *Payload) GetDetails() isPayload_Details { if m != nil { @@ -2014,6 +2088,13 @@ func (m *Payload) GetNewSchemaChange() *NewSchemaChangeDetails { return nil } +func (m *Payload) GetLongRunningMigration() *LongRunningMigrationDetails { + if x, ok := m.GetDetails().(*Payload_LongRunningMigration); ok { + return x.LongRunningMigration + } + 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{}{ @@ -2027,6 +2108,7 @@ func (*Payload) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error (*Payload_TypeSchemaChange)(nil), (*Payload_StreamIngestion)(nil), (*Payload_NewSchemaChange)(nil), + (*Payload_LongRunningMigration)(nil), } } @@ -2084,6 +2166,11 @@ func _Payload_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { if err := b.EncodeMessage(x.NewSchemaChange); err != nil { return err } + case *Payload_LongRunningMigration: + _ = b.EncodeVarint(25<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.LongRunningMigration); err != nil { + return err + } case nil: default: return fmt.Errorf("Payload.Details has unexpected type %T", x) @@ -2174,6 +2261,14 @@ func _Payload_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer err := b.DecodeMessage(msg) m.Details = &Payload_NewSchemaChange{msg} return true, err + case 25: // details.longRunningMigration + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(LongRunningMigrationDetails) + err := b.DecodeMessage(msg) + m.Details = &Payload_LongRunningMigration{msg} + return true, err default: return false, nil } @@ -2233,6 +2328,11 @@ func _Payload_OneofSizer(msg proto.Message) (n int) { n += 2 // tag and wire n += proto.SizeVarint(uint64(s)) n += s + case *Payload_LongRunningMigration: + s := proto.Size(x.LongRunningMigration) + n += 2 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s case nil: default: panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) @@ -2258,6 +2358,7 @@ type Progress struct { // *Progress_TypeSchemaChange // *Progress_StreamIngest // *Progress_NewSchemaChange + // *Progress_LongRunningMigration Details isProgress_Details `protobuf_oneof:"details"` } @@ -2265,7 +2366,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_8b84a7e749431ded, []int{30} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{32} } func (m *Progress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2337,19 +2438,23 @@ type Progress_StreamIngest struct { type Progress_NewSchemaChange struct { NewSchemaChange *NewSchemaChangeProgress `protobuf:"bytes,19,opt,name=newSchemaChange,proto3,oneof"` } +type Progress_LongRunningMigration struct { + LongRunningMigration *LongRunningMigrationProgress `protobuf:"bytes,20,opt,name=longRunningMigration,proto3,oneof"` +} -func (*Progress_FractionCompleted) isProgress_Progress() {} -func (*Progress_HighWater) isProgress_Progress() {} -func (*Progress_Backup) isProgress_Details() {} -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 (*Progress_SchemaChangeGC) isProgress_Details() {} -func (*Progress_TypeSchemaChange) isProgress_Details() {} -func (*Progress_StreamIngest) isProgress_Details() {} -func (*Progress_NewSchemaChange) isProgress_Details() {} +func (*Progress_FractionCompleted) isProgress_Progress() {} +func (*Progress_HighWater) isProgress_Progress() {} +func (*Progress_Backup) isProgress_Details() {} +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 (*Progress_SchemaChangeGC) isProgress_Details() {} +func (*Progress_TypeSchemaChange) isProgress_Details() {} +func (*Progress_StreamIngest) isProgress_Details() {} +func (*Progress_NewSchemaChange) isProgress_Details() {} +func (*Progress_LongRunningMigration) isProgress_Details() {} func (m *Progress) GetProgress() isProgress_Progress { if m != nil { @@ -2448,6 +2553,13 @@ func (m *Progress) GetNewSchemaChange() *NewSchemaChangeProgress { return nil } +func (m *Progress) GetLongRunningMigration() *LongRunningMigrationProgress { + if x, ok := m.GetDetails().(*Progress_LongRunningMigration); ok { + return x.LongRunningMigration + } + 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{}{ @@ -2463,6 +2575,7 @@ func (*Progress) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) erro (*Progress_TypeSchemaChange)(nil), (*Progress_StreamIngest)(nil), (*Progress_NewSchemaChange)(nil), + (*Progress_LongRunningMigration)(nil), } } @@ -2534,6 +2647,11 @@ func _Progress_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { if err := b.EncodeMessage(x.NewSchemaChange); err != nil { return err } + case *Progress_LongRunningMigration: + _ = b.EncodeVarint(20<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.LongRunningMigration); err != nil { + return err + } case nil: default: return fmt.Errorf("Progress.Details has unexpected type %T", x) @@ -2639,6 +2757,14 @@ func _Progress_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffe err := b.DecodeMessage(msg) m.Details = &Progress_NewSchemaChange{msg} return true, err + case 20: // details.longRunningMigration + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(LongRunningMigrationProgress) + err := b.DecodeMessage(msg) + m.Details = &Progress_LongRunningMigration{msg} + return true, err default: return false, nil } @@ -2712,6 +2838,11 @@ func _Progress_OneofSizer(msg proto.Message) (n int) { n += 2 // tag and wire n += proto.SizeVarint(uint64(s)) n += s + case *Progress_LongRunningMigration: + s := proto.Size(x.LongRunningMigration) + n += 2 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s case nil: default: panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) @@ -2731,7 +2862,7 @@ func (m *Job) Reset() { *m = Job{} } func (m *Job) String() string { return proto.CompactTextString(m) } func (*Job) ProtoMessage() {} func (*Job) Descriptor() ([]byte, []int) { - return fileDescriptor_jobs_8b84a7e749431ded, []int{31} + return fileDescriptor_jobs_a7fbefd2c1f66e4f, []int{33} } func (m *Job) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2805,6 +2936,8 @@ func init() { proto.RegisterType((*CreateStatsDetails)(nil), "cockroach.sql.jobs.jobspb.CreateStatsDetails") proto.RegisterType((*CreateStatsDetails_ColStat)(nil), "cockroach.sql.jobs.jobspb.CreateStatsDetails.ColStat") proto.RegisterType((*CreateStatsProgress)(nil), "cockroach.sql.jobs.jobspb.CreateStatsProgress") + proto.RegisterType((*LongRunningMigrationDetails)(nil), "cockroach.sql.jobs.jobspb.LongRunningMigrationDetails") + proto.RegisterType((*LongRunningMigrationProgress)(nil), "cockroach.sql.jobs.jobspb.LongRunningMigrationProgress") proto.RegisterType((*Payload)(nil), "cockroach.sql.jobs.jobspb.Payload") proto.RegisterType((*Progress)(nil), "cockroach.sql.jobs.jobspb.Progress") proto.RegisterType((*Job)(nil), "cockroach.sql.jobs.jobspb.Job") @@ -4934,6 +5067,52 @@ func (m *CreateStatsProgress) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *LongRunningMigrationDetails) 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 *LongRunningMigrationDetails) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ClusterVersion != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.ClusterVersion.Size())) + n39, err := m.ClusterVersion.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n39 + } + return i, nil +} + +func (m *LongRunningMigrationProgress) 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 *LongRunningMigrationProgress) 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) @@ -4972,21 +5151,21 @@ func (m *Payload) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintJobs(dAtA, i, uint64(m.FinishedMicros)) } if len(m.DescriptorIDs) > 0 { - dAtA40 := make([]byte, len(m.DescriptorIDs)*10) - var j39 int + dAtA41 := make([]byte, len(m.DescriptorIDs)*10) + var j40 int for _, num := range m.DescriptorIDs { for num >= 1<<7 { - dAtA40[j39] = uint8(uint64(num)&0x7f | 0x80) + dAtA41[j40] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j39++ + j40++ } - dAtA40[j39] = uint8(num) - j39++ + dAtA41[j40] = uint8(num) + j40++ } dAtA[i] = 0x32 i++ - i = encodeVarintJobs(dAtA, i, uint64(j39)) - i += copy(dAtA[i:], dAtA40[:j39]) + i = encodeVarintJobs(dAtA, i, uint64(j40)) + i += copy(dAtA[i:], dAtA41[:j40]) } if len(m.Error) > 0 { dAtA[i] = 0x42 @@ -4998,18 +5177,18 @@ func (m *Payload) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Lease.Size())) - n41, err := m.Lease.MarshalTo(dAtA[i:]) + n42, err := m.Lease.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n41 + i += n42 } if m.Details != nil { - nn42, err := m.Details.MarshalTo(dAtA[i:]) + nn43, err := m.Details.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn42 + i += nn43 } if len(m.Statement) > 0 { dAtA[i] = 0x82 @@ -5053,11 +5232,11 @@ func (m *Payload) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintJobs(dAtA, i, uint64(m.FinalResumeError.Size())) - n43, err := m.FinalResumeError.MarshalTo(dAtA[i:]) + n44, err := m.FinalResumeError.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n43 + i += n44 } if m.Noncancelable { dAtA[i] = 0xa0 @@ -5080,11 +5259,11 @@ func (m *Payload_Backup) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Backup.Size())) - n44, err := m.Backup.MarshalTo(dAtA[i:]) + n45, err := m.Backup.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n44 + i += n45 } return i, nil } @@ -5094,11 +5273,11 @@ func (m *Payload_Restore) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x5a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Restore.Size())) - n45, err := m.Restore.MarshalTo(dAtA[i:]) + n46, err := m.Restore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n45 + i += n46 } return i, nil } @@ -5108,11 +5287,11 @@ func (m *Payload_SchemaChange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x62 i++ i = encodeVarintJobs(dAtA, i, uint64(m.SchemaChange.Size())) - n46, err := m.SchemaChange.MarshalTo(dAtA[i:]) + n47, err := m.SchemaChange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n46 + i += n47 } return i, nil } @@ -5122,11 +5301,11 @@ func (m *Payload_Import) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x6a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Import.Size())) - n47, err := m.Import.MarshalTo(dAtA[i:]) + n48, err := m.Import.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n47 + i += n48 } return i, nil } @@ -5136,11 +5315,11 @@ func (m *Payload_Changefeed) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Changefeed.Size())) - n48, err := m.Changefeed.MarshalTo(dAtA[i:]) + n49, err := m.Changefeed.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n48 + i += n49 } return i, nil } @@ -5150,11 +5329,11 @@ func (m *Payload_CreateStats) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x7a i++ i = encodeVarintJobs(dAtA, i, uint64(m.CreateStats.Size())) - n49, err := m.CreateStats.MarshalTo(dAtA[i:]) + n50, err := m.CreateStats.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n49 + i += n50 } return i, nil } @@ -5166,11 +5345,11 @@ func (m *Payload_SchemaChangeGC) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintJobs(dAtA, i, uint64(m.SchemaChangeGC.Size())) - n50, err := m.SchemaChangeGC.MarshalTo(dAtA[i:]) + n51, err := m.SchemaChangeGC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n50 + i += n51 } return i, nil } @@ -5182,11 +5361,11 @@ func (m *Payload_TypeSchemaChange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintJobs(dAtA, i, uint64(m.TypeSchemaChange.Size())) - n51, err := m.TypeSchemaChange.MarshalTo(dAtA[i:]) + n52, err := m.TypeSchemaChange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n51 + i += n52 } return i, nil } @@ -5198,11 +5377,11 @@ func (m *Payload_StreamIngestion) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintJobs(dAtA, i, uint64(m.StreamIngestion.Size())) - n52, err := m.StreamIngestion.MarshalTo(dAtA[i:]) + n53, err := m.StreamIngestion.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n52 + i += n53 } return i, nil } @@ -5214,11 +5393,27 @@ func (m *Payload_NewSchemaChange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintJobs(dAtA, i, uint64(m.NewSchemaChange.Size())) - n53, err := m.NewSchemaChange.MarshalTo(dAtA[i:]) + n54, err := m.NewSchemaChange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n53 + i += n54 + } + return i, nil +} +func (m *Payload_LongRunningMigration) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.LongRunningMigration != nil { + dAtA[i] = 0xca + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.LongRunningMigration.Size())) + n55, err := m.LongRunningMigration.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n55 } return i, nil } @@ -5238,11 +5433,11 @@ func (m *Progress) MarshalTo(dAtA []byte) (int, error) { var l int _ = l if m.Progress != nil { - nn54, err := m.Progress.MarshalTo(dAtA[i:]) + nn56, err := m.Progress.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn54 + i += nn56 } if m.ModifiedMicros != 0 { dAtA[i] = 0x10 @@ -5256,11 +5451,11 @@ func (m *Progress) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.RunningStatus) } if m.Details != nil { - nn55, err := m.Details.MarshalTo(dAtA[i:]) + nn57, err := m.Details.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += nn55 + i += nn57 } return i, nil } @@ -5279,11 +5474,11 @@ func (m *Progress_HighWater) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintJobs(dAtA, i, uint64(m.HighWater.Size())) - n56, err := m.HighWater.MarshalTo(dAtA[i:]) + n58, err := m.HighWater.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n56 + i += n58 } return i, nil } @@ -5293,11 +5488,11 @@ func (m *Progress_Backup) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Backup.Size())) - n57, err := m.Backup.MarshalTo(dAtA[i:]) + n59, err := m.Backup.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n57 + i += n59 } return i, nil } @@ -5307,11 +5502,11 @@ func (m *Progress_Restore) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x5a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Restore.Size())) - n58, err := m.Restore.MarshalTo(dAtA[i:]) + n60, err := m.Restore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n58 + i += n60 } return i, nil } @@ -5321,11 +5516,11 @@ func (m *Progress_SchemaChange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x62 i++ i = encodeVarintJobs(dAtA, i, uint64(m.SchemaChange.Size())) - n59, err := m.SchemaChange.MarshalTo(dAtA[i:]) + n61, err := m.SchemaChange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n59 + i += n61 } return i, nil } @@ -5335,11 +5530,11 @@ func (m *Progress_Import) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x6a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Import.Size())) - n60, err := m.Import.MarshalTo(dAtA[i:]) + n62, err := m.Import.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n60 + i += n62 } return i, nil } @@ -5349,11 +5544,11 @@ func (m *Progress_Changefeed) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Changefeed.Size())) - n61, err := m.Changefeed.MarshalTo(dAtA[i:]) + n63, err := m.Changefeed.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n61 + i += n63 } return i, nil } @@ -5363,11 +5558,11 @@ func (m *Progress_CreateStats) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x7a i++ i = encodeVarintJobs(dAtA, i, uint64(m.CreateStats.Size())) - n62, err := m.CreateStats.MarshalTo(dAtA[i:]) + n64, err := m.CreateStats.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n62 + i += n64 } return i, nil } @@ -5379,11 +5574,11 @@ func (m *Progress_SchemaChangeGC) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintJobs(dAtA, i, uint64(m.SchemaChangeGC.Size())) - n63, err := m.SchemaChangeGC.MarshalTo(dAtA[i:]) + n65, err := m.SchemaChangeGC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n63 + i += n65 } return i, nil } @@ -5395,11 +5590,11 @@ func (m *Progress_TypeSchemaChange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintJobs(dAtA, i, uint64(m.TypeSchemaChange.Size())) - n64, err := m.TypeSchemaChange.MarshalTo(dAtA[i:]) + n66, err := m.TypeSchemaChange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n64 + i += n66 } return i, nil } @@ -5411,11 +5606,11 @@ func (m *Progress_StreamIngest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintJobs(dAtA, i, uint64(m.StreamIngest.Size())) - n65, err := m.StreamIngest.MarshalTo(dAtA[i:]) + n67, err := m.StreamIngest.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n65 + i += n67 } return i, nil } @@ -5427,11 +5622,27 @@ func (m *Progress_NewSchemaChange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintJobs(dAtA, i, uint64(m.NewSchemaChange.Size())) - n66, err := m.NewSchemaChange.MarshalTo(dAtA[i:]) + n68, err := m.NewSchemaChange.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n66 + i += n68 + } + return i, nil +} +func (m *Progress_LongRunningMigration) MarshalTo(dAtA []byte) (int, error) { + i := 0 + if m.LongRunningMigration != nil { + dAtA[i] = 0xa2 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintJobs(dAtA, i, uint64(m.LongRunningMigration.Size())) + n69, err := m.LongRunningMigration.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n69 } return i, nil } @@ -5459,21 +5670,21 @@ func (m *Job) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintJobs(dAtA, i, uint64(m.Progress.Size())) - n67, err := m.Progress.MarshalTo(dAtA[i:]) + n70, err := m.Progress.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n67 + i += n70 } if m.Payload != nil { dAtA[i] = 0x1a i++ i = encodeVarintJobs(dAtA, i, uint64(m.Payload.Size())) - n68, err := m.Payload.MarshalTo(dAtA[i:]) + n71, err := m.Payload.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n68 + i += n71 } return i, nil } @@ -6418,6 +6629,28 @@ func (m *CreateStatsProgress) Size() (n int) { return n } +func (m *LongRunningMigrationDetails) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ClusterVersion != nil { + l = m.ClusterVersion.Size() + n += 1 + l + sovJobs(uint64(l)) + } + return n +} + +func (m *LongRunningMigrationProgress) 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 @@ -6602,6 +6835,18 @@ func (m *Payload_NewSchemaChange) Size() (n int) { } return n } +func (m *Payload_LongRunningMigration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.LongRunningMigration != nil { + l = m.LongRunningMigration.Size() + n += 2 + l + sovJobs(uint64(l)) + } + return n +} func (m *Progress) Size() (n int) { if m == nil { return 0 @@ -6765,6 +7010,18 @@ func (m *Progress_NewSchemaChange) Size() (n int) { } return n } +func (m *Progress_LongRunningMigration) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.LongRunningMigration != nil { + l = m.LongRunningMigration.Size() + n += 2 + l + sovJobs(uint64(l)) + } + return n +} func (m *Job) Size() (n int) { if m == nil { return 0 @@ -13162,6 +13419,139 @@ func (m *CreateStatsProgress) Unmarshal(dAtA []byte) error { } return nil } +func (m *LongRunningMigrationDetails) 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: LongRunningMigrationDetails: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LongRunningMigrationDetails: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterVersion", 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 m.ClusterVersion == nil { + m.ClusterVersion = &clusterversion.ClusterVersion{} + } + if err := m.ClusterVersion.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipJobs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthJobs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LongRunningMigrationProgress) 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: LongRunningMigrationProgress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LongRunningMigrationProgress: 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) || (iNdEx+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 @@ -13886,6 +14276,38 @@ func (m *Payload) Unmarshal(dAtA []byte) error { } m.Details = &Payload_NewSchemaChange{v} iNdEx = postIndex + case 25: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LongRunningMigration", 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 := &LongRunningMigrationDetails{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &Payload_LongRunningMigration{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipJobs(dAtA[iNdEx:]) @@ -14347,6 +14769,38 @@ func (m *Progress) Unmarshal(dAtA []byte) error { } m.Details = &Progress_NewSchemaChange{v} iNdEx = postIndex + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LongRunningMigration", 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 := &LongRunningMigrationProgress{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &Progress_LongRunningMigration{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipJobs(dAtA[iNdEx:]) @@ -14608,303 +15062,312 @@ var ( ErrIntOverflowJobs = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("jobs/jobspb/jobs.proto", fileDescriptor_jobs_8b84a7e749431ded) } - -var fileDescriptor_jobs_8b84a7e749431ded = []byte{ - // 4717 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x7b, 0x4b, 0x6c, 0x23, 0x47, - 0x7a, 0xbf, 0x9a, 0xa4, 0xc8, 0xe6, 0x47, 0x91, 0x6a, 0x95, 0x34, 0x33, 0x5c, 0xfe, 0x6d, 0x51, - 0x4b, 0xbf, 0x66, 0xc6, 0x36, 0xe5, 0x95, 0xff, 0xeb, 0xb5, 0x27, 0xf6, 0xd8, 0x7c, 0x8d, 0x44, - 0x6a, 0xf4, 0x70, 0x53, 0x1a, 0x3f, 0x36, 0xde, 0x4e, 0xb3, 0xbb, 0x24, 0x75, 0x44, 0x76, 0x73, - 0xba, 0x9a, 0x33, 0xa3, 0x0d, 0x90, 0x04, 0x1b, 0x04, 0x58, 0xcc, 0x29, 0x01, 0x92, 0x5c, 0x92, - 0x01, 0x02, 0x64, 0x17, 0x08, 0x92, 0x00, 0x41, 0x8c, 0x20, 0xc9, 0x21, 0xb7, 0x5c, 0x7c, 0x48, - 0x80, 0xbd, 0x04, 0x30, 0x72, 0xe0, 0x26, 0xf2, 0x25, 0xc7, 0x20, 0x7b, 0x9b, 0x4b, 0x82, 0x7a, - 0x74, 0xb3, 0x49, 0xea, 0x41, 0x8d, 0xec, 0xcd, 0x65, 0x86, 0xfd, 0xd5, 0x57, 0xbf, 0xaa, 0xfa, - 0xea, 0xab, 0xef, 0x55, 0x25, 0xb8, 0xfa, 0xeb, 0x4e, 0x8b, 0x2c, 0xd3, 0x7f, 0xba, 0x2d, 0xf6, - 0x5f, 0xb1, 0xeb, 0x3a, 0x9e, 0x83, 0xbe, 0x65, 0x38, 0xc6, 0xa1, 0xeb, 0xe8, 0xc6, 0x41, 0x91, - 0xdc, 0x6f, 0x17, 0x59, 0x0b, 0xe7, 0xca, 0x5d, 0xc1, 0xae, 0xeb, 0xb8, 0x94, 0x9f, 0xff, 0xe0, - 0x3d, 0x72, 0x0b, 0xfb, 0xce, 0xbe, 0xc3, 0x7e, 0x2e, 0xd3, 0x5f, 0x82, 0x8a, 0x18, 0x46, 0xb7, - 0xb5, 0x6c, 0xea, 0x9e, 0x2e, 0x68, 0x59, 0x9f, 0x66, 0x39, 0xaf, 0xef, 0x39, 0x6e, 0x47, 0xf7, - 0x7c, 0x8c, 0x17, 0xc8, 0xfd, 0xf6, 0xb2, 0xa1, 0x7b, 0x7a, 0xdb, 0xd9, 0x5f, 0x36, 0x31, 0x31, - 0xba, 0xad, 0x65, 0xe2, 0xb9, 0x3d, 0xc3, 0xeb, 0xb9, 0xd8, 0x14, 0x4c, 0xf9, 0x13, 0x98, 0x3c, - 0x6c, 0xeb, 0xb6, 0xe7, 0xe3, 0xf7, 0x3c, 0xab, 0xbd, 0x7c, 0xd0, 0x36, 0x96, 0x3d, 0xab, 0x83, - 0x89, 0xa7, 0x77, 0xba, 0xa2, 0xe5, 0xdb, 0xb4, 0x2b, 0x31, 0x0e, 0x70, 0x47, 0x37, 0x0e, 0x74, - 0x7b, 0x1f, 0xbb, 0xcb, 0x7c, 0x0c, 0xa3, 0xdb, 0xe2, 0x2c, 0x85, 0xdf, 0x82, 0xe9, 0xbb, 0x58, - 0x27, 0x18, 0x7d, 0x0a, 0x09, 0xdb, 0x31, 0xb1, 0x66, 0x99, 0x59, 0x69, 0x49, 0xba, 0x9e, 0x2e, - 0x97, 0x8e, 0xfb, 0xf9, 0xf8, 0xa6, 0x63, 0xe2, 0x7a, 0xf5, 0x69, 0x3f, 0xff, 0xe6, 0xbe, 0xe5, - 0x1d, 0xf4, 0x5a, 0x45, 0xc3, 0xe9, 0x2c, 0x07, 0xb2, 0x32, 0x5b, 0x83, 0xdf, 0xcb, 0xdd, 0xc3, - 0xfd, 0x65, 0xb1, 0xd2, 0x22, 0xef, 0xa6, 0xc6, 0x29, 0x62, 0xdd, 0x44, 0x0b, 0x30, 0x8d, 0xbb, - 0x8e, 0x71, 0x90, 0x8d, 0x2c, 0x49, 0xd7, 0xa3, 0x2a, 0xff, 0xb8, 0x15, 0xfb, 0xcf, 0x3f, 0xcd, - 0x4b, 0x85, 0x9f, 0x46, 0xe0, 0x5a, 0x59, 0x37, 0x0e, 0x7b, 0xdd, 0x9a, 0x6d, 0xb8, 0x47, 0x5d, - 0xcf, 0x72, 0xec, 0x2d, 0xf6, 0x2f, 0x41, 0x0a, 0x44, 0x0f, 0xf1, 0x11, 0x9b, 0xcf, 0x8c, 0x4a, - 0x7f, 0xa2, 0xf7, 0x20, 0xd6, 0x71, 0x4c, 0xcc, 0x80, 0x32, 0x2b, 0x37, 0x8a, 0xa7, 0x6e, 0x5b, - 0x71, 0x80, 0xb6, 0xe1, 0x98, 0x58, 0x65, 0xdd, 0x50, 0x0b, 0xe4, 0xc3, 0x0e, 0xd1, 0x2c, 0x7b, - 0xcf, 0xc9, 0x46, 0x97, 0xa4, 0xeb, 0xa9, 0x95, 0x5b, 0x67, 0x40, 0x9c, 0x32, 0xad, 0xe2, 0xfa, - 0x46, 0xb3, 0x6e, 0xef, 0x39, 0xe5, 0xd4, 0x71, 0x3f, 0x9f, 0x10, 0x1f, 0x6a, 0xe2, 0xb0, 0x43, - 0xe8, 0x8f, 0xdc, 0x16, 0xf8, 0x34, 0x3a, 0xff, 0x9e, 0x6b, 0xb1, 0xf9, 0x27, 0x55, 0xfa, 0x13, - 0xbd, 0x06, 0x08, 0x73, 0x3c, 0x6c, 0x6a, 0x54, 0x47, 0x34, 0xba, 0xc0, 0x08, 0x5b, 0xa0, 0x12, - 0xb4, 0x54, 0x75, 0x4f, 0x5f, 0xc7, 0x47, 0x5c, 0x42, 0x42, 0x4e, 0xbf, 0x1d, 0x85, 0xcc, 0x60, - 0x2a, 0x0c, 0x7e, 0x0d, 0xe2, 0x6c, 0x73, 0x31, 0x1b, 0x21, 0xb3, 0xf2, 0xc6, 0x44, 0xe2, 0xa0, - 0x5d, 0x8b, 0x4d, 0xd6, 0x4f, 0x15, 0xfd, 0x11, 0x82, 0x18, 0xd1, 0xdb, 0x9e, 0x98, 0x08, 0xfb, - 0x8d, 0xfe, 0x58, 0x82, 0xa5, 0xd1, 0x19, 0x95, 0x8f, 0xd6, 0x37, 0x9a, 0x1b, 0x3a, 0xf1, 0xb0, - 0xbb, 0x8e, 0x8f, 0xea, 0xd5, 0x6c, 0x74, 0x29, 0x7a, 0x3d, 0xb5, 0xb2, 0x35, 0xf9, 0xc0, 0xb5, - 0x73, 0x10, 0x6b, 0xb6, 0xe7, 0x1e, 0xa9, 0xe7, 0x0e, 0x9c, 0x6b, 0xc2, 0x4b, 0x13, 0x41, 0x85, - 0x75, 0x28, 0xc9, 0x75, 0x68, 0x01, 0xa6, 0x1f, 0xe8, 0xed, 0x1e, 0x16, 0xab, 0xe5, 0x1f, 0xb7, - 0x22, 0x6f, 0x4b, 0x85, 0x6b, 0x10, 0xe7, 0x82, 0x41, 0x69, 0x48, 0x96, 0x6a, 0xcd, 0x95, 0xef, - 0xbe, 0xb5, 0x5a, 0xd9, 0x50, 0xa6, 0xc4, 0x16, 0xfc, 0x8f, 0x04, 0x57, 0x9b, 0x9e, 0x8b, 0xf5, - 0x4e, 0xdd, 0xde, 0xc7, 0x84, 0xae, 0xa9, 0x8a, 0x3d, 0xdd, 0x6a, 0x13, 0x64, 0x43, 0x86, 0xb0, - 0x16, 0x4d, 0x37, 0x4d, 0x17, 0x13, 0xc2, 0x07, 0x2c, 0xaf, 0x3e, 0xed, 0xe7, 0x2b, 0x13, 0x1d, - 0x1d, 0xc3, 0x68, 0x2f, 0x73, 0x08, 0xcb, 0xde, 0x37, 0x8c, 0x76, 0x91, 0x8f, 0x54, 0xe2, 0x70, - 0x6a, 0x9a, 0x84, 0x3f, 0xd1, 0x77, 0x20, 0x46, 0xba, 0xba, 0xcd, 0x96, 0x90, 0x5a, 0xb9, 0x16, - 0x92, 0xbf, 0x7f, 0x04, 0x9b, 0x5d, 0xdd, 0x2e, 0xc7, 0xbe, 0xe8, 0xe7, 0xa7, 0x54, 0xc6, 0x8a, - 0xca, 0x00, 0xc4, 0xd3, 0x5d, 0x4f, 0xa3, 0x56, 0x42, 0x68, 0xff, 0xf3, 0xa1, 0x8e, 0xd4, 0x8a, - 0x14, 0x0f, 0xda, 0x46, 0x71, 0xc7, 0xb7, 0x22, 0xa2, 0x7b, 0x92, 0x75, 0xa3, 0xd4, 0xc2, 0xb7, - 0xe0, 0xda, 0x88, 0x00, 0xb6, 0x5d, 0x67, 0x9f, 0xce, 0xa8, 0xf0, 0x8f, 0x71, 0x48, 0xf3, 0x03, - 0xe3, 0xcb, 0x64, 0x78, 0x40, 0xe9, 0x59, 0x06, 0x44, 0xb7, 0x41, 0xc6, 0xb6, 0xc9, 0x11, 0x22, - 0x93, 0x23, 0x24, 0xb0, 0x6d, 0xb2, 0xfe, 0xdf, 0xe2, 0x27, 0x30, 0xca, 0x36, 0x23, 0x71, 0xdc, - 0xcf, 0x47, 0x77, 0xd5, 0x3a, 0x3f, 0x8a, 0xef, 0x42, 0xce, 0xc4, 0x5d, 0x17, 0x1b, 0x3a, 0x3d, - 0x8b, 0x2d, 0x36, 0x75, 0xad, 0xa3, 0xdb, 0xd6, 0x1e, 0x26, 0x5e, 0x36, 0xc6, 0x74, 0x23, 0x3b, - 0xe0, 0xe0, 0x6b, 0xdb, 0x10, 0xed, 0xe8, 0x77, 0x24, 0x98, 0xef, 0xb9, 0x16, 0xd1, 0x5a, 0x47, - 0x5a, 0xdb, 0x31, 0xf4, 0xb6, 0xe5, 0x1d, 0x69, 0x87, 0x0f, 0xb2, 0xd3, 0xec, 0x40, 0xdc, 0x3e, - 0xd7, 0xaa, 0x08, 0x21, 0x15, 0x77, 0x5d, 0x8b, 0x94, 0x8f, 0xee, 0x0a, 0x84, 0xf5, 0x07, 0x4c, - 0x69, 0xcb, 0x0b, 0xc7, 0xfd, 0xbc, 0xb2, 0xab, 0xd6, 0xc3, 0x4d, 0xf7, 0x54, 0xa5, 0x37, 0xc2, - 0x8c, 0xf4, 0xc0, 0x9c, 0x58, 0x8e, 0xad, 0x39, 0xdc, 0x3e, 0x65, 0xe3, 0x4c, 0x50, 0x2b, 0x17, - 0xb7, 0x6c, 0xea, 0x1c, 0x1e, 0xb3, 0xc1, 0xbf, 0x2f, 0x41, 0x8e, 0xba, 0x0a, 0x6c, 0x50, 0x31, - 0x05, 0x1e, 0x46, 0x73, 0xb1, 0xe1, 0xb8, 0x66, 0x36, 0x41, 0xe5, 0x54, 0x6e, 0xfe, 0xdb, 0xa4, - 0x1e, 0x82, 0xf9, 0xaa, 0x5e, 0xcf, 0x32, 0x8b, 0xbb, 0xbb, 0xf5, 0xea, 0x71, 0x3f, 0x9f, 0xdd, - 0xf6, 0xc1, 0x83, 0x4d, 0x54, 0x19, 0xb4, 0x9a, 0xed, 0x9e, 0xd2, 0x82, 0xde, 0x86, 0x8c, 0xe1, - 0xb4, 0xdb, 0xd8, 0x60, 0xcb, 0xde, 0x55, 0xeb, 0x59, 0x99, 0x6d, 0xf0, 0xdc, 0x71, 0x3f, 0x9f, - 0xae, 0x04, 0x2d, 0x74, 0xab, 0xd3, 0x46, 0xf8, 0x13, 0xa9, 0x30, 0x1b, 0x12, 0x18, 0xf3, 0x03, - 0x49, 0x26, 0xad, 0x1b, 0x13, 0x9b, 0x30, 0x35, 0x83, 0x87, 0xbe, 0x73, 0x15, 0xb8, 0x72, 0xe2, - 0x2e, 0x9e, 0x67, 0x7a, 0x92, 0x61, 0xd3, 0xa3, 0x40, 0x86, 0x6f, 0x4a, 0x70, 0xa0, 0x3e, 0xcf, - 0x40, 0x46, 0xc5, 0xc4, 0x73, 0x5c, 0xec, 0x9f, 0xa8, 0xcf, 0x25, 0x98, 0xa7, 0x11, 0x80, 0x6b, - 0x75, 0x3d, 0xc7, 0xd5, 0x5c, 0xfc, 0xd0, 0xb5, 0x3c, 0x4c, 0xb2, 0x11, 0xa6, 0x74, 0xa5, 0x33, - 0x96, 0x30, 0x0c, 0x54, 0xac, 0x06, 0x20, 0xaa, 0xc0, 0xe0, 0x7a, 0x77, 0xfb, 0x47, 0x3f, 0xcf, - 0xdf, 0x9a, 0x68, 0x1f, 0xc7, 0x83, 0x92, 0x62, 0xbd, 0xaa, 0x22, 0x73, 0x0c, 0x18, 0x3d, 0x07, - 0x31, 0xaa, 0xb7, 0xcc, 0x55, 0x24, 0xcb, 0xf2, 0x71, 0x3f, 0x1f, 0xa3, 0x9a, 0xad, 0x32, 0xea, - 0xd0, 0x01, 0x8f, 0x3d, 0xc3, 0x01, 0x5f, 0x85, 0x94, 0xa7, 0xb7, 0xda, 0x58, 0xa3, 0x23, 0x13, - 0x71, 0xfc, 0x5e, 0x1e, 0x91, 0x04, 0xb9, 0xdf, 0x6e, 0xe9, 0x04, 0x17, 0x77, 0x28, 0x67, 0x68, - 0xed, 0xe0, 0xf9, 0x04, 0x82, 0x96, 0x21, 0xe5, 0x3c, 0xc0, 0xae, 0x6b, 0x99, 0x58, 0x33, 0x5b, - 0xec, 0x0c, 0x25, 0xcb, 0x99, 0xe3, 0x7e, 0x1e, 0xb6, 0x04, 0xb9, 0x5a, 0x56, 0xc1, 0x67, 0xa9, - 0xb6, 0x90, 0x07, 0x0b, 0xc2, 0x68, 0x04, 0xe7, 0x9f, 0xe9, 0x53, 0x82, 0x4d, 0xe1, 0xdd, 0xc9, - 0x37, 0x83, 0xef, 0xbb, 0xaf, 0x3c, 0x2c, 0xb2, 0xe0, 0x8b, 0x44, 0xad, 0xb1, 0x16, 0xf4, 0x2a, - 0xcc, 0x75, 0x5d, 0xdc, 0xd5, 0x5d, 0xac, 0x19, 0x4e, 0xa7, 0xdb, 0xc6, 0x1e, 0x36, 0x99, 0xf6, - 0xcb, 0xaa, 0x22, 0x1a, 0x2a, 0x3e, 0x1d, 0xbd, 0x44, 0xbd, 0x92, 0xee, 0xd1, 0x80, 0x87, 0x60, - 0x97, 0x72, 0x26, 0x19, 0x67, 0x9a, 0x51, 0xeb, 0x82, 0x88, 0xde, 0x84, 0x2b, 0x83, 0x7d, 0x23, - 0x5a, 0xb7, 0xd7, 0x6a, 0x5b, 0xe4, 0x00, 0x9b, 0x59, 0x60, 0xdc, 0x0b, 0xa1, 0xc6, 0x6d, 0xbf, - 0x0d, 0x1d, 0x0d, 0xa9, 0xa2, 0x41, 0x05, 0xa3, 0xef, 0xe3, 0x6c, 0x6a, 0x49, 0xba, 0x3e, 0x5d, - 0x5e, 0x7b, 0xda, 0xcf, 0x57, 0x27, 0xd6, 0x23, 0x82, 0x3b, 0xcb, 0x9e, 0x8b, 0x71, 0x48, 0x2d, - 0x2b, 0x02, 0x2f, 0xac, 0x51, 0x3e, 0x0d, 0xa9, 0x00, 0x83, 0x23, 0x98, 0x9d, 0x79, 0x66, 0x6b, - 0x17, 0x42, 0x41, 0x25, 0x48, 0xf0, 0xa0, 0x9a, 0x64, 0xd3, 0x6c, 0x03, 0xbf, 0x7d, 0x9a, 0x0e, - 0x31, 0xae, 0xd0, 0x2e, 0xf9, 0xfd, 0x50, 0x15, 0xc0, 0x3b, 0xea, 0xfa, 0x9a, 0x98, 0x61, 0x28, - 0x2f, 0x9d, 0x86, 0x72, 0xd4, 0x0d, 0x2b, 0x62, 0xd2, 0x13, 0xdf, 0x04, 0x35, 0x60, 0x86, 0x47, - 0xec, 0x02, 0x67, 0x96, 0xe1, 0xbc, 0x72, 0x0a, 0x0e, 0x0b, 0x57, 0xf4, 0x10, 0x52, 0x8a, 0x04, - 0x14, 0x82, 0xb6, 0x21, 0x43, 0x63, 0x4c, 0xca, 0x29, 0xd0, 0x14, 0x86, 0x76, 0xe3, 0x14, 0xb4, - 0xaa, 0x60, 0x0e, 0xe1, 0xa5, 0xcd, 0x10, 0x8d, 0xe4, 0x7e, 0x21, 0xc1, 0xdc, 0x98, 0xf1, 0x40, - 0x3b, 0x10, 0x09, 0xd2, 0x06, 0x6a, 0xd3, 0x23, 0x2c, 0x65, 0xb8, 0x8c, 0x21, 0x89, 0x58, 0x26, - 0xda, 0x87, 0x24, 0x55, 0x67, 0xdb, 0xa3, 0x39, 0x49, 0x84, 0x81, 0x37, 0x8e, 0xfb, 0x79, 0x79, - 0x9b, 0x11, 0x2f, 0x3d, 0x84, 0xcc, 0xc1, 0xeb, 0x26, 0xca, 0x43, 0xca, 0x73, 0x34, 0xfc, 0xc8, - 0x22, 0x9e, 0x65, 0xef, 0xb3, 0x60, 0x41, 0x56, 0xc1, 0x73, 0x6a, 0x82, 0x92, 0xfb, 0x93, 0x08, - 0xa0, 0xf1, 0x53, 0x8a, 0xfe, 0x41, 0x82, 0xe7, 0xfc, 0x18, 0xc0, 0x71, 0xad, 0x7d, 0xcb, 0xd6, - 0xdb, 0x43, 0xc1, 0x80, 0xc4, 0xa4, 0xfd, 0xe9, 0x65, 0x4c, 0x81, 0x08, 0x10, 0xb6, 0x04, 0xfc, - 0x68, 0xa0, 0xf0, 0x1c, 0xf5, 0xa0, 0x3c, 0x50, 0x18, 0x63, 0xb9, 0xa7, 0x66, 0x7b, 0xa7, 0x74, - 0xce, 0xad, 0xc3, 0xf3, 0x67, 0x02, 0x5f, 0xc4, 0x77, 0xe5, 0x7e, 0x24, 0xc1, 0xb5, 0x53, 0x3c, - 0x4a, 0x18, 0x27, 0xcd, 0x71, 0x3e, 0x0c, 0xe3, 0xa4, 0x56, 0x7e, 0xe5, 0x12, 0x5e, 0x2b, 0x34, - 0x89, 0x46, 0x4c, 0x96, 0x94, 0x48, 0xe1, 0x0d, 0x98, 0x15, 0x9d, 0x7c, 0x3f, 0x8a, 0x9e, 0x07, - 0x38, 0xb0, 0xf6, 0x0f, 0xb4, 0x87, 0xba, 0x87, 0x5d, 0x91, 0x4b, 0x26, 0x29, 0xe5, 0x23, 0x4a, - 0x28, 0xfc, 0xab, 0x0c, 0xe9, 0x7a, 0xa7, 0xeb, 0xb8, 0x9e, 0xef, 0x65, 0xef, 0x42, 0x9c, 0xf9, - 0x05, 0x22, 0xf6, 0xaf, 0x78, 0xc6, 0x0c, 0x87, 0x7a, 0x72, 0xff, 0x22, 0xcc, 0x82, 0xc0, 0x08, - 0xdc, 0x5f, 0xe4, 0x44, 0xf7, 0xf7, 0x1e, 0xc4, 0x79, 0x49, 0x40, 0x04, 0xe4, 0xf9, 0x13, 0x22, - 0xf9, 0xfa, 0xd6, 0x1d, 0xab, 0x8d, 0xef, 0x30, 0x36, 0x1f, 0x9c, 0x77, 0x42, 0x2f, 0x83, 0x4c, - 0x88, 0xa7, 0x11, 0xeb, 0x87, 0xdc, 0x7b, 0x46, 0x79, 0x4e, 0xda, 0x6c, 0xee, 0x34, 0xad, 0x1f, - 0x62, 0x35, 0x41, 0x88, 0x47, 0x7f, 0xa0, 0x1c, 0xc8, 0x0f, 0xf5, 0x76, 0x9b, 0x79, 0xd9, 0x69, - 0x96, 0x83, 0x07, 0xdf, 0xc3, 0xc7, 0x2c, 0xfe, 0xcd, 0x1e, 0x33, 0xe1, 0x30, 0xbb, 0xba, 0x77, - 0xc0, 0x22, 0xc7, 0xa4, 0x0a, 0x9c, 0xb4, 0xad, 0x7b, 0x07, 0x28, 0x0b, 0x09, 0xa2, 0x53, 0xdf, - 0x45, 0xb2, 0xf2, 0x52, 0xf4, 0xfa, 0x8c, 0xea, 0x7f, 0xa2, 0x45, 0x60, 0x9e, 0x97, 0x7f, 0x32, - 0x27, 0x16, 0x55, 0x43, 0x14, 0x26, 0x87, 0x43, 0xab, 0xab, 0xed, 0x1d, 0x12, 0xee, 0xb4, 0x84, - 0x1c, 0x0e, 0xad, 0xee, 0x9d, 0x75, 0xa2, 0x26, 0x68, 0xe3, 0x9d, 0x43, 0x82, 0x5e, 0x81, 0x59, - 0x8b, 0x65, 0x2e, 0x9a, 0x69, 0xb9, 0xd8, 0xf0, 0xda, 0x47, 0xcc, 0x61, 0xc9, 0x6a, 0x86, 0x93, - 0xab, 0x82, 0x8a, 0x6e, 0x80, 0x32, 0xea, 0x66, 0x99, 0xa3, 0x91, 0xd5, 0xd9, 0x11, 0x2f, 0x4b, - 0x59, 0xf9, 0x56, 0x87, 0x1c, 0x67, 0x9a, 0xb3, 0x72, 0xfa, 0xc0, 0x67, 0x16, 0x61, 0xbe, 0xab, - 0xbb, 0x04, 0x6b, 0xad, 0x9e, 0x6d, 0xb6, 0xb1, 0xc6, 0x6d, 0x75, 0x36, 0xc3, 0xb8, 0xe7, 0x58, - 0x53, 0x99, 0xb5, 0x70, 0xb3, 0x7e, 0x5e, 0xec, 0x7d, 0xf5, 0xff, 0x20, 0xf6, 0xce, 0xfd, 0x34, - 0x02, 0xd3, 0x4c, 0xcf, 0xd1, 0x2d, 0x88, 0xd1, 0x6d, 0x16, 0x99, 0xdd, 0xa4, 0x31, 0x17, 0xeb, - 0x83, 0x10, 0xc4, 0x6c, 0xbd, 0x83, 0xb3, 0x88, 0x29, 0x01, 0xfb, 0x8d, 0xae, 0x41, 0x82, 0xe0, - 0xfb, 0xda, 0x03, 0xbd, 0x9d, 0x9d, 0x67, 0x3b, 0x1c, 0x27, 0xf8, 0xfe, 0x3d, 0xbd, 0x8d, 0xae, - 0x40, 0xdc, 0x22, 0x9a, 0x8d, 0x1f, 0x66, 0x17, 0x98, 0xa4, 0xa6, 0x2d, 0xb2, 0x89, 0x1f, 0x32, - 0xb3, 0xad, 0xbb, 0xfb, 0xd8, 0xd3, 0x0c, 0xa7, 0x4d, 0xb2, 0x57, 0xe8, 0x01, 0xa3, 0x21, 0x1d, - 0x25, 0x55, 0x9c, 0x36, 0x41, 0xff, 0x0f, 0x92, 0x0f, 0x75, 0xa2, 0xe1, 0x4e, 0xd7, 0x3b, 0x62, - 0xc2, 0x92, 0xa9, 0xda, 0x93, 0x1a, 0xfd, 0x6e, 0xc4, 0xe4, 0x88, 0x12, 0x6d, 0xc4, 0xe4, 0xa8, - 0x12, 0x6b, 0xc4, 0xe4, 0x98, 0x32, 0xdd, 0x88, 0xc9, 0xd3, 0x4a, 0xbc, 0x11, 0x93, 0xe3, 0x4a, - 0xa2, 0x11, 0x93, 0x13, 0x8a, 0xdc, 0x88, 0xc9, 0xb2, 0x92, 0x6c, 0xc4, 0xe4, 0xa4, 0x02, 0x8d, - 0x98, 0x0c, 0x4a, 0xaa, 0x11, 0x93, 0x53, 0xca, 0x4c, 0x23, 0x26, 0xcf, 0x28, 0xe9, 0x46, 0x4c, - 0x4e, 0x2b, 0x99, 0x46, 0x4c, 0xce, 0x28, 0xb3, 0x8d, 0x98, 0x3c, 0xab, 0x28, 0x8d, 0x98, 0xac, - 0x28, 0x73, 0x8d, 0x98, 0x3c, 0xa7, 0xa0, 0xc2, 0xe7, 0x12, 0x28, 0x4d, 0x7c, 0xbf, 0x87, 0x6d, - 0x03, 0xdf, 0xd3, 0xdb, 0x95, 0x83, 0x9e, 0x7d, 0x88, 0x5e, 0x86, 0x59, 0x83, 0xfe, 0xd0, 0x78, - 0x62, 0x4c, 0x97, 0x2a, 0xb1, 0xa5, 0xa6, 0x19, 0xb9, 0x49, 0xa9, 0x74, 0xc5, 0xcf, 0x03, 0x08, - 0x3e, 0x7a, 0xb2, 0x79, 0xd5, 0x2c, 0xc9, 0x59, 0xe8, 0x71, 0x1e, 0x81, 0x71, 0x9d, 0x87, 0xcc, - 0x7c, 0x0c, 0xc1, 0xa8, 0xce, 0x43, 0xb4, 0x0c, 0x0b, 0x36, 0x7e, 0xe4, 0x69, 0xa3, 0xcc, 0xcc, - 0x54, 0xa8, 0x73, 0xb4, 0xad, 0x12, 0xee, 0x50, 0xf8, 0x97, 0x08, 0xcc, 0xfa, 0x93, 0xf6, 0xcd, - 0xe1, 0x1e, 0x28, 0x74, 0x5b, 0x2c, 0x53, 0xf3, 0x1c, 0x8e, 0xe4, 0x1b, 0xc6, 0xf7, 0xce, 0x30, - 0x8c, 0x23, 0x28, 0xf4, 0xbb, 0x6e, 0xee, 0x38, 0x6c, 0x38, 0xee, 0x1a, 0xd4, 0x34, 0x09, 0xd3, - 0x72, 0xbb, 0x90, 0xf1, 0x3b, 0x71, 0x0a, 0xaa, 0x40, 0x7c, 0x68, 0xbc, 0x57, 0x27, 0x18, 0xcf, - 0x17, 0xb5, 0x2a, 0xba, 0xe6, 0x7e, 0x03, 0xd0, 0xf8, 0xd8, 0x61, 0xb7, 0x34, 0xcd, 0xdd, 0xd2, - 0xd6, 0xb0, 0x5b, 0x7a, 0xe7, 0x62, 0x6b, 0x0b, 0x4d, 0x3b, 0x9c, 0xd5, 0xfd, 0x53, 0x04, 0x32, - 0xdc, 0x45, 0x04, 0xee, 0xe8, 0x55, 0x98, 0x63, 0x46, 0xcb, 0xb2, 0xf7, 0xb5, 0xae, 0x20, 0xb2, - 0xf5, 0x45, 0x54, 0xc5, 0x6f, 0x08, 0x98, 0x5f, 0x80, 0xb4, 0x8b, 0x75, 0x73, 0xc0, 0x18, 0x61, - 0x8c, 0x33, 0x94, 0x18, 0x30, 0xbd, 0x04, 0x19, 0xe6, 0x0d, 0x07, 0x5c, 0x51, 0xc6, 0x95, 0x66, - 0xd4, 0x80, 0xad, 0x0c, 0x69, 0xd2, 0xd5, 0xed, 0x01, 0x57, 0x8c, 0x09, 0xf5, 0x9c, 0xda, 0xd1, - 0x0c, 0xed, 0x13, 0xf6, 0xa5, 0x2e, 0x26, 0xbd, 0x0e, 0xd6, 0xba, 0x0e, 0x4f, 0xb6, 0xa2, 0x6a, - 0x92, 0x53, 0xb6, 0x1d, 0x82, 0x76, 0x99, 0xaa, 0x30, 0x59, 0x68, 0x26, 0x17, 0x4e, 0x36, 0xce, - 0x46, 0xb9, 0x39, 0xb9, 0x38, 0xd5, 0x59, 0x32, 0x4c, 0x28, 0xfc, 0x8d, 0x04, 0xd7, 0x68, 0xc0, - 0xcc, 0xad, 0x62, 0x85, 0x55, 0xb2, 0x7d, 0xed, 0xd4, 0x21, 0xc1, 0x82, 0xee, 0x20, 0xfe, 0x5c, - 0x3b, 0xee, 0xe7, 0xe3, 0x94, 0xfb, 0xd2, 0x9e, 0x2b, 0x4e, 0x81, 0xeb, 0x2c, 0x3d, 0xf2, 0x5c, - 0xdd, 0x26, 0x16, 0x4d, 0x14, 0xe8, 0xb6, 0x75, 0x70, 0xa7, 0x85, 0x5d, 0xbe, 0x19, 0x33, 0xea, - 0xc2, 0x50, 0xe3, 0x06, 0x6f, 0x2b, 0xe4, 0x20, 0x3b, 0x3a, 0xe5, 0x20, 0xb3, 0xff, 0x55, 0xb8, - 0xba, 0x89, 0x1f, 0x9e, 0xb4, 0x9a, 0x32, 0x24, 0xb8, 0xfd, 0xf2, 0x55, 0xfe, 0xfa, 0xa8, 0x55, - 0x0d, 0x17, 0xf3, 0x8b, 0x6c, 0xa6, 0x3b, 0xac, 0x83, 0xea, 0x77, 0x2c, 0x7c, 0x0a, 0xd7, 0x46, - 0xd0, 0x83, 0xed, 0x7b, 0x1f, 0xe2, 0x34, 0xf3, 0x13, 0x91, 0x4d, 0x66, 0x3c, 0xab, 0x18, 0x47, - 0x6f, 0x52, 0x7e, 0x55, 0x74, 0x2b, 0xa8, 0xac, 0x24, 0xd1, 0xeb, 0x60, 0xaa, 0x21, 0x77, 0x2d, - 0xe2, 0xa1, 0x0f, 0x60, 0x46, 0x68, 0x04, 0x55, 0x14, 0x7f, 0xda, 0xe7, 0x28, 0x55, 0xca, 0x0d, - 0x40, 0x48, 0xe1, 0x6f, 0x25, 0x98, 0xaf, 0xba, 0x4e, 0xb7, 0x8b, 0x4d, 0xe1, 0x2b, 0xb8, 0x2c, - 0x7c, 0x17, 0x21, 0x85, 0x5c, 0xc4, 0x26, 0x44, 0xea, 0x55, 0x91, 0x0b, 0xdc, 0xbe, 0x6c, 0x8a, - 0x51, 0xaf, 0xa2, 0x77, 0xb8, 0x40, 0x7a, 0x84, 0xd9, 0xcf, 0xcc, 0x58, 0xd2, 0x37, 0xa4, 0xa6, - 0x8c, 0x51, 0x15, 0x1d, 0x0a, 0x3f, 0x49, 0xc0, 0x95, 0xb0, 0x90, 0x57, 0x2b, 0xfe, 0xc4, 0x3f, - 0x83, 0x84, 0x65, 0x9b, 0xf8, 0x11, 0x9e, 0xc8, 0x4e, 0x9e, 0x04, 0x51, 0x14, 0xf2, 0xa8, 0x53, - 0x18, 0x3f, 0xcd, 0x14, 0x98, 0xe8, 0xe3, 0x20, 0x3c, 0xe5, 0x65, 0x9f, 0x5b, 0xcf, 0x8c, 0x5e, - 0x1d, 0x09, 0x55, 0x87, 0x22, 0x41, 0xe6, 0x50, 0xbe, 0xa1, 0x48, 0xb0, 0x09, 0x73, 0x96, 0xed, - 0x61, 0xb7, 0x8d, 0xf5, 0x07, 0x34, 0xb0, 0xa1, 0xc3, 0x8b, 0xea, 0xcf, 0xa4, 0x61, 0x84, 0x12, - 0x02, 0xe0, 0xe1, 0xc8, 0x67, 0x30, 0x1f, 0x06, 0xf5, 0xb7, 0xe0, 0xec, 0x8a, 0x10, 0x93, 0xf0, - 0x00, 0xd6, 0x2f, 0xbc, 0x84, 0x80, 0xea, 0x42, 0xec, 0xf7, 0x20, 0xce, 0x13, 0x7d, 0x51, 0x5e, - 0xbd, 0xfd, 0xac, 0x62, 0xe7, 0x05, 0x04, 0x55, 0xa0, 0xe5, 0xfe, 0x48, 0x82, 0x99, 0xf0, 0x76, - 0x23, 0x0b, 0x64, 0x36, 0x77, 0xdf, 0xa4, 0x45, 0xcb, 0x9b, 0x34, 0x96, 0x65, 0x8d, 0x6c, 0x0f, - 0xde, 0x7f, 0xe6, 0x3d, 0xe0, 0x10, 0x42, 0x95, 0xea, 0x26, 0x0d, 0x90, 0x4c, 0xd7, 0xe9, 0x0e, - 0xca, 0xeb, 0x51, 0x55, 0xa6, 0x04, 0x1a, 0xf3, 0xe5, 0x7e, 0x13, 0x92, 0x81, 0xa2, 0x84, 0x32, - 0xfc, 0xe8, 0xd7, 0x98, 0xe1, 0x9f, 0x39, 0x7e, 0x15, 0xd2, 0x43, 0x12, 0x43, 0x57, 0x83, 0x39, - 0xc4, 0xca, 0x71, 0x3e, 0x87, 0x73, 0x51, 0x0a, 0x3f, 0x8f, 0xc3, 0xfc, 0x49, 0x96, 0xf6, 0x13, - 0x50, 0x42, 0x76, 0x4b, 0x6b, 0x5b, 0xc4, 0x13, 0xe7, 0xe9, 0xc6, 0xd9, 0x09, 0x69, 0xc8, 0xf8, - 0x09, 0x6d, 0xc9, 0xb8, 0xc3, 0x26, 0xf1, 0xfb, 0x90, 0x31, 0xf9, 0xc4, 0x35, 0x71, 0x50, 0xa3, - 0xe7, 0xe6, 0x91, 0x27, 0x18, 0x40, 0x81, 0x9e, 0x36, 0x43, 0x4d, 0x84, 0xdd, 0x3b, 0xf8, 0xe8, - 0x41, 0x6d, 0xc7, 0x32, 0xd9, 0xe9, 0x49, 0x97, 0x9b, 0xc7, 0xfd, 0xfc, 0x9c, 0xc0, 0xf2, 0x8b, - 0x39, 0x97, 0xde, 0xa9, 0x39, 0x73, 0x04, 0xd0, 0xa4, 0x5e, 0x97, 0xb6, 0xd3, 0x81, 0xa7, 0x07, - 0x5e, 0x97, 0x9e, 0xa3, 0xcb, 0x7b, 0x5d, 0xfa, 0xb3, 0x6e, 0xa2, 0xdf, 0x95, 0x60, 0x8e, 0x57, - 0x76, 0x3b, 0x3d, 0x4f, 0xe7, 0xe5, 0x7a, 0x3f, 0x3f, 0xfd, 0xe4, 0xb8, 0x9f, 0x9f, 0x65, 0x02, - 0xd9, 0x10, 0x6d, 0x6c, 0xd8, 0xf2, 0xb3, 0x0e, 0x3b, 0x40, 0x11, 0x39, 0x5b, 0x40, 0x30, 0xd1, - 0x3a, 0x64, 0x78, 0xb2, 0xad, 0xd1, 0x74, 0xd3, 0x72, 0x6c, 0x96, 0xb8, 0xa6, 0xcb, 0x2f, 0x3e, - 0xed, 0xe7, 0x97, 0x4e, 0xd0, 0x2c, 0x9e, 0xa7, 0xdf, 0xe3, 0xbc, 0x6a, 0x7a, 0x2f, 0xfc, 0x89, - 0x0c, 0x48, 0x07, 0xaa, 0x71, 0xd4, 0x15, 0x79, 0xee, 0xe5, 0x5d, 0xd9, 0x8c, 0xaf, 0x23, 0x14, - 0x13, 0xed, 0xc3, 0xac, 0x3f, 0x08, 0x77, 0xe8, 0x24, 0x9b, 0xfc, 0x5a, 0x86, 0xf1, 0xd5, 0x9a, - 0xaf, 0x9a, 0x88, 0x92, 0xcb, 0x55, 0x58, 0x38, 0x31, 0xca, 0xf9, 0x32, 0x0e, 0x57, 0x87, 0x0d, - 0x61, 0x10, 0x87, 0x68, 0xa3, 0x1e, 0xf2, 0xfd, 0x89, 0x8d, 0xa9, 0x8f, 0xc1, 0x8d, 0x99, 0xff, - 0x35, 0xea, 0x23, 0x3f, 0x1b, 0xf1, 0x91, 0xcf, 0x80, 0xcf, 0xd4, 0x6b, 0x04, 0xdf, 0x77, 0x94, - 0x1f, 0x07, 0xbe, 0x80, 0x57, 0x6d, 0x3e, 0x78, 0x06, 0x78, 0xd6, 0xdf, 0xff, 0x0c, 0xbc, 0xc1, - 0x3f, 0x4b, 0x90, 0x1e, 0x5a, 0xd9, 0x2f, 0xd3, 0x1d, 0x6c, 0x07, 0xd1, 0x10, 0x7f, 0x5e, 0xf1, - 0xf6, 0xc5, 0x97, 0x35, 0x1c, 0x24, 0xe5, 0xfe, 0x5e, 0x82, 0xf4, 0x90, 0x20, 0xbf, 0x21, 0x47, - 0xf2, 0xf5, 0xcf, 0xbc, 0x05, 0x99, 0xe1, 0x2d, 0x0a, 0x8d, 0x21, 0x7d, 0x3d, 0x63, 0x14, 0xbe, - 0x07, 0x71, 0x4e, 0x41, 0x08, 0x32, 0x1f, 0x95, 0xea, 0x3b, 0xf5, 0xcd, 0x55, 0xed, 0xce, 0x96, - 0xaa, 0xad, 0x56, 0x94, 0x29, 0x34, 0x03, 0x72, 0xb5, 0x76, 0xb7, 0x46, 0x89, 0x8a, 0x84, 0x52, - 0x90, 0x60, 0x5f, 0xb5, 0xaa, 0x12, 0x29, 0x94, 0x41, 0xe1, 0xd8, 0x7b, 0x98, 0x3a, 0x06, 0x1a, - 0xf7, 0xa3, 0x22, 0xcc, 0xb3, 0x20, 0xbd, 0x43, 0xe3, 0x37, 0xea, 0x0a, 0xb5, 0x50, 0xf4, 0x3c, - 0x17, 0x34, 0x51, 0xa7, 0xb8, 0xa9, 0x77, 0x70, 0xe1, 0xef, 0x62, 0x30, 0x37, 0x00, 0xf1, 0xdd, - 0xe2, 0xcb, 0x20, 0x13, 0xcb, 0x3e, 0xd4, 0x06, 0x97, 0xe6, 0xbc, 0x90, 0x66, 0xd9, 0x87, 0xbb, - 0x6a, 0x5d, 0x4d, 0xd0, 0xc6, 0x5d, 0xd7, 0x42, 0x0d, 0x88, 0x39, 0x5d, 0xcf, 0xcf, 0x21, 0xdf, - 0x3a, 0x43, 0x14, 0x63, 0x63, 0x14, 0xb7, 0xba, 0x9e, 0xa8, 0x00, 0x30, 0x0c, 0xf4, 0x57, 0xd2, - 0x20, 0xeb, 0xe1, 0xd9, 0xe2, 0x3b, 0x17, 0xc2, 0xe3, 0x02, 0x10, 0x37, 0x98, 0x1f, 0xd1, 0x83, - 0xfa, 0xb4, 0x9f, 0x9f, 0x1b, 0x15, 0x10, 0xb9, 0xe4, 0xd5, 0xa6, 0x3f, 0x45, 0xd4, 0xe0, 0x97, - 0x6a, 0x03, 0x41, 0x33, 0x87, 0x30, 0xe1, 0xbd, 0x65, 0x7a, 0x68, 0x23, 0x72, 0xfb, 0x30, 0x13, - 0x9e, 0xfd, 0x09, 0xd5, 0xf2, 0xd2, 0x70, 0x59, 0xe2, 0xd5, 0x89, 0x24, 0x23, 0x52, 0xc2, 0x50, - 0x89, 0xfe, 0x7b, 0x90, 0x0c, 0xc4, 0x7e, 0x91, 0xda, 0x3e, 0xb7, 0xf1, 0x41, 0xb1, 0x6c, 0x5a, - 0x89, 0x17, 0xfe, 0x5a, 0x82, 0x19, 0x15, 0x13, 0xa7, 0xfd, 0x00, 0x9b, 0x34, 0xe6, 0x09, 0xde, - 0xa2, 0x48, 0x93, 0xbf, 0x45, 0x29, 0x41, 0x32, 0xa8, 0x66, 0x5e, 0xe4, 0x5d, 0xc7, 0xa0, 0x17, - 0xba, 0x01, 0x4a, 0xcb, 0xe9, 0xd9, 0xa6, 0xee, 0x1e, 0x69, 0x2e, 0xd6, 0x8d, 0x03, 0x6c, 0x8a, - 0x9b, 0x9b, 0x59, 0x9f, 0xae, 0x72, 0x72, 0xe1, 0xc7, 0x11, 0x40, 0x03, 0xe1, 0x84, 0x4c, 0x11, - 0x8d, 0xdc, 0xd8, 0x3a, 0x44, 0xf2, 0x1a, 0x39, 0xf1, 0xae, 0x6d, 0x24, 0x00, 0x0c, 0x16, 0xee, - 0x6f, 0xa9, 0x1b, 0xa2, 0x11, 0xf4, 0x87, 0x67, 0xd7, 0x6c, 0xa3, 0xac, 0x66, 0xcb, 0xb4, 0xf4, - 0x97, 0x5a, 0xb7, 0x15, 0xce, 0xfa, 0xbf, 0x63, 0x80, 0x2a, 0x2e, 0xd6, 0x3d, 0x4c, 0x2d, 0x0f, - 0x39, 0x2b, 0xd7, 0x2e, 0xc3, 0x34, 0x4f, 0xcc, 0x22, 0x17, 0x49, 0xcc, 0x84, 0x50, 0x78, 0x57, - 0xf4, 0x03, 0x98, 0x31, 0x9c, 0x76, 0xaf, 0x63, 0x6b, 0xec, 0xc6, 0x59, 0x04, 0xc2, 0xdf, 0x3d, - 0x4b, 0x89, 0xc7, 0x26, 0x57, 0xac, 0x38, 0x6d, 0xfa, 0xed, 0xd7, 0x0e, 0x38, 0x20, 0xe3, 0x40, - 0xcf, 0x41, 0x32, 0x38, 0x50, 0x2c, 0x04, 0x4e, 0xaa, 0x03, 0x02, 0x5a, 0x81, 0x69, 0x9d, 0x68, - 0xce, 0x1e, 0x8b, 0x51, 0xcf, 0xd3, 0x30, 0x35, 0xa6, 0x93, 0xad, 0x3d, 0xf4, 0x26, 0xa4, 0xf7, - 0xee, 0xf3, 0xb8, 0x9d, 0x1b, 0x50, 0xfe, 0x10, 0x60, 0xf6, 0xb8, 0x9f, 0x4f, 0xdd, 0xf9, 0x90, - 0x2d, 0x96, 0x9a, 0x4f, 0x35, 0xb5, 0x77, 0x3f, 0xf8, 0x40, 0x37, 0x61, 0xae, 0xa3, 0x3f, 0xd2, - 0xf6, 0x5c, 0xdd, 0x10, 0x81, 0x6a, 0x9b, 0x5b, 0x05, 0x49, 0x9d, 0xed, 0xe8, 0x8f, 0xee, 0x08, - 0x7a, 0xdd, 0x6c, 0xe3, 0xdc, 0x7f, 0x49, 0x90, 0x10, 0x2b, 0x42, 0x5d, 0x00, 0x21, 0x1e, 0xcb, - 0xe4, 0xa1, 0x50, 0xba, 0xfc, 0xe1, 0x71, 0x3f, 0x9f, 0xac, 0x30, 0x6a, 0xbd, 0x4a, 0x9e, 0xf6, - 0xf3, 0x1f, 0x3c, 0xab, 0xd1, 0xf2, 0x41, 0xd4, 0x24, 0x1f, 0xa4, 0x6e, 0xb2, 0x82, 0xe2, 0x81, - 0x4e, 0xb4, 0x03, 0x8b, 0x78, 0xce, 0xbe, 0xab, 0x77, 0xd8, 0xe6, 0xca, 0xea, 0xcc, 0x81, 0x4e, - 0xd6, 0x7c, 0x1a, 0xca, 0xd1, 0x90, 0xe3, 0x01, 0x7f, 0x30, 0xc0, 0x8f, 0x54, 0xf0, 0x8d, 0x56, - 0xe0, 0x4a, 0xd0, 0x59, 0xa3, 0x8b, 0x6e, 0xf5, 0x8c, 0x43, 0xcc, 0x3c, 0x01, 0xb5, 0x59, 0xf3, - 0x41, 0xe3, 0x86, 0xfe, 0xa8, 0xcc, 0x9b, 0x0a, 0x57, 0x60, 0x3e, 0xb4, 0xad, 0x41, 0x80, 0xf8, - 0x97, 0x33, 0x90, 0xd8, 0xd6, 0x8f, 0xda, 0x8e, 0x6e, 0xa2, 0x25, 0x48, 0xf9, 0x17, 0xfd, 0x34, - 0xc4, 0xe6, 0x7a, 0x18, 0x26, 0x21, 0x0b, 0x32, 0x3d, 0x82, 0x5d, 0xba, 0x27, 0x1a, 0x7b, 0xba, - 0xca, 0x6d, 0x55, 0xb9, 0xfc, 0xb4, 0x9f, 0xbf, 0x3d, 0x99, 0x88, 0xb0, 0xd1, 0x73, 0x2d, 0xef, - 0xa8, 0xd8, 0xfc, 0xf0, 0xee, 0xae, 0x80, 0xa2, 0x07, 0xc9, 0x51, 0xd3, 0xbd, 0xf0, 0xa7, 0x78, - 0x36, 0x41, 0x97, 0xab, 0x75, 0x2c, 0xc3, 0x75, 0x88, 0x5f, 0x5d, 0x17, 0xd4, 0x0d, 0x46, 0x44, - 0xaf, 0xc0, 0xec, 0x9e, 0x65, 0xb3, 0x9b, 0x1d, 0x9f, 0x8f, 0x17, 0xd6, 0x33, 0x3e, 0x59, 0x30, - 0x3e, 0x80, 0x4c, 0xe8, 0xa9, 0x04, 0xdd, 0xea, 0x38, 0xdb, 0xea, 0xad, 0xe3, 0x7e, 0x3e, 0x3d, - 0x38, 0x3a, 0x7c, 0xbb, 0x2f, 0xe3, 0xa3, 0xd2, 0x83, 0x61, 0xe8, 0x66, 0x2f, 0xc0, 0x34, 0x7b, - 0xb2, 0xcc, 0x5f, 0x47, 0xa9, 0xfc, 0x03, 0xbd, 0x05, 0xd3, 0x6d, 0xac, 0x13, 0x2c, 0x1e, 0x3e, - 0x2d, 0x9d, 0x71, 0x18, 0xd9, 0xcb, 0x60, 0x95, 0xb3, 0xa3, 0x32, 0xc4, 0xf9, 0x5d, 0x1d, 0xbb, - 0x61, 0x1b, 0x2f, 0x4d, 0x9e, 0xfa, 0xc6, 0x6d, 0x6d, 0x4a, 0x15, 0x3d, 0x51, 0x0d, 0x12, 0x2e, - 0xbf, 0x9e, 0x65, 0xf7, 0x6e, 0xe7, 0x26, 0xdb, 0xa1, 0xdb, 0xdf, 0xb5, 0x29, 0xd5, 0xef, 0x8b, - 0x76, 0xfc, 0x37, 0x12, 0xdc, 0xaa, 0x8b, 0x27, 0x20, 0xc5, 0x09, 0x03, 0xb2, 0x01, 0xe0, 0x10, - 0x0a, 0x5d, 0xa0, 0xc5, 0x6a, 0xf5, 0xec, 0xfa, 0xee, 0xec, 0x05, 0x0e, 0xdd, 0xfb, 0xd2, 0x05, - 0xf2, 0x9e, 0x68, 0x13, 0xc0, 0x08, 0x3c, 0x0d, 0xbb, 0xd8, 0x4b, 0xad, 0xbc, 0x76, 0x91, 0x68, - 0x66, 0x6d, 0x4a, 0x0d, 0x21, 0xa0, 0x0f, 0x21, 0x65, 0x0c, 0x8e, 0x4e, 0x76, 0x96, 0x01, 0xbe, - 0x7e, 0x21, 0xfb, 0xb9, 0x46, 0x6d, 0xe6, 0x80, 0x3a, 0x6c, 0x33, 0x95, 0x51, 0x9b, 0x59, 0x83, - 0xb4, 0xa8, 0x8b, 0xf0, 0xd7, 0xee, 0xd9, 0x39, 0x66, 0xb2, 0xc3, 0x5a, 0xe2, 0xbf, 0x87, 0x2f, - 0xd6, 0x6c, 0xc3, 0x31, 0xb1, 0x59, 0xa3, 0xdf, 0xaa, 0x28, 0x03, 0xb3, 0x0f, 0x82, 0x56, 0x21, - 0x63, 0xb4, 0xb1, 0x6e, 0xf7, 0xba, 0x3e, 0x0e, 0x9a, 0x10, 0x27, 0x2d, 0xfa, 0x09, 0xa0, 0x4d, - 0x40, 0x7b, 0xec, 0x5d, 0x45, 0x78, 0x56, 0xec, 0x7e, 0x70, 0x12, 0x30, 0x85, 0xf5, 0x55, 0x07, - 0x33, 0x43, 0x2f, 0x42, 0xda, 0x76, 0x6c, 0x43, 0xb7, 0x0d, 0xdc, 0x66, 0xde, 0x8d, 0x5f, 0x29, - 0x0e, 0x13, 0xd1, 0xa7, 0x90, 0x21, 0x43, 0x21, 0x7c, 0xf6, 0x0a, 0x1b, 0xf1, 0x8d, 0x8b, 0x16, - 0xfd, 0xd6, 0xa6, 0xd4, 0x11, 0x24, 0xf4, 0x6b, 0xa0, 0x78, 0x23, 0x37, 0x03, 0xec, 0x72, 0xf2, - 0xec, 0x37, 0x4c, 0xa7, 0xdc, 0x7f, 0xac, 0x4d, 0xa9, 0x63, 0x68, 0xe8, 0x33, 0x98, 0x25, 0xc3, - 0xaf, 0x74, 0xb3, 0xd7, 0xd8, 0x00, 0xdf, 0x39, 0xb3, 0xbc, 0x7d, 0xd2, 0xc3, 0xe6, 0xb5, 0x29, - 0x75, 0x14, 0x8b, 0xc2, 0xdb, 0xc3, 0x17, 0x0c, 0xd9, 0xec, 0xb9, 0xf0, 0x27, 0x5f, 0x78, 0x50, - 0xf8, 0x11, 0xac, 0x72, 0x12, 0x12, 0xe2, 0xee, 0x28, 0xb8, 0x91, 0x4d, 0x28, 0x72, 0xe1, 0x2f, - 0x64, 0x90, 0x83, 0xd0, 0x6d, 0x19, 0x50, 0xe0, 0x6c, 0x07, 0xcf, 0xe0, 0xa8, 0xd7, 0x88, 0xac, - 0x4d, 0xa9, 0x73, 0x7e, 0xdb, 0xe0, 0x25, 0xdc, 0x2b, 0x30, 0xdb, 0x71, 0x4c, 0x6b, 0xcf, 0x1a, - 0xd8, 0x6a, 0x5e, 0x29, 0xcc, 0xf8, 0x64, 0x61, 0xab, 0x6f, 0x0f, 0xbd, 0x16, 0x99, 0xe4, 0x95, - 0xf4, 0xda, 0x54, 0xe8, 0x39, 0x09, 0xf5, 0x1d, 0x6e, 0xcf, 0x66, 0xd7, 0x44, 0x22, 0x5b, 0xe4, - 0x61, 0x49, 0x5a, 0x50, 0x45, 0xc2, 0x57, 0x19, 0x31, 0xa6, 0x37, 0xce, 0x35, 0xa6, 0xfe, 0xda, - 0xd7, 0xa4, 0xc0, 0x9a, 0xde, 0x19, 0xb5, 0xa6, 0x37, 0xcf, 0xb7, 0xa6, 0x21, 0x98, 0xc0, 0x9c, - 0xee, 0x9e, 0x68, 0x4e, 0x97, 0x27, 0xd4, 0xf5, 0x10, 0xe2, 0xb0, 0x3d, 0xad, 0x8c, 0xd8, 0xd3, - 0x1b, 0xe7, 0xda, 0xd3, 0xf0, 0x1a, 0x85, 0x41, 0xdd, 0x3a, 0xc1, 0xa0, 0xbe, 0x3e, 0x91, 0x41, - 0x0d, 0x81, 0x85, 0x2d, 0xaa, 0x7a, 0x92, 0x45, 0x2d, 0x4e, 0x66, 0x51, 0x43, 0x90, 0x43, 0x26, - 0xf5, 0xfb, 0x63, 0xe6, 0x42, 0x39, 0xff, 0xbc, 0x9d, 0x58, 0x22, 0x58, 0x93, 0xc6, 0xec, 0x85, - 0x7e, 0x82, 0xbd, 0x98, 0x63, 0xf0, 0x6f, 0x5e, 0xc0, 0x5e, 0x84, 0x06, 0x18, 0x37, 0x18, 0x1f, - 0xc3, 0x4c, 0xf8, 0x90, 0xb3, 0x57, 0x19, 0x67, 0x9b, 0xa3, 0x53, 0xfe, 0x0a, 0x80, 0xe9, 0x40, - 0xa8, 0x09, 0xfd, 0x60, 0xdc, 0x56, 0xcc, 0x9f, 0x0b, 0x7e, 0xca, 0xf5, 0xe5, 0x9a, 0x34, 0x6e, - 0x2c, 0x00, 0x64, 0xff, 0x3e, 0x3b, 0x64, 0x38, 0x0a, 0x7f, 0x20, 0x41, 0xb4, 0xe1, 0xb4, 0x50, - 0x66, 0x50, 0x6d, 0x62, 0x75, 0xa2, 0xf7, 0x07, 0xec, 0x22, 0xad, 0x79, 0xe1, 0x8c, 0x79, 0x04, - 0xd5, 0xb9, 0xa0, 0x13, 0x7a, 0x17, 0x12, 0x5d, 0x1e, 0xb2, 0x0a, 0xdb, 0x50, 0x38, 0xab, 0x3f, - 0xe7, 0x54, 0xfd, 0x2e, 0x37, 0x6f, 0x84, 0xff, 0x84, 0x67, 0xc3, 0x31, 0x31, 0xca, 0x00, 0x6c, - 0xeb, 0x84, 0x74, 0x0f, 0x5c, 0x9d, 0x60, 0x65, 0x0a, 0x25, 0x20, 0xba, 0xbe, 0xd1, 0x54, 0xa4, - 0x9b, 0x1f, 0x87, 0x6b, 0x43, 0x55, 0xb5, 0x54, 0xdf, 0xac, 0x6f, 0xae, 0x6a, 0x9b, 0xa5, 0x8d, - 0x5a, 0x53, 0x99, 0x42, 0x59, 0x58, 0xf8, 0xa8, 0x54, 0xdf, 0x11, 0xc5, 0x22, 0xad, 0xbe, 0xb9, - 0x53, 0x53, 0xef, 0x95, 0xee, 0x2a, 0x12, 0xba, 0x0a, 0x48, 0xdd, 0xaa, 0xac, 0x37, 0xab, 0x65, - 0xad, 0xb2, 0xb5, 0xb1, 0x5d, 0xaa, 0xec, 0xd4, 0xb7, 0x36, 0x95, 0x08, 0x92, 0x21, 0x56, 0xdd, - 0xda, 0xac, 0x29, 0x70, 0xf3, 0x17, 0x51, 0x88, 0x51, 0xed, 0x40, 0x2f, 0x42, 0x6a, 0x77, 0xb3, - 0xb9, 0x5d, 0xab, 0xd4, 0xef, 0xd4, 0x6b, 0x55, 0x65, 0x2a, 0x37, 0xff, 0xf8, 0xc9, 0xd2, 0x2c, - 0x6d, 0xda, 0xb5, 0x49, 0x17, 0x1b, 0xcc, 0x2c, 0xa2, 0x1c, 0xc4, 0xcb, 0xa5, 0xca, 0xfa, 0xee, - 0xb6, 0x22, 0xe5, 0x32, 0x8f, 0x9f, 0x2c, 0x01, 0x65, 0xe0, 0x26, 0x09, 0x3d, 0x07, 0x09, 0xb5, - 0xd6, 0xdc, 0xd9, 0x52, 0x6b, 0x4a, 0x24, 0x37, 0xfb, 0xf8, 0xc9, 0x52, 0x8a, 0x36, 0x0a, 0x4b, - 0x83, 0x5e, 0x81, 0x74, 0xb3, 0xb2, 0x56, 0xdb, 0x28, 0x69, 0x95, 0xb5, 0xd2, 0xe6, 0x6a, 0x4d, - 0x89, 0xe6, 0x16, 0x1e, 0x3f, 0x59, 0x52, 0x46, 0x55, 0x93, 0x0e, 0x51, 0xdf, 0xd8, 0xde, 0x52, - 0x77, 0x94, 0xd8, 0x60, 0x08, 0x6e, 0x11, 0x50, 0x01, 0x80, 0xf7, 0xbe, 0x53, 0xab, 0x55, 0x95, - 0xe9, 0x1c, 0x7a, 0xfc, 0x64, 0x29, 0x43, 0xdb, 0x07, 0x07, 0x1d, 0xbd, 0x04, 0x33, 0x15, 0xb5, - 0x56, 0xda, 0xa9, 0x69, 0xcd, 0x9d, 0xd2, 0x4e, 0x53, 0x89, 0x0f, 0x56, 0x12, 0x3a, 0xbc, 0xa8, - 0x08, 0x73, 0xa5, 0xdd, 0x9d, 0x2d, 0x6d, 0x88, 0x37, 0x91, 0xbb, 0xf6, 0xf8, 0xc9, 0xd2, 0x3c, - 0xe5, 0x2d, 0xf5, 0x3c, 0x27, 0xcc, 0xff, 0x1a, 0x28, 0x43, 0xf3, 0xd7, 0x56, 0x2b, 0x8a, 0x9c, - 0xbb, 0xfa, 0xf8, 0xc9, 0x12, 0x1a, 0x5d, 0xc2, 0x6a, 0x05, 0xfd, 0x7f, 0xb8, 0xba, 0xf3, 0xc9, - 0x76, 0xad, 0x5a, 0x6b, 0x56, 0xb4, 0xe1, 0x65, 0x27, 0x73, 0xd9, 0xc7, 0x4f, 0x96, 0x16, 0x68, - 0x9f, 0xb1, 0xa5, 0xbf, 0x0e, 0x4a, 0x73, 0x47, 0xad, 0x95, 0x36, 0xb4, 0xfa, 0xe6, 0x6a, 0xad, - 0xc9, 0x36, 0x0b, 0x06, 0x53, 0x1a, 0x39, 0x66, 0x74, 0x09, 0x9b, 0xb5, 0x8f, 0x46, 0xf0, 0x53, - 0x03, 0xfe, 0x91, 0x93, 0x93, 0x93, 0x7f, 0xfc, 0x67, 0x8b, 0x53, 0x7f, 0xfe, 0x93, 0xc5, 0xa9, - 0xf2, 0xf5, 0x2f, 0xfe, 0x63, 0x71, 0xea, 0x8b, 0xe3, 0x45, 0xe9, 0x67, 0xc7, 0x8b, 0xd2, 0x97, - 0xc7, 0x8b, 0xd2, 0xbf, 0x1f, 0x2f, 0x4a, 0xbf, 0xf7, 0xd5, 0xe2, 0xd4, 0xcf, 0xbe, 0x5a, 0x9c, - 0xfa, 0xf2, 0xab, 0xc5, 0xa9, 0x4f, 0xe3, 0x5c, 0x6b, 0x5b, 0x71, 0x96, 0x5d, 0xbd, 0xf9, 0xbf, - 0x01, 0x00, 0x00, 0xff, 0xff, 0xaa, 0x3a, 0xa9, 0x6b, 0x2b, 0x39, 0x00, 0x00, +func init() { proto.RegisterFile("jobs/jobspb/jobs.proto", fileDescriptor_jobs_a7fbefd2c1f66e4f) } + +var fileDescriptor_jobs_a7fbefd2c1f66e4f = []byte{ + // 4849 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5b, 0x4b, 0x6c, 0x1b, 0x49, + 0x7a, 0x56, 0x93, 0x14, 0xd9, 0xfc, 0x25, 0x52, 0xad, 0x92, 0x6c, 0x73, 0xb8, 0x1e, 0x51, 0xcb, + 0x9d, 0x87, 0xed, 0xd9, 0xa1, 0x76, 0x3d, 0xd9, 0x79, 0x38, 0x33, 0x9e, 0x11, 0x1f, 0x96, 0x28, + 0x5b, 0x0f, 0x17, 0x25, 0xcf, 0x63, 0x33, 0xdb, 0x69, 0x76, 0x97, 0xa4, 0x8e, 0xc8, 0x6e, 0xba, + 0xab, 0x69, 0x5b, 0x1b, 0x20, 0x09, 0x36, 0x08, 0xb0, 0xf0, 0x29, 0x01, 0x92, 0x00, 0x8b, 0xc4, + 0x40, 0x80, 0xec, 0x02, 0x39, 0x24, 0x08, 0x32, 0x08, 0x92, 0x1c, 0x72, 0xcb, 0x65, 0x0e, 0x09, + 0xb0, 0x97, 0x00, 0x83, 0x1c, 0xb8, 0x89, 0xe6, 0x92, 0x63, 0x90, 0xdc, 0x7c, 0x49, 0x50, 0x8f, + 0x6e, 0x36, 0x29, 0x4a, 0xa2, 0xec, 0x99, 0xcd, 0xc5, 0x66, 0xff, 0xf5, 0xd7, 0x57, 0xaf, 0xbf, + 0xbe, 0xff, 0xaf, 0xbf, 0x4a, 0x70, 0xf1, 0x37, 0xdc, 0x26, 0x5d, 0x62, 0xff, 0x74, 0x9a, 0xfc, + 0xbf, 0x52, 0xc7, 0x73, 0x7d, 0x17, 0xbd, 0x60, 0xba, 0xe6, 0x81, 0xe7, 0x1a, 0xe6, 0x7e, 0x89, + 0xde, 0x6f, 0x95, 0x78, 0x89, 0xd0, 0xca, 0x5f, 0x20, 0x9e, 0xe7, 0x7a, 0x4c, 0x5f, 0xfc, 0x10, + 0x35, 0xf2, 0xf3, 0x7b, 0xee, 0x9e, 0xcb, 0x7f, 0x2e, 0xb1, 0x5f, 0x52, 0x8a, 0x38, 0x46, 0xa7, + 0xb9, 0x64, 0x19, 0xbe, 0x21, 0x65, 0xb9, 0x40, 0x66, 0xbb, 0xaf, 0xef, 0xba, 0x5e, 0xdb, 0xf0, + 0x03, 0x8c, 0x6f, 0xd1, 0xfb, 0xad, 0x25, 0xd3, 0xf0, 0x8d, 0x96, 0xbb, 0xb7, 0x64, 0x11, 0x6a, + 0x76, 0x9a, 0x4b, 0xd4, 0xf7, 0xba, 0xa6, 0xdf, 0xf5, 0x88, 0x25, 0x95, 0x0a, 0x23, 0x94, 0x7c, + 0xe2, 0x18, 0x8e, 0x1f, 0xe0, 0x77, 0x7d, 0xbb, 0xb5, 0xb4, 0xdf, 0x32, 0x97, 0x7c, 0xbb, 0x4d, + 0xa8, 0x6f, 0xb4, 0x3b, 0xb2, 0xe4, 0x9b, 0xac, 0x2a, 0x35, 0xf7, 0x49, 0xdb, 0x30, 0xf7, 0x0d, + 0x67, 0x8f, 0x78, 0x4b, 0xa2, 0x0d, 0xb3, 0xd3, 0x94, 0x2a, 0x2f, 0x99, 0xad, 0x2e, 0xf5, 0x89, + 0xf7, 0x80, 0x78, 0xd4, 0x76, 0x9d, 0x25, 0xf9, 0xa9, 0xcb, 0x6f, 0xa1, 0x55, 0xfc, 0x6d, 0x98, + 0xbc, 0x43, 0x0c, 0x4a, 0xd0, 0x27, 0x90, 0x72, 0x5c, 0x8b, 0xe8, 0xb6, 0x95, 0x53, 0x16, 0x95, + 0x2b, 0x99, 0xf2, 0xf2, 0x51, 0xaf, 0x90, 0xdc, 0x70, 0x2d, 0x52, 0xaf, 0x3e, 0xed, 0x15, 0xde, + 0xd8, 0xb3, 0xfd, 0xfd, 0x6e, 0xb3, 0x64, 0xba, 0xed, 0xa5, 0x70, 0x46, 0xad, 0x66, 0xff, 0xf7, + 0x52, 0xe7, 0x60, 0x6f, 0x49, 0xce, 0x47, 0x49, 0x54, 0xc3, 0x49, 0x86, 0x58, 0xb7, 0xd0, 0x3c, + 0x4c, 0x92, 0x8e, 0x6b, 0xee, 0xe7, 0x62, 0x8b, 0xca, 0x95, 0x38, 0x16, 0x1f, 0x37, 0x12, 0xff, + 0xf9, 0x67, 0x05, 0xa5, 0xf8, 0xb3, 0x18, 0x5c, 0x2a, 0x1b, 0xe6, 0x41, 0xb7, 0x53, 0x73, 0x4c, + 0xef, 0xb0, 0xe3, 0xdb, 0xae, 0xb3, 0xc9, 0xff, 0xa5, 0x48, 0x83, 0xf8, 0x01, 0x39, 0xe4, 0xfd, + 0x99, 0xc6, 0xec, 0x27, 0x7a, 0x0f, 0x12, 0x6d, 0xd7, 0x22, 0x1c, 0x28, 0x7b, 0xfd, 0x6a, 0xe9, + 0xc4, 0xc5, 0x2d, 0xf5, 0xd1, 0xd6, 0x5d, 0x8b, 0x60, 0x5e, 0x0d, 0x35, 0x41, 0x3d, 0x68, 0x53, + 0xdd, 0x76, 0x76, 0xdd, 0x5c, 0x7c, 0x51, 0xb9, 0x32, 0x75, 0xfd, 0xc6, 0x29, 0x10, 0x27, 0x74, + 0xab, 0x74, 0x7b, 0xbd, 0x51, 0x77, 0x76, 0xdd, 0xf2, 0xd4, 0x51, 0xaf, 0x90, 0x92, 0x1f, 0x38, + 0x75, 0xd0, 0xa6, 0xec, 0x47, 0x7e, 0x13, 0x02, 0x19, 0xeb, 0x7f, 0xd7, 0xb3, 0x79, 0xff, 0xd3, + 0x98, 0xfd, 0x44, 0xdf, 0x06, 0x44, 0x04, 0x1e, 0xb1, 0x74, 0x66, 0x49, 0x3a, 0x1b, 0x60, 0x8c, + 0x0f, 0x50, 0x0b, 0x4b, 0xaa, 0x86, 0x6f, 0xdc, 0x26, 0x87, 0x62, 0x86, 0xe4, 0x3c, 0xfd, 0x4e, + 0x1c, 0xb2, 0xfd, 0xae, 0x70, 0xf8, 0x55, 0x48, 0x72, 0x13, 0x20, 0xbc, 0x85, 0xec, 0xf5, 0xef, + 0x8c, 0x35, 0x1d, 0xac, 0x6a, 0xa9, 0xc1, 0xeb, 0x61, 0x59, 0x1f, 0x21, 0x48, 0x50, 0xa3, 0xe5, + 0xcb, 0x8e, 0xf0, 0xdf, 0xe8, 0x4f, 0x14, 0x58, 0x1c, 0xee, 0x51, 0xf9, 0xf0, 0xf6, 0x7a, 0x63, + 0xdd, 0x60, 0x76, 0x74, 0x9b, 0x1c, 0xd6, 0xab, 0xb9, 0xf8, 0x62, 0xfc, 0xca, 0xd4, 0xf5, 0xcd, + 0xf1, 0x1b, 0xae, 0x9d, 0x81, 0x58, 0x73, 0x7c, 0xef, 0x10, 0x9f, 0xd9, 0x70, 0xbe, 0x01, 0x2f, + 0x8f, 0x05, 0x15, 0xb5, 0xa1, 0xb4, 0xb0, 0xa1, 0x79, 0x98, 0x7c, 0x60, 0xb4, 0xba, 0x44, 0x8e, + 0x56, 0x7c, 0xdc, 0x88, 0xbd, 0xad, 0x14, 0x2f, 0x41, 0x52, 0x4c, 0x0c, 0xca, 0x40, 0x7a, 0xb9, + 0xd6, 0xb8, 0xfe, 0xbd, 0x37, 0x57, 0x2a, 0xeb, 0xda, 0x84, 0x5c, 0x82, 0xff, 0x55, 0xe0, 0x62, + 0xc3, 0xf7, 0x88, 0xd1, 0xae, 0x3b, 0x7b, 0x84, 0xb2, 0x31, 0x55, 0x89, 0x6f, 0xd8, 0x2d, 0x8a, + 0x1c, 0xc8, 0x52, 0x5e, 0xa2, 0x1b, 0x96, 0xe5, 0x11, 0x4a, 0x45, 0x83, 0xe5, 0x95, 0xa7, 0xbd, + 0x42, 0x65, 0xac, 0xad, 0x63, 0x9a, 0xad, 0x25, 0x01, 0x61, 0x3b, 0x7b, 0xa6, 0xd9, 0x2a, 0x89, + 0x96, 0x96, 0x05, 0x1c, 0xce, 0xd0, 0xe8, 0x27, 0xfa, 0x2e, 0x24, 0x68, 0xc7, 0x70, 0xf8, 0x10, + 0xa6, 0xae, 0x5f, 0x8a, 0xcc, 0x7f, 0xb0, 0x05, 0x1b, 0x1d, 0xc3, 0x29, 0x27, 0x3e, 0xef, 0x15, + 0x26, 0x30, 0x57, 0x45, 0x65, 0x00, 0xea, 0x1b, 0x9e, 0xaf, 0x33, 0x2e, 0x91, 0xd6, 0xff, 0x62, + 0xa4, 0x22, 0xe3, 0x9a, 0xd2, 0x7e, 0xcb, 0x2c, 0x6d, 0x07, 0x5c, 0x23, 0xab, 0xa7, 0x79, 0x35, + 0x26, 0x2d, 0xbe, 0x00, 0x97, 0x86, 0x26, 0x60, 0xcb, 0x73, 0xf7, 0x58, 0x8f, 0x8a, 0xff, 0x98, + 0x84, 0x8c, 0xd8, 0x30, 0xc1, 0x9c, 0x0c, 0x36, 0xa8, 0x3c, 0x4b, 0x83, 0xe8, 0x26, 0xa8, 0xc4, + 0xb1, 0x04, 0x42, 0x6c, 0x7c, 0x84, 0x14, 0x71, 0x2c, 0x5e, 0xff, 0x05, 0xb1, 0x03, 0xe3, 0x7c, + 0x31, 0x52, 0x47, 0xbd, 0x42, 0x7c, 0x07, 0xd7, 0xc5, 0x56, 0x7c, 0x17, 0xf2, 0x16, 0xe9, 0x78, + 0xc4, 0x34, 0xd8, 0x5e, 0x6c, 0xf2, 0xae, 0xeb, 0x6d, 0xc3, 0xb1, 0x77, 0x09, 0xf5, 0x73, 0x09, + 0x6e, 0x1b, 0xb9, 0xbe, 0x86, 0x18, 0xdb, 0xba, 0x2c, 0x47, 0xbf, 0xab, 0xc0, 0x5c, 0xd7, 0xb3, + 0xa9, 0xde, 0x3c, 0xd4, 0x5b, 0xae, 0x69, 0xb4, 0x6c, 0xff, 0x50, 0x3f, 0x78, 0x90, 0x9b, 0xe4, + 0x1b, 0xe2, 0xe6, 0x99, 0xac, 0x22, 0x27, 0xa9, 0xb4, 0xe3, 0xd9, 0xb4, 0x7c, 0x78, 0x47, 0x22, + 0xdc, 0x7e, 0xc0, 0x8d, 0xb6, 0x3c, 0x7f, 0xd4, 0x2b, 0x68, 0x3b, 0xb8, 0x1e, 0x2d, 0xba, 0x87, + 0xb5, 0xee, 0x90, 0x32, 0x32, 0x42, 0x3a, 0xb1, 0x5d, 0x47, 0x77, 0x05, 0x3f, 0xe5, 0x92, 0x7c, + 0xa2, 0xae, 0x9f, 0x9f, 0xd9, 0xf0, 0x2c, 0x39, 0xc6, 0xc1, 0x7f, 0xa0, 0x40, 0x9e, 0xb9, 0x0a, + 0x62, 0xb2, 0x69, 0x0a, 0xfd, 0x90, 0xee, 0x11, 0xd3, 0xf5, 0xac, 0x5c, 0x8a, 0xcd, 0x53, 0xb9, + 0xf1, 0x6f, 0xe3, 0x7a, 0x08, 0xee, 0xd1, 0xba, 0x5d, 0xdb, 0x2a, 0xed, 0xec, 0xd4, 0xab, 0x47, + 0xbd, 0x42, 0x6e, 0x2b, 0x00, 0x0f, 0x17, 0x11, 0x73, 0x68, 0x9c, 0xeb, 0x9c, 0x50, 0x82, 0xde, + 0x86, 0xac, 0xe9, 0xb6, 0x5a, 0xc4, 0xe4, 0xc3, 0xde, 0xc1, 0xf5, 0x9c, 0xca, 0x17, 0x78, 0xf6, + 0xa8, 0x57, 0xc8, 0x54, 0xc2, 0x12, 0xb6, 0xd4, 0x19, 0x33, 0xfa, 0x89, 0x30, 0xcc, 0x44, 0x26, + 0x8c, 0xfb, 0x81, 0x34, 0x9f, 0xad, 0xab, 0x63, 0x53, 0x18, 0xce, 0x92, 0x81, 0xef, 0x7c, 0x05, + 0x2e, 0x8c, 0x5c, 0xc5, 0xb3, 0xa8, 0x27, 0x1d, 0xa5, 0x1e, 0x0d, 0xb2, 0x62, 0x51, 0xc2, 0x0d, + 0xf5, 0x59, 0x16, 0xb2, 0x98, 0x50, 0xdf, 0xf5, 0x48, 0xb0, 0xa3, 0x3e, 0x53, 0x60, 0x8e, 0xc5, + 0x09, 0x9e, 0xdd, 0xf1, 0x5d, 0x4f, 0xf7, 0xc8, 0x43, 0xcf, 0xf6, 0x09, 0xcd, 0xc5, 0xb8, 0xd1, + 0x2d, 0x9f, 0x32, 0x84, 0x41, 0xa0, 0x52, 0x35, 0x04, 0xc1, 0x12, 0x43, 0xd8, 0xdd, 0xcd, 0x1f, + 0xfd, 0xa2, 0x70, 0x63, 0xac, 0x75, 0x3c, 0x1e, 0xba, 0x94, 0xea, 0x55, 0x8c, 0xac, 0x63, 0xc0, + 0xe8, 0x32, 0x24, 0x98, 0xdd, 0x72, 0x57, 0x91, 0x2e, 0xab, 0x47, 0xbd, 0x42, 0x82, 0x59, 0x36, + 0xe6, 0xd2, 0x81, 0x0d, 0x9e, 0x78, 0x86, 0x0d, 0xbe, 0x02, 0x53, 0xbe, 0xd1, 0x6c, 0x11, 0x9d, + 0xb5, 0x4c, 0xe5, 0xf6, 0x7b, 0x65, 0x68, 0x26, 0xe8, 0xfd, 0x56, 0xd3, 0xa0, 0xa4, 0xb4, 0xcd, + 0x34, 0x23, 0x63, 0x07, 0x3f, 0x10, 0x50, 0xb4, 0x04, 0x53, 0xee, 0x03, 0xe2, 0x79, 0xb6, 0x45, + 0x74, 0xab, 0xc9, 0xf7, 0x50, 0xba, 0x9c, 0x3d, 0xea, 0x15, 0x60, 0x53, 0x8a, 0xab, 0x65, 0x0c, + 0x81, 0x4a, 0xb5, 0x89, 0x7c, 0x98, 0x97, 0xa4, 0x11, 0xee, 0x7f, 0x6e, 0x4f, 0x29, 0xde, 0x85, + 0x77, 0xc7, 0x5f, 0x0c, 0xb1, 0xee, 0x81, 0xf1, 0xf0, 0xc8, 0x42, 0x0c, 0x12, 0x35, 0x8f, 0x95, + 0xa0, 0xd7, 0x60, 0xb6, 0xe3, 0x91, 0x8e, 0xe1, 0x11, 0xdd, 0x74, 0xdb, 0x9d, 0x16, 0xf1, 0x89, + 0xc5, 0xad, 0x5f, 0xc5, 0x9a, 0x2c, 0xa8, 0x04, 0x72, 0xf4, 0x32, 0xf3, 0x4a, 0x86, 0xcf, 0x02, + 0x1e, 0x4a, 0x3c, 0xa6, 0x99, 0xe6, 0x9a, 0x19, 0x2e, 0xad, 0x4b, 0x21, 0x7a, 0x03, 0x2e, 0xf4, + 0xd7, 0x8d, 0xea, 0x9d, 0x6e, 0xb3, 0x65, 0xd3, 0x7d, 0x62, 0xe5, 0x80, 0x6b, 0xcf, 0x47, 0x0a, + 0xb7, 0x82, 0x32, 0x74, 0x38, 0x60, 0x8a, 0x26, 0x9b, 0x18, 0x63, 0x8f, 0xe4, 0xa6, 0x16, 0x95, + 0x2b, 0x93, 0xe5, 0xd5, 0xa7, 0xbd, 0x42, 0x75, 0x6c, 0x3b, 0xa2, 0xa4, 0xbd, 0xe4, 0x7b, 0x84, + 0x44, 0xcc, 0xb2, 0x22, 0xf1, 0xa2, 0x16, 0x15, 0xc8, 0x10, 0x06, 0xe8, 0x6f, 0xc1, 0xdc, 0xf4, + 0x33, 0xb3, 0x5d, 0x04, 0x05, 0x2d, 0x43, 0x4a, 0x84, 0xde, 0x34, 0x97, 0xe1, 0x0b, 0xf8, 0xcd, + 0x93, 0x6c, 0x88, 0x6b, 0x45, 0x56, 0x29, 0xa8, 0x87, 0xaa, 0x00, 0xfe, 0x61, 0x27, 0xb0, 0xc4, + 0x2c, 0x47, 0x79, 0xf9, 0x24, 0x94, 0xc3, 0x4e, 0xd4, 0x10, 0xd3, 0xbe, 0xfc, 0xa6, 0x68, 0x0d, + 0xa6, 0x45, 0x5c, 0x2f, 0x71, 0x66, 0x38, 0xce, 0xab, 0x27, 0xe0, 0xf0, 0x70, 0xc5, 0x88, 0x20, + 0x4d, 0xd1, 0x50, 0x42, 0xd1, 0x16, 0x64, 0x59, 0x8c, 0xc9, 0x34, 0x25, 0x9a, 0xc6, 0xd1, 0xae, + 0x9e, 0x80, 0x56, 0x95, 0xca, 0x11, 0xbc, 0x8c, 0x15, 0x91, 0xd1, 0xfc, 0xff, 0x28, 0x30, 0x7b, + 0x8c, 0x3c, 0xd0, 0x36, 0xc4, 0xc2, 0x63, 0x03, 0xe3, 0xf4, 0x18, 0x3f, 0x32, 0x3c, 0x0f, 0x91, + 0xc4, 0x6c, 0x0b, 0xed, 0x41, 0x9a, 0x99, 0xb3, 0xe3, 0xb3, 0x33, 0x49, 0x8c, 0x83, 0xaf, 0x1d, + 0xf5, 0x0a, 0xea, 0x16, 0x17, 0x3e, 0x77, 0x13, 0xaa, 0x00, 0xaf, 0x5b, 0xa8, 0x00, 0x53, 0xbe, + 0xab, 0x93, 0x47, 0x36, 0xf5, 0x6d, 0x67, 0x8f, 0x07, 0x0b, 0x2a, 0x06, 0xdf, 0xad, 0x49, 0x49, + 0xfe, 0x4f, 0x63, 0x80, 0x8e, 0xef, 0x52, 0xf4, 0x0f, 0x0a, 0x5c, 0x0e, 0x62, 0x00, 0xd7, 0xb3, + 0xf7, 0x6c, 0xc7, 0x68, 0x0d, 0x04, 0x03, 0x0a, 0x9f, 0xed, 0x4f, 0x9e, 0x87, 0x0a, 0x64, 0x80, + 0xb0, 0x29, 0xe1, 0x87, 0x03, 0x85, 0xcb, 0xcc, 0x83, 0x8a, 0x40, 0xe1, 0x98, 0xca, 0x3d, 0x9c, + 0xeb, 0x9e, 0x50, 0x39, 0x7f, 0x1b, 0x5e, 0x3c, 0x15, 0xf8, 0x3c, 0xbe, 0x2b, 0xff, 0x23, 0x05, + 0x2e, 0x9d, 0xe0, 0x51, 0xa2, 0x38, 0x19, 0x81, 0x73, 0x37, 0x8a, 0x33, 0x75, 0xfd, 0x57, 0x9f, + 0xc3, 0x6b, 0x45, 0x3a, 0xb1, 0x96, 0x50, 0x15, 0x2d, 0x56, 0xfc, 0x0e, 0xcc, 0xc8, 0x4a, 0x81, + 0x1f, 0x45, 0x2f, 0x02, 0xec, 0xdb, 0x7b, 0xfb, 0xfa, 0x43, 0xc3, 0x27, 0x9e, 0x3c, 0x4b, 0xa6, + 0x99, 0xe4, 0x43, 0x26, 0x28, 0xfe, 0xab, 0x0a, 0x99, 0x7a, 0xbb, 0xe3, 0x7a, 0x7e, 0xe0, 0x65, + 0xef, 0x40, 0x92, 0xfb, 0x05, 0x2a, 0xd7, 0xaf, 0x74, 0x4a, 0x0f, 0x07, 0x6a, 0x0a, 0xff, 0x22, + 0x69, 0x41, 0x62, 0x84, 0xee, 0x2f, 0x36, 0xd2, 0xfd, 0xbd, 0x07, 0x49, 0x91, 0x38, 0x90, 0x01, + 0x79, 0x61, 0x44, 0x24, 0x5f, 0xdf, 0xbc, 0x65, 0xb7, 0xc8, 0x2d, 0xae, 0x16, 0x80, 0x8b, 0x4a, + 0xe8, 0x15, 0x50, 0x29, 0xf5, 0x75, 0x6a, 0xff, 0x50, 0x78, 0xcf, 0xb8, 0x38, 0x93, 0x36, 0x1a, + 0xdb, 0x0d, 0xfb, 0x87, 0x04, 0xa7, 0x28, 0xf5, 0xd9, 0x0f, 0x94, 0x07, 0xf5, 0xa1, 0xd1, 0x6a, + 0x71, 0x2f, 0x3b, 0xc9, 0xcf, 0xe0, 0xe1, 0xf7, 0xe0, 0x36, 0x4b, 0x7e, 0xbd, 0xdb, 0x4c, 0x3a, + 0xcc, 0x8e, 0xe1, 0xef, 0xf3, 0xc8, 0x31, 0x8d, 0x41, 0x88, 0xb6, 0x0c, 0x7f, 0x1f, 0xe5, 0x20, + 0x45, 0x0d, 0xe6, 0xbb, 0x68, 0x4e, 0x5d, 0x8c, 0x5f, 0x99, 0xc6, 0xc1, 0x27, 0x5a, 0x00, 0xee, + 0x79, 0xc5, 0x27, 0x77, 0x62, 0x71, 0x1c, 0x91, 0xf0, 0x79, 0x38, 0xb0, 0x3b, 0xfa, 0xee, 0x01, + 0x15, 0x4e, 0x4b, 0xce, 0xc3, 0x81, 0xdd, 0xb9, 0x75, 0x9b, 0xe2, 0x14, 0x2b, 0xbc, 0x75, 0x40, + 0xd1, 0xab, 0x30, 0x63, 0xf3, 0x93, 0x8b, 0x6e, 0xd9, 0x1e, 0x31, 0xfd, 0xd6, 0x21, 0x77, 0x58, + 0x2a, 0xce, 0x0a, 0x71, 0x55, 0x4a, 0xd1, 0x55, 0xd0, 0x86, 0xdd, 0x2c, 0x77, 0x34, 0x2a, 0x9e, + 0x19, 0xf2, 0xb2, 0x4c, 0x55, 0x2c, 0x75, 0xc4, 0x71, 0x66, 0x84, 0xaa, 0x90, 0xf7, 0x7d, 0x66, + 0x09, 0xe6, 0x3a, 0x86, 0x47, 0x89, 0xde, 0xec, 0x3a, 0x56, 0x8b, 0xe8, 0x82, 0xab, 0x73, 0x59, + 0xae, 0x3d, 0xcb, 0x8b, 0xca, 0xbc, 0x44, 0xd0, 0xfa, 0x59, 0xb1, 0xf7, 0xc5, 0xff, 0x87, 0xd8, + 0x3b, 0xff, 0xb3, 0x18, 0x4c, 0x72, 0x3b, 0x47, 0x37, 0x20, 0xc1, 0x96, 0x59, 0x9e, 0xec, 0xc6, + 0x8d, 0xb9, 0x78, 0x1d, 0x84, 0x20, 0xe1, 0x18, 0x6d, 0x92, 0x43, 0xdc, 0x08, 0xf8, 0x6f, 0x74, + 0x09, 0x52, 0x94, 0xdc, 0xd7, 0x1f, 0x18, 0xad, 0xdc, 0x1c, 0x5f, 0xe1, 0x24, 0x25, 0xf7, 0xef, + 0x19, 0x2d, 0x74, 0x01, 0x92, 0x36, 0xd5, 0x1d, 0xf2, 0x30, 0x37, 0xcf, 0x67, 0x6a, 0xd2, 0xa6, + 0x1b, 0xe4, 0x21, 0xa7, 0x6d, 0xc3, 0xdb, 0x23, 0xbe, 0x6e, 0xba, 0x2d, 0x9a, 0xbb, 0xc0, 0x36, + 0x18, 0x0b, 0xe9, 0x98, 0xa8, 0xe2, 0xb6, 0x28, 0xfa, 0x06, 0xa4, 0x1f, 0x1a, 0x54, 0x27, 0xed, + 0x8e, 0x7f, 0xc8, 0x27, 0x4b, 0x65, 0x66, 0x4f, 0x6b, 0xec, 0x7b, 0x2d, 0xa1, 0xc6, 0xb4, 0xf8, + 0x5a, 0x42, 0x8d, 0x6b, 0x89, 0xb5, 0x84, 0x9a, 0xd0, 0x26, 0xd7, 0x12, 0xea, 0xa4, 0x96, 0x5c, + 0x4b, 0xa8, 0x49, 0x2d, 0xb5, 0x96, 0x50, 0x53, 0x9a, 0xba, 0x96, 0x50, 0x55, 0x2d, 0xbd, 0x96, + 0x50, 0xd3, 0x1a, 0xac, 0x25, 0x54, 0xd0, 0xa6, 0xd6, 0x12, 0xea, 0x94, 0x36, 0xbd, 0x96, 0x50, + 0xa7, 0xb5, 0xcc, 0x5a, 0x42, 0xcd, 0x68, 0xd9, 0xb5, 0x84, 0x9a, 0xd5, 0x66, 0xd6, 0x12, 0xea, + 0x8c, 0xa6, 0xad, 0x25, 0x54, 0x4d, 0x9b, 0x5d, 0x4b, 0xa8, 0xb3, 0x1a, 0x2a, 0x7e, 0xa6, 0x80, + 0xd6, 0x20, 0xf7, 0xbb, 0xc4, 0x31, 0xc9, 0x3d, 0xa3, 0x55, 0xd9, 0xef, 0x3a, 0x07, 0xe8, 0x15, + 0x98, 0x31, 0xd9, 0x0f, 0x5d, 0x1c, 0x8c, 0xd9, 0x50, 0x15, 0x3e, 0xd4, 0x0c, 0x17, 0x37, 0x98, + 0x94, 0x8d, 0xf8, 0x45, 0x00, 0xa9, 0xc7, 0x76, 0xb6, 0xc8, 0x9a, 0xa5, 0x85, 0x0a, 0xdb, 0xce, + 0x43, 0x30, 0x9e, 0xfb, 0x90, 0xd3, 0xc7, 0x00, 0x0c, 0x76, 0x1f, 0xa2, 0x25, 0x98, 0x77, 0xc8, + 0x23, 0x5f, 0x1f, 0x56, 0xe6, 0x54, 0x81, 0x67, 0x59, 0x59, 0x25, 0x5a, 0xa1, 0xf8, 0x2f, 0x31, + 0x98, 0x09, 0x3a, 0x1d, 0xd0, 0xe1, 0x2e, 0x68, 0x6c, 0x59, 0x6c, 0x4b, 0xf7, 0x5d, 0x81, 0x14, + 0x10, 0xe3, 0x7b, 0xa7, 0x10, 0xe3, 0x10, 0x0a, 0xfb, 0xae, 0x5b, 0xdb, 0x2e, 0x6f, 0x4e, 0xb8, + 0x06, 0x9c, 0xa1, 0x51, 0x59, 0x7e, 0x07, 0xb2, 0x41, 0x25, 0x21, 0x41, 0x15, 0x48, 0x0e, 0xb4, + 0xf7, 0xda, 0x18, 0xed, 0x05, 0x53, 0x8d, 0x65, 0xd5, 0xfc, 0x6f, 0x02, 0x3a, 0xde, 0x76, 0xd4, + 0x2d, 0x4d, 0x0a, 0xb7, 0xb4, 0x39, 0xe8, 0x96, 0xde, 0x39, 0xdf, 0xd8, 0x22, 0xdd, 0x8e, 0x9e, + 0xea, 0xfe, 0x29, 0x06, 0x59, 0xe1, 0x22, 0x42, 0x77, 0xf4, 0x1a, 0xcc, 0x72, 0xd2, 0xb2, 0x9d, + 0x3d, 0xbd, 0x23, 0x85, 0x7c, 0x7c, 0x31, 0xac, 0x05, 0x05, 0xa1, 0xf2, 0xb7, 0x20, 0xe3, 0x11, + 0xc3, 0xea, 0x2b, 0xc6, 0xb8, 0xe2, 0x34, 0x13, 0x86, 0x4a, 0x2f, 0x43, 0x96, 0x7b, 0xc3, 0xbe, + 0x56, 0x9c, 0x6b, 0x65, 0xb8, 0x34, 0x54, 0x2b, 0x43, 0x86, 0x76, 0x0c, 0xa7, 0xaf, 0x95, 0xe0, + 0x93, 0x7a, 0x46, 0xee, 0x68, 0x9a, 0xd5, 0x89, 0xfa, 0x52, 0x8f, 0xd0, 0x6e, 0x9b, 0xe8, 0x1d, + 0x57, 0x1c, 0xb6, 0xe2, 0x38, 0x2d, 0x24, 0x5b, 0x2e, 0x45, 0x3b, 0xdc, 0x54, 0xf8, 0x5c, 0xe8, + 0x96, 0x98, 0x9c, 0x5c, 0x92, 0xb7, 0x72, 0x6d, 0xfc, 0xe9, 0xc4, 0x33, 0x74, 0x50, 0x50, 0xfc, + 0x1b, 0x05, 0x2e, 0xb1, 0x80, 0x59, 0xb0, 0x62, 0x85, 0xe7, 0xbb, 0x03, 0xeb, 0x34, 0x20, 0xc5, + 0x83, 0xee, 0x30, 0xfe, 0x5c, 0x3d, 0xea, 0x15, 0x92, 0x4c, 0xfb, 0xb9, 0x3d, 0x57, 0x92, 0x01, + 0xd7, 0xf9, 0xf1, 0xc8, 0xf7, 0x0c, 0x87, 0xda, 0xec, 0xa0, 0xc0, 0x96, 0xad, 0x4d, 0xda, 0x4d, + 0xe2, 0x89, 0xc5, 0x98, 0xc6, 0xf3, 0x03, 0x85, 0xeb, 0xa2, 0xac, 0x98, 0x87, 0xdc, 0x70, 0x97, + 0xc3, 0x93, 0xfd, 0xaf, 0xc1, 0xc5, 0x0d, 0xf2, 0x70, 0xd4, 0x68, 0xca, 0x90, 0x12, 0xfc, 0x15, + 0x98, 0xfc, 0x95, 0x61, 0x56, 0x8d, 0xa6, 0xfc, 0x4b, 0xbc, 0xa7, 0xdb, 0xbc, 0x02, 0x0e, 0x2a, + 0x16, 0x3f, 0x81, 0x4b, 0x43, 0xe8, 0xe1, 0xf2, 0xbd, 0x0f, 0x49, 0x76, 0xf2, 0x93, 0x91, 0x4d, + 0xf6, 0xf8, 0xa9, 0xe2, 0x38, 0x7a, 0x83, 0xe9, 0x63, 0x59, 0xad, 0x88, 0x79, 0x4a, 0xa2, 0xdb, + 0x26, 0xcc, 0x42, 0xee, 0xd8, 0xd4, 0x47, 0x1f, 0xc0, 0xb4, 0xb4, 0x08, 0x66, 0x28, 0x41, 0xb7, + 0xcf, 0x30, 0xaa, 0x29, 0x2f, 0x04, 0xa1, 0xc5, 0xbf, 0x55, 0x60, 0xae, 0xea, 0xb9, 0x9d, 0x0e, + 0xb1, 0xa4, 0xaf, 0x10, 0x73, 0x11, 0xb8, 0x08, 0x25, 0xe2, 0x22, 0x36, 0x20, 0x56, 0xaf, 0xca, + 0xb3, 0xc0, 0xcd, 0xe7, 0x3d, 0x62, 0xd4, 0xab, 0xe8, 0x1d, 0x31, 0x21, 0x5d, 0xca, 0xf9, 0x33, + 0x7b, 0xec, 0xd0, 0x37, 0x60, 0xa6, 0x5c, 0x11, 0xcb, 0x0a, 0xc5, 0x9f, 0xa6, 0xe0, 0x42, 0x74, + 0x92, 0x57, 0x2a, 0x41, 0xc7, 0x3f, 0x85, 0x94, 0xed, 0x58, 0xe4, 0x11, 0x19, 0x8b, 0x27, 0x47, + 0x41, 0x94, 0xe4, 0x7c, 0xd4, 0x19, 0x4c, 0x70, 0xcc, 0x94, 0x98, 0xe8, 0xa3, 0x30, 0x3c, 0x15, + 0x69, 0x9f, 0x1b, 0xcf, 0x8c, 0x5e, 0x1d, 0x0a, 0x55, 0x07, 0x22, 0x41, 0xee, 0x50, 0xbe, 0xa6, + 0x48, 0xb0, 0x01, 0xb3, 0xb6, 0xe3, 0x13, 0xaf, 0x45, 0x8c, 0x07, 0x2c, 0xb0, 0x61, 0xcd, 0xcb, + 0xec, 0xcf, 0xb8, 0x61, 0x84, 0x16, 0x01, 0x10, 0xe1, 0xc8, 0xa7, 0x30, 0x17, 0x05, 0x0d, 0x96, + 0xe0, 0xf4, 0x8c, 0x10, 0x9f, 0xe1, 0x3e, 0x6c, 0x90, 0x78, 0x89, 0x00, 0xd5, 0xe5, 0xb4, 0xdf, + 0x83, 0xa4, 0x38, 0xe8, 0xcb, 0xf4, 0xea, 0xcd, 0x67, 0x9d, 0x76, 0x91, 0x40, 0xc0, 0x12, 0x2d, + 0xff, 0xc7, 0x0a, 0x4c, 0x47, 0x97, 0x1b, 0xd9, 0xa0, 0xf2, 0xbe, 0x07, 0x94, 0x16, 0x2f, 0x6f, + 0xb0, 0x58, 0x96, 0x17, 0xf2, 0x35, 0x78, 0xff, 0x99, 0xd7, 0x40, 0x40, 0x48, 0x53, 0xaa, 0x5b, + 0x2c, 0x40, 0xb2, 0x3c, 0xb7, 0xd3, 0x4f, 0xaf, 0xc7, 0xb1, 0xca, 0x04, 0x2c, 0xe6, 0xcb, 0xff, + 0x16, 0xa4, 0x43, 0x43, 0x89, 0x9c, 0xf0, 0xe3, 0x5f, 0xe1, 0x09, 0xff, 0xd4, 0xf6, 0xab, 0x90, + 0x19, 0x98, 0x31, 0x74, 0x31, 0xec, 0x43, 0xa2, 0x9c, 0x14, 0x7d, 0x38, 0x13, 0xa5, 0xf8, 0x8b, + 0x24, 0xcc, 0x8d, 0x62, 0xda, 0x8f, 0x41, 0x8b, 0xf0, 0x96, 0xde, 0xb2, 0xa9, 0x2f, 0xf7, 0xd3, + 0xd5, 0xd3, 0x0f, 0xa4, 0x11, 0xf2, 0x93, 0xd6, 0x92, 0xf5, 0x06, 0x29, 0xf1, 0xfb, 0x90, 0xb5, + 0x44, 0xc7, 0x75, 0xb9, 0x51, 0xe3, 0x67, 0x9e, 0x23, 0x47, 0x10, 0xa0, 0x44, 0xcf, 0x58, 0x91, + 0x22, 0xca, 0xef, 0x1d, 0x02, 0xf4, 0x30, 0xb7, 0x63, 0x5b, 0x7c, 0xf7, 0x64, 0xca, 0x8d, 0xa3, + 0x5e, 0x61, 0x56, 0x62, 0x05, 0xc9, 0x9c, 0xe7, 0x5e, 0xa9, 0x59, 0x6b, 0x08, 0xd0, 0x62, 0x5e, + 0x97, 0x95, 0xb3, 0x86, 0x27, 0xfb, 0x5e, 0x97, 0xed, 0xa3, 0xe7, 0xf7, 0xba, 0xec, 0x67, 0xdd, + 0x42, 0xbf, 0xa7, 0xc0, 0xac, 0xc8, 0xec, 0xb6, 0xbb, 0xbe, 0x21, 0xd2, 0xf5, 0xc1, 0xf9, 0xf4, + 0xe3, 0xa3, 0x5e, 0x61, 0x86, 0x4f, 0xc8, 0xba, 0x2c, 0xe3, 0xcd, 0x96, 0x9f, 0xb5, 0xd9, 0x3e, + 0x8a, 0x3c, 0xb3, 0x85, 0x02, 0x0b, 0xdd, 0x86, 0xac, 0x38, 0x6c, 0x07, 0x17, 0xe7, 0xfc, 0xe0, + 0x9a, 0x29, 0xbf, 0xf4, 0xb4, 0x57, 0x58, 0x1c, 0x61, 0x59, 0xe2, 0x9c, 0x7e, 0x4f, 0xe8, 0xe2, + 0xcc, 0x6e, 0xf4, 0x13, 0x99, 0x90, 0x09, 0x4d, 0xe3, 0xb0, 0x23, 0xcf, 0xb9, 0xcf, 0xef, 0xca, + 0xa6, 0x03, 0x1b, 0x61, 0x98, 0x68, 0x0f, 0x66, 0x82, 0x46, 0x84, 0x43, 0xa7, 0xb9, 0xf4, 0x57, + 0xd2, 0x4c, 0x60, 0xd6, 0x62, 0xd4, 0x54, 0xa6, 0x5c, 0x2e, 0xc2, 0xfc, 0xc8, 0x28, 0xe7, 0x8b, + 0x24, 0x5c, 0x1c, 0x24, 0xc2, 0x30, 0x0e, 0xd1, 0x87, 0x3d, 0xe4, 0xfb, 0x63, 0x93, 0x69, 0x80, + 0x21, 0xc8, 0x2c, 0xf8, 0x1a, 0xf6, 0x91, 0x9f, 0x0e, 0xf9, 0xc8, 0x67, 0xc0, 0xe7, 0xe6, 0x35, + 0x84, 0x1f, 0x38, 0xca, 0x8f, 0x42, 0x5f, 0x20, 0xb2, 0x36, 0x1f, 0x3c, 0x03, 0x3c, 0xaf, 0x1f, + 0x7c, 0x86, 0xde, 0xe0, 0x9f, 0x15, 0xc8, 0x0c, 0x8c, 0xec, 0x97, 0xe9, 0x0e, 0xb6, 0xc2, 0x68, + 0x48, 0x3c, 0xaf, 0x78, 0xfb, 0xfc, 0xc3, 0x1a, 0x0c, 0x92, 0xf2, 0x7f, 0xaf, 0x40, 0x66, 0x60, + 0x22, 0xbf, 0x26, 0x47, 0xf2, 0xd5, 0xf7, 0xbc, 0x09, 0xd9, 0xc1, 0x25, 0x8a, 0xb4, 0xa1, 0x7c, + 0x35, 0x6d, 0x14, 0xdf, 0x82, 0xa4, 0x90, 0x20, 0x04, 0xd9, 0x0f, 0x97, 0xeb, 0xdb, 0xf5, 0x8d, + 0x15, 0xfd, 0xd6, 0x26, 0xd6, 0x57, 0x2a, 0xda, 0x04, 0x9a, 0x06, 0xb5, 0x5a, 0xbb, 0x53, 0x63, + 0x42, 0x4d, 0x41, 0x53, 0x90, 0xe2, 0x5f, 0xb5, 0xaa, 0x16, 0x2b, 0x96, 0x41, 0x13, 0xd8, 0xbb, + 0x84, 0x39, 0x06, 0x16, 0xf7, 0xa3, 0x12, 0xcc, 0xf1, 0x20, 0xbd, 0xcd, 0xe2, 0x37, 0xe6, 0x0a, + 0xf5, 0x48, 0xf4, 0x3c, 0x1b, 0x16, 0x31, 0xa7, 0xb8, 0x61, 0xb4, 0x49, 0xf1, 0xef, 0x12, 0x30, + 0xdb, 0x07, 0x09, 0xdc, 0xe2, 0x2b, 0xa0, 0x52, 0xdb, 0x39, 0xd0, 0xfb, 0x97, 0xe6, 0x22, 0x91, + 0x66, 0x3b, 0x07, 0x3b, 0xb8, 0x8e, 0x53, 0xac, 0x70, 0xc7, 0xb3, 0xd1, 0x1a, 0x24, 0xdc, 0x8e, + 0x1f, 0x9c, 0x21, 0xdf, 0x3c, 0x65, 0x2a, 0x8e, 0xb5, 0x51, 0xda, 0xec, 0xf8, 0x32, 0x03, 0xc0, + 0x31, 0xd0, 0x5f, 0x2a, 0xfd, 0x53, 0x8f, 0x38, 0x2d, 0xbe, 0x73, 0x2e, 0x3c, 0x31, 0x01, 0xf2, + 0x06, 0xf3, 0x43, 0xb6, 0x51, 0x9f, 0xf6, 0x0a, 0xb3, 0xc3, 0x13, 0x44, 0x9f, 0xf3, 0x6a, 0x33, + 0xe8, 0x22, 0x5a, 0x13, 0x97, 0x6a, 0xfd, 0x89, 0xe6, 0x0e, 0x61, 0xcc, 0x7b, 0xcb, 0xcc, 0xc0, + 0x42, 0xe4, 0xf7, 0x60, 0x3a, 0xda, 0xfb, 0x11, 0xd9, 0xf2, 0xe5, 0xc1, 0xb4, 0xc4, 0x6b, 0x63, + 0xcd, 0x8c, 0x3c, 0x12, 0x46, 0x52, 0xf4, 0x6f, 0x41, 0x3a, 0x9c, 0xf6, 0xf3, 0xe4, 0xf6, 0x05, + 0xc7, 0x87, 0xc9, 0xb2, 0x49, 0x2d, 0x59, 0xfc, 0x6b, 0x05, 0xa6, 0x31, 0xa1, 0x6e, 0xeb, 0x01, + 0xb1, 0x58, 0xcc, 0x13, 0xbe, 0x45, 0x51, 0xc6, 0x7f, 0x8b, 0xb2, 0x0c, 0xe9, 0x30, 0x9b, 0x79, + 0x9e, 0x77, 0x1d, 0xfd, 0x5a, 0xe8, 0x2a, 0x68, 0x4d, 0xb7, 0xeb, 0x58, 0x86, 0x77, 0xa8, 0x7b, + 0xc4, 0x30, 0xf7, 0x89, 0x25, 0x6f, 0x6e, 0x66, 0x02, 0x39, 0x16, 0xe2, 0xe2, 0x8f, 0x63, 0x80, + 0xfa, 0x93, 0x13, 0xa1, 0x22, 0x16, 0xb9, 0xf1, 0x71, 0xc8, 0xc3, 0x6b, 0x6c, 0xe4, 0x5d, 0xdb, + 0x50, 0x00, 0x18, 0x0e, 0x3c, 0x58, 0x52, 0x2f, 0x22, 0xa3, 0xe8, 0x8f, 0x4e, 0xcf, 0xd9, 0xc6, + 0x79, 0xce, 0x96, 0x5b, 0xe9, 0x2f, 0x35, 0x6f, 0x2b, 0x9d, 0xf5, 0x7f, 0x27, 0x00, 0x55, 0x3c, + 0x62, 0xf8, 0x84, 0x31, 0x0f, 0x3d, 0xed, 0xac, 0x5d, 0x86, 0x49, 0x71, 0x30, 0x8b, 0x9d, 0xe7, + 0x60, 0x26, 0x27, 0x45, 0x54, 0x45, 0x3f, 0x80, 0x69, 0xd3, 0x6d, 0x75, 0xdb, 0x8e, 0xce, 0x6f, + 0x9c, 0x65, 0x20, 0xfc, 0xbd, 0xd3, 0x8c, 0xf8, 0x58, 0xe7, 0x4a, 0x15, 0xb7, 0xc5, 0xbe, 0x83, + 0xdc, 0x81, 0x00, 0xe4, 0x1a, 0xe8, 0x32, 0xa4, 0xc3, 0x0d, 0xc5, 0x43, 0xe0, 0x34, 0xee, 0x0b, + 0xd0, 0x75, 0x98, 0x34, 0xa8, 0xee, 0xee, 0xf2, 0x18, 0xf5, 0x2c, 0x0b, 0xc3, 0x09, 0x83, 0x6e, + 0xee, 0xa2, 0x37, 0x20, 0xb3, 0x7b, 0x5f, 0xc4, 0xed, 0x82, 0x40, 0xc5, 0x43, 0x80, 0x99, 0xa3, + 0x5e, 0x61, 0xea, 0xd6, 0x5d, 0x3e, 0x58, 0x46, 0x9f, 0x78, 0x6a, 0xf7, 0x7e, 0xf8, 0x81, 0xae, + 0xc1, 0x6c, 0xdb, 0x78, 0xa4, 0xef, 0x7a, 0x86, 0x29, 0x03, 0xd5, 0x96, 0x60, 0x05, 0x05, 0xcf, + 0xb4, 0x8d, 0x47, 0xb7, 0xa4, 0xbc, 0x6e, 0xb5, 0x48, 0xfe, 0xbf, 0x14, 0x48, 0xc9, 0x11, 0xa1, + 0x0e, 0x80, 0x9c, 0x1e, 0xdb, 0x12, 0xa1, 0x50, 0xa6, 0x7c, 0xf7, 0xa8, 0x57, 0x48, 0x57, 0xb8, + 0xb4, 0x5e, 0xa5, 0x4f, 0x7b, 0x85, 0x0f, 0x9e, 0x95, 0xb4, 0x02, 0x10, 0x9c, 0x16, 0x8d, 0xd4, + 0x2d, 0x9e, 0x50, 0xdc, 0x37, 0xa8, 0xbe, 0x6f, 0x53, 0xdf, 0xdd, 0xf3, 0x8c, 0x36, 0x5f, 0x5c, + 0x15, 0x4f, 0xef, 0x1b, 0x74, 0x35, 0x90, 0xa1, 0x3c, 0x0b, 0x39, 0x1e, 0x88, 0x07, 0x03, 0x62, + 0x4b, 0x85, 0xdf, 0xe8, 0x3a, 0x5c, 0x08, 0x2b, 0xeb, 0x6c, 0xd0, 0xcd, 0xae, 0x79, 0x40, 0xb8, + 0x27, 0x60, 0x9c, 0x35, 0x17, 0x16, 0xae, 0x1b, 0x8f, 0xca, 0xa2, 0xa8, 0x78, 0x01, 0xe6, 0x22, + 0xcb, 0x1a, 0x06, 0x88, 0x1d, 0xf8, 0xc6, 0x1d, 0xd7, 0xd9, 0xc3, 0x5d, 0x87, 0x27, 0xce, 0xec, + 0x3d, 0xcf, 0x88, 0x3e, 0xa9, 0xbb, 0x0b, 0x33, 0x43, 0x4f, 0x56, 0x25, 0xc3, 0x44, 0x73, 0x62, + 0x83, 0x6f, 0x5c, 0x4b, 0x15, 0xf1, 0x19, 0x44, 0xdf, 0x59, 0x73, 0xe0, 0xbb, 0xb8, 0x00, 0x97, + 0x47, 0xb5, 0x18, 0xf6, 0xe8, 0x27, 0x19, 0x48, 0x6d, 0x19, 0x87, 0x2d, 0xd7, 0xb0, 0xd0, 0x22, + 0x4c, 0x05, 0x4f, 0x0f, 0x82, 0xa6, 0xd3, 0x38, 0x2a, 0x42, 0x36, 0x64, 0xbb, 0x94, 0x78, 0xcc, + 0x4a, 0x74, 0xfe, 0x98, 0x56, 0xb0, 0x67, 0xb9, 0xfc, 0xb4, 0x57, 0xb8, 0x39, 0xde, 0xa2, 0x11, + 0xb3, 0xeb, 0xd9, 0xfe, 0x61, 0xa9, 0x71, 0xf7, 0xce, 0x8e, 0x84, 0x62, 0x5b, 0xdb, 0xc5, 0x99, + 0x6e, 0xf4, 0x53, 0x3e, 0xe4, 0x60, 0x0b, 0xa0, 0xb7, 0x6d, 0xd3, 0x73, 0x69, 0x90, 0xef, 0x97, + 0xd2, 0x75, 0x2e, 0x44, 0xaf, 0xc2, 0xcc, 0xae, 0xed, 0xf0, 0xbb, 0xa6, 0x40, 0x4f, 0xa4, 0xfa, + 0xb3, 0x81, 0x58, 0x2a, 0x3e, 0x80, 0x6c, 0xe4, 0xf1, 0x06, 0x33, 0xbe, 0x24, 0x37, 0xbe, 0xcd, + 0xa3, 0x5e, 0x21, 0xd3, 0xdf, 0xcc, 0xc2, 0x00, 0x9f, 0xc7, 0x6b, 0x66, 0xfa, 0xcd, 0x30, 0xf3, + 0x9b, 0x87, 0x49, 0xfe, 0xd4, 0x5a, 0xbc, 0xd7, 0xc2, 0xe2, 0x03, 0xbd, 0x09, 0x93, 0x2d, 0x62, + 0x50, 0x22, 0x9f, 0x62, 0x2d, 0x9e, 0x42, 0x0f, 0xfc, 0xad, 0x32, 0x16, 0xea, 0xa8, 0x0c, 0x49, + 0x71, 0x7b, 0xc8, 0xef, 0xfc, 0x8e, 0x27, 0x4b, 0x4f, 0x7c, 0x75, 0xb7, 0x3a, 0x81, 0x65, 0x4d, + 0x54, 0x83, 0x94, 0x27, 0x2e, 0x8c, 0xf9, 0x4d, 0xe0, 0x99, 0xc7, 0xff, 0xc8, 0x7d, 0xf4, 0xea, + 0x04, 0x0e, 0xea, 0xa2, 0xed, 0xe0, 0xd5, 0x86, 0xf0, 0x33, 0xf2, 0x51, 0x4a, 0x69, 0xcc, 0x10, + 0xb1, 0x0f, 0x38, 0x80, 0xc2, 0x06, 0x68, 0xf3, 0xdb, 0x03, 0x7e, 0xa1, 0x78, 0xfa, 0x00, 0x07, + 0x6e, 0xa2, 0xd9, 0x00, 0x45, 0x4d, 0xb4, 0x01, 0x60, 0x86, 0xbe, 0x8f, 0x5f, 0x35, 0x4e, 0x5d, + 0xff, 0xf6, 0x79, 0xe2, 0xab, 0xd5, 0x09, 0x1c, 0x41, 0x40, 0x77, 0x61, 0xca, 0xec, 0x6f, 0xe6, + 0xdc, 0x0c, 0x07, 0x7c, 0xfd, 0x5c, 0x8c, 0xbe, 0xca, 0x58, 0xbc, 0x2f, 0x1d, 0x64, 0x71, 0x6d, + 0x98, 0xc5, 0x6b, 0x90, 0x91, 0x99, 0x1a, 0xf1, 0x4a, 0x3f, 0x37, 0xcb, 0x9d, 0x48, 0xd4, 0x4a, + 0x82, 0x77, 0xfc, 0xa5, 0x9a, 0x63, 0xba, 0x16, 0xb1, 0x6a, 0xec, 0x1b, 0xcb, 0xc4, 0x34, 0xff, + 0xa0, 0x68, 0x05, 0xb2, 0x66, 0x8b, 0x18, 0x4e, 0xb7, 0x13, 0xe0, 0xa0, 0x31, 0x71, 0x32, 0xb2, + 0x9e, 0x04, 0xda, 0x00, 0xb4, 0xcb, 0x5f, 0x7a, 0x44, 0x7b, 0xc5, 0x6f, 0x2c, 0xc7, 0x01, 0xd3, + 0x78, 0x5d, 0xdc, 0xef, 0x19, 0x7a, 0x09, 0x32, 0x8e, 0xeb, 0x98, 0x86, 0x63, 0x92, 0x16, 0xf7, + 0xb7, 0xe2, 0x92, 0x73, 0x50, 0x88, 0x3e, 0x81, 0x2c, 0x1d, 0x38, 0x54, 0xe4, 0x2e, 0xf0, 0x16, + 0xbf, 0x73, 0xde, 0x34, 0xe4, 0xea, 0x04, 0x1e, 0x42, 0x42, 0xbf, 0x0e, 0x9a, 0x3f, 0x74, 0x57, + 0xc1, 0xaf, 0x4b, 0x4f, 0x7f, 0x55, 0x75, 0xc2, 0x8d, 0xcc, 0xea, 0x04, 0x3e, 0x86, 0x86, 0x3e, + 0x85, 0x19, 0x3a, 0xf8, 0x6e, 0x38, 0x77, 0x89, 0x37, 0xf0, 0xdd, 0x53, 0x13, 0xee, 0xa3, 0x9e, + 0x5a, 0xaf, 0x4e, 0xe0, 0x61, 0x2c, 0x06, 0xef, 0x0c, 0x5e, 0x79, 0xe4, 0x72, 0x67, 0xc2, 0x8f, + 0xbe, 0x82, 0x61, 0xf0, 0x43, 0x58, 0xa8, 0x05, 0xf3, 0xad, 0x11, 0x6e, 0x23, 0xf7, 0x02, 0x6f, + 0xe3, 0xb4, 0xc3, 0xcf, 0x29, 0xfe, 0x6d, 0x75, 0x02, 0x8f, 0x44, 0x2d, 0xa7, 0x21, 0x25, 0xef, + 0xce, 0xc2, 0x1b, 0xe9, 0x94, 0xa6, 0x16, 0x7f, 0x92, 0x06, 0x35, 0x0c, 0x5d, 0x97, 0x00, 0x85, + 0xc1, 0x46, 0xff, 0x19, 0x20, 0xf3, 0x51, 0xb1, 0xd5, 0x09, 0x3c, 0x1b, 0x94, 0xf5, 0x5f, 0x02, + 0xbe, 0x0a, 0x33, 0x6d, 0xd7, 0xb2, 0x77, 0xed, 0xbe, 0x67, 0x10, 0x99, 0xd2, 0x6c, 0x20, 0x96, + 0x9e, 0xe1, 0xe6, 0xc0, 0x6b, 0x99, 0x71, 0x5e, 0x89, 0xaf, 0x4e, 0x44, 0x9e, 0xd3, 0x30, 0x4f, + 0xe5, 0x89, 0x11, 0xe9, 0xf2, 0xb4, 0x2c, 0xc2, 0xb2, 0x8c, 0x94, 0xca, 0x03, 0x6f, 0x65, 0x88, + 0xba, 0xaf, 0x9e, 0x49, 0xdd, 0xc1, 0xd8, 0x57, 0x95, 0x90, 0xbb, 0x6f, 0x0d, 0x73, 0xf7, 0xb5, + 0xb3, 0xb9, 0x3b, 0x02, 0x13, 0x92, 0xf7, 0xce, 0x48, 0xf2, 0x5e, 0x1a, 0x73, 0x67, 0x45, 0x10, + 0x07, 0xd9, 0xbb, 0x32, 0xc4, 0xde, 0x57, 0xcf, 0x64, 0xef, 0xe8, 0x18, 0x25, 0x7d, 0x6f, 0x8e, + 0xa0, 0xef, 0xd7, 0xc7, 0xa2, 0xef, 0x08, 0x58, 0x94, 0xbf, 0xf1, 0x28, 0xfe, 0x2e, 0x8d, 0xc7, + 0xdf, 0x11, 0xc8, 0x01, 0x02, 0xff, 0xfe, 0x31, 0x72, 0xd2, 0xce, 0xde, 0xdd, 0x23, 0x53, 0x24, + 0xab, 0xca, 0x31, 0x76, 0x32, 0x46, 0xb0, 0xd3, 0x2c, 0x87, 0x7f, 0xe3, 0x1c, 0xec, 0x14, 0x69, + 0xe0, 0x38, 0x3d, 0x7d, 0x04, 0xd3, 0x51, 0x4a, 0xe1, 0xaf, 0x52, 0x4e, 0x27, 0xbf, 0x13, 0xfe, + 0x0a, 0x82, 0xdb, 0x40, 0xa4, 0x08, 0xfd, 0xe0, 0x38, 0x33, 0xcd, 0x9d, 0x09, 0x7e, 0xc2, 0xf5, + 0xed, 0xaa, 0x72, 0x9c, 0x9a, 0xda, 0x27, 0x50, 0xd3, 0x3c, 0x6f, 0xe4, 0xad, 0x73, 0x52, 0x53, + 0xa4, 0xa5, 0xd1, 0xdc, 0x04, 0xa0, 0x06, 0xcf, 0x07, 0x22, 0x3c, 0x55, 0xfc, 0x43, 0x05, 0xe2, + 0x6b, 0x6e, 0x13, 0x65, 0xfb, 0xc9, 0x3d, 0x9e, 0x96, 0x7b, 0xbf, 0xaf, 0x2e, 0x4f, 0x91, 0xdf, + 0x3a, 0xa5, 0x47, 0x61, 0x32, 0x34, 0xac, 0x84, 0xde, 0x85, 0x54, 0x47, 0xc4, 0xe3, 0x92, 0x8a, + 0x8a, 0xa7, 0xd5, 0x17, 0x9a, 0x38, 0xa8, 0x72, 0xed, 0x6a, 0xf4, 0x2f, 0xa6, 0xd6, 0x5d, 0x8b, + 0xa0, 0x2c, 0xc0, 0x96, 0x41, 0x69, 0x67, 0xdf, 0x33, 0x28, 0xd1, 0x26, 0x50, 0x0a, 0xe2, 0xb7, + 0xd7, 0x1b, 0x9a, 0x72, 0xed, 0xa3, 0x68, 0x2a, 0xae, 0x8a, 0x97, 0xeb, 0x1b, 0xf5, 0x8d, 0x15, + 0x7d, 0x63, 0x79, 0xbd, 0xd6, 0xd0, 0x26, 0x50, 0x0e, 0xe6, 0x3f, 0x5c, 0xae, 0x6f, 0xcb, 0xdc, + 0x9c, 0x5e, 0xdf, 0xd8, 0xae, 0xe1, 0x7b, 0xcb, 0x77, 0x34, 0x05, 0x5d, 0x04, 0x84, 0x37, 0x2b, + 0xb7, 0x1b, 0xd5, 0xb2, 0x5e, 0xd9, 0x5c, 0xdf, 0x5a, 0xae, 0x6c, 0xd7, 0x37, 0x37, 0xb4, 0x18, + 0x52, 0x21, 0x51, 0xdd, 0xdc, 0xa8, 0x69, 0x70, 0xed, 0xaf, 0x12, 0x90, 0x60, 0xc6, 0x88, 0x5e, + 0x82, 0xa9, 0x9d, 0x8d, 0xc6, 0x56, 0xad, 0x52, 0xbf, 0x55, 0xaf, 0x55, 0xb5, 0x89, 0xfc, 0xdc, + 0xe3, 0x27, 0x8b, 0x33, 0xac, 0x68, 0xc7, 0xa1, 0x1d, 0x62, 0x72, 0x16, 0x46, 0x79, 0x48, 0x96, + 0x97, 0x2b, 0xb7, 0x77, 0xb6, 0x34, 0x25, 0x9f, 0x7d, 0xfc, 0x64, 0x11, 0x98, 0x82, 0x60, 0x40, + 0x74, 0x19, 0x52, 0xb8, 0xd6, 0xd8, 0xde, 0xc4, 0x35, 0x2d, 0x96, 0x9f, 0x79, 0xfc, 0x64, 0x71, + 0x8a, 0x15, 0x4a, 0x62, 0x43, 0xaf, 0x42, 0xa6, 0x51, 0x59, 0xad, 0xad, 0x2f, 0xeb, 0x95, 0xd5, + 0xe5, 0x8d, 0x95, 0x9a, 0x16, 0xcf, 0xcf, 0x3f, 0x7e, 0xb2, 0xa8, 0x0d, 0xef, 0x04, 0xd6, 0x44, + 0x7d, 0x7d, 0x6b, 0x13, 0x6f, 0x6b, 0x89, 0x7e, 0x13, 0x82, 0x80, 0x50, 0x11, 0x40, 0xd4, 0xbe, + 0x55, 0xab, 0x55, 0xb5, 0xc9, 0x3c, 0x7a, 0xfc, 0x64, 0x31, 0xcb, 0xca, 0xfb, 0xbc, 0x82, 0x5e, + 0x86, 0xe9, 0x0a, 0xae, 0x2d, 0x6f, 0xd7, 0xf4, 0xc6, 0xf6, 0xf2, 0x76, 0x43, 0x4b, 0xf6, 0x47, + 0x12, 0xe1, 0x0a, 0x54, 0x82, 0xd9, 0xe5, 0x9d, 0xed, 0x4d, 0x7d, 0x40, 0x37, 0x95, 0xbf, 0xf4, + 0xf8, 0xc9, 0xe2, 0x1c, 0xd3, 0x5d, 0xee, 0xfa, 0x6e, 0x54, 0xff, 0xdb, 0xa0, 0x0d, 0xf4, 0x5f, + 0x5f, 0xa9, 0x68, 0x6a, 0xfe, 0xe2, 0xe3, 0x27, 0x8b, 0x68, 0x78, 0x08, 0x2b, 0x15, 0xf4, 0x2b, + 0x70, 0x71, 0xfb, 0xe3, 0xad, 0x5a, 0xb5, 0xd6, 0xa8, 0xe8, 0x83, 0xc3, 0x4e, 0xe7, 0x73, 0x8f, + 0x9f, 0x2c, 0xce, 0xb3, 0x3a, 0xc7, 0x86, 0xfe, 0x3a, 0x68, 0x8d, 0x6d, 0x5c, 0x5b, 0x5e, 0xd7, + 0xeb, 0x1b, 0x2b, 0xb5, 0x06, 0x5f, 0x2c, 0xe8, 0x77, 0x69, 0x68, 0x57, 0xb3, 0x21, 0x6c, 0xd4, + 0x3e, 0x1c, 0xc2, 0x9f, 0xea, 0xeb, 0x0f, 0x6d, 0x54, 0xf4, 0x36, 0x5c, 0xbc, 0xb3, 0xb9, 0xb1, + 0xa2, 0xe3, 0x9d, 0x0d, 0x6e, 0x3f, 0xeb, 0xf5, 0x15, 0xbc, 0xcc, 0x1b, 0x99, 0xce, 0x5f, 0x7e, + 0xfc, 0x64, 0x91, 0x3f, 0x09, 0x19, 0xb5, 0xf1, 0xf2, 0xea, 0x8f, 0xff, 0x7c, 0x61, 0xe2, 0x2f, + 0x7e, 0xba, 0x30, 0x51, 0xbe, 0xf2, 0xf9, 0x7f, 0x2c, 0x4c, 0x7c, 0x7e, 0xb4, 0xa0, 0xfc, 0xfc, + 0x68, 0x41, 0xf9, 0xe2, 0x68, 0x41, 0xf9, 0xf7, 0xa3, 0x05, 0xe5, 0xf7, 0xbf, 0x5c, 0x98, 0xf8, + 0xf9, 0x97, 0x0b, 0x13, 0x5f, 0x7c, 0xb9, 0x30, 0xf1, 0x49, 0x52, 0xd8, 0x7b, 0x33, 0xc9, 0x0f, + 0x9d, 0x6f, 0xfc, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x39, 0xdd, 0x69, 0x8c, 0xfa, 0x3a, 0x00, + 0x00, } diff --git a/pkg/jobs/jobspb/jobs.proto b/pkg/jobs/jobspb/jobs.proto index d1a82a90f106..6e9be36264fc 100644 --- a/pkg/jobs/jobspb/jobs.proto +++ b/pkg/jobs/jobspb/jobs.proto @@ -20,6 +20,7 @@ import "sql/catalog/descpb/structured.proto"; import "sql/catalog/descpb/tenant.proto"; import "util/hlc/timestamp.proto"; import "sql/schemachanger/scpb/scpb.proto"; +import "clusterversion/cluster_version.proto"; message Lease { option (gogoproto.equal) = true; @@ -322,6 +323,7 @@ message NewSchemaChangeProgress { repeated cockroach.sql.schemachanger.scpb.State states = 1; } + message ResumeSpanList { repeated roachpb.Span resume_spans = 1 [(gogoproto.nullable) = false]; } @@ -577,6 +579,14 @@ message CreateStatsProgress { } +message LongRunningMigrationDetails { + clusterversion.ClusterVersion cluster_version = 1; +} + +message LongRunningMigrationProgress { + +} + message Payload { string description = 1; // If empty, the description is assumed to be the statement. @@ -619,6 +629,7 @@ message Payload { TypeSchemaChangeDetails typeSchemaChange = 22; StreamIngestionDetails streamIngestion = 23; NewSchemaChangeDetails newSchemaChange = 24; + LongRunningMigrationDetails longRunningMigration = 25; } } @@ -641,6 +652,7 @@ message Progress { TypeSchemaChangeProgress typeSchemaChange = 17; StreamIngestionProgress streamIngest = 18; NewSchemaChangeProgress newSchemaChange = 19; + LongRunningMigrationProgress longRunningMigration = 20; } } @@ -662,6 +674,7 @@ enum Type { TYPEDESC_SCHEMA_CHANGE = 9 [(gogoproto.enumvalue_customname) = "TypeTypeSchemaChange"]; STREAM_INGESTION = 10 [(gogoproto.enumvalue_customname) = "TypeStreamIngestion"]; NEW_SCHEMA_CHANGE = 11 [(gogoproto.enumvalue_customname) = "TypeNewSchemaChange"]; + LONG_RUNNING_MIGRATION = 12 [(gogoproto.enumvalue_customname) = "TypeLongRunningMigration"]; } message Job { diff --git a/pkg/jobs/jobspb/wrap.go b/pkg/jobs/jobspb/wrap.go index 44809875b621..629499fd9400 100644 --- a/pkg/jobs/jobspb/wrap.go +++ b/pkg/jobs/jobspb/wrap.go @@ -30,6 +30,7 @@ var _ Details = CreateStatsDetails{} var _ Details = SchemaChangeGCDetails{} var _ Details = StreamIngestionDetails{} var _ Details = NewSchemaChangeDetails{} +var _ Details = LongRunningMigrationDetails{} // ProgressDetails is a marker interface for job progress details proto structs. type ProgressDetails interface{} @@ -42,6 +43,7 @@ var _ ProgressDetails = CreateStatsProgress{} var _ ProgressDetails = SchemaChangeGCProgress{} var _ ProgressDetails = StreamIngestionProgress{} var _ ProgressDetails = NewSchemaChangeProgress{} +var _ ProgressDetails = LongRunningMigrationProgress{} // Type returns the payload's job type. func (p *Payload) Type() Type { @@ -75,6 +77,8 @@ func DetailsType(d isPayload_Details) Type { return TypeStreamIngestion case *Payload_NewSchemaChange: return TypeNewSchemaChange + case *Payload_LongRunningMigration: + return TypeLongRunningMigration default: panic(errors.AssertionFailedf("Payload.Type called on a payload with an unknown details type: %T", d)) } @@ -109,6 +113,8 @@ func WrapProgressDetails(details ProgressDetails) interface { return &Progress_StreamIngest{StreamIngest: &d} case NewSchemaChangeProgress: return &Progress_NewSchemaChange{NewSchemaChange: &d} + case LongRunningMigrationProgress: + return &Progress_LongRunningMigration{LongRunningMigration: &d} default: panic(errors.AssertionFailedf("WrapProgressDetails: unknown details type %T", d)) } @@ -138,6 +144,8 @@ func (p *Payload) UnwrapDetails() Details { return *d.StreamIngestion case *Payload_NewSchemaChange: return *d.NewSchemaChange + case *Payload_LongRunningMigration: + return *d.LongRunningMigration default: return nil } @@ -167,6 +175,8 @@ func (p *Progress) UnwrapDetails() ProgressDetails { return *d.StreamIngest case *Progress_NewSchemaChange: return *d.NewSchemaChange + case *Progress_LongRunningMigration: + return *d.LongRunningMigration default: return nil } @@ -209,6 +219,8 @@ func WrapPayloadDetails(details Details) interface { return &Payload_StreamIngestion{StreamIngestion: &d} case NewSchemaChangeDetails: return &Payload_NewSchemaChange{NewSchemaChange: &d} + case LongRunningMigrationDetails: + return &Payload_LongRunningMigration{LongRunningMigration: &d} default: panic(errors.AssertionFailedf("jobs.WrapPayloadDetails: unknown details type %T", d)) } @@ -244,7 +256,7 @@ const ( func (Type) SafeValue() {} // NumJobTypes is the number of jobs types. -const NumJobTypes = 12 +const NumJobTypes = 13 func init() { if len(Type_name) != NumJobTypes { diff --git a/pkg/jobs/registry.go b/pkg/jobs/registry.go index 78663dc484ac..07f0b0221142 100644 --- a/pkg/jobs/registry.go +++ b/pkg/jobs/registry.go @@ -648,7 +648,7 @@ func (r *Registry) Start( UPDATE system.jobs SET claim_session_id = NULL WHERE claim_session_id <> $1 - AND status IN `+claimableStatusTupleString+` + AND status IN `+NonTerminalStatusTupleString+` AND NOT crdb_internal.sql_liveness_is_alive(claim_session_id)`, s.ID().UnsafeBytes(), ); err != nil { diff --git a/pkg/migration/BUILD.bazel b/pkg/migration/BUILD.bazel index a0cfcb63f082..8a69c4c52a12 100644 --- a/pkg/migration/BUILD.bazel +++ b/pkg/migration/BUILD.bazel @@ -12,6 +12,7 @@ go_library( "//pkg/clusterversion", "//pkg/kv", "//pkg/roachpb", + "//pkg/security", "//pkg/server/serverpb", "//pkg/util/log", "@com_github_cockroachdb_logtags//:logtags", diff --git a/pkg/migration/migration.go b/pkg/migration/migration.go index bc2342ca918a..fbef1ed7d3a3 100644 --- a/pkg/migration/migration.go +++ b/pkg/migration/migration.go @@ -28,13 +28,14 @@ import ( "github.com/cockroachdb/cockroach/pkg/clusterversion" "github.com/cockroachdb/cockroach/pkg/kv" "github.com/cockroachdb/cockroach/pkg/roachpb" + "github.com/cockroachdb/cockroach/pkg/security" "github.com/cockroachdb/cockroach/pkg/server/serverpb" "github.com/cockroachdb/logtags" ) // Manager coordinates long-running migrations. type Manager interface { - Migrate(ctx context.Context, from, to clusterversion.ClusterVersion) error + Migrate(ctx context.Context, user security.SQLUsername, from, to clusterversion.ClusterVersion) error } // Cluster abstracts a physical KV cluster and can be utilized by a long-runnng diff --git a/pkg/migration/migrationjob/BUILD.bazel b/pkg/migration/migrationjob/BUILD.bazel new file mode 100644 index 000000000000..f05f934286c0 --- /dev/null +++ b/pkg/migration/migrationjob/BUILD.bazel @@ -0,0 +1,16 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "migrationjob", + srcs = ["migration_job.go"], + importpath = "github.com/cockroachdb/cockroach/pkg/migration/migrationjob", + visibility = ["//visibility:public"], + deps = [ + "//pkg/jobs", + "//pkg/jobs/jobspb", + "//pkg/migration", + "//pkg/migration/migrations", + "//pkg/settings/cluster", + "//pkg/sql", + ], +) diff --git a/pkg/migration/migrationjob/migration_job.go b/pkg/migration/migrationjob/migration_job.go new file mode 100644 index 000000000000..ab0702a5117e --- /dev/null +++ b/pkg/migration/migrationjob/migration_job.go @@ -0,0 +1,53 @@ +// Copyright 2018 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +// Package migrationjob contains the jobs.Resumer implementation +// used for long-running migrations. +package migrationjob + +import ( + "context" + + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" + "github.com/cockroachdb/cockroach/pkg/migration" + "github.com/cockroachdb/cockroach/pkg/migration/migrations" + "github.com/cockroachdb/cockroach/pkg/settings/cluster" + "github.com/cockroachdb/cockroach/pkg/sql" +) + +func init() { + jobs.RegisterConstructor(jobspb.TypeLongRunningMigration, func(job *jobs.Job, settings *cluster.Settings) jobs.Resumer { + return &resumer{j: job} + }) +} + +type resumer struct { + j *jobs.Job +} + +var _ jobs.Resumer = (*resumer)(nil) + +func (r resumer) Resume(ctx context.Context, execCtxI interface{}) error { + // TODO(ajwerner): add some check to see if we're done. + execCtx := execCtxI.(sql.JobExecContext) + pl := r.j.Payload() + cv := *pl.GetLongRunningMigration().ClusterVersion + m, ok := migrations.GetMigration(cv) + if !ok { + return nil + } + return m.(*migration.KVMigration).Run(ctx, cv, execCtx.MigrationCluster()) +} + +// The long-running migration resumer has no reverting logic. +func (r resumer) OnFailOrCancel(ctx context.Context, execCtx interface{}) error { + return nil +} diff --git a/pkg/migration/migrationmanager/BUILD.bazel b/pkg/migration/migrationmanager/BUILD.bazel index 988ba0b1bc44..95a418de34b0 100644 --- a/pkg/migration/migrationmanager/BUILD.bazel +++ b/pkg/migration/migrationmanager/BUILD.bazel @@ -7,13 +7,21 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/clusterversion", + "//pkg/jobs", + "//pkg/jobs/jobspb", "//pkg/kv", "//pkg/migration", - "//pkg/migration/migrationcluster", + "//pkg/migration/migrationjob", "//pkg/migration/migrations", + "//pkg/security", "//pkg/server/serverpb", + "//pkg/sql/protoreflect", + "//pkg/sql/sem/tree", + "//pkg/sql/sqlutil", "//pkg/util/log", + "@com_github_cockroachdb_errors//:errors", "@com_github_cockroachdb_logtags//:logtags", + "@com_github_cockroachdb_redact//:redact", ], ) @@ -26,6 +34,7 @@ go_test( deps = [ "//pkg/base", "//pkg/clusterversion", + "//pkg/jobs", "//pkg/kv/kvserver/batcheval", "//pkg/kv/kvserver/liveness", "//pkg/migration", @@ -35,11 +44,13 @@ go_test( "//pkg/security/securitytest", "//pkg/server", "//pkg/settings/cluster", + "//pkg/sql/sqlutil", "//pkg/testutils", "//pkg/testutils/serverutils", "//pkg/testutils/testcluster", "//pkg/util/leaktest", "//pkg/util/log", + "//pkg/util/tracing", "@com_github_cockroachdb_errors//:errors", "@com_github_stretchr_testify//require", ], diff --git a/pkg/migration/migrationmanager/manager.go b/pkg/migration/migrationmanager/manager.go index ce00e985d451..127d1aaaa7e0 100644 --- a/pkg/migration/migrationmanager/manager.go +++ b/pkg/migration/migrationmanager/manager.go @@ -17,39 +17,45 @@ import ( "fmt" "github.com/cockroachdb/cockroach/pkg/clusterversion" + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" "github.com/cockroachdb/cockroach/pkg/kv" "github.com/cockroachdb/cockroach/pkg/migration" - "github.com/cockroachdb/cockroach/pkg/migration/migrationcluster" + _ "github.com/cockroachdb/cockroach/pkg/migration/migrationjob" "github.com/cockroachdb/cockroach/pkg/migration/migrations" + "github.com/cockroachdb/cockroach/pkg/security" "github.com/cockroachdb/cockroach/pkg/server/serverpb" + "github.com/cockroachdb/cockroach/pkg/sql/protoreflect" + "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" + "github.com/cockroachdb/cockroach/pkg/sql/sqlutil" "github.com/cockroachdb/cockroach/pkg/util/log" + "github.com/cockroachdb/errors" "github.com/cockroachdb/logtags" + "github.com/cockroachdb/redact" ) // Manager is the instance responsible for executing migrations across the // cluster. type Manager struct { - c migration.Cluster + c migration.Cluster + ie sqlutil.InternalExecutor + jr *jobs.Registry } // NewManager constructs a new Manager. -// -// TODO(irfansharif): We'll need to eventually plumb in on a lease manager here. -func NewManager( - dialer migrationcluster.NodeDialer, nl migrationcluster.NodeLiveness, db *kv.DB, -) *Manager { +func NewManager(c migration.Cluster, ie sqlutil.InternalExecutor, jr *jobs.Registry) *Manager { return &Manager{ - c: migrationcluster.New(migrationcluster.ClusterConfig{ - NodeLiveness: nl, - Dialer: dialer, - DB: db, - }), + c: c, + ie: ie, + jr: jr, } } // Migrate runs the set of migrations required to upgrade the cluster version // from the current version to the target one. -func (m *Manager) Migrate(ctx context.Context, from, to clusterversion.ClusterVersion) error { +func (m *Manager) Migrate( + ctx context.Context, user security.SQLUsername, from, to clusterversion.ClusterVersion, +) error { // TODO(irfansharif): Should we inject every ctx here with specific labels // for each migration, so they log distinctly? ctx = logtags.AddTag(ctx, "migration-mgr", nil) @@ -80,11 +86,10 @@ func (m *Manager) Migrate(ctx context.Context, from, to clusterversion.ClusterVe log.Infof(ctx, "migrating cluster from %s to %s (stepping through %s)", from, to, clusterVersions) for _, clusterVersion := range clusterVersions { + log.Infof(ctx, "stepping through %s to %s (%s)", from, to, clusterVersions) // First, run the actual migration if any. - if mig, ok := migrations.GetMigration(clusterVersion); ok { - if err := mig.(*migration.KVMigration).Run(ctx, clusterVersion, m.c); err != nil { - return err - } + if err := m.runMigration(ctx, user, clusterVersion); err != nil { + return err } // Next we'll push out the version gate to every node in the cluster. @@ -209,3 +214,101 @@ func (m *Manager) Migrate(ctx context.Context, from, to clusterversion.ClusterVe return nil } + +func (m *Manager) runMigration( + ctx context.Context, user security.SQLUsername, version clusterversion.ClusterVersion, +) error { + if _, exists := migrations.GetMigration(version); !exists { + return nil + } + id, err := m.getOrCreateMigrationJob(ctx, user, version) + if err != nil { + return err + } + return m.jr.Run(ctx, m.ie, []int64{id}) +} + +func (m *Manager) getOrCreateMigrationJob( + ctx context.Context, user security.SQLUsername, version clusterversion.ClusterVersion, +) (jobID int64, _ error) { + + if err := m.c.DB().Txn(ctx, func(ctx context.Context, txn *kv.Txn) (err error) { + var found bool + found, jobID, err = m.getRunningMigrationJob(ctx, txn, version) + if err != nil { + return err + } + if found { + return nil + } + var j *jobs.Job + j, err = m.jr.CreateJobWithTxn(ctx, jobs.Record{ + Description: "Long running migration", + Details: jobspb.LongRunningMigrationDetails{ + ClusterVersion: &version, + }, + Username: user, + Progress: jobspb.LongRunningMigrationProgress{}, + NonCancelable: true, + }, txn) + if err != nil { + return err + } + jobID = *j.ID() + return nil + }); err != nil { + return 0, err + } + return jobID, nil +} + +func (m *Manager) getRunningMigrationJob( + ctx context.Context, txn *kv.Txn, version clusterversion.ClusterVersion, +) (found bool, jobID int64, _ error) { + const query = ` +SELECT id, status + FROM ( + SELECT id, + status, + crdb_internal.pb_to_json( + 'cockroach.sql.jobs.jobspb.Payload', + payload + ) AS pl + FROM system.jobs + WHERE status IN ` + jobs.NonTerminalStatusTupleString + ` + ) + WHERE pl->'longRunningMigration'->'clusterVersion' = $1::JSON;` + // TODO(ajwerner): Flip the emitDefaults flag once this is rebased on master. + jsonMsg, err := protoreflect.MessageToJSON(&version, true /* emitDefaults */) + if err != nil { + return false, 0, errors.Wrap(err, "failed to marshal version to JSON") + } + rows, err := m.ie.Query(ctx, "migration-manager-find-jobs", txn, query, jsonMsg.String()) + if err != nil { + return false, 0, err + } + parseRow := func(row tree.Datums) (id int64, status jobs.Status) { + return int64(*row[0].(*tree.DInt)), jobs.Status(*row[1].(*tree.DString)) + } + switch len(rows) { + case 0: + return false, 0, nil + case 1: + id, status := parseRow(rows[0]) + log.Infof(ctx, "found existing migration job %d for version %v in status %s, waiting", + id, &version, status) + return true, id, nil + default: + var buf redact.StringBuilder + buf.Printf("found multiple non-terminal jobs for version %s: [", redact.Safe(&version)) + for i, row := range rows { + if i > 0 { + buf.SafeString(", ") + } + id, status := parseRow(row) + buf.Printf("(%d, %s)", id, redact.Safe(status)) + } + log.Errorf(ctx, "%s", buf) + return false, 0, errors.AssertionFailedf("%s", buf) + } +} diff --git a/pkg/migration/migrationmanager/manager_external_test.go b/pkg/migration/migrationmanager/manager_external_test.go index e1b3aa802414..56ab855d4ce0 100644 --- a/pkg/migration/migrationmanager/manager_external_test.go +++ b/pkg/migration/migrationmanager/manager_external_test.go @@ -16,6 +16,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/base" "github.com/cockroachdb/cockroach/pkg/clusterversion" + "github.com/cockroachdb/cockroach/pkg/jobs" "github.com/cockroachdb/cockroach/pkg/kv/kvserver/batcheval" "github.com/cockroachdb/cockroach/pkg/kv/kvserver/liveness" "github.com/cockroachdb/cockroach/pkg/migration" @@ -23,14 +24,132 @@ import ( "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/server" "github.com/cockroachdb/cockroach/pkg/settings/cluster" + "github.com/cockroachdb/cockroach/pkg/sql/sqlutil" "github.com/cockroachdb/cockroach/pkg/testutils" "github.com/cockroachdb/cockroach/pkg/testutils/testcluster" "github.com/cockroachdb/cockroach/pkg/util/leaktest" "github.com/cockroachdb/cockroach/pkg/util/log" + "github.com/cockroachdb/cockroach/pkg/util/tracing" "github.com/cockroachdb/errors" "github.com/stretchr/testify/require" ) +// TestAlreadyRunningJobsAreHandledProperly is a relatively low-level test to +// ensure that the behavior to detect running jobs is sane. The test intercepts +// and blocks a migration that it first runs. It then duplicates the job to +// break the single-running job invariant. It then ensures that that invariant +// violation is detected. After that errant job is finished, it ensures that +// concurrent attempts to bump the cluster version detect the already running +// migration and wait. +func TestAlreadyRunningJobsAreHandledProperly(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + + // We're going to be migrating from startCV to endCV. + startCV := clusterversion.ClusterVersion{Version: roachpb.Version{Major: 41}} + endCV := clusterversion.ClusterVersion{Version: roachpb.Version{Major: 42}} + + ctx := context.Background() + tc := testcluster.StartTestCluster(t, 2, base.TestClusterArgs{ + ReplicationMode: base.ReplicationManual, + ServerArgs: base.TestServerArgs{ + Settings: cluster.MakeTestingClusterSettingsWithVersions(endCV.Version, startCV.Version, false), + Knobs: base.TestingKnobs{ + Server: &server.TestingKnobs{ + BinaryVersionOverride: startCV.Version, + DisableAutomaticVersionUpgrade: 1, + }, + }, + }, + }) + defer tc.Stopper().Stop(ctx) + + ch := make(chan chan error) + defer migrations.TestingRegisterMigrationInterceptor(endCV, func( + ctx context.Context, cv clusterversion.ClusterVersion, h migration.Cluster, + ) error { + canResume := make(chan error) + ch <- canResume + return <-canResume + })() + upgrade1Err := make(chan error, 1) + go func() { + _, err := tc.ServerConn(0).ExecContext(ctx, `SET CLUSTER SETTING version = $1`, endCV.String()) + upgrade1Err <- err + }() + unblock := <-ch + + // Inject a second job for the same migration and ensure that that causes + // an error. This is pretty gnarly. + var secondID int64 + require.NoError(t, tc.ServerConn(0).QueryRow(` + INSERT + INTO system.jobs + ( + SELECT + unique_rowid(), + status, + created, + payload, + progress, + created_by_type, + created_by_id, + claim_session_id, + claim_instance_id + FROM system.jobs + WHERE ( + crdb_internal.pb_to_json( + 'cockroach.sql.jobs.jobspb.Payload', + payload + )->'longRunningMigration' + ) IS NOT NULL + ) +RETURNING id;`).Scan(&secondID)) + + // Make sure that the second job gets run in a timely manner. + runErr := make(chan error) + go func() { + runErr <- tc.Server(0).JobRegistry().(*jobs.Registry). + Run( + ctx, + tc.Server(0).InternalExecutor().(sqlutil.InternalExecutor), + []int64{secondID}, + ) + }() + fakeJobBlockChan := <-ch + + // Ensure that we see the assertion error. + _, err := tc.Conns[0].ExecContext(ctx, `SET CLUSTER SETTING version = $1`, endCV.String()) + require.Regexp(t, "found multiple non-terminal jobs for version", err) + + // Let the fake, erroneous job finish with an error. + fakeJobBlockChan <- errors.New("boom") + require.Regexp(t, "boom", <-runErr) + + // Launch a second migration which later we'll ensure does not kick off + // another job. We'll make sure this happens by polling the trace to see + // the log line indicating what we want. + recCtx, getRecording, cancel := tracing.ContextWithRecordingSpan(ctx, "test") + defer cancel() + upgrade2Err := make(chan error, 1) + go func() { + // Use an internal executor to get access to the trace as it happens. + _, err := tc.Server(0).InternalExecutor().(sqlutil.InternalExecutor).Exec( + recCtx, "test", nil /* txn */, `SET CLUSTER SETTING version = $1`, endCV.String()) + upgrade2Err <- err + }() + + testutils.SucceedsSoon(t, func() error { + if tracing.FindMsgInRecording(getRecording(), "found existing migration job") > 0 { + return nil + } + return errors.Errorf("waiting for job to be discovered: %v", getRecording()) + }) + close(unblock) + require.NoError(t, <-upgrade1Err) + require.NoError(t, <-upgrade2Err) +} + func TestMigrateUpdatesReplicaVersion(t *testing.T) { defer leaktest.AfterTest(t)() defer log.Scope(t).Close(t) diff --git a/pkg/server/BUILD.bazel b/pkg/server/BUILD.bazel index c5a537a98b59..f771ff0a01fa 100644 --- a/pkg/server/BUILD.bazel +++ b/pkg/server/BUILD.bazel @@ -75,7 +75,9 @@ go_library( "//pkg/kv/kvserver/protectedts/ptprovider", "//pkg/kv/kvserver/protectedts/ptreconcile", "//pkg/kv/kvserver/reports", + "//pkg/migration/migrationcluster", "//pkg/migration/migrationmanager", + "//pkg/migration/migrations", "//pkg/roachpb", "//pkg/rpc", "//pkg/rpc/nodedialer", diff --git a/pkg/server/server_sql.go b/pkg/server/server_sql.go index a7daa200810e..ec98447d327c 100644 --- a/pkg/server/server_sql.go +++ b/pkg/server/server_sql.go @@ -32,7 +32,9 @@ import ( "github.com/cockroachdb/cockroach/pkg/kv/kvclient/kvtenant" "github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverbase" "github.com/cockroachdb/cockroach/pkg/kv/kvserver/protectedts" + "github.com/cockroachdb/cockroach/pkg/migration/migrationcluster" "github.com/cockroachdb/cockroach/pkg/migration/migrationmanager" + _ "github.com/cockroachdb/cockroach/pkg/migration/migrations" "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/rpc" "github.com/cockroachdb/cockroach/pkg/rpc/nodedialer" @@ -625,14 +627,14 @@ func newSQLServer(ctx context.Context, cfg sqlServerArgs) (*SQLServer, error) { // We only need to attach a version upgrade hook if we're the system // tenant. Regular tenants are disallowed from changing cluster // versions. - migrationMgr := migrationmanager.NewManager( - cfg.nodeDialer, - nodeLiveness, - cfg.db, - ) - execCfg.VersionUpgradeHook = func(ctx context.Context, from, to clusterversion.ClusterVersion) error { - return migrationMgr.Migrate(ctx, from, to) - } + c := migrationcluster.New(migrationcluster.ClusterConfig{ + NodeLiveness: nodeLiveness, + Dialer: cfg.nodeDialer, + DB: cfg.db, + }) + migrationMgr := migrationmanager.NewManager(c, cfg.circularInternalExecutor, jobRegistry) + execCfg.MigrationCluster = c + execCfg.VersionUpgradeHook = migrationMgr.Migrate } temporaryObjectCleaner := sql.NewTemporaryObjectCleaner( diff --git a/pkg/sql/BUILD.bazel b/pkg/sql/BUILD.bazel index 6393275322eb..6428fb8a8e47 100644 --- a/pkg/sql/BUILD.bazel +++ b/pkg/sql/BUILD.bazel @@ -250,6 +250,7 @@ go_library( "//pkg/kv/kvserver", "//pkg/kv/kvserver/liveness/livenesspb", "//pkg/kv/kvserver/protectedts", + "//pkg/migration", "//pkg/roachpb", "//pkg/rpc", "//pkg/rpc/nodedialer", diff --git a/pkg/sql/exec_util.go b/pkg/sql/exec_util.go index c787e3d9044e..fbfec5148c5c 100644 --- a/pkg/sql/exec_util.go +++ b/pkg/sql/exec_util.go @@ -36,6 +36,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/kv/kvclient/kvcoord" "github.com/cockroachdb/cockroach/pkg/kv/kvclient/rangecache" "github.com/cockroachdb/cockroach/pkg/kv/kvserver/protectedts" + "github.com/cockroachdb/cockroach/pkg/migration" "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/rpc" "github.com/cockroachdb/cockroach/pkg/security" @@ -796,8 +797,15 @@ type ExecutorConfig struct { // VersionUpgradeHook is called after validating a `SET CLUSTER SETTING // version` but before executing it. It can carry out arbitrary migrations - // that allow us to eventually remove legacy code. - VersionUpgradeHook func(ctx context.Context, from, to clusterversion.ClusterVersion) error + // that allow us to eventually remove legacy code. It will only be populated + // on the system tenant. + // + // TODO(tbg,irfansharif,ajwerner): Hook up for secondary tenants. + VersionUpgradeHook func(ctx context.Context, user security.SQLUsername, from, to clusterversion.ClusterVersion) error + + // MigrationCluster is used to drive KV-level, long-running migrations. + // It will only be populated on the system tenant. + MigrationCluster migration.Cluster // IndexBackfiller is used to backfill indexes. It is another rather circular // object which mostly just holds on to an ExecConfig. diff --git a/pkg/sql/job_exec_context.go b/pkg/sql/job_exec_context.go index 31f87c07ca61..024a9af47e95 100644 --- a/pkg/sql/job_exec_context.go +++ b/pkg/sql/job_exec_context.go @@ -11,6 +11,7 @@ package sql import ( + "github.com/cockroachdb/cockroach/pkg/migration" "github.com/cockroachdb/cockroach/pkg/security" "github.com/cockroachdb/cockroach/pkg/sql/catalog/lease" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" @@ -41,10 +42,11 @@ func (e *plannerJobExecContext) ExtendedEvalContext() *extendedEvalContext { func (e *plannerJobExecContext) SessionData() *sessiondata.SessionData { return e.p.SessionData() } -func (e *plannerJobExecContext) ExecCfg() *ExecutorConfig { return e.p.ExecCfg() } -func (e *plannerJobExecContext) DistSQLPlanner() *DistSQLPlanner { return e.p.DistSQLPlanner() } -func (e *plannerJobExecContext) LeaseMgr() *lease.Manager { return e.p.LeaseMgr() } -func (e *plannerJobExecContext) User() security.SQLUsername { return e.p.User() } +func (e *plannerJobExecContext) ExecCfg() *ExecutorConfig { return e.p.ExecCfg() } +func (e *plannerJobExecContext) DistSQLPlanner() *DistSQLPlanner { return e.p.DistSQLPlanner() } +func (e *plannerJobExecContext) LeaseMgr() *lease.Manager { return e.p.LeaseMgr() } +func (e *plannerJobExecContext) User() security.SQLUsername { return e.p.User() } +func (e *plannerJobExecContext) MigrationCluster() migration.Cluster { return e.p.MigrationCluster() } // JobExecContext provides the execution environment for a job. It is what is // passed to the Resume/OnFailOrCancel/OnPauseRequested methods of a jobs's @@ -63,4 +65,5 @@ type JobExecContext interface { DistSQLPlanner() *DistSQLPlanner LeaseMgr() *lease.Manager User() security.SQLUsername + MigrationCluster() migration.Cluster } diff --git a/pkg/sql/planhook.go b/pkg/sql/planhook.go index f61af5e7bba6..cf1747471105 100644 --- a/pkg/sql/planhook.go +++ b/pkg/sql/planhook.go @@ -13,6 +13,7 @@ package sql import ( "context" + "github.com/cockroachdb/cockroach/pkg/migration" "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/security" "github.com/cockroachdb/cockroach/pkg/sql/catalog" @@ -97,6 +98,7 @@ type PlanHookState interface { ) (string, error) CreateSchemaNamespaceEntry(ctx context.Context, schemaNameKey roachpb.Key, schemaID descpb.ID) error + MigrationCluster() migration.Cluster } // AddPlanHook adds a hook used to short-circuit creating a planNode from a diff --git a/pkg/sql/planner.go b/pkg/sql/planner.go index ab3c9a840f67..beb0ba52d128 100644 --- a/pkg/sql/planner.go +++ b/pkg/sql/planner.go @@ -18,6 +18,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/jobs" "github.com/cockroachdb/cockroach/pkg/kv" "github.com/cockroachdb/cockroach/pkg/kv/kvserver" + "github.com/cockroachdb/cockroach/pkg/migration" "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/rpc" "github.com/cockroachdb/cockroach/pkg/security" @@ -473,6 +474,11 @@ func (p *planner) DistSQLPlanner() *DistSQLPlanner { return p.extendedEvalCtx.DistSQLPlanner } +// MigrationCluster returns the migration.Cluster if there is one. +func (p *planner) MigrationCluster() migration.Cluster { + return p.execCfg.MigrationCluster +} + // GetTypeFromValidSQLSyntax implements the tree.EvalPlanner interface. // We define this here to break the dependency from eval.go to the parser. func (p *planner) GetTypeFromValidSQLSyntax(sql string) (*types.T, error) { diff --git a/pkg/sql/set_cluster_setting.go b/pkg/sql/set_cluster_setting.go index 249ad5d68cfc..9022229cbfd4 100644 --- a/pkg/sql/set_cluster_setting.go +++ b/pkg/sql/set_cluster_setting.go @@ -53,7 +53,7 @@ type setClusterSettingNode struct { // versionUpgradeHook is called after validating a `SET CLUSTER SETTING // version` but before executing it. It can carry out arbitrary migrations // that allow us to eventually remove legacy code. - versionUpgradeHook func(ctx context.Context, from, to clusterversion.ClusterVersion) error + versionUpgradeHook func(ctx context.Context, username security.SQLUsername, from, to clusterversion.ClusterVersion) error } func checkPrivilegesForSetting(ctx context.Context, p *planner, name string, action string) error { @@ -259,7 +259,7 @@ func (n *setClusterSettingNode) startExec(params runParams) error { // toSettingString already validated the input, and checked to // see that we are allowed to transition. Let's call into our // upgrade hook to run migrations, if any. - if err := n.versionUpgradeHook(ctx, from, to); err != nil { + if err := n.versionUpgradeHook(ctx, params.p.User(), from, to); err != nil { return err } } diff --git a/pkg/ts/catalog/chart_catalog.go b/pkg/ts/catalog/chart_catalog.go index 8f805fa50039..da2534226dc4 100644 --- a/pkg/ts/catalog/chart_catalog.go +++ b/pkg/ts/catalog/chart_catalog.go @@ -2321,6 +2321,7 @@ var charts = []sectionDescription{ "jobs.schema_change_gc.currently_running", "jobs.typedesc_schema_change.currently_running", "jobs.stream_ingestion.currently_running", + "jobs.long_running_migration.currently_running", }, }, { @@ -2454,6 +2455,17 @@ var charts = []sectionDescription{ "jobs.stream_ingestion.resume_retry_error", }, }, + { + Title: "Long Running Migrations", + Metrics: []string{ + "jobs.long_running_migration.fail_or_cancel_completed", + "jobs.long_running_migration.fail_or_cancel_failed", + "jobs.long_running_migration.fail_or_cancel_retry_error", + "jobs.long_running_migration.resume_completed", + "jobs.long_running_migration.resume_failed", + "jobs.long_running_migration.resume_retry_error", + }, + }, }, }, }