From ea43c8630763e7503ca535753f9c14f3b533372c Mon Sep 17 00:00:00 2001 From: Azhng Date: Wed, 4 Aug 2021 10:17:22 -0400 Subject: [PATCH] sql,jobs: create SQL Stats Compaction Job and resumer This commit introduces the SQL Stats Compaction job type and a barebones implementation of the SQL Stats compaction. Release note: None --- .../settings/settings-for-tenants.txt | 1 + docs/generated/settings/settings.html | 1 + pkg/jobs/jobspb/jobs.pb.go | 1110 +++++++++++------ pkg/jobs/jobspb/jobs.proto | 12 +- pkg/jobs/jobspb/wrap.go | 12 +- pkg/sql/BUILD.bazel | 1 + pkg/sql/compact_sql_stats.go | 64 + pkg/sql/conn_executor.go | 3 +- .../sqlstats/persistedsqlstats/BUILD.bazel | 13 + .../persistedsqlstats/cluster_settings.go | 9 + .../persistedsqlstats/compaction_exec.go | 158 +++ .../compaction_scheduling.go | 70 ++ .../persistedsqlstats/compaction_test.go | 303 +++++ .../sqlstats/persistedsqlstats/provider.go | 19 +- .../sqlstats/persistedsqlstats/test_utils.go | 3 +- pkg/ts/catalog/chart_catalog.go | 12 + pkg/util/jobutil/BUILD.bazel | 0 17 files changed, 1430 insertions(+), 361 deletions(-) create mode 100644 pkg/sql/compact_sql_stats.go create mode 100644 pkg/sql/sqlstats/persistedsqlstats/compaction_exec.go create mode 100644 pkg/sql/sqlstats/persistedsqlstats/compaction_scheduling.go create mode 100644 pkg/sql/sqlstats/persistedsqlstats/compaction_test.go create mode 100644 pkg/util/jobutil/BUILD.bazel diff --git a/docs/generated/settings/settings-for-tenants.txt b/docs/generated/settings/settings-for-tenants.txt index 2b537facc2cd..c0e6097a5ce9 100644 --- a/docs/generated/settings/settings-for-tenants.txt +++ b/docs/generated/settings/settings-for-tenants.txt @@ -138,6 +138,7 @@ sql.stats.flush.enabled boolean true if set, SQL execution statistics are period sql.stats.flush.interval duration 1h0m0s the interval at which SQL execution statistics are flushed to disk sql.stats.histogram_collection.enabled boolean true histogram collection mode sql.stats.multi_column_collection.enabled boolean true multi-column statistics collection mode +sql.stats.persisted_rows.max integer 10000 maximum number of rows of statement and transaction statistics that will be persisted in the system tables sql.stats.post_events.enabled boolean false if set, an event is logged for every CREATE STATISTICS job sql.temp_object_cleaner.cleanup_interval duration 30m0s how often to clean up orphaned temporary objects sql.trace.log_statement_execute boolean false set to true to enable logging of executed statements diff --git a/docs/generated/settings/settings.html b/docs/generated/settings/settings.html index 586c80212b0c..3094e918f2e8 100644 --- a/docs/generated/settings/settings.html +++ b/docs/generated/settings/settings.html @@ -142,6 +142,7 @@ sql.stats.flush.intervalduration1h0m0sthe interval at which SQL execution statistics are flushed to disk sql.stats.histogram_collection.enabledbooleantruehistogram collection mode sql.stats.multi_column_collection.enabledbooleantruemulti-column statistics collection mode +sql.stats.persisted_rows.maxinteger10000maximum number of rows of statement and transaction statistics that will be persisted in the system tables sql.stats.post_events.enabledbooleanfalseif set, an event is logged for every CREATE STATISTICS job sql.temp_object_cleaner.cleanup_intervalduration30m0show often to clean up orphaned temporary objects sql.trace.log_statement_executebooleanfalseset to true to enable logging of executed statements diff --git a/pkg/jobs/jobspb/jobs.pb.go b/pkg/jobs/jobspb/jobs.pb.go index d7464d23ce56..70b0fa6fa103 100644 --- a/pkg/jobs/jobspb/jobs.pb.go +++ b/pkg/jobs/jobspb/jobs.pb.go @@ -106,10 +106,11 @@ 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 - TypeMigration Type = 12 + TypeTypeSchemaChange Type = 9 + TypeStreamIngestion Type = 10 + TypeNewSchemaChange Type = 11 + TypeMigration Type = 12 + TypeSQLStatsCompaction Type = 13 ) var Type_name = map[int32]string{ @@ -126,6 +127,7 @@ var Type_name = map[int32]string{ 10: "STREAM_INGESTION", 11: "NEW_SCHEMA_CHANGE", 12: "MIGRATION", + 13: "SQL_STATS_COMPACTION", } var Type_value = map[string]int32{ @@ -142,6 +144,7 @@ var Type_value = map[string]int32{ "STREAM_INGESTION": 10, "NEW_SCHEMA_CHANGE": 11, "MIGRATION": 12, + "SQL_STATS_COMPACTION": 13, } func (Type) EnumDescriptor() ([]byte, []int) { @@ -2139,6 +2142,70 @@ func (m *MigrationProgress) XXX_DiscardUnknown() { var xxx_messageInfo_MigrationProgress proto.InternalMessageInfo +type SQLStatsCompactionDetails struct { +} + +func (m *SQLStatsCompactionDetails) Reset() { *m = SQLStatsCompactionDetails{} } +func (m *SQLStatsCompactionDetails) String() string { return proto.CompactTextString(m) } +func (*SQLStatsCompactionDetails) ProtoMessage() {} +func (*SQLStatsCompactionDetails) Descriptor() ([]byte, []int) { + return fileDescriptor_6c315f3a2536c4ef, []int{31} +} +func (m *SQLStatsCompactionDetails) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SQLStatsCompactionDetails) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *SQLStatsCompactionDetails) XXX_Merge(src proto.Message) { + xxx_messageInfo_SQLStatsCompactionDetails.Merge(m, src) +} +func (m *SQLStatsCompactionDetails) XXX_Size() int { + return m.Size() +} +func (m *SQLStatsCompactionDetails) XXX_DiscardUnknown() { + xxx_messageInfo_SQLStatsCompactionDetails.DiscardUnknown(m) +} + +var xxx_messageInfo_SQLStatsCompactionDetails proto.InternalMessageInfo + +type SQLStatsCompactionProgress struct { +} + +func (m *SQLStatsCompactionProgress) Reset() { *m = SQLStatsCompactionProgress{} } +func (m *SQLStatsCompactionProgress) String() string { return proto.CompactTextString(m) } +func (*SQLStatsCompactionProgress) ProtoMessage() {} +func (*SQLStatsCompactionProgress) Descriptor() ([]byte, []int) { + return fileDescriptor_6c315f3a2536c4ef, []int{32} +} +func (m *SQLStatsCompactionProgress) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SQLStatsCompactionProgress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *SQLStatsCompactionProgress) XXX_Merge(src proto.Message) { + xxx_messageInfo_SQLStatsCompactionProgress.Merge(m, src) +} +func (m *SQLStatsCompactionProgress) XXX_Size() int { + return m.Size() +} +func (m *SQLStatsCompactionProgress) XXX_DiscardUnknown() { + xxx_messageInfo_SQLStatsCompactionProgress.DiscardUnknown(m) +} + +var xxx_messageInfo_SQLStatsCompactionProgress 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. @@ -2176,6 +2243,7 @@ type Payload struct { // *Payload_StreamIngestion // *Payload_NewSchemaChange // *Payload_Migration + // *Payload_SqlStatsCompaction Details isPayload_Details `protobuf_oneof:"details"` } @@ -2183,7 +2251,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_6c315f3a2536c4ef, []int{31} + return fileDescriptor_6c315f3a2536c4ef, []int{33} } func (m *Payload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2247,18 +2315,22 @@ type Payload_NewSchemaChange struct { type Payload_Migration struct { Migration *MigrationDetails `protobuf:"bytes,25,opt,name=migration,proto3,oneof" json:"migration,omitempty"` } +type Payload_SqlStatsCompaction struct { + SqlStatsCompaction *SQLStatsCompactionDetails `protobuf:"bytes,27,opt,name=sqlStatsCompaction,proto3,oneof" json:"sqlStatsCompaction,omitempty"` +} -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_Migration) 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_Migration) isPayload_Details() {} +func (*Payload_SqlStatsCompaction) isPayload_Details() {} func (m *Payload) GetDetails() isPayload_Details { if m != nil { @@ -2344,6 +2416,13 @@ func (m *Payload) GetMigration() *MigrationDetails { return nil } +func (m *Payload) GetSqlStatsCompaction() *SQLStatsCompactionDetails { + if x, ok := m.GetDetails().(*Payload_SqlStatsCompaction); ok { + return x.SqlStatsCompaction + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Payload) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -2358,6 +2437,7 @@ func (*Payload) XXX_OneofWrappers() []interface{} { (*Payload_StreamIngestion)(nil), (*Payload_NewSchemaChange)(nil), (*Payload_Migration)(nil), + (*Payload_SqlStatsCompaction)(nil), } } @@ -2380,6 +2460,7 @@ type Progress struct { // *Progress_StreamIngest // *Progress_NewSchemaChange // *Progress_Migration + // *Progress_SqlStatsCompaction Details isProgress_Details `protobuf_oneof:"details"` TraceID uint64 `protobuf:"varint,21,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` } @@ -2388,7 +2469,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_6c315f3a2536c4ef, []int{32} + return fileDescriptor_6c315f3a2536c4ef, []int{34} } func (m *Progress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2463,6 +2544,9 @@ type Progress_NewSchemaChange struct { type Progress_Migration struct { Migration *MigrationProgress `protobuf:"bytes,20,opt,name=migration,proto3,oneof" json:"migration,omitempty"` } +type Progress_SqlStatsCompaction struct { + SqlStatsCompaction *SQLStatsCompactionProgress `protobuf:"bytes,22,opt,name=sqlStatsCompaction,proto3,oneof" json:"sqlStatsCompaction,omitempty"` +} func (*Progress_FractionCompleted) isProgress_Progress() {} func (*Progress_HighWater) isProgress_Progress() {} @@ -2477,6 +2561,7 @@ func (*Progress_TypeSchemaChange) isProgress_Details() {} func (*Progress_StreamIngest) isProgress_Details() {} func (*Progress_NewSchemaChange) isProgress_Details() {} func (*Progress_Migration) isProgress_Details() {} +func (*Progress_SqlStatsCompaction) isProgress_Details() {} func (m *Progress) GetProgress() isProgress_Progress { if m != nil { @@ -2582,6 +2667,13 @@ func (m *Progress) GetMigration() *MigrationProgress { return nil } +func (m *Progress) GetSqlStatsCompaction() *SQLStatsCompactionProgress { + if x, ok := m.GetDetails().(*Progress_SqlStatsCompaction); ok { + return x.SqlStatsCompaction + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*Progress) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -2598,6 +2690,7 @@ func (*Progress) XXX_OneofWrappers() []interface{} { (*Progress_StreamIngest)(nil), (*Progress_NewSchemaChange)(nil), (*Progress_Migration)(nil), + (*Progress_SqlStatsCompaction)(nil), } } @@ -2613,7 +2706,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_6c315f3a2536c4ef, []int{33} + return fileDescriptor_6c315f3a2536c4ef, []int{35} } func (m *Job) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2703,6 +2796,8 @@ func init() { proto.RegisterType((*CreateStatsProgress)(nil), "cockroach.sql.jobs.jobspb.CreateStatsProgress") proto.RegisterType((*MigrationDetails)(nil), "cockroach.sql.jobs.jobspb.MigrationDetails") proto.RegisterType((*MigrationProgress)(nil), "cockroach.sql.jobs.jobspb.MigrationProgress") + proto.RegisterType((*SQLStatsCompactionDetails)(nil), "cockroach.sql.jobs.jobspb.SQLStatsCompactionDetails") + proto.RegisterType((*SQLStatsCompactionProgress)(nil), "cockroach.sql.jobs.jobspb.SQLStatsCompactionProgress") 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") @@ -2711,334 +2806,339 @@ func init() { func init() { proto.RegisterFile("jobs/jobspb/jobs.proto", fileDescriptor_6c315f3a2536c4ef) } var fileDescriptor_6c315f3a2536c4ef = []byte{ - // 5229 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5b, 0x4b, 0x6c, 0x23, 0x47, - 0x7a, 0x56, 0x53, 0x14, 0x1f, 0xbf, 0x48, 0xaa, 0x59, 0xd2, 0x68, 0x68, 0xae, 0x3d, 0xd4, 0x72, - 0x3d, 0xf6, 0xcc, 0xd8, 0xa6, 0xbc, 0x9a, 0x5d, 0xaf, 0x3d, 0x6b, 0x8f, 0xcd, 0x97, 0x24, 0x52, - 0xa3, 0xc7, 0x34, 0xa9, 0xf1, 0xd8, 0x8e, 0xb7, 0xd3, 0xec, 0x2e, 0x49, 0x1d, 0x91, 0x6c, 0x4e, - 0x57, 0x73, 0x66, 0xb4, 0x01, 0x16, 0x8b, 0x5d, 0x04, 0x08, 0xe6, 0x94, 0x1c, 0x36, 0x87, 0x24, - 0x03, 0x2c, 0xb0, 0x5e, 0x20, 0x87, 0x04, 0x41, 0x16, 0xc1, 0x26, 0x08, 0x72, 0x08, 0x90, 0x8b, - 0x0f, 0x1b, 0x60, 0x2f, 0x41, 0x9c, 0x1c, 0x98, 0x44, 0xbe, 0xe4, 0x18, 0x24, 0xb7, 0x39, 0x05, - 0xf5, 0xe8, 0x66, 0x37, 0xf5, 0xa2, 0x66, 0xc6, 0x9b, 0x8b, 0xd4, 0xf5, 0x57, 0xd5, 0x57, 0xaf, - 0xbf, 0xbe, 0xff, 0xaf, 0xbf, 0x8a, 0x30, 0xff, 0x3b, 0x56, 0x8b, 0x2c, 0xd2, 0x3f, 0xbd, 0x16, - 0xfb, 0x57, 0xe8, 0xd9, 0x96, 0x63, 0xa1, 0x17, 0x74, 0x4b, 0xdf, 0xb7, 0x2d, 0x4d, 0xdf, 0x2b, - 0x90, 0x7b, 0xed, 0x02, 0xcb, 0xe1, 0xa5, 0xb2, 0x17, 0xb0, 0x6d, 0x5b, 0x36, 0x2d, 0xcf, 0x3f, - 0x78, 0x8d, 0xec, 0xdc, 0xae, 0xb5, 0x6b, 0xb1, 0xcf, 0x45, 0xfa, 0x25, 0xa4, 0x88, 0x61, 0xf4, - 0x5a, 0x8b, 0x86, 0xe6, 0x68, 0x42, 0x96, 0x71, 0x65, 0xa6, 0xf5, 0xc6, 0x8e, 0x65, 0x77, 0x34, - 0xc7, 0xc5, 0xf8, 0x06, 0xb9, 0xd7, 0x5e, 0xd4, 0x35, 0x47, 0x6b, 0x5b, 0xbb, 0x8b, 0x06, 0x26, - 0x7a, 0xaf, 0xb5, 0x48, 0x1c, 0xbb, 0xaf, 0x3b, 0x7d, 0x1b, 0x1b, 0xa2, 0x50, 0xee, 0x98, 0x42, - 0x0e, 0xee, 0x6a, 0x5d, 0xc7, 0xc5, 0xef, 0x3b, 0x66, 0x7b, 0x71, 0xaf, 0xad, 0x2f, 0x3a, 0x66, - 0x07, 0x13, 0x47, 0xeb, 0xf4, 0x44, 0xce, 0xd7, 0x69, 0x55, 0xa2, 0xef, 0xe1, 0x8e, 0xa6, 0xef, - 0x69, 0xdd, 0x5d, 0x6c, 0x2f, 0xf2, 0x36, 0xf4, 0x5e, 0x4b, 0x14, 0x79, 0x59, 0x6f, 0xf7, 0x89, - 0x83, 0xed, 0xfb, 0xd8, 0x26, 0xa6, 0xd5, 0x5d, 0x14, 0x49, 0x55, 0xa4, 0x79, 0xa9, 0xfc, 0xcf, - 0x43, 0x70, 0xb1, 0xa4, 0xe9, 0xfb, 0xfd, 0x5e, 0xb5, 0xab, 0xdb, 0x07, 0x3d, 0xc7, 0xb4, 0xba, - 0x9b, 0xec, 0x2f, 0x41, 0x32, 0x4c, 0xee, 0xe3, 0x83, 0x8c, 0xb4, 0x20, 0x5d, 0x49, 0x28, 0xf4, - 0x13, 0xbd, 0x07, 0xe1, 0x8e, 0x65, 0xe0, 0x4c, 0x68, 0x41, 0xba, 0x92, 0x5a, 0xba, 0x5a, 0x38, - 0x71, 0x6e, 0x0b, 0x43, 0xb4, 0x75, 0xcb, 0xc0, 0x0a, 0xab, 0x86, 0x5a, 0x10, 0xdb, 0xef, 0x10, - 0xd5, 0xec, 0xee, 0x58, 0x99, 0xc9, 0x05, 0xe9, 0xca, 0xf4, 0xd2, 0x8d, 0x53, 0x20, 0x4e, 0xe8, - 0x56, 0x61, 0x6d, 0xbd, 0x51, 0xeb, 0xee, 0x58, 0xa5, 0xe9, 0xc3, 0x41, 0x2e, 0x2a, 0x12, 0x4a, - 0x74, 0xbf, 0x43, 0xe8, 0x47, 0x76, 0x13, 0x5c, 0x19, 0xed, 0x7f, 0xdf, 0x36, 0x59, 0xff, 0xe3, - 0x0a, 0xfd, 0x44, 0xaf, 0x03, 0xc2, 0x1c, 0x0f, 0x1b, 0x2a, 0x5d, 0x48, 0x95, 0x0e, 0x30, 0xc4, - 0x06, 0x28, 0x7b, 0x39, 0x15, 0xcd, 0xd1, 0xd6, 0xf0, 0xc1, 0x8d, 0xf0, 0x7f, 0xfd, 0x34, 0x27, - 0xf1, 0xbf, 0xf9, 0x1f, 0x4e, 0x42, 0x6a, 0xd8, 0x15, 0x06, 0xbf, 0x0a, 0x11, 0xb6, 0x02, 0x98, - 0xb5, 0x90, 0x5a, 0x7a, 0x73, 0xac, 0xe9, 0xa0, 0x55, 0x0b, 0x0d, 0x56, 0x4f, 0x11, 0xf5, 0x11, - 0x82, 0x30, 0xd1, 0xda, 0x8e, 0xe8, 0x08, 0xfb, 0x46, 0x7f, 0x22, 0xc1, 0xc2, 0x68, 0x8f, 0x4a, - 0x07, 0x6b, 0xeb, 0x8d, 0x75, 0x8d, 0x2e, 0xe3, 0x1a, 0x3e, 0xa8, 0x55, 0x32, 0x93, 0x0b, 0x93, - 0x57, 0xa6, 0x97, 0x36, 0xc7, 0x6f, 0xb8, 0x7a, 0x06, 0x62, 0xb5, 0xeb, 0xd8, 0x07, 0xca, 0x99, - 0x0d, 0x67, 0x1b, 0x70, 0x79, 0x2c, 0x28, 0xbf, 0x0e, 0xc5, 0xb9, 0x0e, 0xcd, 0xc1, 0xd4, 0x7d, - 0xad, 0xdd, 0xc7, 0x62, 0xb4, 0x3c, 0x71, 0x23, 0xf4, 0xb6, 0x94, 0xbf, 0x08, 0x11, 0x3e, 0x31, - 0x28, 0x09, 0xf1, 0x62, 0xb5, 0xb1, 0xf4, 0xed, 0xb7, 0x56, 0xca, 0xeb, 0xf2, 0x84, 0x58, 0x82, - 0x5f, 0x4a, 0x30, 0xdf, 0x70, 0x6c, 0xac, 0x75, 0x6a, 0xdd, 0x5d, 0x4c, 0xe8, 0x98, 0x2a, 0xd8, - 0xd1, 0xcc, 0x36, 0x41, 0x97, 0x21, 0x45, 0x58, 0x8e, 0xaa, 0x19, 0x86, 0x8d, 0x09, 0x11, 0x0d, - 0x26, 0xb9, 0xb4, 0xc8, 0x85, 0xe8, 0x9b, 0x10, 0x26, 0x3d, 0xad, 0xcb, 0x5a, 0x9e, 0x5e, 0xba, - 0xe8, 0x9b, 0x36, 0xb1, 0x91, 0x0b, 0x8d, 0x9e, 0xd6, 0x2d, 0x85, 0x3f, 0x1f, 0xe4, 0x26, 0x14, - 0x56, 0x14, 0x95, 0x00, 0x88, 0xa3, 0xd9, 0x8e, 0x4a, 0x77, 0xa0, 0x50, 0xda, 0x97, 0x7c, 0x15, - 0xe9, 0x0e, 0x2d, 0xec, 0xb5, 0xf5, 0x42, 0xd3, 0xdd, 0xa1, 0xa2, 0x7a, 0x9c, 0x55, 0xa3, 0xd2, - 0xfc, 0xbf, 0x4c, 0xc2, 0xc5, 0x91, 0x8e, 0x6f, 0xd9, 0xd6, 0x2e, 0xeb, 0xd2, 0x32, 0x24, 0xf4, - 0xbe, 0x63, 0xdd, 0xc7, 0x36, 0x6f, 0x41, 0x1a, 0xbf, 0x85, 0x69, 0x51, 0x91, 0xca, 0xd1, 0x0f, - 0x00, 0xf5, 0x34, 0xdb, 0x31, 0x29, 0xb8, 0xda, 0x13, 0xe8, 0x99, 0x10, 0xd3, 0x8f, 0xda, 0x29, - 0xfa, 0x71, 0x42, 0xbf, 0x0a, 0x5b, 0x2e, 0x98, 0x2b, 0x61, 0xcb, 0x29, 0x5a, 0x4e, 0xf7, 0x46, - 0x73, 0xb3, 0xbb, 0x90, 0x3e, 0x52, 0x05, 0x29, 0x80, 0x4c, 0x86, 0x8c, 0x0d, 0xd5, 0x63, 0xb0, - 0xf3, 0x0c, 0x31, 0xed, 0x56, 0xf7, 0x32, 0xb2, 0x8f, 0x24, 0x98, 0x3f, 0xbe, 0x73, 0xc7, 0xe8, - 0xda, 0xc7, 0x7e, 0x5d, 0x9b, 0x5e, 0xaa, 0x3c, 0x8f, 0x89, 0xf0, 0x6b, 0xec, 0xdf, 0x47, 0x20, - 0xc9, 0x69, 0xca, 0xd5, 0xc4, 0xa0, 0xbe, 0x48, 0x4f, 0xa3, 0x2f, 0xe8, 0x26, 0xc4, 0x70, 0x97, - 0xcf, 0x98, 0xe8, 0xf8, 0x58, 0x08, 0x51, 0xdc, 0x65, 0xf3, 0x84, 0x5e, 0xe0, 0xbc, 0x47, 0x95, - 0x35, 0x5e, 0x8a, 0x1e, 0x0e, 0x72, 0x93, 0xdb, 0x4a, 0x8d, 0x13, 0xe0, 0x8f, 0x25, 0x98, 0xed, - 0xdb, 0x26, 0x51, 0x5b, 0x07, 0x6a, 0xdb, 0xd2, 0xb5, 0xb6, 0xe9, 0x1c, 0xa8, 0xfb, 0xf7, 0x33, - 0x53, 0x4c, 0x51, 0x6e, 0x9e, 0xc9, 0xc6, 0x62, 0x98, 0x85, 0x6d, 0xdb, 0x24, 0xa5, 0x83, 0x5b, - 0x02, 0x61, 0xed, 0x3e, 0xd7, 0x8e, 0xb9, 0xc3, 0x41, 0x4e, 0xde, 0x56, 0x6a, 0xfe, 0xac, 0x3b, - 0x8a, 0xdc, 0x1f, 0x29, 0x8c, 0xde, 0x85, 0xac, 0x81, 0x7b, 0x36, 0xd6, 0x35, 0xaa, 0x19, 0x2d, - 0x86, 0xac, 0x76, 0xb4, 0xae, 0xb9, 0x83, 0x89, 0x93, 0x09, 0x33, 0x5e, 0xc8, 0x0c, 0x4b, 0xf0, - 0xa6, 0xd7, 0x45, 0x3e, 0xd2, 0x3c, 0x12, 0xa7, 0xba, 0x6e, 0x71, 0xab, 0x90, 0x89, 0xb0, 0x89, - 0x5a, 0x3a, 0xbf, 0x3d, 0x51, 0xd2, 0xf8, 0x88, 0xe5, 0x53, 0x60, 0xc6, 0xd7, 0x04, 0xb3, 0x57, - 0x71, 0x86, 0x7f, 0x75, 0x6c, 0xaa, 0x55, 0x52, 0x38, 0x68, 0x2e, 0xfe, 0x50, 0x82, 0x2c, 0xb5, - 0xb9, 0x58, 0x0f, 0x6c, 0x07, 0xd5, 0xc6, 0xba, 0x65, 0x1b, 0x99, 0x28, 0x1d, 0x75, 0xa9, 0xf1, - 0x6f, 0x83, 0xdc, 0xf5, 0x5d, 0xd3, 0xd9, 0xeb, 0xb7, 0x0a, 0xba, 0xd5, 0x59, 0xf4, 0x5a, 0x33, - 0x5a, 0xc3, 0xef, 0xc5, 0xde, 0xfe, 0xee, 0x22, 0x73, 0x0d, 0xfa, 0x7d, 0xd3, 0x28, 0x6c, 0x6f, - 0xd7, 0x2a, 0x87, 0x83, 0x5c, 0x66, 0xcb, 0x05, 0xf7, 0x14, 0x43, 0x61, 0xd0, 0x4a, 0xa6, 0x77, - 0x42, 0x0e, 0x7a, 0x1b, 0x52, 0xba, 0xd5, 0x6e, 0x63, 0x9d, 0x8d, 0x73, 0x5b, 0xa9, 0x65, 0x62, - 0x4c, 0x69, 0xd2, 0x87, 0x83, 0x5c, 0xb2, 0xec, 0xe5, 0x50, 0xf5, 0x49, 0xea, 0xfe, 0x64, 0xb6, - 0x0c, 0x17, 0x8e, 0xd5, 0x81, 0xb3, 0x08, 0x3f, 0xee, 0xdf, 0x3e, 0x32, 0xa4, 0xf8, 0xa2, 0xb8, - 0x7b, 0x2b, 0xff, 0x77, 0xf3, 0x90, 0x52, 0x30, 0x71, 0x2c, 0x1b, 0xbb, 0x3b, 0xca, 0xbf, 0x1b, - 0xc2, 0x4f, 0xb1, 0x1b, 0x7e, 0x21, 0xc1, 0x2c, 0x75, 0xae, 0x6c, 0xb3, 0xe7, 0x58, 0xb6, 0x6a, - 0xe3, 0x07, 0xb6, 0xe9, 0x60, 0x97, 0x1b, 0x8b, 0xa7, 0x2c, 0x68, 0xb0, 0x23, 0x85, 0x8a, 0x07, - 0xa2, 0x08, 0x0c, 0xae, 0xf5, 0x37, 0x7f, 0xf4, 0xef, 0xb9, 0x1b, 0x63, 0xad, 0xd9, 0x51, 0x7f, - 0xaf, 0x50, 0xab, 0x28, 0xc8, 0x38, 0x02, 0x8c, 0x5e, 0x84, 0x30, 0xdd, 0x35, 0xcc, 0xc0, 0xc7, - 0x4b, 0xb1, 0xc3, 0x41, 0x2e, 0x4c, 0xf7, 0x95, 0xc2, 0xa4, 0xc8, 0x81, 0x39, 0xb1, 0x69, 0xbc, - 0x3d, 0xcc, 0x74, 0x34, 0xca, 0x86, 0xf4, 0xee, 0xf8, 0x43, 0xe2, 0xb3, 0xef, 0x2e, 0x21, 0xf3, - 0xaa, 0xf8, 0xec, 0xa1, 0xd6, 0x91, 0x1c, 0xb4, 0x05, 0x29, 0xea, 0x32, 0xb5, 0x34, 0x82, 0x55, - 0xda, 0x65, 0x92, 0x91, 0x59, 0x7b, 0xa3, 0x7b, 0x82, 0xdc, 0x6b, 0xd3, 0x32, 0x85, 0x8a, 0x28, - 0xec, 0x9b, 0xb7, 0xa4, 0xe1, 0x93, 0x11, 0xb4, 0x02, 0xd3, 0x8e, 0xd6, 0x6a, 0xbb, 0x70, 0x9c, - 0x84, 0x5e, 0x39, 0x01, 0xae, 0x49, 0x4b, 0xfa, 0xb0, 0xc0, 0x71, 0x05, 0x04, 0x55, 0x00, 0x9c, - 0x83, 0x9e, 0x8b, 0x93, 0x62, 0x38, 0x97, 0x4f, 0xc2, 0x39, 0xe8, 0xf9, 0x61, 0xe2, 0x8e, 0x48, - 0x13, 0x54, 0x87, 0x04, 0x77, 0xa9, 0x05, 0xce, 0x0c, 0xc3, 0x79, 0xf5, 0x04, 0x1c, 0xe6, 0xaa, - 0x68, 0x3e, 0xa4, 0x69, 0xe2, 0x49, 0x08, 0x2a, 0x42, 0x94, 0xbb, 0xf2, 0x24, 0x93, 0x64, 0x30, - 0x5f, 0x3f, 0xa9, 0x3b, 0xac, 0x94, 0x6f, 0xea, 0xdd, 0x7a, 0x68, 0x11, 0xa6, 0xa9, 0x79, 0xb7, - 0x4d, 0x03, 0xab, 0x46, 0x8b, 0x11, 0x5c, 0xbc, 0x94, 0x3a, 0x1c, 0xe4, 0x60, 0x53, 0x88, 0x2b, - 0x25, 0x05, 0xdc, 0x22, 0x95, 0x16, 0x7a, 0x0d, 0xd2, 0x3d, 0x1b, 0xf7, 0x34, 0x1b, 0xab, 0xba, - 0xd5, 0xe9, 0xb5, 0xb1, 0x83, 0x0d, 0xb6, 0xa1, 0x63, 0x8a, 0x2c, 0x32, 0xca, 0xae, 0x9c, 0xbb, - 0x4c, 0x9a, 0x43, 0xbd, 0x71, 0x82, 0x6d, 0x5a, 0x32, 0xce, 0x4a, 0x26, 0x99, 0xb4, 0x26, 0x84, - 0xe8, 0x00, 0xe6, 0xc9, 0x01, 0x71, 0x70, 0x47, 0x65, 0xd3, 0x4d, 0xd4, 0x8e, 0xb9, 0x6b, 0x53, - 0x52, 0xce, 0xa4, 0xd9, 0xb0, 0xca, 0xe3, 0x2b, 0x5b, 0x83, 0xe1, 0xb0, 0x65, 0x24, 0xeb, 0x02, - 0x85, 0xfb, 0x9b, 0x73, 0xe4, 0x98, 0x2c, 0x74, 0x1d, 0x2e, 0x0c, 0x77, 0x06, 0x51, 0x7b, 0xfd, - 0x56, 0xdb, 0x24, 0x7b, 0xd8, 0xc8, 0x00, 0xeb, 0xe8, 0x9c, 0x2f, 0x73, 0xcb, 0xcd, 0x43, 0x07, - 0x81, 0xcd, 0xae, 0xd3, 0xd9, 0xd1, 0x76, 0x71, 0x66, 0x7a, 0x41, 0xba, 0x32, 0x55, 0x5a, 0x7d, - 0x32, 0xc8, 0x55, 0xc6, 0xde, 0xa9, 0x04, 0x77, 0x16, 0x1d, 0x1b, 0x63, 0xdf, 0xc6, 0x2f, 0x0b, - 0x3c, 0xff, 0x9e, 0x75, 0x65, 0x48, 0x01, 0x18, 0x52, 0x7e, 0x26, 0xf1, 0xd4, 0xf6, 0xc8, 0x87, - 0x82, 0xba, 0x80, 0x6c, 0x7c, 0x5f, 0x6b, 0x9b, 0x86, 0xe6, 0x60, 0xd5, 0xec, 0x1a, 0xf8, 0x21, - 0x26, 0x19, 0xc4, 0xa6, 0xfe, 0x9d, 0xf1, 0xa7, 0x5e, 0xf1, 0x30, 0x6a, 0x14, 0xc2, 0xf5, 0xae, - 0xec, 0xa0, 0x18, 0x13, 0xf4, 0x97, 0x12, 0x20, 0x6f, 0x93, 0x77, 0x2c, 0xc3, 0xdc, 0x31, 0xb1, - 0x4d, 0x32, 0xb3, 0xac, 0xc1, 0x0f, 0xce, 0xc1, 0x95, 0x02, 0x63, 0xdd, 0x85, 0x78, 0x3e, 0x54, - 0x99, 0x36, 0x46, 0x71, 0xb3, 0xff, 0x2b, 0x41, 0xfa, 0x08, 0x33, 0xa3, 0x26, 0x84, 0x4c, 0x83, - 0x19, 0xa1, 0x64, 0x89, 0x1a, 0xc7, 0x50, 0xad, 0xf2, 0x64, 0xf0, 0x4c, 0x4d, 0x87, 0x4c, 0x03, - 0xed, 0x42, 0x9c, 0x6e, 0xa2, 0xae, 0xa3, 0x9a, 0x06, 0xb3, 0x66, 0xc9, 0x52, 0xfd, 0x70, 0x90, - 0x8b, 0x6d, 0x31, 0xe1, 0x33, 0x37, 0x11, 0xe3, 0xe0, 0x35, 0x03, 0xe5, 0x60, 0xda, 0xb1, 0x54, - 0xfc, 0xd0, 0x24, 0x8e, 0xd9, 0xdd, 0x65, 0x9e, 0x5c, 0x4c, 0x01, 0xc7, 0xaa, 0x0a, 0x49, 0xf6, - 0x4f, 0x43, 0x80, 0x8e, 0x92, 0x37, 0xfa, 0x5b, 0x09, 0x5e, 0x74, 0xdd, 0x3b, 0xcb, 0x36, 0x77, - 0xcd, 0xae, 0xd6, 0x0e, 0xf8, 0x79, 0x12, 0x5b, 0xc8, 0x8f, 0x9f, 0xc5, 0x42, 0x08, 0xdf, 0x6f, - 0x53, 0xc0, 0x8f, 0xfa, 0x80, 0x2f, 0x52, 0x57, 0x84, 0xfb, 0x80, 0x47, 0x8a, 0xdc, 0x51, 0x32, - 0xfd, 0x13, 0x2a, 0x67, 0xd7, 0xe0, 0xa5, 0x53, 0x81, 0xcf, 0xe3, 0x58, 0x64, 0x7f, 0x24, 0xc1, - 0xc5, 0x13, 0xcc, 0xb5, 0x1f, 0x27, 0xc9, 0x71, 0x6e, 0x07, 0x4f, 0x09, 0xdf, 0x7d, 0x06, 0x97, - 0xc0, 0xdf, 0x89, 0x15, 0x78, 0xe1, 0x44, 0xca, 0x3b, 0x6b, 0x34, 0x31, 0x3f, 0xd0, 0xbf, 0x4a, - 0x30, 0x33, 0xb2, 0x83, 0xd1, 0x47, 0x3e, 0x05, 0xaf, 0x1d, 0x0e, 0x72, 0x51, 0xd6, 0xc8, 0x73, - 0xd1, 0xf2, 0xfd, 0xa3, 0x5a, 0xbe, 0x41, 0x5b, 0x60, 0x0d, 0xb3, 0x16, 0xde, 0x7f, 0xea, 0x16, - 0x38, 0xc4, 0x50, 0xd3, 0xb3, 0xff, 0x20, 0x81, 0x3c, 0x4a, 0x16, 0x68, 0x13, 0x64, 0xfc, 0xd0, - 0xb1, 0x35, 0xd5, 0x67, 0xd4, 0xa5, 0xf3, 0x18, 0xf5, 0x14, 0xab, 0xde, 0xf4, 0x2c, 0xfb, 0x27, - 0x90, 0xb4, 0xf1, 0x2e, 0xf5, 0x71, 0x75, 0xab, 0xbb, 0x63, 0xee, 0x8a, 0x95, 0x7e, 0x6b, 0x6c, - 0xcf, 0xa5, 0xa0, 0xb0, 0xea, 0x65, 0x56, 0x5b, 0x49, 0xd8, 0xbe, 0x54, 0xf6, 0x87, 0x12, 0xcc, - 0x1f, 0xcf, 0x77, 0xc7, 0xe8, 0xda, 0x56, 0x50, 0xd7, 0x6e, 0x3c, 0x3d, 0xa5, 0xfa, 0x34, 0xa4, - 0x1e, 0x8e, 0x49, 0x72, 0x28, 0xff, 0x26, 0x55, 0x13, 0x56, 0xc7, 0x3b, 0x81, 0xbf, 0x04, 0xb0, - 0x67, 0xee, 0xee, 0xa9, 0x0f, 0x34, 0x07, 0xdb, 0x22, 0x92, 0x17, 0xa7, 0x92, 0x0f, 0xa9, 0x20, - 0xff, 0xc7, 0x00, 0xc9, 0x5a, 0xa7, 0x67, 0xd9, 0x8e, 0xeb, 0x6d, 0xdf, 0x82, 0x08, 0x37, 0xf4, - 0x62, 0xc2, 0x0b, 0xa7, 0x74, 0x30, 0x50, 0x93, 0xfb, 0x67, 0xc2, 0xb2, 0x08, 0x0c, 0xb4, 0x09, - 0x51, 0xee, 0x14, 0x91, 0xcc, 0x45, 0x06, 0xb7, 0x38, 0x36, 0x1c, 0x77, 0xaf, 0x5c, 0x9f, 0x48, - 0xa0, 0x78, 0x7e, 0x71, 0xe8, 0x58, 0xbf, 0xf8, 0x3d, 0x88, 0xf0, 0x30, 0xac, 0x08, 0xd4, 0xe4, - 0x8e, 0x89, 0xf0, 0xd4, 0x36, 0x97, 0xcd, 0x36, 0x5e, 0x66, 0xc5, 0xdc, 0xde, 0xf2, 0x4a, 0xe8, - 0x15, 0x88, 0x11, 0xe2, 0xa8, 0xc4, 0xfc, 0x3e, 0x3f, 0x69, 0x4c, 0xf2, 0x10, 0x63, 0xa3, 0xd1, - 0x6c, 0x98, 0xdf, 0xc7, 0x4a, 0x94, 0x10, 0x87, 0x7e, 0xa0, 0x4b, 0xc0, 0xbc, 0x2e, 0xa2, 0x51, - 0x5f, 0x8a, 0xb9, 0x4d, 0x93, 0x8a, 0x4f, 0xc2, 0x70, 0xf6, 0xcd, 0x9e, 0xba, 0xb3, 0x4f, 0xb8, - 0xaf, 0x22, 0x70, 0xf6, 0xcd, 0xde, 0xf2, 0x1a, 0x51, 0xa2, 0x34, 0x73, 0x79, 0x9f, 0xa0, 0x2c, - 0xc4, 0x1e, 0x68, 0xed, 0x36, 0x3b, 0xd9, 0x4c, 0x31, 0x14, 0x2f, 0x1d, 0x34, 0x35, 0x91, 0xaf, - 0xd6, 0xd4, 0x88, 0xb3, 0x44, 0x4f, 0x73, 0xf6, 0xd8, 0x31, 0x34, 0xae, 0x00, 0x17, 0x6d, 0x69, - 0xce, 0x1e, 0xca, 0x40, 0x94, 0x8f, 0x8b, 0x64, 0x62, 0x0b, 0x93, 0x57, 0x12, 0x8a, 0x9b, 0x44, - 0xaf, 0xc2, 0x0c, 0x8f, 0xcf, 0xa8, 0x86, 0x69, 0x63, 0xdd, 0x69, 0x1f, 0x30, 0x3f, 0x2b, 0xa6, - 0xa4, 0xb8, 0xb8, 0x22, 0xa4, 0xe8, 0x2a, 0xc8, 0xa3, 0x8e, 0x29, 0xf3, 0x8f, 0x62, 0xca, 0xcc, - 0x88, 0x5f, 0x4a, 0x7d, 0x58, 0xb1, 0xd6, 0x3e, 0x87, 0x2f, 0xc3, 0x7d, 0x58, 0x91, 0x31, 0x74, - 0xf6, 0xae, 0x82, 0x2c, 0xbc, 0xd2, 0x61, 0xd9, 0x24, 0xc7, 0xe5, 0xf2, 0x61, 0xd1, 0x02, 0xcc, - 0xf6, 0x34, 0x9b, 0x60, 0xb5, 0xd5, 0xef, 0x1a, 0x6d, 0xac, 0x72, 0xac, 0x4c, 0x8a, 0x95, 0x4e, - 0xb3, 0xac, 0x12, 0xcb, 0xe1, 0x7a, 0x77, 0xd6, 0x69, 0x7d, 0xfe, 0xff, 0xe1, 0xb4, 0x9e, 0xfd, - 0x79, 0x08, 0xa6, 0xd8, 0x2e, 0x43, 0x37, 0x20, 0x4c, 0xd7, 0x52, 0xc4, 0x97, 0xc6, 0x3d, 0x31, - 0xb1, 0x3a, 0x08, 0x41, 0xb8, 0xab, 0x75, 0x70, 0x06, 0xb1, 0x95, 0x66, 0xdf, 0xe8, 0x22, 0x44, - 0x09, 0xbe, 0xa7, 0xde, 0xd7, 0xda, 0x99, 0x59, 0xa6, 0x88, 0x11, 0x82, 0xef, 0xdd, 0xd1, 0xda, - 0xe8, 0x02, 0x44, 0x4c, 0xa2, 0x76, 0xf1, 0x83, 0xcc, 0x1c, 0xb7, 0x4a, 0x26, 0xd9, 0xc0, 0x0f, - 0xd0, 0xd7, 0x20, 0xfe, 0x40, 0x23, 0x2a, 0xee, 0xf4, 0x9c, 0x03, 0x36, 0x17, 0x31, 0xaa, 0xba, - 0xa4, 0x4a, 0xd3, 0xcc, 0x79, 0xd1, 0xec, 0x5d, 0xec, 0xa8, 0xba, 0xd5, 0x26, 0x99, 0x0b, 0x74, - 0xab, 0xd2, 0xd3, 0x1a, 0x15, 0x95, 0xad, 0x36, 0xa9, 0x87, 0x63, 0x21, 0x79, 0xb2, 0x1e, 0x8e, - 0x4d, 0xca, 0xe1, 0x7a, 0x38, 0x16, 0x96, 0xa7, 0xea, 0xe1, 0xd8, 0x94, 0x1c, 0xa9, 0x87, 0x63, - 0x11, 0x39, 0x5a, 0x0f, 0xc7, 0xa2, 0x72, 0xac, 0x1e, 0x8e, 0xc5, 0xe4, 0x78, 0x3d, 0x1c, 0x8b, - 0xcb, 0x50, 0x0f, 0xc7, 0x40, 0x9e, 0xae, 0x87, 0x63, 0xd3, 0x72, 0xa2, 0x1e, 0x8e, 0x25, 0xe4, - 0x64, 0x3d, 0x1c, 0x4b, 0xca, 0xa9, 0x7a, 0x38, 0x96, 0x92, 0x67, 0xea, 0xe1, 0xd8, 0x8c, 0x2c, - 0xd7, 0xc3, 0x31, 0x59, 0x4e, 0xd7, 0xc3, 0xb1, 0xb4, 0x8c, 0xb2, 0x55, 0x11, 0x47, 0xd6, 0xd0, - 0x77, 0x03, 0xf3, 0x34, 0xf6, 0x49, 0x8e, 0x55, 0xca, 0xff, 0x42, 0x02, 0xb9, 0x81, 0xef, 0xf5, - 0x71, 0x57, 0xc7, 0x77, 0xb4, 0x76, 0x79, 0xaf, 0xdf, 0xdd, 0x47, 0xaf, 0xc0, 0x8c, 0x4e, 0x3f, - 0x54, 0x1e, 0xe5, 0xa3, 0x33, 0x26, 0xb1, 0x19, 0x4b, 0x32, 0x71, 0x83, 0x4a, 0xe9, 0xc4, 0xbd, - 0x04, 0x20, 0xca, 0x51, 0x36, 0x09, 0xb1, 0x22, 0x71, 0x5e, 0x84, 0x52, 0xc8, 0x08, 0x8c, 0x6d, - 0x3d, 0x60, 0x94, 0x15, 0x80, 0x51, 0xac, 0x07, 0x68, 0x11, 0xe6, 0xba, 0xf8, 0xa1, 0xa3, 0x8e, - 0x16, 0x66, 0xf4, 0xa4, 0xa4, 0x69, 0x5e, 0xd9, 0x5f, 0x21, 0xff, 0x4f, 0x21, 0x98, 0x71, 0x3b, - 0xed, 0x72, 0xfa, 0x0e, 0xc8, 0x74, 0x75, 0x4d, 0x43, 0x75, 0x2c, 0x8e, 0xe4, 0xb2, 0xfb, 0x7b, - 0xa7, 0x05, 0x44, 0x83, 0x28, 0x34, 0x5d, 0x33, 0x9a, 0x16, 0x6b, 0x8e, 0x9b, 0x37, 0x25, 0x49, - 0xfc, 0xb2, 0xec, 0x36, 0xa4, 0xdc, 0x4a, 0x5c, 0x82, 0xca, 0x10, 0x09, 0xb4, 0xf7, 0xda, 0x18, - 0xed, 0xb9, 0x53, 0xad, 0x88, 0xaa, 0xd9, 0xdf, 0x05, 0x74, 0xb4, 0x6d, 0xbf, 0x69, 0x9d, 0xe2, - 0xa6, 0x75, 0x33, 0x68, 0x5a, 0xdf, 0x39, 0xdf, 0xd8, 0x7c, 0xdd, 0xf6, 0x87, 0xa8, 0xfe, 0x31, - 0x04, 0x29, 0x6e, 0x98, 0x3c, 0x9b, 0x4a, 0x29, 0x8a, 0x32, 0xa0, 0xd9, 0xdd, 0x1d, 0x46, 0xda, - 0xe9, 0xf8, 0x42, 0x8a, 0xec, 0x66, 0x78, 0x85, 0xbf, 0x41, 0x3d, 0x0f, 0xcd, 0x08, 0x86, 0xe4, - 0x43, 0xd4, 0x83, 0xd0, 0x0c, 0xaf, 0xd0, 0x65, 0x48, 0x31, 0xef, 0x71, 0x58, 0x6a, 0x92, 0x95, - 0x4a, 0x32, 0xa9, 0x57, 0xac, 0x04, 0x49, 0xd2, 0xd3, 0x7c, 0xe1, 0xfd, 0x30, 0x9b, 0xd4, 0x33, - 0xee, 0x31, 0x12, 0xb4, 0x8e, 0xdf, 0x21, 0xb0, 0x31, 0xe9, 0x77, 0xb0, 0xda, 0xb3, 0x78, 0xc4, - 0x65, 0x52, 0x89, 0x73, 0xc9, 0x96, 0x45, 0xd0, 0x36, 0x53, 0x15, 0x36, 0x17, 0xaa, 0xc1, 0x27, - 0x27, 0x13, 0x61, 0xad, 0x5c, 0x1b, 0x7f, 0x3a, 0x95, 0x19, 0x12, 0x14, 0xe4, 0xff, 0x4a, 0x82, - 0x8b, 0xd4, 0x1b, 0xe3, 0x3b, 0xad, 0xcc, 0x6e, 0x2c, 0x5d, 0xed, 0xd4, 0x20, 0xca, 0xdc, 0x3c, - 0xcf, 0x9d, 0x5d, 0x3d, 0x1c, 0xe4, 0x22, 0xb4, 0xf4, 0x33, 0x5b, 0xb9, 0x08, 0x05, 0xae, 0xb1, - 0x48, 0x82, 0x63, 0x6b, 0x5d, 0xc2, 0xe2, 0xf8, 0x74, 0xd9, 0x3a, 0xb8, 0xd3, 0xa2, 0xe7, 0xda, - 0x10, 0x33, 0x68, 0x73, 0x81, 0xcc, 0x75, 0x9e, 0x97, 0xcf, 0x42, 0x66, 0xb4, 0xcb, 0x5e, 0x98, - 0xf2, 0xb7, 0x60, 0x7e, 0x03, 0x3f, 0x38, 0x6e, 0x34, 0x25, 0x88, 0x72, 0xa6, 0x73, 0x55, 0xfe, - 0xca, 0x28, 0xe9, 0xf8, 0x2f, 0x6d, 0x0b, 0xac, 0xa7, 0x4d, 0x56, 0x41, 0x71, 0x2b, 0xe6, 0x3f, - 0x81, 0x8b, 0x23, 0xe8, 0xde, 0xf2, 0x7d, 0x00, 0x11, 0xe2, 0x68, 0x8e, 0x70, 0xcf, 0x52, 0xe3, - 0xa0, 0x37, 0x1c, 0xcd, 0xe9, 0x13, 0x45, 0xd4, 0xcb, 0x2b, 0x2c, 0xc0, 0xda, 0xef, 0x60, 0xaa, - 0x22, 0xb7, 0x4c, 0xe2, 0xa0, 0x0f, 0x20, 0x21, 0x54, 0x82, 0x6a, 0x8a, 0xdb, 0xef, 0x33, 0xb4, - 0x6a, 0xda, 0xf6, 0x40, 0x48, 0xfe, 0xaf, 0x25, 0x98, 0xad, 0xd8, 0x56, 0xaf, 0x87, 0x0d, 0x61, - 0x73, 0xf8, 0x64, 0xb8, 0xa6, 0x46, 0xf2, 0x99, 0x9a, 0x0d, 0x08, 0xd5, 0x2a, 0xe2, 0x58, 0x71, - 0xf3, 0x59, 0x4f, 0x2b, 0xb5, 0x0a, 0x7a, 0x87, 0xcf, 0x48, 0x9f, 0x30, 0x02, 0x4d, 0x1d, 0x89, - 0xb3, 0x05, 0xef, 0x78, 0x86, 0x53, 0xd1, 0x27, 0xf9, 0xcf, 0xa2, 0x70, 0xc1, 0x3f, 0xcb, 0x2b, - 0x65, 0xb7, 0xe3, 0x9f, 0x42, 0xd4, 0x8d, 0xb5, 0x8c, 0x41, 0x94, 0xc7, 0x41, 0x14, 0xc4, 0x7c, - 0xf8, 0xe3, 0x2d, 0x2e, 0x26, 0x6a, 0x40, 0xda, 0xec, 0x3a, 0xd8, 0x6e, 0x63, 0xed, 0x3e, 0xf5, - 0x2e, 0xe8, 0x9c, 0x89, 0xd8, 0xf6, 0xb8, 0xb6, 0x5c, 0xf6, 0x01, 0x70, 0x9f, 0xe0, 0x53, 0x98, - 0xf5, 0x83, 0xba, 0xfd, 0x3f, 0x3d, 0xa8, 0xca, 0xba, 0x37, 0x84, 0x75, 0xa3, 0xbf, 0x3e, 0x20, - 0x37, 0x32, 0x74, 0xd7, 0x3b, 0x18, 0xf0, 0xc0, 0xf9, 0x8d, 0xa7, 0x9e, 0x91, 0xca, 0xc8, 0x21, - 0x21, 0xe0, 0xea, 0x32, 0x2b, 0xf8, 0x15, 0xb9, 0xba, 0x77, 0x20, 0xc2, 0x63, 0xab, 0xe2, 0xb2, - 0xe8, 0xe6, 0xd3, 0x0e, 0x81, 0xc7, 0x6c, 0x15, 0x81, 0x96, 0xfd, 0x23, 0x09, 0x12, 0xfe, 0xe5, - 0x46, 0x26, 0xc4, 0xd8, 0xf4, 0xbb, 0x9c, 0x36, 0xf9, 0xdc, 0x0f, 0xd0, 0x5c, 0x95, 0x6a, 0x06, - 0xf5, 0xc4, 0x0c, 0xdb, 0xea, 0x0d, 0x2f, 0x0b, 0x27, 0x95, 0x18, 0x15, 0x50, 0xdf, 0x31, 0xfb, - 0x03, 0x88, 0x7b, 0x93, 0xee, 0x0b, 0x89, 0x4d, 0x3e, 0xc7, 0x90, 0xd8, 0xa9, 0xed, 0x57, 0x20, - 0x19, 0x98, 0x31, 0x34, 0xef, 0xf5, 0x21, 0x5c, 0x8a, 0xf0, 0x3e, 0x9c, 0x89, 0x92, 0xff, 0x8b, - 0x28, 0xcc, 0x1e, 0x47, 0xb5, 0x1f, 0x81, 0xec, 0xe3, 0x2d, 0xb5, 0x6d, 0x12, 0x47, 0xe8, 0xe6, - 0xd5, 0xd3, 0x4f, 0xd5, 0x3e, 0xf2, 0x13, 0xaa, 0x98, 0xb2, 0x83, 0x94, 0xf8, 0x09, 0xa4, 0x0c, - 0xde, 0x71, 0x11, 0xf6, 0x16, 0x2f, 0x2d, 0x4e, 0x3b, 0x0d, 0x1f, 0x43, 0x80, 0x02, 0x3d, 0x69, - 0xf8, 0xb2, 0x08, 0xd2, 0x21, 0xe9, 0x81, 0x1f, 0xf4, 0xc4, 0xb1, 0xea, 0xd9, 0xc9, 0x30, 0xe1, - 0xb6, 0x42, 0x31, 0xd1, 0x2e, 0xcc, 0xb8, 0x8d, 0xb8, 0x27, 0xf0, 0xf8, 0x73, 0x69, 0xc6, 0x9d, - 0x98, 0x86, 0x38, 0x91, 0xff, 0x58, 0x82, 0x59, 0xb7, 0x25, 0x2f, 0x72, 0x6c, 0x1a, 0x8c, 0xce, - 0x92, 0xa5, 0xc6, 0xe1, 0x20, 0x97, 0x16, 0x33, 0xe3, 0x06, 0x30, 0x9e, 0x59, 0xef, 0xd2, 0xc6, - 0x08, 0xa0, 0x41, 0x9d, 0x08, 0x9a, 0x4f, 0x1b, 0x9e, 0x1a, 0x3a, 0x11, 0x94, 0xd8, 0x9e, 0xdd, - 0x89, 0xa0, 0x9f, 0x35, 0x03, 0xfd, 0x9e, 0x04, 0x69, 0x7e, 0x5b, 0xd5, 0xe9, 0x3b, 0x1a, 0xbf, - 0x18, 0x76, 0x8f, 0xe6, 0x1f, 0x1d, 0x0e, 0x72, 0x33, 0x6c, 0x79, 0xd7, 0x45, 0x1e, 0x6b, 0xb6, - 0xf4, 0xb4, 0xcd, 0x0e, 0x51, 0xc4, 0x49, 0xd6, 0x13, 0x18, 0x68, 0x0d, 0x52, 0x3c, 0x5e, 0xe1, - 0xbe, 0xe4, 0x62, 0x67, 0xf6, 0x64, 0xe9, 0xe5, 0x27, 0x83, 0xdc, 0xc2, 0x31, 0xfb, 0x84, 0x87, - 0x3a, 0xee, 0xf0, 0xb2, 0x4a, 0x72, 0xc7, 0x9f, 0x44, 0xb7, 0x60, 0x86, 0x7b, 0x9e, 0xc3, 0xe7, - 0x19, 0x30, 0xfe, 0x1d, 0x2b, 0xf7, 0x5a, 0x3d, 0xa9, 0x08, 0x43, 0xcd, 0xc3, 0xdc, 0xb1, 0x4e, - 0xd3, 0x17, 0x11, 0x98, 0x0f, 0xd2, 0xaa, 0xe7, 0xd6, 0xa8, 0xa3, 0xf6, 0xf6, 0xfd, 0xb1, 0xa9, - 0xd9, 0x7b, 0xa8, 0xc1, 0xa8, 0xd1, 0x4d, 0x8d, 0x5a, 0xdc, 0x4f, 0x47, 0xac, 0xd7, 0x53, 0xe0, - 0xb3, 0xe5, 0x1d, 0xc1, 0x77, 0x4d, 0xd8, 0x5d, 0xcf, 0xb2, 0xf0, 0xc0, 0xd3, 0x07, 0x4f, 0x01, - 0xcf, 0xea, 0x7b, 0x8f, 0x4c, 0x5c, 0xdb, 0xf2, 0x2b, 0x09, 0x92, 0x81, 0x91, 0xfd, 0x26, 0x8d, - 0xcb, 0x96, 0xe7, 0x5b, 0xf1, 0x07, 0x7f, 0x6f, 0x9f, 0x7f, 0x58, 0x41, 0x97, 0x2b, 0xfb, 0x37, - 0x12, 0x24, 0x03, 0x13, 0xf9, 0x15, 0x99, 0xa5, 0xe7, 0xdf, 0xf3, 0x16, 0xa4, 0x82, 0x4b, 0xe4, - 0x6b, 0x43, 0x7a, 0x3e, 0x6d, 0xe4, 0xbf, 0x03, 0x11, 0x2e, 0x41, 0x08, 0x52, 0x1f, 0x16, 0x6b, - 0xcd, 0xda, 0xc6, 0x8a, 0xba, 0xbc, 0xa9, 0xa8, 0x2b, 0x65, 0x79, 0x02, 0x25, 0x20, 0x56, 0xa9, - 0xde, 0xaa, 0x52, 0xa1, 0x2c, 0xa1, 0x69, 0x88, 0xb2, 0x54, 0xb5, 0x22, 0x87, 0xf2, 0x25, 0x90, - 0x39, 0xf6, 0x0e, 0xa6, 0x66, 0x86, 0x1e, 0x23, 0x50, 0x01, 0x66, 0x99, 0xcb, 0xdf, 0xa1, 0x9e, - 0x15, 0xdd, 0xde, 0xaa, 0xcf, 0x17, 0x4f, 0x7b, 0x59, 0x74, 0xf7, 0x6e, 0x68, 0x1d, 0x9c, 0xff, - 0x65, 0x18, 0xd2, 0x43, 0x10, 0xd7, 0xc8, 0xfe, 0xb9, 0x34, 0x3c, 0xd0, 0x44, 0xce, 0xbc, 0x76, - 0x3c, 0x52, 0x5f, 0x9c, 0x6d, 0xc4, 0xf5, 0xdf, 0x87, 0x74, 0xd3, 0x3c, 0x19, 0xe4, 0xd2, 0xa3, - 0x9d, 0x25, 0xcf, 0x78, 0x2f, 0xe8, 0x76, 0x91, 0x85, 0x5e, 0xcd, 0xee, 0xbe, 0x3a, 0x7c, 0xff, - 0xc4, 0x43, 0xaf, 0x66, 0x77, 0x7f, 0x5b, 0xa9, 0x29, 0x51, 0x9a, 0xb9, 0x6d, 0x9b, 0xa8, 0x0e, - 0x61, 0xab, 0xe7, 0xb8, 0x27, 0xe8, 0xb7, 0xce, 0x35, 0xa4, 0xcd, 0x9e, 0x18, 0x8f, 0xc2, 0x30, - 0x50, 0x9d, 0xdf, 0xa4, 0x0f, 0x27, 0x9a, 0x11, 0xf2, 0x98, 0x14, 0x9a, 0x0c, 0x2c, 0x44, 0x76, - 0x17, 0x12, 0xfe, 0x19, 0x3b, 0xe6, 0x02, 0xa1, 0x18, 0x8c, 0x72, 0xbc, 0x36, 0x56, 0xd7, 0xc5, - 0x09, 0xd3, 0x77, 0xa7, 0xf4, 0x1d, 0x88, 0x7b, 0xe3, 0x38, 0xcf, 0xd5, 0x1a, 0xe7, 0x78, 0x2f, - 0x84, 0x37, 0x25, 0x47, 0xf2, 0x9f, 0x85, 0x20, 0xa1, 0x60, 0x62, 0xb5, 0xef, 0x63, 0x83, 0x7a, - 0x50, 0xde, 0x33, 0x4b, 0x69, 0xfc, 0x67, 0x96, 0x45, 0x88, 0x0f, 0x2d, 0xd0, 0x39, 0xde, 0xbc, - 0x0d, 0x6b, 0xa1, 0x8f, 0x20, 0xd9, 0xb2, 0xfa, 0x5d, 0x43, 0xb3, 0x0f, 0x98, 0x5f, 0xc5, 0x3c, - 0x90, 0xd4, 0xd2, 0xb7, 0x4e, 0xf7, 0x05, 0xbd, 0x5e, 0x17, 0x4a, 0xa2, 0x32, 0xf5, 0x9f, 0x94, - 0x44, 0xcb, 0x97, 0xca, 0xbf, 0x07, 0x09, 0x7f, 0x2e, 0x8a, 0x41, 0x78, 0x63, 0x73, 0xa3, 0xca, - 0xf7, 0x64, 0xa9, 0x58, 0x5e, 0x5b, 0xae, 0xdd, 0xba, 0x25, 0x4b, 0x54, 0x5e, 0xbd, 0x5b, 0x6b, - 0xca, 0x21, 0xba, 0x3b, 0x95, 0x6a, 0xa3, 0x59, 0x54, 0x9a, 0x6e, 0xa4, 0x33, 0x8f, 0x21, 0xe9, - 0x6f, 0x8f, 0x32, 0x1f, 0x75, 0x3b, 0x99, 0x20, 0x70, 0xf2, 0x7e, 0x75, 0xcc, 0x1e, 0xbb, 0x1a, - 0x64, 0xfb, 0x51, 0xf3, 0xff, 0x1c, 0x02, 0x34, 0x5c, 0x78, 0x8f, 0xac, 0xee, 0x02, 0xe8, 0x7b, - 0x58, 0xdf, 0xef, 0x59, 0x66, 0xd7, 0x11, 0x67, 0xcd, 0xb7, 0xc7, 0xd2, 0x1d, 0x8f, 0xac, 0xca, - 0x5e, 0x7d, 0xc5, 0x87, 0x85, 0x7e, 0x72, 0x7a, 0xa4, 0x7c, 0x92, 0x45, 0xca, 0xd9, 0xce, 0xff, - 0xcd, 0x46, 0xcb, 0x8b, 0x00, 0xc3, 0x1e, 0xa3, 0xeb, 0x30, 0x75, 0x8e, 0xe8, 0x06, 0x2f, 0xeb, - 0xd7, 0xf5, 0xfc, 0xff, 0x84, 0x01, 0x95, 0x6d, 0xac, 0x39, 0x98, 0x52, 0x34, 0x39, 0x2d, 0xc4, - 0x51, 0x82, 0x29, 0x7e, 0xa4, 0x0f, 0x9d, 0xe7, 0x48, 0xef, 0x36, 0xcd, 0xaa, 0xa2, 0xef, 0x41, - 0x42, 0xb7, 0xda, 0xfd, 0x4e, 0x57, 0x65, 0xef, 0x71, 0xc4, 0xf9, 0xe3, 0xdb, 0xa7, 0xad, 0xd8, - 0x91, 0xce, 0x15, 0xca, 0x56, 0x9b, 0xa6, 0xbd, 0xf7, 0xc2, 0x0c, 0x90, 0x95, 0x40, 0x2f, 0x42, - 0xdc, 0x63, 0x1e, 0xa6, 0x0e, 0x71, 0x65, 0x28, 0x40, 0x4b, 0x30, 0xa5, 0x11, 0xd5, 0xda, 0x61, - 0xce, 0xf4, 0x59, 0x5b, 0x51, 0x09, 0x6b, 0x64, 0x73, 0x07, 0x5d, 0x83, 0x74, 0x47, 0x7b, 0xa8, - 0xee, 0xd8, 0x9a, 0x2e, 0x9c, 0xe3, 0x36, 0x67, 0x42, 0x49, 0x99, 0xe9, 0x68, 0x0f, 0x97, 0x85, - 0xbc, 0x66, 0xb4, 0x31, 0xba, 0x0e, 0xc9, 0x9d, 0x7b, 0xfc, 0x68, 0xc5, 0xad, 0x12, 0x7f, 0xdc, - 0x34, 0x73, 0x38, 0xc8, 0x4d, 0x2f, 0xdf, 0x66, 0x13, 0x43, 0x6d, 0x92, 0x32, 0xbd, 0x73, 0xcf, - 0x4b, 0x64, 0xff, 0x5b, 0x82, 0xa8, 0x18, 0x11, 0xea, 0x01, 0x88, 0xe9, 0x31, 0x0d, 0xbe, 0xa6, - 0xc9, 0xd2, 0xed, 0xc3, 0x41, 0x2e, 0x5e, 0x66, 0xd2, 0x5a, 0x85, 0x3c, 0x19, 0xe4, 0x3e, 0x78, - 0x5a, 0x8b, 0xe2, 0x82, 0x28, 0x71, 0xde, 0x48, 0xcd, 0x60, 0x81, 0xdc, 0x3d, 0x8d, 0xa8, 0x7b, - 0x26, 0x71, 0xac, 0x5d, 0x5b, 0xeb, 0x88, 0x6b, 0xfa, 0xc4, 0x9e, 0x46, 0x56, 0x5d, 0x19, 0xca, - 0x52, 0xdf, 0xec, 0x3e, 0x7f, 0x4e, 0xc5, 0x1f, 0x6d, 0x78, 0x69, 0xb4, 0x04, 0x17, 0xbc, 0xca, - 0x2a, 0x9d, 0xa9, 0x56, 0x5f, 0xdf, 0xc7, 0xcc, 0x06, 0x51, 0x72, 0x9f, 0xf5, 0x32, 0xd7, 0xb5, - 0x87, 0x25, 0x9e, 0x95, 0xbf, 0x00, 0xb3, 0xbe, 0x65, 0xf5, 0x3c, 0x69, 0x0c, 0x32, 0x7f, 0x4d, - 0xe0, 0x7b, 0x02, 0x7f, 0x1b, 0x66, 0x46, 0x7e, 0xe1, 0x21, 0xf8, 0xd7, 0x1f, 0x22, 0x0c, 0xfe, - 0x24, 0xa4, 0x50, 0xe6, 0x49, 0xf7, 0x6c, 0x90, 0xd2, 0x03, 0xe9, 0xfc, 0x2c, 0xa4, 0xbd, 0x66, - 0xbc, 0xb6, 0x7f, 0x95, 0x80, 0xe8, 0x96, 0x76, 0xd0, 0xb6, 0x34, 0x03, 0x2d, 0xc0, 0xb4, 0xfb, - 0x0e, 0xca, 0x6d, 0x2f, 0xae, 0xf8, 0x45, 0x41, 0x35, 0x93, 0xd9, 0x4d, 0x90, 0x4f, 0xcd, 0x4c, - 0x48, 0xf5, 0x09, 0xb6, 0xa9, 0x06, 0xa8, 0xec, 0xe7, 0x28, 0xdc, 0xdc, 0x94, 0x4a, 0x4f, 0x06, - 0xb9, 0x9b, 0xe3, 0x2d, 0x1e, 0xd6, 0xfb, 0xb6, 0xe9, 0x1c, 0x14, 0x1a, 0xb7, 0x6f, 0x6d, 0x0b, - 0x28, 0xca, 0x15, 0x96, 0x92, 0xec, 0xfb, 0x93, 0xe2, 0xb9, 0x1b, 0x5d, 0x08, 0xb5, 0x63, 0xea, - 0xb6, 0x45, 0xdc, 0xfb, 0x16, 0x21, 0x5d, 0x67, 0x42, 0xf4, 0x2a, 0xcc, 0xec, 0x98, 0x5d, 0x76, - 0x65, 0xe8, 0x96, 0xe3, 0x57, 0x2d, 0x29, 0x57, 0x2c, 0x0a, 0xde, 0x87, 0x94, 0xef, 0x9d, 0x19, - 0x55, 0xc2, 0x08, 0x53, 0xc2, 0xcd, 0xc3, 0x41, 0x2e, 0x39, 0xdc, 0xd4, 0x5c, 0x11, 0x9f, 0xc5, - 0xb5, 0x49, 0x0e, 0x9b, 0xa1, 0x6a, 0x38, 0x07, 0x53, 0xec, 0xc7, 0x4a, 0xfc, 0xa1, 0xae, 0xc2, - 0x13, 0xa8, 0x0a, 0x49, 0x11, 0x0a, 0xe1, 0xbf, 0x64, 0x12, 0x8f, 0xf3, 0x16, 0x7c, 0x4b, 0xef, - 0xfe, 0xd6, 0xa9, 0x50, 0xed, 0xea, 0x96, 0x81, 0x8d, 0x2a, 0x4d, 0x2b, 0x22, 0xf2, 0xcb, 0x12, - 0x04, 0xad, 0x40, 0x4a, 0x6f, 0x63, 0xad, 0xdb, 0xef, 0xb9, 0x38, 0x68, 0x4c, 0x9c, 0xa4, 0xa8, - 0x27, 0x80, 0x36, 0x00, 0xed, 0xb0, 0xb7, 0x47, 0xfe, 0x5e, 0xb1, 0xab, 0xc5, 0x71, 0xc0, 0x64, - 0x56, 0x57, 0x19, 0xf6, 0x0c, 0xbd, 0x0c, 0xc9, 0xae, 0xd5, 0xd5, 0xb5, 0xae, 0x8e, 0xdb, 0x8c, - 0x59, 0xf9, 0x6d, 0x64, 0x50, 0x88, 0x4a, 0x10, 0xe1, 0xf7, 0xd6, 0xe2, 0x0c, 0x7b, 0x65, 0xdc, - 0xe7, 0xec, 0xab, 0x13, 0x8a, 0xa8, 0x89, 0xaa, 0x10, 0xb5, 0xf9, 0x1b, 0x0a, 0x76, 0x97, 0x7d, - 0x66, 0x2c, 0xc9, 0xf7, 0x42, 0x63, 0x75, 0x42, 0x71, 0xeb, 0xa2, 0xa6, 0xfb, 0x94, 0x94, 0xdb, - 0x51, 0xf1, 0x1a, 0xb0, 0x30, 0xe6, 0x09, 0x61, 0x08, 0x18, 0x40, 0xa1, 0x03, 0x34, 0xd9, 0x5d, - 0x14, 0xbb, 0xe5, 0x3e, 0x7d, 0x80, 0x81, 0xd7, 0x14, 0x74, 0x80, 0xbc, 0x26, 0xda, 0xa0, 0x8e, - 0x80, 0x6b, 0xdb, 0xd9, 0xfd, 0xf7, 0xf4, 0xd2, 0xeb, 0xe7, 0xf1, 0x7f, 0x57, 0x27, 0x14, 0x1f, - 0x02, 0xba, 0x0d, 0xd3, 0xfa, 0x90, 0xa2, 0x32, 0x33, 0x0c, 0xf0, 0x8d, 0x73, 0xd9, 0xa9, 0x55, - 0x6a, 0x9b, 0x86, 0x52, 0xf4, 0x31, 0xa4, 0x48, 0xe0, 0xbc, 0x94, 0xb9, 0xc0, 0x50, 0xdf, 0x3c, - 0x6f, 0xbc, 0x76, 0x75, 0x42, 0x19, 0x41, 0x42, 0xbf, 0x0d, 0xb2, 0x33, 0x72, 0xab, 0xc3, 0x2e, - 0xb0, 0x4f, 0x7f, 0xaa, 0x79, 0xc2, 0xdd, 0xd5, 0xea, 0x84, 0x72, 0x04, 0x0d, 0x7d, 0x0a, 0x33, - 0x24, 0xf8, 0x5b, 0x92, 0xcc, 0x45, 0xd6, 0xc0, 0x37, 0xc7, 0xff, 0xf5, 0xc9, 0x10, 0x7f, 0x14, - 0x8b, 0xc2, 0x77, 0x83, 0x97, 0x43, 0xec, 0x79, 0xc4, 0xe9, 0xf0, 0xc7, 0x5f, 0x56, 0x51, 0xf8, - 0x11, 0x2c, 0xb4, 0x06, 0xf1, 0x8e, 0xcb, 0xf9, 0x99, 0x17, 0xce, 0x3c, 0x62, 0x8c, 0x9a, 0xa1, - 0xd5, 0x09, 0x65, 0x58, 0xbf, 0x14, 0x87, 0xa8, 0xb8, 0x44, 0xf4, 0x6e, 0xf8, 0xf9, 0xdd, 0x3e, - 0xbf, 0xd5, 0xcf, 0xca, 0x5f, 0xcb, 0xff, 0x34, 0x0e, 0x31, 0xcf, 0x49, 0x5d, 0x04, 0xe4, 0xb9, - 0x0f, 0xc3, 0x17, 0xcc, 0xd4, 0xac, 0x84, 0x56, 0x27, 0x94, 0xb4, 0x9b, 0x37, 0x7c, 0xc4, 0x7c, - 0x33, 0xf0, 0xbc, 0x69, 0x9c, 0x5f, 0x67, 0xd1, 0x0e, 0x7a, 0xef, 0x9f, 0x28, 0xdd, 0x8b, 0x47, - 0xae, 0x1e, 0xdd, 0xf3, 0xe8, 0x73, 0xca, 0x15, 0x0b, 0xba, 0xbf, 0x0c, 0x29, 0xbb, 0xdf, 0x65, - 0x77, 0x87, 0xe2, 0xcc, 0xcf, 0x7d, 0xa6, 0xa4, 0x90, 0x8a, 0x63, 0x7b, 0x79, 0x84, 0x81, 0xae, - 0x9e, 0xc9, 0x40, 0xee, 0xd8, 0x57, 0x25, 0x8f, 0x82, 0x96, 0x47, 0x29, 0xe8, 0xda, 0xd9, 0x14, - 0xe4, 0x83, 0xf1, 0x38, 0x68, 0xfb, 0x58, 0x0e, 0x5a, 0x1c, 0x73, 0x13, 0xf9, 0x10, 0x83, 0x24, - 0x54, 0x1e, 0x21, 0xa1, 0xab, 0x67, 0x92, 0x90, 0x7f, 0x8c, 0x82, 0x85, 0x36, 0x8f, 0x61, 0xa1, - 0x37, 0xce, 0x75, 0x1c, 0x59, 0x95, 0x02, 0x34, 0xa4, 0x1c, 0x47, 0x43, 0x85, 0xf1, 0x68, 0xc8, - 0x07, 0x19, 0xe0, 0xa1, 0x4f, 0x8e, 0xf0, 0x90, 0x7c, 0xf6, 0x46, 0x3e, 0x36, 0xd0, 0xb3, 0x2a, - 0x1d, 0x21, 0x22, 0xed, 0x18, 0x22, 0x4a, 0x33, 0xf8, 0xeb, 0xe7, 0x20, 0x22, 0x5f, 0x03, 0x47, - 0x99, 0xe8, 0x2e, 0x24, 0xfc, 0xec, 0xc1, 0x5e, 0xfc, 0x9c, 0xce, 0x73, 0x27, 0xfc, 0x08, 0x8e, - 0xe9, 0x80, 0x2f, 0x0b, 0x7d, 0xef, 0x28, 0x09, 0xcd, 0x9e, 0x09, 0x7e, 0xc2, 0x9d, 0xf6, 0xaa, - 0x74, 0x94, 0x85, 0x6e, 0xf9, 0x59, 0x68, 0xee, 0x4c, 0x1b, 0x75, 0xc4, 0x4b, 0x5d, 0x95, 0x7c, - 0x34, 0x84, 0x5e, 0x81, 0x98, 0x63, 0x6b, 0x3a, 0xbb, 0x96, 0xb8, 0xc0, 0xee, 0x9e, 0x58, 0x50, - 0xa8, 0x49, 0x65, 0x2c, 0x78, 0xc4, 0x3e, 0x8c, 0x12, 0x40, 0xcc, 0x7d, 0x5a, 0xe1, 0xa3, 0xae, - 0xfc, 0xcf, 0x24, 0x98, 0xac, 0x5b, 0x2d, 0xf4, 0x92, 0x2f, 0x52, 0x99, 0x14, 0xe7, 0xd9, 0xa9, - 0xba, 0xd5, 0x12, 0x21, 0xc7, 0xf7, 0x87, 0xb5, 0xc5, 0xc1, 0xef, 0x1b, 0xa7, 0x74, 0xd9, 0x0b, - 0xf4, 0x7a, 0x95, 0xd0, 0xbb, 0x10, 0xed, 0x71, 0xc7, 0x5a, 0x30, 0x59, 0xfe, 0xb4, 0xfa, 0xbc, - 0xa4, 0xe2, 0x56, 0xb9, 0x76, 0xd5, 0xff, 0xfb, 0xe4, 0x75, 0xcb, 0xc0, 0x28, 0x05, 0xb0, 0xa5, - 0x11, 0xd2, 0xdb, 0xb3, 0x35, 0x82, 0xe5, 0x09, 0x14, 0x85, 0xc9, 0xb5, 0xf5, 0x86, 0x2c, 0x5d, - 0xbb, 0xeb, 0x0f, 0x33, 0x56, 0x94, 0x62, 0x6d, 0xa3, 0xb6, 0xb1, 0xa2, 0x6e, 0x14, 0xd7, 0xab, - 0x0d, 0x79, 0x02, 0x65, 0x60, 0xee, 0xc3, 0x62, 0xad, 0x29, 0xe2, 0x8e, 0x6a, 0x6d, 0xa3, 0x59, - 0x55, 0xee, 0x14, 0x6f, 0xc9, 0x12, 0x9a, 0x07, 0xa4, 0x6c, 0x96, 0xd7, 0x1a, 0x95, 0x92, 0x5a, - 0xde, 0x5c, 0xdf, 0x2a, 0x96, 0x9b, 0xb5, 0xcd, 0x0d, 0x39, 0x84, 0x62, 0x10, 0xae, 0x6c, 0x6e, - 0x54, 0x65, 0xb8, 0xf6, 0x93, 0x30, 0x84, 0x59, 0x84, 0xe4, 0x65, 0x98, 0xde, 0xde, 0x68, 0x6c, - 0x55, 0xcb, 0xb5, 0xe5, 0x5a, 0xb5, 0x22, 0x4f, 0x64, 0x67, 0x1f, 0x3d, 0x5e, 0x98, 0xa1, 0x59, - 0xdb, 0x5d, 0xd2, 0xc3, 0x3a, 0xe3, 0x56, 0x94, 0x85, 0x48, 0xa9, 0x58, 0x5e, 0xdb, 0xde, 0x92, - 0xa5, 0x6c, 0xea, 0xd1, 0xe3, 0x05, 0xa0, 0x05, 0x38, 0x2f, 0xa2, 0x17, 0x79, 0x04, 0x65, 0x53, - 0xa9, 0xca, 0xa1, 0xec, 0xcc, 0xa3, 0xc7, 0x0b, 0xd3, 0x2c, 0x30, 0x23, 0xb8, 0xed, 0x55, 0x48, - 0x36, 0xca, 0xab, 0xd5, 0xf5, 0xa2, 0x5a, 0x5e, 0x2d, 0x6e, 0xac, 0x54, 0xe5, 0xc9, 0xec, 0xdc, - 0xa3, 0xc7, 0x0b, 0xf2, 0xe8, 0xfe, 0xa0, 0x4d, 0xd4, 0xd6, 0xb7, 0x36, 0x95, 0xa6, 0x1c, 0x1e, - 0x36, 0xc1, 0x69, 0x09, 0xe5, 0x01, 0x78, 0xed, 0xe5, 0x6a, 0xb5, 0x22, 0x4f, 0x65, 0xd1, 0xa3, - 0xc7, 0x0b, 0x29, 0x9a, 0x3f, 0x64, 0x1b, 0x74, 0x19, 0x12, 0x65, 0xa5, 0x5a, 0x6c, 0x56, 0xd5, - 0x46, 0xb3, 0xd8, 0x6c, 0xc8, 0x91, 0xe1, 0x48, 0x7c, 0x0c, 0x82, 0x0a, 0x90, 0x2e, 0x6e, 0x37, - 0x37, 0xd5, 0x40, 0xd9, 0x68, 0xf6, 0xe2, 0xa3, 0xc7, 0x0b, 0xb3, 0xb4, 0x6c, 0xb1, 0xef, 0x58, - 0xfe, 0xf2, 0xaf, 0x83, 0x1c, 0xe8, 0xbf, 0xba, 0x52, 0x96, 0x63, 0xd9, 0xf9, 0x47, 0x8f, 0x17, - 0xd0, 0xe8, 0x10, 0x56, 0xca, 0xe8, 0x5b, 0x30, 0xdf, 0xfc, 0x68, 0xab, 0x5a, 0xa9, 0x36, 0xca, - 0x6a, 0x70, 0xd8, 0xf1, 0x6c, 0xe6, 0xd1, 0xe3, 0x85, 0x39, 0x5a, 0xe7, 0xc8, 0xd0, 0xdf, 0x00, - 0xb9, 0xd1, 0x54, 0xaa, 0xc5, 0x75, 0xb5, 0xb6, 0xb1, 0x52, 0x6d, 0xb0, 0xc5, 0x82, 0x61, 0x97, - 0x46, 0xf6, 0x3a, 0x1d, 0xc2, 0x46, 0xf5, 0xc3, 0x11, 0xfc, 0xe9, 0x61, 0xf9, 0x91, 0xed, 0x8b, - 0x16, 0x20, 0xbe, 0x5e, 0x5b, 0x51, 0x8a, 0x0c, 0x37, 0x91, 0x4d, 0x3f, 0x7a, 0xbc, 0x90, 0xa4, - 0xe5, 0xbc, 0xcd, 0x98, 0x8d, 0xfd, 0xfe, 0xcf, 0x2e, 0x4d, 0xfc, 0xd9, 0x67, 0x97, 0x26, 0x4a, - 0x57, 0x3e, 0xff, 0xcf, 0x4b, 0x13, 0x9f, 0x1f, 0x5e, 0x92, 0x7e, 0x7d, 0x78, 0x49, 0xfa, 0xe2, - 0xf0, 0x92, 0xf4, 0x1f, 0x87, 0x97, 0xa4, 0x3f, 0xf8, 0xf2, 0xd2, 0xc4, 0xaf, 0xbf, 0xbc, 0x34, - 0xf1, 0xc5, 0x97, 0x97, 0x26, 0x3e, 0x8e, 0x70, 0xbd, 0x6e, 0x45, 0xd8, 0x39, 0xf0, 0xfa, 0xff, - 0x05, 0x00, 0x00, 0xff, 0xff, 0xbf, 0x72, 0xb2, 0xba, 0xcf, 0x41, 0x00, 0x00, + // 5312 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5b, 0x4d, 0x6c, 0x23, 0x47, + 0x76, 0x56, 0x53, 0x14, 0x7f, 0x9e, 0x44, 0xaa, 0x59, 0xd2, 0x68, 0x68, 0x7a, 0x3c, 0xd4, 0x72, + 0x3d, 0xf6, 0xcc, 0xac, 0x4d, 0x79, 0x35, 0xb6, 0xd7, 0x9e, 0xb5, 0xc7, 0xe6, 0x9f, 0x24, 0xea, + 0x7f, 0x9a, 0xd2, 0x78, 0x6c, 0xc7, 0xdb, 0x69, 0x76, 0x97, 0xa4, 0x8e, 0x48, 0x36, 0xa7, 0xab, + 0x39, 0x33, 0xda, 0x00, 0x8b, 0xc5, 0x2e, 0x02, 0x24, 0x73, 0x4a, 0x0e, 0xc9, 0x21, 0xc9, 0x00, + 0x01, 0xd6, 0x0b, 0xe4, 0x90, 0x20, 0xc8, 0x62, 0xb1, 0x09, 0x82, 0x1c, 0x02, 0xe4, 0x62, 0x20, + 0x09, 0xb0, 0x97, 0x20, 0x4e, 0x0e, 0x4c, 0x22, 0x5f, 0x72, 0x0c, 0x92, 0xdb, 0x9c, 0x82, 0xfa, + 0xe9, 0x66, 0x37, 0x49, 0x49, 0xd4, 0xcc, 0x78, 0x73, 0x91, 0xba, 0x5e, 0x55, 0x7d, 0xf5, 0xf7, + 0xea, 0x7b, 0xaf, 0x5e, 0x15, 0x61, 0xee, 0x37, 0xac, 0x3a, 0x59, 0xa0, 0x7f, 0xda, 0x75, 0xf6, + 0x2f, 0xdf, 0xb6, 0x2d, 0xc7, 0x42, 0x2f, 0xe8, 0x96, 0x7e, 0x68, 0x5b, 0x9a, 0x7e, 0x90, 0x27, + 0xf7, 0x1a, 0x79, 0x96, 0xc3, 0x4b, 0x65, 0x2e, 0x60, 0xdb, 0xb6, 0x6c, 0x5a, 0x9e, 0x7f, 0xf0, + 0x1a, 0x99, 0xd9, 0x7d, 0x6b, 0xdf, 0x62, 0x9f, 0x0b, 0xf4, 0x4b, 0x48, 0x11, 0xc3, 0x68, 0xd7, + 0x17, 0x0c, 0xcd, 0xd1, 0x84, 0x2c, 0xed, 0xca, 0x4c, 0xeb, 0xf5, 0x3d, 0xcb, 0x6e, 0x6a, 0x8e, + 0x8b, 0xf1, 0x4d, 0x72, 0xaf, 0xb1, 0xa0, 0x6b, 0x8e, 0xd6, 0xb0, 0xf6, 0x17, 0x0c, 0x4c, 0xf4, + 0x76, 0x7d, 0x81, 0x38, 0x76, 0x47, 0x77, 0x3a, 0x36, 0x36, 0x44, 0xa1, 0xec, 0x90, 0x42, 0x0e, + 0x6e, 0x69, 0x2d, 0xc7, 0xc5, 0xef, 0x38, 0x66, 0x63, 0xe1, 0xa0, 0xa1, 0x2f, 0x38, 0x66, 0x13, + 0x13, 0x47, 0x6b, 0xb6, 0x45, 0xce, 0x37, 0x68, 0x55, 0xa2, 0x1f, 0xe0, 0xa6, 0xa6, 0x1f, 0x68, + 0xad, 0x7d, 0x6c, 0x2f, 0xf0, 0x36, 0xf4, 0x76, 0x5d, 0x14, 0x79, 0x59, 0x6f, 0x74, 0x88, 0x83, + 0xed, 0xfb, 0xd8, 0x26, 0xa6, 0xd5, 0x5a, 0x10, 0x49, 0x55, 0xa4, 0x79, 0xa9, 0xdc, 0x4f, 0x43, + 0x70, 0xb1, 0xa8, 0xe9, 0x87, 0x9d, 0x76, 0xa5, 0xa5, 0xdb, 0x47, 0x6d, 0xc7, 0xb4, 0x5a, 0x5b, + 0xec, 0x2f, 0x41, 0x32, 0x8c, 0x1f, 0xe2, 0xa3, 0xb4, 0x34, 0x2f, 0x5d, 0x9d, 0x52, 0xe8, 0x27, + 0x7a, 0x1f, 0xc2, 0x4d, 0xcb, 0xc0, 0xe9, 0xd0, 0xbc, 0x74, 0x35, 0xb9, 0x78, 0x2d, 0x7f, 0xe2, + 0xdc, 0xe6, 0x7b, 0x68, 0x1b, 0x96, 0x81, 0x15, 0x56, 0x0d, 0xd5, 0x21, 0x76, 0xd8, 0x24, 0xaa, + 0xd9, 0xda, 0xb3, 0xd2, 0xe3, 0xf3, 0xd2, 0xd5, 0xc9, 0xc5, 0x9b, 0xa7, 0x40, 0x9c, 0xd0, 0xad, + 0xfc, 0xda, 0x46, 0xad, 0xda, 0xda, 0xb3, 0x8a, 0x93, 0xc7, 0xdd, 0x6c, 0x54, 0x24, 0x94, 0xe8, + 0x61, 0x93, 0xd0, 0x8f, 0xcc, 0x16, 0xb8, 0x32, 0xda, 0xff, 0x8e, 0x6d, 0xb2, 0xfe, 0xc7, 0x15, + 0xfa, 0x89, 0x5e, 0x03, 0x84, 0x39, 0x1e, 0x36, 0x54, 0xba, 0x90, 0x2a, 0x1d, 0x60, 0x88, 0x0d, + 0x50, 0xf6, 0x72, 0xca, 0x9a, 0xa3, 0xad, 0xe1, 0xa3, 0x9b, 0xe1, 0xff, 0xfa, 0x93, 0xac, 0xc4, + 0xff, 0xe6, 0x7e, 0x38, 0x0e, 0xc9, 0x5e, 0x57, 0x18, 0xfc, 0x0a, 0x44, 0xd8, 0x0a, 0x60, 0xd6, + 0x42, 0x72, 0xf1, 0x8d, 0x91, 0xa6, 0x83, 0x56, 0xcd, 0xd7, 0x58, 0x3d, 0x45, 0xd4, 0x47, 0x08, + 0xc2, 0x44, 0x6b, 0x38, 0xa2, 0x23, 0xec, 0x1b, 0xfd, 0x91, 0x04, 0xf3, 0xfd, 0x3d, 0x2a, 0x1e, + 0xad, 0x6d, 0xd4, 0x36, 0x34, 0xba, 0x8c, 0x6b, 0xf8, 0xa8, 0x5a, 0x4e, 0x8f, 0xcf, 0x8f, 0x5f, + 0x9d, 0x5c, 0xdc, 0x1a, 0xbd, 0xe1, 0xca, 0x19, 0x88, 0x95, 0x96, 0x63, 0x1f, 0x29, 0x67, 0x36, + 0x9c, 0xa9, 0xc1, 0x95, 0x91, 0xa0, 0xfc, 0x3a, 0x14, 0xe7, 0x3a, 0x34, 0x0b, 0x13, 0xf7, 0xb5, + 0x46, 0x07, 0x8b, 0xd1, 0xf2, 0xc4, 0xcd, 0xd0, 0x3b, 0x52, 0xee, 0x22, 0x44, 0xf8, 0xc4, 0xa0, + 0x04, 0xc4, 0x0b, 0x95, 0xda, 0xe2, 0x5b, 0x6f, 0x2f, 0x97, 0x36, 0xe4, 0x31, 0xb1, 0x04, 0xbf, + 0x90, 0x60, 0xae, 0xe6, 0xd8, 0x58, 0x6b, 0x56, 0x5b, 0xfb, 0x98, 0xd0, 0x31, 0x95, 0xb1, 0xa3, + 0x99, 0x0d, 0x82, 0xae, 0x40, 0x92, 0xb0, 0x1c, 0x55, 0x33, 0x0c, 0x1b, 0x13, 0x22, 0x1a, 0x4c, + 0x70, 0x69, 0x81, 0x0b, 0xd1, 0xb7, 0x21, 0x4c, 0xda, 0x5a, 0x8b, 0xb5, 0x3c, 0xb9, 0x78, 0xd1, + 0x37, 0x6d, 0x62, 0x23, 0xe7, 0x6b, 0x6d, 0xad, 0x55, 0x0c, 0x7f, 0xd1, 0xcd, 0x8e, 0x29, 0xac, + 0x28, 0x2a, 0x02, 0x10, 0x47, 0xb3, 0x1d, 0x95, 0xee, 0x40, 0xa1, 0xb4, 0x2f, 0xf9, 0x2a, 0xd2, + 0x1d, 0x9a, 0x3f, 0x68, 0xe8, 0xf9, 0x1d, 0x77, 0x87, 0x8a, 0xea, 0x71, 0x56, 0x8d, 0x4a, 0x73, + 0xff, 0x32, 0x0e, 0x17, 0xfb, 0x3a, 0xbe, 0x6d, 0x5b, 0xfb, 0xac, 0x4b, 0x4b, 0x30, 0xa5, 0x77, + 0x1c, 0xeb, 0x3e, 0xb6, 0x79, 0x0b, 0xd2, 0xe8, 0x2d, 0x4c, 0x8a, 0x8a, 0x54, 0x8e, 0x7e, 0x00, + 0xa8, 0xad, 0xd9, 0x8e, 0x49, 0xc1, 0xd5, 0xb6, 0x40, 0x4f, 0x87, 0x98, 0x7e, 0x54, 0x4f, 0xd1, + 0x8f, 0x13, 0xfa, 0x95, 0xdf, 0x76, 0xc1, 0x5c, 0x09, 0x5b, 0x4e, 0xd1, 0x72, 0xaa, 0xdd, 0x9f, + 0x9b, 0xd9, 0x87, 0xd4, 0x40, 0x15, 0xa4, 0x00, 0x32, 0x19, 0x32, 0x36, 0x54, 0x8f, 0xc1, 0xce, + 0x33, 0xc4, 0x94, 0x5b, 0xdd, 0xcb, 0xc8, 0x3c, 0x92, 0x60, 0x6e, 0x78, 0xe7, 0x86, 0xe8, 0xda, + 0x27, 0x7e, 0x5d, 0x9b, 0x5c, 0x2c, 0x3f, 0x8f, 0x89, 0xf0, 0x6b, 0xec, 0xdf, 0x46, 0x20, 0xc1, + 0x69, 0xca, 0xd5, 0xc4, 0xa0, 0xbe, 0x48, 0x4f, 0xa3, 0x2f, 0xe8, 0x16, 0xc4, 0x70, 0x8b, 0xcf, + 0x98, 0xe8, 0xf8, 0x48, 0x08, 0x51, 0xdc, 0x62, 0xf3, 0x84, 0x5e, 0xe0, 0xbc, 0x47, 0x95, 0x35, + 0x5e, 0x8c, 0x1e, 0x77, 0xb3, 0xe3, 0xbb, 0x4a, 0x95, 0x13, 0xe0, 0x8f, 0x25, 0x98, 0xe9, 0xd8, + 0x26, 0x51, 0xeb, 0x47, 0x6a, 0xc3, 0xd2, 0xb5, 0x86, 0xe9, 0x1c, 0xa9, 0x87, 0xf7, 0xd3, 0x13, + 0x4c, 0x51, 0x6e, 0x9d, 0xc9, 0xc6, 0x62, 0x98, 0xf9, 0x5d, 0xdb, 0x24, 0xc5, 0xa3, 0x75, 0x81, + 0xb0, 0x76, 0x9f, 0x6b, 0xc7, 0xec, 0x71, 0x37, 0x2b, 0xef, 0x2a, 0x55, 0x7f, 0xd6, 0x1d, 0x45, + 0xee, 0xf4, 0x15, 0x46, 0xef, 0x41, 0xc6, 0xc0, 0x6d, 0x1b, 0xeb, 0x1a, 0xd5, 0x8c, 0x3a, 0x43, + 0x56, 0x9b, 0x5a, 0xcb, 0xdc, 0xc3, 0xc4, 0x49, 0x87, 0x19, 0x2f, 0xa4, 0x7b, 0x25, 0x78, 0xd3, + 0x1b, 0x22, 0x1f, 0x69, 0x1e, 0x89, 0x53, 0x5d, 0xb7, 0xb8, 0x55, 0x48, 0x47, 0xd8, 0x44, 0x2d, + 0x9e, 0xdf, 0x9e, 0x28, 0x29, 0x3c, 0x60, 0xf9, 0x14, 0x98, 0xf6, 0x35, 0xc1, 0xec, 0x55, 0x9c, + 0xe1, 0x5f, 0x1b, 0x99, 0x6a, 0x95, 0x24, 0x0e, 0x9a, 0x8b, 0xdf, 0x93, 0x20, 0x43, 0x6d, 0x2e, + 0xd6, 0x03, 0xdb, 0x41, 0xb5, 0xb1, 0x6e, 0xd9, 0x46, 0x3a, 0x4a, 0x47, 0x5d, 0xac, 0xfd, 0x5b, + 0x37, 0x7b, 0x63, 0xdf, 0x74, 0x0e, 0x3a, 0xf5, 0xbc, 0x6e, 0x35, 0x17, 0xbc, 0xd6, 0x8c, 0x7a, + 0xef, 0x7b, 0xa1, 0x7d, 0xb8, 0xbf, 0xc0, 0x5c, 0x83, 0x4e, 0xc7, 0x34, 0xf2, 0xbb, 0xbb, 0xd5, + 0xf2, 0x71, 0x37, 0x9b, 0xde, 0x76, 0xc1, 0x3d, 0xc5, 0x50, 0x18, 0xb4, 0x92, 0x6e, 0x9f, 0x90, + 0x83, 0xde, 0x81, 0xa4, 0x6e, 0x35, 0x1a, 0x58, 0x67, 0xe3, 0xdc, 0x55, 0xaa, 0xe9, 0x18, 0x53, + 0x9a, 0xd4, 0x71, 0x37, 0x9b, 0x28, 0x79, 0x39, 0x54, 0x7d, 0x12, 0xba, 0x3f, 0x99, 0x29, 0xc1, + 0x85, 0xa1, 0x3a, 0x70, 0x16, 0xe1, 0xc7, 0xfd, 0xdb, 0x47, 0x86, 0x24, 0x5f, 0x14, 0x77, 0x6f, + 0xe5, 0xfe, 0x66, 0x0e, 0x92, 0x0a, 0x26, 0x8e, 0x65, 0x63, 0x77, 0x47, 0xf9, 0x77, 0x43, 0xf8, + 0x29, 0x76, 0xc3, 0xcf, 0x24, 0x98, 0xa1, 0xce, 0x95, 0x6d, 0xb6, 0x1d, 0xcb, 0x56, 0x6d, 0xfc, + 0xc0, 0x36, 0x1d, 0xec, 0x72, 0x63, 0xe1, 0x94, 0x05, 0x0d, 0x76, 0x24, 0x5f, 0xf6, 0x40, 0x14, + 0x81, 0xc1, 0xb5, 0xfe, 0xd6, 0x8f, 0xfe, 0x3d, 0x7b, 0x73, 0xa4, 0x35, 0x1b, 0xf4, 0xf7, 0xf2, + 0xd5, 0xb2, 0x82, 0x8c, 0x01, 0x60, 0x74, 0x09, 0xc2, 0x74, 0xd7, 0x30, 0x03, 0x1f, 0x2f, 0xc6, + 0x8e, 0xbb, 0xd9, 0x30, 0xdd, 0x57, 0x0a, 0x93, 0x22, 0x07, 0x66, 0xc5, 0xa6, 0xf1, 0xf6, 0x30, + 0xd3, 0xd1, 0x28, 0x1b, 0xd2, 0x7b, 0xa3, 0x0f, 0x89, 0xcf, 0xbe, 0xbb, 0x84, 0xcc, 0xab, 0xe2, + 0xb3, 0x87, 0xea, 0x03, 0x39, 0x68, 0x1b, 0x92, 0xd4, 0x65, 0xaa, 0x6b, 0x04, 0xab, 0xb4, 0xcb, + 0x24, 0x2d, 0xb3, 0xf6, 0xfa, 0xf7, 0x04, 0xb9, 0xd7, 0xa0, 0x65, 0xf2, 0x65, 0x51, 0xd8, 0x37, + 0x6f, 0x09, 0xc3, 0x27, 0x23, 0x68, 0x19, 0x26, 0x1d, 0xad, 0xde, 0x70, 0xe1, 0x38, 0x09, 0xbd, + 0x72, 0x02, 0xdc, 0x0e, 0x2d, 0xe9, 0xc3, 0x02, 0xc7, 0x15, 0x10, 0x54, 0x06, 0x70, 0x8e, 0xda, + 0x2e, 0x4e, 0x92, 0xe1, 0x5c, 0x39, 0x09, 0xe7, 0xa8, 0xed, 0x87, 0x89, 0x3b, 0x22, 0x4d, 0xd0, + 0x2a, 0x4c, 0x71, 0x97, 0x5a, 0xe0, 0x4c, 0x33, 0x9c, 0x57, 0x4f, 0xc0, 0x61, 0xae, 0x8a, 0xe6, + 0x43, 0x9a, 0x24, 0x9e, 0x84, 0xa0, 0x02, 0x44, 0xb9, 0x2b, 0x4f, 0xd2, 0x09, 0x06, 0xf3, 0x8d, + 0x93, 0xba, 0xc3, 0x4a, 0xf9, 0xa6, 0xde, 0xad, 0x87, 0x16, 0x60, 0x92, 0x9a, 0x77, 0xdb, 0x34, + 0xb0, 0x6a, 0xd4, 0x19, 0xc1, 0xc5, 0x8b, 0xc9, 0xe3, 0x6e, 0x16, 0xb6, 0x84, 0xb8, 0x5c, 0x54, + 0xc0, 0x2d, 0x52, 0xae, 0xa3, 0x6f, 0x41, 0xaa, 0x6d, 0xe3, 0xb6, 0x66, 0x63, 0x55, 0xb7, 0x9a, + 0xed, 0x06, 0x76, 0xb0, 0xc1, 0x36, 0x74, 0x4c, 0x91, 0x45, 0x46, 0xc9, 0x95, 0x73, 0x97, 0x49, + 0x73, 0xa8, 0x37, 0x4e, 0xb0, 0x4d, 0x4b, 0xc6, 0x59, 0xc9, 0x04, 0x93, 0x56, 0x85, 0x10, 0x1d, + 0xc1, 0x1c, 0x39, 0x22, 0x0e, 0x6e, 0xaa, 0x6c, 0xba, 0x89, 0xda, 0x34, 0xf7, 0x6d, 0x4a, 0xca, + 0xe9, 0x14, 0x1b, 0x56, 0x69, 0x74, 0x65, 0xab, 0x31, 0x1c, 0xb6, 0x8c, 0x64, 0x43, 0xa0, 0x70, + 0x7f, 0x73, 0x96, 0x0c, 0xc9, 0x42, 0x37, 0xe0, 0x42, 0x6f, 0x67, 0x10, 0xb5, 0xdd, 0xa9, 0x37, + 0x4c, 0x72, 0x80, 0x8d, 0x34, 0xb0, 0x8e, 0xce, 0xfa, 0x32, 0xb7, 0xdd, 0x3c, 0x74, 0x14, 0xd8, + 0xec, 0x3a, 0x9d, 0x1d, 0x6d, 0x1f, 0xa7, 0x27, 0xe7, 0xa5, 0xab, 0x13, 0xc5, 0x95, 0x27, 0xdd, + 0x6c, 0x79, 0xe4, 0x9d, 0x4a, 0x70, 0x73, 0xc1, 0xb1, 0x31, 0xf6, 0x6d, 0xfc, 0x92, 0xc0, 0xf3, + 0xef, 0x59, 0x57, 0x86, 0x14, 0x80, 0x1e, 0xe5, 0xa7, 0xa7, 0x9e, 0xda, 0x1e, 0xf9, 0x50, 0x50, + 0x0b, 0x90, 0x8d, 0xef, 0x6b, 0x0d, 0xd3, 0xd0, 0x1c, 0xac, 0x9a, 0x2d, 0x03, 0x3f, 0xc4, 0x24, + 0x8d, 0xd8, 0xd4, 0xbf, 0x3b, 0xfa, 0xd4, 0x2b, 0x1e, 0x46, 0x95, 0x42, 0xb8, 0xde, 0x95, 0x1d, + 0x14, 0x63, 0x82, 0xfe, 0x42, 0x02, 0xe4, 0x6d, 0xf2, 0xa6, 0x65, 0x98, 0x7b, 0x26, 0xb6, 0x49, + 0x7a, 0x86, 0x35, 0xf8, 0xe1, 0x39, 0xb8, 0x52, 0x60, 0x6c, 0xb8, 0x10, 0xcf, 0x87, 0x2a, 0x53, + 0x46, 0x3f, 0x6e, 0xe6, 0x7f, 0x25, 0x48, 0x0d, 0x30, 0x33, 0xda, 0x81, 0x90, 0x69, 0x30, 0x23, + 0x94, 0x28, 0x52, 0xe3, 0x18, 0xaa, 0x96, 0x9f, 0x74, 0x9f, 0xa9, 0xe9, 0x90, 0x69, 0xa0, 0x7d, + 0x88, 0xd3, 0x4d, 0xd4, 0x72, 0x54, 0xd3, 0x60, 0xd6, 0x2c, 0x51, 0x5c, 0x3d, 0xee, 0x66, 0x63, + 0xdb, 0x4c, 0xf8, 0xcc, 0x4d, 0xc4, 0x38, 0x78, 0xd5, 0x40, 0x59, 0x98, 0x74, 0x2c, 0x15, 0x3f, + 0x34, 0x89, 0x63, 0xb6, 0xf6, 0x99, 0x27, 0x17, 0x53, 0xc0, 0xb1, 0x2a, 0x42, 0x92, 0xf9, 0xe3, + 0x10, 0xa0, 0x41, 0xf2, 0x46, 0x7f, 0x2d, 0xc1, 0x25, 0xd7, 0xbd, 0xb3, 0x6c, 0x73, 0xdf, 0x6c, + 0x69, 0x8d, 0x80, 0x9f, 0x27, 0xb1, 0x85, 0xfc, 0xe4, 0x59, 0x2c, 0x84, 0xf0, 0xfd, 0xb6, 0x04, + 0x7c, 0xbf, 0x0f, 0x78, 0x89, 0xba, 0x22, 0xdc, 0x07, 0x1c, 0x28, 0x72, 0x47, 0x49, 0x77, 0x4e, + 0xa8, 0x9c, 0x59, 0x83, 0x97, 0x4e, 0x05, 0x3e, 0x8f, 0x63, 0x91, 0xf9, 0x91, 0x04, 0x17, 0x4f, + 0x30, 0xd7, 0x7e, 0x9c, 0x04, 0xc7, 0xb9, 0x1d, 0x3c, 0x25, 0x7c, 0xf7, 0x19, 0x5c, 0x02, 0x7f, + 0x27, 0x96, 0xe1, 0x85, 0x13, 0x29, 0xef, 0xac, 0xd1, 0xc4, 0xfc, 0x40, 0xff, 0x2a, 0xc1, 0x74, + 0xdf, 0x0e, 0x46, 0x1f, 0xfb, 0x14, 0xbc, 0x7a, 0xdc, 0xcd, 0x46, 0x59, 0x23, 0xcf, 0x45, 0xcb, + 0x0f, 0x07, 0xb5, 0x7c, 0x93, 0xb6, 0xc0, 0x1a, 0x66, 0x2d, 0x7c, 0xf0, 0xd4, 0x2d, 0x70, 0x88, + 0x9e, 0xa6, 0x67, 0xfe, 0x4e, 0x02, 0xb9, 0x9f, 0x2c, 0xd0, 0x16, 0xc8, 0xf8, 0xa1, 0x63, 0x6b, + 0xaa, 0xcf, 0xa8, 0x4b, 0xe7, 0x31, 0xea, 0x49, 0x56, 0x7d, 0xc7, 0xb3, 0xec, 0x9f, 0x42, 0xc2, + 0xc6, 0xfb, 0xd4, 0xc7, 0xd5, 0xad, 0xd6, 0x9e, 0xb9, 0x2f, 0x56, 0xfa, 0xed, 0x91, 0x3d, 0x97, + 0xbc, 0xc2, 0xaa, 0x97, 0x58, 0x6d, 0x65, 0xca, 0xf6, 0xa5, 0x32, 0x3f, 0x94, 0x60, 0x6e, 0x38, + 0xdf, 0x0d, 0xd1, 0xb5, 0xed, 0xa0, 0xae, 0xdd, 0x7c, 0x7a, 0x4a, 0xf5, 0x69, 0xc8, 0x6a, 0x38, + 0x26, 0xc9, 0xa1, 0xdc, 0x1b, 0x54, 0x4d, 0x58, 0x1d, 0xef, 0x04, 0xfe, 0x12, 0xc0, 0x81, 0xb9, + 0x7f, 0xa0, 0x3e, 0xd0, 0x1c, 0x6c, 0x8b, 0x48, 0x5e, 0x9c, 0x4a, 0x3e, 0xa2, 0x82, 0xdc, 0x1f, + 0x02, 0x24, 0xaa, 0xcd, 0xb6, 0x65, 0x3b, 0xae, 0xb7, 0xbd, 0x0e, 0x11, 0x6e, 0xe8, 0xc5, 0x84, + 0xe7, 0x4f, 0xe9, 0x60, 0xa0, 0x26, 0xf7, 0xcf, 0x84, 0x65, 0x11, 0x18, 0x68, 0x0b, 0xa2, 0xdc, + 0x29, 0x22, 0xe9, 0x8b, 0x0c, 0x6e, 0x61, 0x64, 0x38, 0xee, 0x5e, 0xb9, 0x3e, 0x91, 0x40, 0xf1, + 0xfc, 0xe2, 0xd0, 0x50, 0xbf, 0xf8, 0x7d, 0x88, 0xf0, 0x30, 0xac, 0x08, 0xd4, 0x64, 0x87, 0x44, + 0x78, 0xaa, 0x5b, 0x4b, 0x66, 0x03, 0x2f, 0xb1, 0x62, 0x6e, 0x6f, 0x79, 0x25, 0xf4, 0x0a, 0xc4, + 0x08, 0x71, 0x54, 0x62, 0x7e, 0x9f, 0x9f, 0x34, 0xc6, 0x79, 0x88, 0xb1, 0x56, 0xdb, 0xa9, 0x99, + 0xdf, 0xc7, 0x4a, 0x94, 0x10, 0x87, 0x7e, 0xa0, 0xcb, 0xc0, 0xbc, 0x2e, 0xa2, 0x51, 0x5f, 0x8a, + 0xb9, 0x4d, 0xe3, 0x8a, 0x4f, 0xc2, 0x70, 0x0e, 0xcd, 0xb6, 0xba, 0x77, 0x48, 0xb8, 0xaf, 0x22, + 0x70, 0x0e, 0xcd, 0xf6, 0xd2, 0x1a, 0x51, 0xa2, 0x34, 0x73, 0xe9, 0x90, 0xa0, 0x0c, 0xc4, 0x1e, + 0x68, 0x8d, 0x06, 0x3b, 0xd9, 0x4c, 0x30, 0x14, 0x2f, 0x1d, 0x34, 0x35, 0x91, 0xaf, 0xd7, 0xd4, + 0x88, 0xb3, 0x44, 0x5b, 0x73, 0x0e, 0xd8, 0x31, 0x34, 0xae, 0x00, 0x17, 0x6d, 0x6b, 0xce, 0x01, + 0x4a, 0x43, 0x94, 0x8f, 0x8b, 0xa4, 0x63, 0xf3, 0xe3, 0x57, 0xa7, 0x14, 0x37, 0x89, 0x5e, 0x85, + 0x69, 0x1e, 0x9f, 0x51, 0x0d, 0xd3, 0xc6, 0xba, 0xd3, 0x38, 0x62, 0x7e, 0x56, 0x4c, 0x49, 0x72, + 0x71, 0x59, 0x48, 0xd1, 0x35, 0x90, 0xfb, 0x1d, 0x53, 0xe6, 0x1f, 0xc5, 0x94, 0xe9, 0x3e, 0xbf, + 0x94, 0xfa, 0xb0, 0x62, 0xad, 0x7d, 0x0e, 0x5f, 0x9a, 0xfb, 0xb0, 0x22, 0xa3, 0xe7, 0xec, 0x5d, + 0x03, 0x59, 0x78, 0xa5, 0xbd, 0xb2, 0x09, 0x8e, 0xcb, 0xe5, 0xbd, 0xa2, 0x79, 0x98, 0x69, 0x6b, + 0x36, 0xc1, 0x6a, 0xbd, 0xd3, 0x32, 0x1a, 0x58, 0xe5, 0x58, 0xe9, 0x24, 0x2b, 0x9d, 0x62, 0x59, + 0x45, 0x96, 0xc3, 0xf5, 0xee, 0xac, 0xd3, 0xfa, 0xdc, 0xff, 0xc3, 0x69, 0x3d, 0xf3, 0xd3, 0x10, + 0x4c, 0xb0, 0x5d, 0x86, 0x6e, 0x42, 0x98, 0xae, 0xa5, 0x88, 0x2f, 0x8d, 0x7a, 0x62, 0x62, 0x75, + 0x10, 0x82, 0x70, 0x4b, 0x6b, 0xe2, 0x34, 0x62, 0x2b, 0xcd, 0xbe, 0xd1, 0x45, 0x88, 0x12, 0x7c, + 0x4f, 0xbd, 0xaf, 0x35, 0xd2, 0x33, 0x4c, 0x11, 0x23, 0x04, 0xdf, 0xbb, 0xa3, 0x35, 0xd0, 0x05, + 0x88, 0x98, 0x44, 0x6d, 0xe1, 0x07, 0xe9, 0x59, 0x6e, 0x95, 0x4c, 0xb2, 0x89, 0x1f, 0xa0, 0x17, + 0x21, 0xfe, 0x40, 0x23, 0x2a, 0x6e, 0xb6, 0x9d, 0x23, 0x36, 0x17, 0x31, 0xaa, 0xba, 0xa4, 0x42, + 0xd3, 0xcc, 0x79, 0xd1, 0xec, 0x7d, 0xec, 0xa8, 0xba, 0xd5, 0x20, 0xe9, 0x0b, 0x74, 0xab, 0xd2, + 0xd3, 0x1a, 0x15, 0x95, 0xac, 0x06, 0x59, 0x0d, 0xc7, 0x42, 0xf2, 0xf8, 0x6a, 0x38, 0x36, 0x2e, + 0x87, 0x57, 0xc3, 0xb1, 0xb0, 0x3c, 0xb1, 0x1a, 0x8e, 0x4d, 0xc8, 0x91, 0xd5, 0x70, 0x2c, 0x22, + 0x47, 0x57, 0xc3, 0xb1, 0xa8, 0x1c, 0x5b, 0x0d, 0xc7, 0x62, 0x72, 0x7c, 0x35, 0x1c, 0x8b, 0xcb, + 0xb0, 0x1a, 0x8e, 0x81, 0x3c, 0xb9, 0x1a, 0x8e, 0x4d, 0xca, 0x53, 0xab, 0xe1, 0xd8, 0x94, 0x9c, + 0x58, 0x0d, 0xc7, 0x12, 0x72, 0x72, 0x35, 0x1c, 0x4b, 0xca, 0xd3, 0xab, 0xe1, 0xd8, 0xb4, 0x2c, + 0xaf, 0x86, 0x63, 0xb2, 0x9c, 0x5a, 0x0d, 0xc7, 0x52, 0x32, 0xca, 0x54, 0x44, 0x1c, 0x59, 0x43, + 0xdf, 0x0d, 0xcc, 0xd3, 0xc8, 0x27, 0x39, 0x56, 0x29, 0xf7, 0x33, 0x09, 0xe4, 0x1a, 0xbe, 0xd7, + 0xc1, 0x2d, 0x1d, 0xdf, 0xd1, 0x1a, 0xa5, 0x83, 0x4e, 0xeb, 0x10, 0xbd, 0x02, 0xd3, 0x3a, 0xfd, + 0x50, 0x79, 0x94, 0x8f, 0xce, 0x98, 0xc4, 0x66, 0x2c, 0xc1, 0xc4, 0x35, 0x2a, 0xa5, 0x13, 0xf7, + 0x12, 0x80, 0x28, 0x47, 0xd9, 0x24, 0xc4, 0x8a, 0xc4, 0x79, 0x11, 0x4a, 0x21, 0x7d, 0x30, 0xb6, + 0xf5, 0x80, 0x51, 0x56, 0x00, 0x46, 0xb1, 0x1e, 0xa0, 0x05, 0x98, 0x6d, 0xe1, 0x87, 0x8e, 0xda, + 0x5f, 0x98, 0xd1, 0x93, 0x92, 0xa2, 0x79, 0x25, 0x7f, 0x85, 0xdc, 0x3f, 0x85, 0x60, 0xda, 0xed, + 0xb4, 0xcb, 0xe9, 0x7b, 0x20, 0xd3, 0xd5, 0x35, 0x0d, 0xd5, 0xb1, 0x38, 0x92, 0xcb, 0xee, 0xef, + 0x9f, 0x16, 0x10, 0x0d, 0xa2, 0xd0, 0x74, 0xd5, 0xd8, 0xb1, 0x58, 0x73, 0xdc, 0xbc, 0x29, 0x09, + 0xe2, 0x97, 0x65, 0x76, 0x21, 0xe9, 0x56, 0xe2, 0x12, 0x54, 0x82, 0x48, 0xa0, 0xbd, 0x6f, 0x8d, + 0xd0, 0x9e, 0x3b, 0xd5, 0x8a, 0xa8, 0x9a, 0xf9, 0x4d, 0x40, 0x83, 0x6d, 0xfb, 0x4d, 0xeb, 0x04, + 0x37, 0xad, 0x5b, 0x41, 0xd3, 0xfa, 0xee, 0xf9, 0xc6, 0xe6, 0xeb, 0xb6, 0x3f, 0x44, 0xf5, 0xf7, + 0x21, 0x48, 0x72, 0xc3, 0xe4, 0xd9, 0x54, 0x4a, 0x51, 0x94, 0x01, 0xcd, 0xd6, 0x7e, 0x2f, 0xd2, + 0x4e, 0xc7, 0x17, 0x52, 0x64, 0x37, 0xc3, 0x2b, 0xfc, 0x4d, 0xea, 0x79, 0x68, 0x46, 0x30, 0x24, + 0x1f, 0xa2, 0x1e, 0x84, 0x66, 0x78, 0x85, 0xae, 0x40, 0x92, 0x79, 0x8f, 0xbd, 0x52, 0xe3, 0xac, + 0x54, 0x82, 0x49, 0xbd, 0x62, 0x45, 0x48, 0x90, 0xb6, 0xe6, 0x0b, 0xef, 0x87, 0xd9, 0xa4, 0x9e, + 0x71, 0x8f, 0x31, 0x45, 0xeb, 0xf8, 0x1d, 0x02, 0x1b, 0x93, 0x4e, 0x13, 0xab, 0x6d, 0x8b, 0x47, + 0x5c, 0xc6, 0x95, 0x38, 0x97, 0x6c, 0x5b, 0x04, 0xed, 0x32, 0x55, 0x61, 0x73, 0xa1, 0x1a, 0x7c, + 0x72, 0xd2, 0x11, 0xd6, 0xca, 0xf5, 0xd1, 0xa7, 0x53, 0x99, 0x26, 0x41, 0x41, 0xee, 0x2f, 0x25, + 0xb8, 0x48, 0xbd, 0x31, 0xbe, 0xd3, 0x4a, 0xec, 0xc6, 0xd2, 0xd5, 0x4e, 0x0d, 0xa2, 0xcc, 0xcd, + 0xf3, 0xdc, 0xd9, 0x95, 0xe3, 0x6e, 0x36, 0x42, 0x4b, 0x3f, 0xb3, 0x95, 0x8b, 0x50, 0xe0, 0x2a, + 0x8b, 0x24, 0x38, 0xb6, 0xd6, 0x22, 0x2c, 0x8e, 0x4f, 0x97, 0xad, 0x89, 0x9b, 0x75, 0x7a, 0xae, + 0x0d, 0x31, 0x83, 0x36, 0x1b, 0xc8, 0xdc, 0xe0, 0x79, 0xb9, 0x0c, 0xa4, 0xfb, 0xbb, 0xec, 0x85, + 0x29, 0x7f, 0x0d, 0xe6, 0x36, 0xf1, 0x83, 0x61, 0xa3, 0x29, 0x42, 0x94, 0x33, 0x9d, 0xab, 0xf2, + 0x57, 0xfb, 0x49, 0xc7, 0x7f, 0x69, 0x9b, 0x67, 0x3d, 0xdd, 0x61, 0x15, 0x14, 0xb7, 0x62, 0xee, + 0x53, 0xb8, 0xd8, 0x87, 0xee, 0x2d, 0xdf, 0x87, 0x10, 0x21, 0x8e, 0xe6, 0x08, 0xf7, 0x2c, 0x39, + 0x0a, 0x7a, 0xcd, 0xd1, 0x9c, 0x0e, 0x51, 0x44, 0xbd, 0x9c, 0xc2, 0x02, 0xac, 0x9d, 0x26, 0xa6, + 0x2a, 0xb2, 0x6e, 0x12, 0x07, 0x7d, 0x08, 0x53, 0x42, 0x25, 0xa8, 0xa6, 0xb8, 0xfd, 0x3e, 0x43, + 0xab, 0x26, 0x6d, 0x0f, 0x84, 0xe4, 0x7e, 0x2e, 0xc1, 0x4c, 0xd9, 0xb6, 0xda, 0x6d, 0x6c, 0x08, + 0x9b, 0xc3, 0x27, 0xc3, 0x35, 0x35, 0x92, 0xcf, 0xd4, 0x6c, 0x42, 0xa8, 0x5a, 0x16, 0xc7, 0x8a, + 0x5b, 0xcf, 0x7a, 0x5a, 0xa9, 0x96, 0xd1, 0xbb, 0x7c, 0x46, 0x3a, 0x84, 0x11, 0x68, 0x72, 0x20, + 0xce, 0x16, 0xbc, 0xe3, 0xe9, 0x4d, 0x45, 0x87, 0xe4, 0x3e, 0x8f, 0xc2, 0x05, 0xff, 0x2c, 0x2f, + 0x97, 0xdc, 0x8e, 0x7f, 0x06, 0x51, 0x37, 0xd6, 0x32, 0x02, 0x51, 0x0e, 0x83, 0xc8, 0x8b, 0xf9, + 0xf0, 0xc7, 0x5b, 0x5c, 0x4c, 0x54, 0x83, 0x94, 0xd9, 0x72, 0xb0, 0xdd, 0xc0, 0xda, 0x7d, 0xea, + 0x5d, 0xd0, 0x39, 0x13, 0xb1, 0xed, 0x51, 0x6d, 0xb9, 0xec, 0x03, 0xe0, 0x3e, 0xc1, 0x67, 0x30, + 0xe3, 0x07, 0x75, 0xfb, 0x7f, 0x7a, 0x50, 0x95, 0x75, 0xaf, 0x07, 0xeb, 0x46, 0x7f, 0x7d, 0x40, + 0x6e, 0x64, 0xe8, 0xae, 0x77, 0x30, 0xe0, 0x81, 0xf3, 0x9b, 0x4f, 0x3d, 0x23, 0xe5, 0xbe, 0x43, + 0x42, 0xc0, 0xd5, 0x65, 0x56, 0xf0, 0x6b, 0x72, 0x75, 0xef, 0x40, 0x84, 0xc7, 0x56, 0xc5, 0x65, + 0xd1, 0xad, 0xa7, 0x1d, 0x02, 0x8f, 0xd9, 0x2a, 0x02, 0x2d, 0xf3, 0x07, 0x12, 0x4c, 0xf9, 0x97, + 0x1b, 0x99, 0x10, 0x63, 0xd3, 0xef, 0x72, 0xda, 0xf8, 0x73, 0x3f, 0x40, 0x73, 0x55, 0xaa, 0x1a, + 0xd4, 0x13, 0x33, 0x6c, 0xab, 0xdd, 0xbb, 0x2c, 0x1c, 0x57, 0x62, 0x54, 0x40, 0x7d, 0xc7, 0xcc, + 0x0f, 0x20, 0xee, 0x4d, 0xba, 0x2f, 0x24, 0x36, 0xfe, 0x1c, 0x43, 0x62, 0xa7, 0xb6, 0x5f, 0x86, + 0x44, 0x60, 0xc6, 0xd0, 0x9c, 0xd7, 0x87, 0x70, 0x31, 0xc2, 0xfb, 0x70, 0x26, 0x4a, 0xee, 0xcf, + 0xa3, 0x30, 0x33, 0x8c, 0x6a, 0x3f, 0x06, 0xd9, 0xc7, 0x5b, 0x6a, 0xc3, 0x24, 0x8e, 0xd0, 0xcd, + 0x6b, 0xa7, 0x9f, 0xaa, 0x7d, 0xe4, 0x27, 0x54, 0x31, 0x69, 0x07, 0x29, 0xf1, 0x53, 0x48, 0x1a, + 0xbc, 0xe3, 0x22, 0xec, 0x2d, 0x5e, 0x5a, 0x9c, 0x76, 0x1a, 0x1e, 0x42, 0x80, 0x02, 0x3d, 0x61, + 0xf8, 0xb2, 0x08, 0xd2, 0x21, 0xe1, 0x81, 0x1f, 0xb5, 0xc5, 0xb1, 0xea, 0xd9, 0xc9, 0x70, 0xca, + 0x6d, 0x85, 0x62, 0xa2, 0x7d, 0x98, 0x76, 0x1b, 0x71, 0x4f, 0xe0, 0xf1, 0xe7, 0xd2, 0x8c, 0x3b, + 0x31, 0x35, 0x71, 0x22, 0xff, 0xb1, 0x04, 0x33, 0x6e, 0x4b, 0x5e, 0xe4, 0xd8, 0x34, 0x18, 0x9d, + 0x25, 0x8a, 0xb5, 0xe3, 0x6e, 0x36, 0x25, 0x66, 0xc6, 0x0d, 0x60, 0x3c, 0xb3, 0xde, 0xa5, 0x8c, + 0x3e, 0x40, 0x83, 0x3a, 0x11, 0x34, 0x9f, 0x36, 0x3c, 0xd1, 0x73, 0x22, 0x28, 0xb1, 0x3d, 0xbb, + 0x13, 0x41, 0x3f, 0xab, 0x06, 0xfa, 0x2d, 0x09, 0x52, 0xfc, 0xb6, 0xaa, 0xd9, 0x71, 0x34, 0x7e, + 0x31, 0xec, 0x1e, 0xcd, 0x3f, 0x3e, 0xee, 0x66, 0xa7, 0xd9, 0xf2, 0x6e, 0x88, 0x3c, 0xd6, 0x6c, + 0xf1, 0x69, 0x9b, 0xed, 0xa1, 0x88, 0x93, 0xac, 0x27, 0x30, 0xd0, 0x1a, 0x24, 0x79, 0xbc, 0xc2, + 0x7d, 0xc9, 0xc5, 0xce, 0xec, 0x89, 0xe2, 0xcb, 0x4f, 0xba, 0xd9, 0xf9, 0x21, 0xfb, 0x84, 0x87, + 0x3a, 0xee, 0xf0, 0xb2, 0x4a, 0x62, 0xcf, 0x9f, 0x44, 0xeb, 0x30, 0xcd, 0x3d, 0xcf, 0xde, 0xf3, + 0x0c, 0x18, 0xfd, 0x8e, 0x95, 0x7b, 0xad, 0x9e, 0x54, 0x84, 0xa1, 0xe6, 0x60, 0x76, 0xa8, 0xd3, + 0xf4, 0x65, 0x04, 0xe6, 0x82, 0xb4, 0xea, 0xb9, 0x35, 0x6a, 0xbf, 0xbd, 0xfd, 0x60, 0x64, 0x6a, + 0xf6, 0x1e, 0x6a, 0x30, 0x6a, 0x74, 0x53, 0xfd, 0x16, 0xf7, 0xb3, 0x3e, 0xeb, 0xf5, 0x14, 0xf8, + 0x6c, 0x79, 0xfb, 0xf0, 0x5d, 0x13, 0x76, 0xd7, 0xb3, 0x2c, 0x3c, 0xf0, 0xf4, 0xe1, 0x53, 0xc0, + 0xb3, 0xfa, 0xde, 0x23, 0x13, 0xd7, 0xb6, 0xfc, 0xa3, 0x04, 0x89, 0xc0, 0xc8, 0x7e, 0x95, 0xc6, + 0x65, 0xdb, 0xf3, 0xad, 0xf8, 0x83, 0xbf, 0x77, 0xce, 0x3f, 0xac, 0xa0, 0xcb, 0x95, 0xf9, 0x2b, + 0x09, 0x12, 0x81, 0x89, 0xfc, 0x9a, 0xcc, 0xd2, 0xf3, 0xef, 0x79, 0x1d, 0x92, 0xc1, 0x25, 0xf2, + 0xb5, 0x21, 0x3d, 0x9f, 0x36, 0x72, 0xdf, 0x81, 0x08, 0x97, 0x20, 0x04, 0xc9, 0x8f, 0x0a, 0xd5, + 0x9d, 0xea, 0xe6, 0xb2, 0xba, 0xb4, 0xa5, 0xa8, 0xcb, 0x25, 0x79, 0x0c, 0x4d, 0x41, 0xac, 0x5c, + 0x59, 0xaf, 0x50, 0xa1, 0x2c, 0xa1, 0x49, 0x88, 0xb2, 0x54, 0xa5, 0x2c, 0x87, 0x72, 0x45, 0x90, + 0x39, 0xf6, 0x1e, 0xa6, 0x66, 0x86, 0x1e, 0x23, 0x50, 0x1e, 0x66, 0x98, 0xcb, 0xdf, 0xa4, 0x9e, + 0x15, 0xdd, 0xde, 0xaa, 0xcf, 0x17, 0x4f, 0x79, 0x59, 0x74, 0xf7, 0x6e, 0x6a, 0x4d, 0x9c, 0xfb, + 0x45, 0x18, 0x52, 0x3d, 0x10, 0xd7, 0xc8, 0xfe, 0x99, 0xd4, 0x3b, 0xd0, 0x44, 0xce, 0xbc, 0x76, + 0x1c, 0xa8, 0x2f, 0xce, 0x36, 0xe2, 0xfa, 0xef, 0x23, 0xba, 0x69, 0x9e, 0x74, 0xb3, 0xa9, 0xfe, + 0xce, 0x92, 0x67, 0xbc, 0x17, 0x74, 0xbb, 0xc8, 0x42, 0xaf, 0x66, 0xeb, 0x50, 0xed, 0xbd, 0x7f, + 0xe2, 0xa1, 0x57, 0xb3, 0x75, 0xb8, 0xab, 0x54, 0x95, 0x28, 0xcd, 0xdc, 0xb5, 0x4d, 0xb4, 0x0a, + 0x61, 0xab, 0xed, 0xb8, 0x27, 0xe8, 0xb7, 0xcf, 0x35, 0xa4, 0xad, 0xb6, 0x18, 0x8f, 0xc2, 0x30, + 0xd0, 0x2a, 0xbf, 0x49, 0xef, 0x4d, 0x34, 0x23, 0xe4, 0x11, 0x29, 0x34, 0x11, 0x58, 0x88, 0xcc, + 0x3e, 0x4c, 0xf9, 0x67, 0x6c, 0xc8, 0x05, 0x42, 0x21, 0x18, 0xe5, 0xf8, 0xd6, 0x48, 0x5d, 0x17, + 0x27, 0x4c, 0xdf, 0x9d, 0xd2, 0x77, 0x20, 0xee, 0x8d, 0xe3, 0x3c, 0x57, 0x6b, 0x9c, 0xe3, 0xbd, + 0x10, 0xde, 0x84, 0x1c, 0xc9, 0x7d, 0x1e, 0x82, 0x29, 0x05, 0x13, 0xab, 0x71, 0x1f, 0x1b, 0xd4, + 0x83, 0xf2, 0x9e, 0x59, 0x4a, 0xa3, 0x3f, 0xb3, 0x2c, 0x40, 0xbc, 0x67, 0x81, 0xce, 0xf1, 0xe6, + 0xad, 0x57, 0x0b, 0x7d, 0x0c, 0x89, 0xba, 0xd5, 0x69, 0x19, 0x9a, 0x7d, 0xc4, 0xfc, 0x2a, 0xe6, + 0x81, 0x24, 0x17, 0xdf, 0x3c, 0xdd, 0x17, 0xf4, 0x7a, 0x9d, 0x2f, 0x8a, 0xca, 0xd4, 0x7f, 0x52, + 0xa6, 0xea, 0xbe, 0x54, 0xee, 0x7d, 0x98, 0xf2, 0xe7, 0xa2, 0x18, 0x84, 0x37, 0xb7, 0x36, 0x2b, + 0x7c, 0x4f, 0x16, 0x0b, 0xa5, 0xb5, 0xa5, 0xea, 0xfa, 0xba, 0x2c, 0x51, 0x79, 0xe5, 0x6e, 0x75, + 0x47, 0x0e, 0xd1, 0xdd, 0xa9, 0x54, 0x6a, 0x3b, 0x05, 0x65, 0xc7, 0x8d, 0x74, 0xe6, 0x30, 0x24, + 0xfc, 0xed, 0x51, 0xe6, 0xa3, 0x6e, 0x27, 0x13, 0x04, 0x4e, 0xde, 0xaf, 0x8e, 0xd8, 0x63, 0x57, + 0x83, 0x6c, 0x3f, 0x6a, 0xee, 0x9f, 0x43, 0x80, 0x7a, 0x0b, 0xef, 0x91, 0xd5, 0x5d, 0x00, 0xfd, + 0x00, 0xeb, 0x87, 0x6d, 0xcb, 0x6c, 0x39, 0xe2, 0xac, 0xf9, 0xce, 0x48, 0xba, 0xe3, 0x91, 0x55, + 0xc9, 0xab, 0xaf, 0xf8, 0xb0, 0xd0, 0xef, 0x9f, 0x1e, 0x29, 0x1f, 0x67, 0x91, 0x72, 0xb6, 0xf3, + 0x7f, 0xb5, 0xd1, 0xf2, 0x02, 0x40, 0xaf, 0xc7, 0xe8, 0x06, 0x4c, 0x9c, 0x23, 0xba, 0xc1, 0xcb, + 0xfa, 0x75, 0x3d, 0xf7, 0x3f, 0x61, 0x40, 0x25, 0x1b, 0x6b, 0x0e, 0xa6, 0x14, 0x4d, 0x4e, 0x0b, + 0x71, 0x14, 0x61, 0x82, 0x1f, 0xe9, 0x43, 0xe7, 0x39, 0xd2, 0xbb, 0x4d, 0xb3, 0xaa, 0xe8, 0x7b, + 0x30, 0xa5, 0x5b, 0x8d, 0x4e, 0xb3, 0xa5, 0xb2, 0xf7, 0x38, 0xe2, 0xfc, 0xf1, 0xd6, 0x69, 0x2b, + 0x36, 0xd0, 0xb9, 0x7c, 0xc9, 0x6a, 0xd0, 0xb4, 0xf7, 0x5e, 0x98, 0x01, 0xb2, 0x12, 0xe8, 0x12, + 0xc4, 0x3d, 0xe6, 0x61, 0xea, 0x10, 0x57, 0x7a, 0x02, 0xb4, 0x08, 0x13, 0x1a, 0x51, 0xad, 0x3d, + 0xe6, 0x4c, 0x9f, 0xb5, 0x15, 0x95, 0xb0, 0x46, 0xb6, 0xf6, 0xd0, 0x75, 0x48, 0x35, 0xb5, 0x87, + 0xea, 0x9e, 0xad, 0xe9, 0xc2, 0x39, 0x6e, 0x70, 0x26, 0x94, 0x94, 0xe9, 0xa6, 0xf6, 0x70, 0x49, + 0xc8, 0xab, 0x46, 0x03, 0xa3, 0x1b, 0x90, 0xd8, 0xbb, 0xc7, 0x8f, 0x56, 0xdc, 0x2a, 0xf1, 0xc7, + 0x4d, 0xd3, 0xc7, 0xdd, 0xec, 0xe4, 0xd2, 0x6d, 0x36, 0x31, 0xd4, 0x26, 0x29, 0x93, 0x7b, 0xf7, + 0xbc, 0x44, 0xe6, 0xbf, 0x25, 0x88, 0x8a, 0x11, 0xa1, 0x36, 0x80, 0x98, 0x1e, 0xd3, 0xe0, 0x6b, + 0x9a, 0x28, 0xde, 0x3e, 0xee, 0x66, 0xe3, 0x25, 0x26, 0xad, 0x96, 0xc9, 0x93, 0x6e, 0xf6, 0xc3, + 0xa7, 0xb5, 0x28, 0x2e, 0x88, 0x12, 0xe7, 0x8d, 0x54, 0x0d, 0x16, 0xc8, 0x3d, 0xd0, 0x88, 0x7a, + 0x60, 0x12, 0xc7, 0xda, 0xb7, 0xb5, 0xa6, 0xb8, 0xa6, 0x9f, 0x3a, 0xd0, 0xc8, 0x8a, 0x2b, 0x43, + 0x19, 0xea, 0x9b, 0xdd, 0xe7, 0xcf, 0xa9, 0xf8, 0xa3, 0x0d, 0x2f, 0x8d, 0x16, 0xe1, 0x82, 0x57, + 0x59, 0xa5, 0x33, 0x55, 0xef, 0xe8, 0x87, 0x98, 0xd9, 0x20, 0x4a, 0xee, 0x33, 0x5e, 0xe6, 0x86, + 0xf6, 0xb0, 0xc8, 0xb3, 0x72, 0x17, 0x60, 0xc6, 0xb7, 0xac, 0x9e, 0x27, 0x8d, 0x41, 0xe6, 0xaf, + 0x09, 0x7c, 0x4f, 0xe0, 0x6f, 0xc3, 0x74, 0xdf, 0x2f, 0x3c, 0x04, 0xff, 0xfa, 0x43, 0x84, 0xc1, + 0x9f, 0x84, 0xe4, 0x4b, 0x3c, 0xe9, 0x9e, 0x0d, 0x92, 0x7a, 0x20, 0x9d, 0x9b, 0x81, 0x94, 0xd7, + 0x8c, 0xd7, 0xf6, 0x8b, 0xf0, 0x42, 0xed, 0xf6, 0x3a, 0xeb, 0x4f, 0xc9, 0x6a, 0xb6, 0xf9, 0xa2, + 0xba, 0x71, 0xde, 0x4b, 0x90, 0x19, 0xcc, 0xf4, 0xaa, 0xfe, 0x3c, 0x01, 0xd1, 0x6d, 0xed, 0xa8, + 0x61, 0x69, 0x06, 0x9a, 0x87, 0x49, 0xf7, 0x09, 0x95, 0xdb, 0xd5, 0xb8, 0xe2, 0x17, 0x05, 0x35, + 0x54, 0x66, 0x97, 0x48, 0x3e, 0x0d, 0x35, 0x21, 0xd9, 0x21, 0xd8, 0xa6, 0xca, 0xa3, 0xb2, 0x5f, + 0xb2, 0x70, 0x4b, 0x55, 0x2c, 0x3e, 0xe9, 0x66, 0x6f, 0x8d, 0xb6, 0xee, 0x58, 0xef, 0xd8, 0xa6, + 0x73, 0x94, 0xaf, 0xdd, 0x5e, 0xdf, 0x15, 0x50, 0x94, 0x66, 0x2c, 0x25, 0xd1, 0xf1, 0x27, 0xc5, + 0x4b, 0x39, 0xba, 0x86, 0x6a, 0xd3, 0xd4, 0x6d, 0x8b, 0xb8, 0x57, 0x35, 0x42, 0xba, 0xc1, 0x84, + 0xe8, 0x55, 0x98, 0xde, 0x33, 0x5b, 0xec, 0xb6, 0xd1, 0x2d, 0xc7, 0x6f, 0x69, 0x92, 0xae, 0x58, + 0x14, 0xbc, 0x0f, 0x49, 0xdf, 0x13, 0x35, 0xaa, 0xbf, 0x11, 0xa6, 0xbf, 0x5b, 0xc7, 0xdd, 0x6c, + 0xa2, 0xc7, 0x07, 0x5c, 0x87, 0x9f, 0xc5, 0x2b, 0x4a, 0xf4, 0x9a, 0xa1, 0x1a, 0x3c, 0x0b, 0x13, + 0xec, 0x77, 0x4e, 0xfc, 0x8d, 0xaf, 0xc2, 0x13, 0xa8, 0x02, 0x09, 0x11, 0x45, 0xe1, 0x3f, 0x82, + 0x12, 0xef, 0xfa, 0xe6, 0x7d, 0x5a, 0xe3, 0xfe, 0x4c, 0x2a, 0x5f, 0x69, 0xe9, 0x96, 0x81, 0x8d, + 0x0a, 0x4d, 0x2b, 0x22, 0x68, 0xcc, 0x12, 0x04, 0x2d, 0x43, 0x52, 0x6f, 0x60, 0xad, 0xd5, 0x69, + 0xbb, 0x38, 0x68, 0x44, 0x9c, 0x84, 0xa8, 0x27, 0x80, 0x36, 0x01, 0xed, 0xb1, 0x67, 0x4b, 0xfe, + 0x5e, 0xb1, 0x5b, 0xc9, 0x51, 0xc0, 0x64, 0x56, 0x57, 0xe9, 0xf5, 0x0c, 0xbd, 0x0c, 0x89, 0x96, + 0xd5, 0xd2, 0xb5, 0x96, 0x8e, 0x1b, 0x8c, 0x94, 0xf9, 0x45, 0x66, 0x50, 0x88, 0x8a, 0x10, 0xe1, + 0x57, 0xde, 0xe2, 0xf8, 0x7b, 0x75, 0xd4, 0x97, 0xf0, 0x2b, 0x63, 0x8a, 0xa8, 0x89, 0x2a, 0x10, + 0xb5, 0xf9, 0xf3, 0x0b, 0x76, 0x0d, 0x7e, 0x66, 0x18, 0xca, 0xf7, 0xb8, 0x63, 0x65, 0x4c, 0x71, + 0xeb, 0xa2, 0x1d, 0xf7, 0x15, 0x2a, 0x37, 0xc1, 0xe2, 0x21, 0x61, 0x7e, 0xc4, 0xc3, 0x45, 0x0f, + 0x30, 0x80, 0x42, 0x07, 0x68, 0xb2, 0x6b, 0x2c, 0x76, 0x41, 0x7e, 0xfa, 0x00, 0x03, 0x0f, 0x31, + 0xe8, 0x00, 0x79, 0x4d, 0xb4, 0x49, 0x7d, 0x08, 0xd7, 0x2d, 0x60, 0x57, 0xe7, 0x93, 0x8b, 0xaf, + 0x9d, 0xc7, 0x75, 0x5e, 0x19, 0x53, 0x7c, 0x08, 0xe8, 0x36, 0x4c, 0xea, 0x3d, 0x76, 0x4b, 0x4f, + 0x33, 0xc0, 0xd7, 0xcf, 0x65, 0xe2, 0x56, 0xa8, 0x59, 0xeb, 0x49, 0xd1, 0x27, 0x90, 0x24, 0x81, + 0xa3, 0x56, 0xfa, 0x02, 0x43, 0x7d, 0xe3, 0xbc, 0xa1, 0xde, 0x95, 0x31, 0xa5, 0x0f, 0x09, 0xfd, + 0x3a, 0xc8, 0x4e, 0xdf, 0x85, 0x10, 0xbb, 0xfb, 0x3e, 0xfd, 0x95, 0xe7, 0x09, 0xd7, 0x5e, 0x2b, + 0x63, 0xca, 0x00, 0x1a, 0xfa, 0x0c, 0xa6, 0x49, 0xf0, 0x67, 0x28, 0xe9, 0x8b, 0xac, 0x81, 0x6f, + 0x8f, 0xfe, 0xc3, 0x95, 0x1e, 0x7e, 0x3f, 0x16, 0x85, 0x6f, 0x05, 0xef, 0x95, 0xd8, 0xcb, 0x8a, + 0xd3, 0xe1, 0x87, 0xdf, 0x73, 0x51, 0xf8, 0x3e, 0x2c, 0xb4, 0x06, 0xf1, 0xa6, 0x6b, 0x2e, 0xd2, + 0x2f, 0x9c, 0x79, 0x3a, 0xe9, 0xb7, 0x60, 0x2b, 0x63, 0x4a, 0xaf, 0x3e, 0xda, 0x03, 0x44, 0xee, + 0x35, 0xfa, 0x2c, 0x49, 0xfa, 0x45, 0x86, 0x7a, 0x9a, 0x4b, 0x7f, 0xa2, 0x6d, 0x5a, 0x19, 0x53, + 0x86, 0x20, 0x16, 0xe3, 0x10, 0x15, 0xf7, 0x9c, 0xde, 0x23, 0x04, 0xfe, 0xfc, 0x80, 0x3f, 0x3c, + 0xc8, 0xc8, 0x2f, 0xe6, 0x7e, 0x07, 0x20, 0xe6, 0xf9, 0xd1, 0x0b, 0x80, 0x3c, 0x0f, 0xa7, 0xf7, + 0xc8, 0x9a, 0x9a, 0xaf, 0xd0, 0xca, 0x98, 0x92, 0x72, 0xf3, 0x7a, 0xef, 0xac, 0x6f, 0x05, 0x5e, + 0x60, 0x8d, 0xf2, 0x03, 0x32, 0x3a, 0x11, 0xde, 0x13, 0x2d, 0x6a, 0x56, 0xc4, 0x3b, 0x5c, 0xcf, + 0xac, 0xf0, 0x00, 0x79, 0xd2, 0x15, 0x0b, 0xb3, 0x72, 0x05, 0x92, 0x76, 0xa7, 0xc5, 0xae, 0x37, + 0x45, 0x58, 0x82, 0xbb, 0x75, 0x09, 0x21, 0x15, 0x91, 0x85, 0x52, 0x1f, 0xd3, 0x5d, 0x3b, 0x93, + 0xe9, 0xdc, 0xb1, 0xaf, 0x48, 0x1e, 0xd5, 0x2d, 0xf5, 0x53, 0xdd, 0xf5, 0xb3, 0xa9, 0xce, 0x07, + 0xe3, 0x71, 0xdd, 0xee, 0x50, 0xae, 0x5b, 0x18, 0x71, 0xb3, 0xfa, 0x10, 0x83, 0x64, 0x57, 0xea, + 0x23, 0xbb, 0x6b, 0x67, 0x92, 0x9d, 0x7f, 0x8c, 0x82, 0xed, 0xb6, 0x86, 0xb0, 0xdd, 0xeb, 0xe7, + 0x3a, 0x31, 0xad, 0x48, 0x01, 0xba, 0x53, 0x86, 0xd1, 0x5d, 0x7e, 0x34, 0xba, 0xf3, 0x41, 0x06, + 0xf8, 0xee, 0xd3, 0x01, 0xbe, 0x93, 0xcf, 0x26, 0x8c, 0xa1, 0xb1, 0xa8, 0x15, 0x69, 0x80, 0xf0, + 0xb4, 0x21, 0x84, 0x97, 0x62, 0xf0, 0x37, 0xce, 0x41, 0x78, 0xbe, 0x06, 0x06, 0x19, 0xef, 0x2e, + 0x4c, 0xf9, 0x59, 0x8a, 0x3d, 0x4a, 0x3a, 0x9d, 0x4f, 0x4f, 0xf8, 0x9d, 0x1e, 0xd3, 0x01, 0x5f, + 0x16, 0xfa, 0xde, 0x20, 0xd9, 0xcd, 0x9c, 0x09, 0x7e, 0xc2, 0xb5, 0xfb, 0x8a, 0x34, 0xc8, 0x76, + 0xeb, 0x7e, 0xb6, 0x9b, 0x3d, 0xd3, 0x16, 0x0e, 0x38, 0xd2, 0x2b, 0x92, 0x9f, 0xee, 0xf6, 0x87, + 0xd2, 0x1d, 0xb7, 0x2e, 0x6f, 0x9d, 0x8b, 0xee, 0x7c, 0xf8, 0x43, 0x20, 0xd1, 0x2b, 0x10, 0x73, + 0x6c, 0x4d, 0x67, 0x57, 0x34, 0x17, 0xd8, 0x3d, 0x1c, 0x0b, 0x90, 0xed, 0x50, 0x19, 0x0b, 0xa4, + 0xb1, 0x0f, 0xa3, 0x08, 0x10, 0x73, 0x9f, 0x99, 0xf8, 0x38, 0x32, 0xf7, 0x13, 0x09, 0xc6, 0x57, + 0xad, 0x3a, 0x7a, 0xc9, 0x17, 0xb5, 0x4d, 0x88, 0xb3, 0xfd, 0xc4, 0xaa, 0x55, 0x17, 0xe1, 0xd7, + 0x0f, 0x7a, 0xb5, 0xc5, 0x21, 0xf8, 0x9b, 0xa7, 0x0c, 0xc2, 0x0b, 0x7a, 0x7b, 0x95, 0xd0, 0x7b, + 0x10, 0x6d, 0xf3, 0x93, 0x82, 0xa0, 0xcc, 0xdc, 0x69, 0xf5, 0x79, 0x49, 0xc5, 0xad, 0x72, 0xfd, + 0x9a, 0xff, 0xb7, 0xda, 0x1b, 0x96, 0x81, 0x51, 0x12, 0x60, 0x5b, 0x23, 0xa4, 0x7d, 0x60, 0x6b, + 0x04, 0xcb, 0x63, 0x28, 0x0a, 0xe3, 0x6b, 0x1b, 0x35, 0x59, 0xba, 0x7e, 0xd7, 0x1f, 0x72, 0x2d, + 0x2b, 0x85, 0xea, 0x66, 0x75, 0x73, 0x59, 0xdd, 0x2c, 0x6c, 0x54, 0x6a, 0xf2, 0x18, 0x4a, 0xc3, + 0xec, 0x47, 0x85, 0xea, 0x8e, 0x88, 0xc1, 0xaa, 0xd5, 0xcd, 0x9d, 0x8a, 0x72, 0xa7, 0xb0, 0x2e, + 0x4b, 0x68, 0x0e, 0x90, 0xb2, 0x55, 0x5a, 0xab, 0x95, 0x8b, 0x6a, 0x69, 0x6b, 0x63, 0xbb, 0x50, + 0xda, 0xa9, 0x6e, 0x6d, 0xca, 0x21, 0x14, 0x83, 0x70, 0x79, 0x6b, 0xb3, 0x22, 0xc3, 0xf5, 0x7f, + 0x08, 0x43, 0x98, 0x45, 0x8b, 0x5e, 0x86, 0xc9, 0xdd, 0xcd, 0xda, 0x76, 0xa5, 0x54, 0x5d, 0xaa, + 0x56, 0xca, 0xf2, 0x58, 0x66, 0xe6, 0xd1, 0xe3, 0xf9, 0x69, 0x9a, 0xb5, 0xdb, 0x22, 0x6d, 0xac, + 0x33, 0x12, 0x47, 0x19, 0x88, 0x14, 0x0b, 0xa5, 0xb5, 0xdd, 0x6d, 0x59, 0xca, 0x24, 0x1f, 0x3d, + 0x9e, 0x07, 0x5a, 0x80, 0x13, 0x30, 0xba, 0xc4, 0xa3, 0x49, 0x5b, 0x4a, 0x45, 0x0e, 0x65, 0xa6, + 0x1f, 0x3d, 0x9e, 0x9f, 0x64, 0x41, 0x2a, 0x41, 0xa2, 0xaf, 0x42, 0xa2, 0x56, 0x5a, 0xa9, 0x6c, + 0x14, 0xd4, 0xd2, 0x4a, 0x61, 0x73, 0xb9, 0x22, 0x8f, 0x67, 0x66, 0x1f, 0x3d, 0x9e, 0x97, 0xfb, + 0x37, 0x22, 0x6d, 0xa2, 0xba, 0xb1, 0xbd, 0xa5, 0xec, 0xc8, 0xe1, 0x5e, 0x13, 0x9c, 0xff, 0x50, + 0x0e, 0x80, 0xd7, 0x5e, 0xaa, 0x54, 0xca, 0xf2, 0x44, 0x06, 0x3d, 0x7a, 0x3c, 0x9f, 0xa4, 0xf9, + 0x3d, 0x5a, 0x43, 0x57, 0x60, 0xaa, 0xa4, 0x54, 0x0a, 0x3b, 0x15, 0xb5, 0xb6, 0x53, 0xd8, 0xa9, + 0xc9, 0x91, 0xde, 0x48, 0x7c, 0x54, 0x85, 0xf2, 0x90, 0x2a, 0xec, 0xee, 0x6c, 0xa9, 0x81, 0xb2, + 0xd1, 0xcc, 0xc5, 0x47, 0x8f, 0xe7, 0x67, 0x68, 0xd9, 0x42, 0xc7, 0xb1, 0xfc, 0xe5, 0x5f, 0x03, + 0x39, 0xd0, 0x7f, 0x75, 0xb9, 0x24, 0xc7, 0x32, 0x73, 0x8f, 0x1e, 0xcf, 0xa3, 0xfe, 0x21, 0x2c, + 0x97, 0xd0, 0x9b, 0x30, 0xb7, 0xf3, 0xf1, 0x76, 0xa5, 0x5c, 0xa9, 0x95, 0xd4, 0xe0, 0xb0, 0xe3, + 0x99, 0xf4, 0xa3, 0xc7, 0xf3, 0xb3, 0xb4, 0xce, 0xc0, 0xd0, 0x5f, 0x07, 0xb9, 0xb6, 0xa3, 0x54, + 0x0a, 0x1b, 0x6a, 0x75, 0x73, 0xb9, 0x52, 0x63, 0x8b, 0x05, 0xbd, 0x2e, 0xf5, 0x91, 0x0a, 0x1d, + 0xc2, 0x66, 0xe5, 0xa3, 0x3e, 0xfc, 0xc9, 0x5e, 0xf9, 0x3e, 0x9e, 0x40, 0xf3, 0x10, 0xdf, 0xa8, + 0x2e, 0x2b, 0x05, 0x86, 0x3b, 0x95, 0x49, 0x3d, 0x7a, 0x3c, 0x9f, 0xa0, 0xe5, 0xbc, 0x5d, 0x8f, + 0xde, 0x84, 0xd9, 0xda, 0xed, 0x75, 0x3e, 0x19, 0x7e, 0x8d, 0x49, 0x64, 0x32, 0x8f, 0x1e, 0xcf, + 0xcf, 0xb1, 0x4e, 0x0c, 0xec, 0xe5, 0x4c, 0xec, 0xb7, 0x7f, 0x72, 0x79, 0xec, 0x4f, 0x3f, 0xbf, + 0x3c, 0x56, 0xbc, 0xfa, 0xc5, 0x7f, 0x5e, 0x1e, 0xfb, 0xe2, 0xf8, 0xb2, 0xf4, 0xcb, 0xe3, 0xcb, + 0xd2, 0x97, 0xc7, 0x97, 0xa5, 0xff, 0x38, 0xbe, 0x2c, 0xfd, 0xee, 0x57, 0x97, 0xc7, 0x7e, 0xf9, + 0xd5, 0xe5, 0xb1, 0x2f, 0xbf, 0xba, 0x3c, 0xf6, 0x49, 0x84, 0xef, 0x86, 0x7a, 0x84, 0x1d, 0x87, + 0x6f, 0xfc, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa4, 0xe7, 0x9a, 0x6e, 0x11, 0x43, 0x00, 0x00, } func (this *BackupEncryptionOptions) Equal(that interface{}) bool { @@ -5822,6 +5922,52 @@ func (m *MigrationProgress) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SQLStatsCompactionDetails) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SQLStatsCompactionDetails) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SQLStatsCompactionDetails) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *SQLStatsCompactionProgress) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SQLStatsCompactionProgress) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SQLStatsCompactionProgress) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func (m *Payload) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6213,6 +6359,29 @@ func (m *Payload_Migration) MarshalToSizedBuffer(dAtA []byte) (int, error) { } return len(dAtA) - i, nil } +func (m *Payload_SqlStatsCompaction) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Payload_SqlStatsCompaction) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SqlStatsCompaction != nil { + { + size, err := m.SqlStatsCompaction.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintJobs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xda + } + return len(dAtA) - i, nil +} func (m *Progress) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6233,13 +6402,6 @@ func (m *Progress) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.TraceID != 0 { - i = encodeVarintJobs(dAtA, i, uint64(m.TraceID)) - i-- - dAtA[i] = 0x1 - i-- - dAtA[i] = 0xa8 - } if m.Details != nil { { size := m.Details.Size() @@ -6249,6 +6411,13 @@ func (m *Progress) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } } + if m.TraceID != 0 { + i = encodeVarintJobs(dAtA, i, uint64(m.TraceID)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xa8 + } if len(m.RunningStatus) > 0 { i -= len(m.RunningStatus) copy(dAtA[i:], m.RunningStatus) @@ -6548,6 +6717,29 @@ func (m *Progress_Migration) MarshalToSizedBuffer(dAtA []byte) (int, error) { } return len(dAtA) - i, nil } +func (m *Progress_SqlStatsCompaction) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Progress_SqlStatsCompaction) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SqlStatsCompaction != nil { + { + size, err := m.SqlStatsCompaction.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintJobs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xb2 + } + return len(dAtA) - i, nil +} func (m *Job) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7684,6 +7876,24 @@ func (m *MigrationProgress) Size() (n int) { return n } +func (m *SQLStatsCompactionDetails) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *SQLStatsCompactionProgress) 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 @@ -7878,6 +8088,18 @@ func (m *Payload_Migration) Size() (n int) { } return n } +func (m *Payload_SqlStatsCompaction) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SqlStatsCompaction != nil { + l = m.SqlStatsCompaction.Size() + n += 2 + l + sovJobs(uint64(l)) + } + return n +} func (m *Progress) Size() (n int) { if m == nil { return 0 @@ -8056,6 +8278,18 @@ func (m *Progress_Migration) Size() (n int) { } return n } +func (m *Progress_SqlStatsCompaction) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SqlStatsCompaction != nil { + l = m.SqlStatsCompaction.Size() + n += 2 + l + sovJobs(uint64(l)) + } + return n +} func (m *Job) Size() (n int) { if m == nil { return 0 @@ -15820,6 +16054,106 @@ func (m *MigrationProgress) Unmarshal(dAtA []byte) error { } return nil } +func (m *SQLStatsCompactionDetails) 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: SQLStatsCompactionDetails: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SQLStatsCompactionDetails: 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 *SQLStatsCompactionProgress) 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: SQLStatsCompactionProgress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SQLStatsCompactionProgress: 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 @@ -16600,6 +16934,41 @@ func (m *Payload) Unmarshal(dAtA []byte) error { } m.Details = &Payload_Migration{v} iNdEx = postIndex + case 27: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SqlStatsCompaction", 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 < 0 { + return ErrInvalidLengthJobs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SQLStatsCompactionDetails{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &Payload_SqlStatsCompaction{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipJobs(dAtA[iNdEx:]) @@ -17151,6 +17520,41 @@ func (m *Progress) Unmarshal(dAtA []byte) error { break } } + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SqlStatsCompaction", 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 < 0 { + return ErrInvalidLengthJobs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SQLStatsCompactionProgress{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Details = &Progress_SqlStatsCompaction{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipJobs(dAtA[iNdEx:]) diff --git a/pkg/jobs/jobspb/jobs.proto b/pkg/jobs/jobspb/jobs.proto index 2a1dca15340f..a4adc69998a2 100644 --- a/pkg/jobs/jobspb/jobs.proto +++ b/pkg/jobs/jobspb/jobs.proto @@ -673,6 +673,13 @@ message MigrationProgress { } +message SQLStatsCompactionDetails { +} + +message SQLStatsCompactionProgress { + +} + message Payload { string description = 1; // If empty, the description is assumed to be the statement. @@ -716,10 +723,11 @@ message Payload { StreamIngestionDetails streamIngestion = 23; NewSchemaChangeDetails newSchemaChange = 24; MigrationDetails migration = 25; + SQLStatsCompactionDetails sqlStatsCompaction = 27; } reserved 26; - // NEXT ID: 27. + // NEXT ID: 28. } message Progress { @@ -742,6 +750,7 @@ message Progress { StreamIngestionProgress streamIngest = 18; NewSchemaChangeProgress newSchemaChange = 19; MigrationProgress migration = 20; + SQLStatsCompactionProgress sqlStatsCompaction = 22; } uint64 trace_id = 21 [(gogoproto.customname) = "TraceID"]; @@ -766,6 +775,7 @@ enum Type { STREAM_INGESTION = 10 [(gogoproto.enumvalue_customname) = "TypeStreamIngestion"]; NEW_SCHEMA_CHANGE = 11 [(gogoproto.enumvalue_customname) = "TypeNewSchemaChange"]; MIGRATION = 12 [(gogoproto.enumvalue_customname) = "TypeMigration"]; + SQL_STATS_COMPACTION = 13 [(gogoproto.enumvalue_customname) = "TypeSQLStatsCompaction"]; } message Job { diff --git a/pkg/jobs/jobspb/wrap.go b/pkg/jobs/jobspb/wrap.go index 03e8b8592986..26deda8ed0e2 100644 --- a/pkg/jobs/jobspb/wrap.go +++ b/pkg/jobs/jobspb/wrap.go @@ -92,6 +92,8 @@ func DetailsType(d isPayload_Details) Type { return TypeNewSchemaChange case *Payload_Migration: return TypeMigration + case *Payload_SqlStatsCompaction: + return TypeSQLStatsCompaction default: panic(errors.AssertionFailedf("Payload.Type called on a payload with an unknown details type: %T", d)) } @@ -128,6 +130,8 @@ func WrapProgressDetails(details ProgressDetails) interface { return &Progress_NewSchemaChange{NewSchemaChange: &d} case MigrationProgress: return &Progress_Migration{Migration: &d} + case SQLStatsCompactionProgress: + return &Progress_SqlStatsCompaction{SqlStatsCompaction: &d} default: panic(errors.AssertionFailedf("WrapProgressDetails: unknown details type %T", d)) } @@ -159,6 +163,8 @@ func (p *Payload) UnwrapDetails() Details { return *d.NewSchemaChange case *Payload_Migration: return *d.Migration + case *Payload_SqlStatsCompaction: + return *d.SqlStatsCompaction default: return nil } @@ -190,6 +196,8 @@ func (p *Progress) UnwrapDetails() ProgressDetails { return *d.NewSchemaChange case *Progress_Migration: return *d.Migration + case *Progress_SqlStatsCompaction: + return *d.SqlStatsCompaction default: return nil } @@ -234,6 +242,8 @@ func WrapPayloadDetails(details Details) interface { return &Payload_NewSchemaChange{NewSchemaChange: &d} case MigrationDetails: return &Payload_Migration{Migration: &d} + case SQLStatsCompactionDetails: + return &Payload_SqlStatsCompaction{SqlStatsCompaction: &d} default: panic(errors.AssertionFailedf("jobs.WrapPayloadDetails: unknown details type %T", d)) } @@ -269,7 +279,7 @@ const ( func (Type) SafeValue() {} // NumJobTypes is the number of jobs types. -const NumJobTypes = 13 +const NumJobTypes = 14 // MarshalJSONPB redacts sensitive sink URI parameters from ChangefeedDetails. func (p ChangefeedDetails) MarshalJSONPB(x *jsonpb.Marshaler) ([]byte, error) { diff --git a/pkg/sql/BUILD.bazel b/pkg/sql/BUILD.bazel index c5eb99b5a6d8..4d150ab4cc55 100644 --- a/pkg/sql/BUILD.bazel +++ b/pkg/sql/BUILD.bazel @@ -33,6 +33,7 @@ go_library( "comment_on_database.go", "comment_on_index.go", "comment_on_table.go", + "compact_sql_stats.go", "conn_executor.go", "conn_executor_exec.go", "conn_executor_prepare.go", diff --git a/pkg/sql/compact_sql_stats.go b/pkg/sql/compact_sql_stats.go new file mode 100644 index 000000000000..26a5ff462bb1 --- /dev/null +++ b/pkg/sql/compact_sql_stats.go @@ -0,0 +1,64 @@ +// Copyright 2021 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 sql + +import ( + "context" + + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" + "github.com/cockroachdb/cockroach/pkg/settings/cluster" + "github.com/cockroachdb/cockroach/pkg/sql/sqlstats/persistedsqlstats" + "github.com/cockroachdb/cockroach/pkg/util/log" + "github.com/cockroachdb/errors" +) + +type sqlStatsCompactionResumer struct { + job *jobs.Job + st *cluster.Settings +} + +var _ jobs.Resumer = &sqlStatsCompactionResumer{} + +// Resume implements the jobs.Resumer interface. +func (r *sqlStatsCompactionResumer) Resume(ctx context.Context, execCtx interface{}) error { + log.Infof(ctx, "starting sql stats compaction job") + p := execCtx.(JobExecContext) + ie := p.ExecCfg().InternalExecutor + db := p.ExecCfg().DB + + // We check for concurrently running SQL Stats compaction jobs. We only allow + // one job to be running at the same time. + if err := persistedsqlstats.CheckExistingCompactionJob(ctx, r.job, ie, nil /* txn */); err != nil { + if errors.Is(err, persistedsqlstats.ErrConcurrentSQLStatsCompaction) { + log.Infof(ctx, "exiting due to a running sql stats compaction job") + return nil + } + return err + } + + statsCompactor := persistedsqlstats.NewStatsCompactor(r.st, ie, db, p.ExecCfg().SQLStatsTestingKnobs) + return statsCompactor.DeleteOldestEntries(ctx) +} + +// OnFailOrCancel implements the jobs.Resumer interface. +func (r *sqlStatsCompactionResumer) OnFailOrCancel(ctx context.Context, execCtx interface{}) error { + return nil +} + +func init() { + jobs.RegisterConstructor(jobspb.TypeSQLStatsCompaction, func(job *jobs.Job, settings *cluster.Settings) jobs.Resumer { + return &sqlStatsCompactionResumer{ + job: job, + st: settings, + } + }) +} diff --git a/pkg/sql/conn_executor.go b/pkg/sql/conn_executor.go index 0f88f6875e74..b31610b56bbe 100644 --- a/pkg/sql/conn_executor.go +++ b/pkg/sql/conn_executor.go @@ -257,7 +257,7 @@ type Server struct { // sqlStats tracks per-application statistics for all applications on each // node. Newly collected statistics flow into sqlStats. - sqlStats sqlstats.Provider + sqlStats *persistedsqlstats.PersistedSQLStats // sqlStatsController is the control-plane interface for sqlStats. sqlStatsController *sslocal.Controller @@ -353,6 +353,7 @@ func NewServer(cfg *ExecutorConfig, pool *mon.BytesMonitor) *Server { InternalExecutor: &sqlStatsInternalExecutor, KvDB: cfg.DB, SQLIDContainer: cfg.NodeID, + JobRegistry: s.cfg.JobRegistry, Knobs: cfg.SQLStatsTestingKnobs, FlushCounter: metrics.StatsMetrics.SQLStatsFlushStarted, FailureCounter: metrics.StatsMetrics.SQLStatsFlushFailure, diff --git a/pkg/sql/sqlstats/persistedsqlstats/BUILD.bazel b/pkg/sql/sqlstats/persistedsqlstats/BUILD.bazel index afebce05b2cf..a2406bd3c0e5 100644 --- a/pkg/sql/sqlstats/persistedsqlstats/BUILD.bazel +++ b/pkg/sql/sqlstats/persistedsqlstats/BUILD.bazel @@ -5,6 +5,8 @@ go_library( srcs = [ "cluster_settings.go", "combined_iterator.go", + "compaction_exec.go", + "compaction_scheduling.go", "flush.go", "mem_iterator.go", "provider.go", @@ -16,6 +18,8 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/base", + "//pkg/jobs", + "//pkg/jobs/jobspb", "//pkg/kv", "//pkg/roachpb:with-mocks", "//pkg/security", @@ -41,6 +45,7 @@ go_library( go_test( name = "persistedsqlstats_test", srcs = [ + "compaction_test.go", "flush_test.go", "main_test.go", "reader_test.go", @@ -48,15 +53,23 @@ go_test( deps = [ ":persistedsqlstats", "//pkg/base", + "//pkg/jobs", + "//pkg/jobs/jobspb", + "//pkg/kv/kvserver", + "//pkg/kv/kvserver/kvserverbase", "//pkg/roachpb:with-mocks", "//pkg/security", "//pkg/security/securitytest", "//pkg/server", "//pkg/sql", + "//pkg/sql/catalog/descpb", "//pkg/sql/sqlstats", + "//pkg/sql/sqlutil", + "//pkg/testutils", "//pkg/testutils/serverutils", "//pkg/testutils/sqlutils", "//pkg/testutils/testcluster", + "//pkg/util/encoding", "//pkg/util/leaktest", "//pkg/util/log", "//pkg/util/stop", diff --git a/pkg/sql/sqlstats/persistedsqlstats/cluster_settings.go b/pkg/sql/sqlstats/persistedsqlstats/cluster_settings.go index 85199ee611cb..07e46d96839f 100644 --- a/pkg/sql/sqlstats/persistedsqlstats/cluster_settings.go +++ b/pkg/sql/sqlstats/persistedsqlstats/cluster_settings.go @@ -50,3 +50,12 @@ var SQLStatsFlushJitter = settings.RegisterFloatSetting( return nil }, ) + +// SQLStatsMaxPersistedRows specifies maximum number of rows that will be +// retained in system.statement_statistics and system.transaction_statistics. +var SQLStatsMaxPersistedRows = settings.RegisterIntSetting( + "sql.stats.persisted_rows.max", + "maximum number of rows of statement and transaction"+ + " statistics that will be persisted in the system tables", + 10000, /* defaultValue */ +).WithPublic() diff --git a/pkg/sql/sqlstats/persistedsqlstats/compaction_exec.go b/pkg/sql/sqlstats/persistedsqlstats/compaction_exec.go new file mode 100644 index 000000000000..32d5d3e5623b --- /dev/null +++ b/pkg/sql/sqlstats/persistedsqlstats/compaction_exec.go @@ -0,0 +1,158 @@ +// Copyright 2021 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 persistedsqlstats + +import ( + "context" + "fmt" + + "github.com/cockroachdb/cockroach/pkg/kv" + "github.com/cockroachdb/cockroach/pkg/security" + "github.com/cockroachdb/cockroach/pkg/settings/cluster" + "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" + "github.com/cockroachdb/cockroach/pkg/sql/sessiondata" + "github.com/cockroachdb/cockroach/pkg/sql/sqlutil" + "github.com/cockroachdb/errors" +) + +// StatsCompactor is responsible for compacting older SQL Stats. It is +// executed by sql.sqlStatsCompactionResumer. +type StatsCompactor struct { + st *cluster.Settings + db *kv.DB + ie sqlutil.InternalExecutor + + knobs *TestingKnobs +} + +// NewStatsCompactor returns a new instance of StatsCompactor. +func NewStatsCompactor( + setting *cluster.Settings, internalEx sqlutil.InternalExecutor, db *kv.DB, knobs *TestingKnobs, +) *StatsCompactor { + return &StatsCompactor{ + st: setting, + db: db, + ie: internalEx, + knobs: knobs, + } +} + +// DeleteOldestEntries removes the oldest statement and transaction statistics +// that exceeded the limit defined by `sql.stats.persisted_rows.max` +// (persistedsqlstats.SQLStatsMaxPersistedRows). +func (c *StatsCompactor) DeleteOldestEntries(ctx context.Context) error { + stmtStatsEntryCount, txnStatsEntryCount, err := c.getExistingStmtAndTxnStatsEntries(ctx) + if err != nil { + return err + } + + err = c.deleteOldestEntries(ctx, stmtStatsEntryCount, txnStatsEntryCount) + if err != nil { + return err + } + + return nil +} + +func (c *StatsCompactor) getExistingStmtAndTxnStatsEntries( + ctx context.Context, +) (stmtStatsEntryCount, txnStatsEntryCount int64, err error) { + stmt := "SELECT count(*) FROM system.statement_statistics AS OF SYSTEM TIME follower_read_timestamp()" + if c.knobs.DisableFollowerRead { + stmt = "SELECT count(*) FROM system.statement_statistics" + } + row, err := c.ie.QueryRowEx(ctx, + "scan-sql-stmt-stats-entries", + nil, + sessiondata.InternalExecutorOverride{User: security.NodeUserName()}, + stmt) + if err != nil { + return 0 /* stmtStatsEntryCount */, 0 /* txnStatsEntryCount */, err + } + + if row.Len() != 1 { + return 0 /* stmtStatsEntryCount */, 0 /* txnStatsEntryCount */, errors.AssertionFailedf("unexpected number of column returned") + } + stmtStatsEntryCount = int64(tree.MustBeDInt(row[0])) + + stmt = "SELECT count(*) FROM system.transaction_statistics AS OF SYSTEM TIME follower_read_timestamp()" + if c.knobs.DisableFollowerRead { + stmt = "SELECT count(*) FROM system.transaction_statistics" + } + row, err = c.ie.QueryRowEx(ctx, + "scan-sql-txn-stats-entries", + nil, + sessiondata.InternalExecutorOverride{User: security.NodeUserName()}, + stmt) + if err != nil { + return 0 /* stmtStatsEntryCount */, 0 /* txnStatsEntryCount */, err + } + + if row.Len() != 1 { + return 0 /* stmtStatsEntryCount */, 0 /* txnStatsEntryCount */, errors.AssertionFailedf("unexpected received %d columns", row.Len()) + } + txnStatsEntryCount = int64(tree.MustBeDInt(row[0])) + + return stmtStatsEntryCount, txnStatsEntryCount, nil +} + +func (c *StatsCompactor) deleteOldestEntries( + ctx context.Context, curStmtStatsEntries, curTxnStatsEntries int64, +) error { + maxStatsEntry := SQLStatsMaxPersistedRows.Get(&c.st.SV) + + // [1]: table name + // [2]: primary key + // [3]: number of entries to remove + const stmt = ` +DELETE FROM %[1]s +WHERE (%[2]s) IN ( + SELECT %[2]s + FROM %[1]s + ORDER BY aggregated_ts ASC + LIMIT %[3]d +) +` + + return c.db.Txn(ctx, func(ctx context.Context, txn *kv.Txn) error { + if entriesToRemove := curStmtStatsEntries - maxStatsEntry; entriesToRemove > 0 { + _, err := c.ie.ExecEx(ctx, + "delete-old-stmt-stats", + txn, + sessiondata.InternalExecutorOverride{User: security.NodeUserName()}, + fmt.Sprintf(stmt, + "system.statement_statistics", + "aggregated_ts, fingerprint_id, plan_hash, app_name, node_id", + entriesToRemove)) + + if err != nil { + return err + } + } + + if entriesToRemove := curTxnStatsEntries - maxStatsEntry; entriesToRemove > 0 { + _, err := c.ie.ExecEx(ctx, + "delete-old-txn-stats", + txn, + sessiondata.InternalExecutorOverride{User: security.NodeUserName()}, + fmt.Sprintf(stmt, + "system.transaction_statistics", + "aggregated_ts, fingerprint_id, app_name, node_id", + entriesToRemove)) + + if err != nil { + return err + } + } + + return nil + }) +} diff --git a/pkg/sql/sqlstats/persistedsqlstats/compaction_scheduling.go b/pkg/sql/sqlstats/persistedsqlstats/compaction_scheduling.go new file mode 100644 index 000000000000..ee6d1f208630 --- /dev/null +++ b/pkg/sql/sqlstats/persistedsqlstats/compaction_scheduling.go @@ -0,0 +1,70 @@ +// Copyright 2021 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 persistedsqlstats + +import ( + "context" + + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" + "github.com/cockroachdb/cockroach/pkg/kv" + "github.com/cockroachdb/cockroach/pkg/security" + "github.com/cockroachdb/cockroach/pkg/sql/sqlutil" +) + +// CreateCompactionJob creates a system.jobs record if there is no other +// SQL Stats compaction job running. This is invoked by the scheduled job +// Executor. +func CreateCompactionJob( + ctx context.Context, + createdByInfo *jobs.CreatedByInfo, + txn *kv.Txn, + ie sqlutil.InternalExecutor, + jobRegistry *jobs.Registry, +) (jobspb.JobID, error) { + if err := CheckExistingCompactionJob(ctx, nil /* job */, ie, txn); err != nil { + return jobspb.InvalidJobID, err + } + + record := jobs.Record{ + Description: "SQL Stats compaction", + Username: security.NodeUserName(), + Details: jobspb.SQLStatsCompactionDetails{}, + Progress: jobspb.SQLStatsCompactionProgress{}, + CreatedBy: createdByInfo, + } + + jobID := jobRegistry.MakeJobID() + if _, err := jobRegistry.CreateAdoptableJobWithTxn(ctx, record, jobID, txn); err != nil { + return jobspb.InvalidJobID, err + } + return jobID, nil +} + +// CheckExistingCompactionJob checks for existing SQL Stats Compaction job +// that are either PAUSED, CANCELED, or RUNNING. If so, it returns a +// ErrConcurrentSQLStatsCompaction. +func CheckExistingCompactionJob( + ctx context.Context, job *jobs.Job, ie sqlutil.InternalExecutor, txn *kv.Txn, +) error { + jobID := jobspb.InvalidJobID + if job != nil { + jobID = job.ID() + } + exists, err := jobs.RunningJobExists(ctx, jobID, ie, txn, func(payload *jobspb.Payload) bool { + return payload.Type() == jobspb.TypeSQLStatsCompaction + }) + + if err == nil && exists { + err = ErrConcurrentSQLStatsCompaction + } + return err +} diff --git a/pkg/sql/sqlstats/persistedsqlstats/compaction_test.go b/pkg/sql/sqlstats/persistedsqlstats/compaction_test.go new file mode 100644 index 000000000000..e8180dd68a57 --- /dev/null +++ b/pkg/sql/sqlstats/persistedsqlstats/compaction_test.go @@ -0,0 +1,303 @@ +// Copyright 2021 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 persistedsqlstats_test + +import ( + "context" + gosql "database/sql" + "errors" + "fmt" + "net/url" + "testing" + + "github.com/cockroachdb/cockroach/pkg/base" + "github.com/cockroachdb/cockroach/pkg/jobs" + "github.com/cockroachdb/cockroach/pkg/jobs/jobspb" + "github.com/cockroachdb/cockroach/pkg/kv/kvserver" + "github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverbase" + "github.com/cockroachdb/cockroach/pkg/roachpb" + "github.com/cockroachdb/cockroach/pkg/security" + "github.com/cockroachdb/cockroach/pkg/sql" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb" + "github.com/cockroachdb/cockroach/pkg/sql/sqlstats/persistedsqlstats" + "github.com/cockroachdb/cockroach/pkg/sql/sqlutil" + "github.com/cockroachdb/cockroach/pkg/testutils" + "github.com/cockroachdb/cockroach/pkg/testutils/serverutils" + "github.com/cockroachdb/cockroach/pkg/testutils/sqlutils" + "github.com/cockroachdb/cockroach/pkg/util/encoding" + "github.com/cockroachdb/cockroach/pkg/util/leaktest" + "github.com/cockroachdb/cockroach/pkg/util/log" + "github.com/stretchr/testify/require" +) + +func TestSQLStatsCompactor(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + + testCluster := serverutils.StartNewTestCluster( + t, 3 /* numNodes */, base.TestClusterArgs{ + ServerArgs: base.TestServerArgs{ + Knobs: base.TestingKnobs{ + SQLStatsKnobs: &persistedsqlstats.TestingKnobs{ + DisableFollowerRead: true, + }, + }, + }, + }) + + ctx := context.Background() + defer testCluster.Stopper().Stop(ctx) + + firstServer := testCluster.Server(0 /* idx */) + firstPgURL, firstServerConnCleanup := sqlutils.PGUrl( + t, firstServer.ServingSQLAddr(), "CreateConnections", /* prefix */ + url.User(security.RootUser)) + defer firstServerConnCleanup() + + pgFirstSQLConn, err := gosql.Open("postgres", firstPgURL.String()) + require.NoError(t, err) + firstSQLConn := sqlutils.MakeSQLRunner(pgFirstSQLConn) + + defer func() { + err := pgFirstSQLConn.Close() + require.NoError(t, err) + }() + + maxPersistedRowLimit := 5 + firstServerSQLStats := + firstServer. + SQLServer().(*sql.Server). + GetSQLStatsProvider().(*persistedsqlstats.PersistedSQLStats) + firstSQLConn.Exec(t, + "SET CLUSTER SETTING sql.stats.persisted_rows.max = $1", + maxPersistedRowLimit) + + stmt := "SELECT 1" + for i := 0; i < 10; i++ { + firstSQLConn.Exec(t, stmt) + // Mutate the stmt to create different fingerprint. + stmt = fmt.Sprintf("%s, 1", stmt) + } + + firstServerSQLStats.Flush(ctx) + + statsCompactor := persistedsqlstats.NewStatsCompactor( + firstServer.ClusterSettings(), + firstServer.InternalExecutor().(sqlutil.InternalExecutor), + firstServer.DB(), + &persistedsqlstats.TestingKnobs{ + DisableFollowerRead: true, + }, + ) + + // Initial compaction should remove the all the oldest entries. + expectedDeletedStmtFingerprints, expectedDeletedTxnFingerprints := + getTopSortedFingerprints(t, firstSQLConn, maxPersistedRowLimit) + err = statsCompactor.DeleteOldestEntries(ctx) + require.NoError(t, err) + + actualStmtFingerprints, actualTxnFingerprints := + getTopSortedFingerprints(t, firstSQLConn, 0 /* limit */) + require.Equal(t, maxPersistedRowLimit, len(actualStmtFingerprints)) + require.Equal(t, maxPersistedRowLimit, len(actualTxnFingerprints)) + + for fingerprintID := range actualStmtFingerprints { + for _, deletedFingerprintID := range expectedDeletedStmtFingerprints { + require.NotEqual(t, deletedFingerprintID, fingerprintID) + } + } + + for fingerprintID := range actualTxnFingerprints { + for _, deletedFingerprintID := range expectedDeletedTxnFingerprints { + require.NotEqual(t, deletedFingerprintID, fingerprintID) + } + } + + // Calling it again should be a noop. + err = statsCompactor.DeleteOldestEntries(ctx) + require.NoError(t, err) + stmtStatsCnt, txnStatsCnt := getPersistedStatsEntry(t, firstSQLConn) + require.Equal(t, maxPersistedRowLimit, stmtStatsCnt) + require.Equal(t, maxPersistedRowLimit, txnStatsCnt) +} + +func TestAtMostOneSQLStatsCompactionJob(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + + var serverArgs base.TestServerArgs + var allowRequest chan struct{} + + serverArgs.Knobs.SQLStatsKnobs = &persistedsqlstats.TestingKnobs{ + DisableFollowerRead: true, + } + + params := base.TestClusterArgs{ServerArgs: serverArgs} + params.ServerArgs.Knobs.JobsTestingKnobs = jobs.NewTestingKnobsWithShortIntervals() + + params.ServerArgs.Knobs.Store = &kvserver.StoreTestingKnobs{ + TestingRequestFilter: createStatsRequestFilter(t, &allowRequest), + } + + ctx := context.Background() + tc := serverutils.StartNewTestCluster(t, 3 /* numNodes */, params) + defer tc.Stopper().Stop(ctx) + conn := tc.ServerConn(0 /* idx */) + server := tc.Server(0 /* idx */) + + allowRequest = make(chan struct{}) + + jobID, err := launchSQLStatsCompactionJob(server) + require.NoError(t, err) + + // We wait until the job appears in the system.jobs table. + testutils.SucceedsSoon(t, func() error { + server.JobRegistry().(*jobs.Registry).TestingNudgeAdoptionQueue() + var cnt uint64 + row := conn.QueryRow(`SELECT count(*) FROM system.jobs where id = $1`, jobID) + require.NoError(t, row.Scan(&cnt)) + if cnt == 0 { + return errors.New("retry") + } + return nil + }) + + allowRequest <- struct{}{} + + // Launching a second job should fail here since we are still blocking the + // the first job's execution through allowRequest. (Since we need to send + // struct{}{} twice into the channel to fully unblock it.) + _, err = launchSQLStatsCompactionJob(server) + expected := persistedsqlstats.ErrConcurrentSQLStatsCompaction.Error() + if !testutils.IsError(err, expected) { + t.Fatalf("expected '%s' error, but got %+v", expected, err) + } + + allowRequest <- struct{}{} + close(allowRequest) + + // We wait until the first job finishes. + testutils.SucceedsSoon(t, func() error { + var cnt uint64 + row := conn.QueryRow( + `SELECT id FROM system.jobs where id = $1 AND status = 'succeeded'`, jobID) + return row.Scan(&cnt) + }) + + // Launching the job now should succeed. + jobID, err = launchSQLStatsCompactionJob(server) + require.NoError(t, err) + + // Wait until the second job to finish for sanity check. + testutils.SucceedsSoon(t, func() error { + server.JobRegistry().(*jobs.Registry).TestingNudgeAdoptionQueue() + var cnt uint64 + row := conn.QueryRow( + `SELECT id FROM system.jobs where id = $1 AND status = 'succeeded'`, jobID) + return row.Scan(&cnt) + }) +} + +func launchSQLStatsCompactionJob(server serverutils.TestServerInterface) (jobspb.JobID, error) { + return persistedsqlstats.CreateCompactionJob( + context.Background(), nil /* createdByInfo */, nil, /* txn */ + server.InternalExecutor().(sqlutil.InternalExecutor), + server.JobRegistry().(*jobs.Registry), + ) +} + +func getPersistedStatsEntry( + t *testing.T, sqlConn *sqlutils.SQLRunner, +) (stmtStatsCnt, txnStatsCnt int) { + stmt := "SELECT count(*) FROM %s" + + row := sqlConn.QueryRow(t, fmt.Sprintf(stmt, "system.statement_statistics")) + row.Scan(&stmtStatsCnt) + + row = sqlConn.QueryRow(t, fmt.Sprintf(stmt, "system.transaction_statistics")) + row.Scan(&txnStatsCnt) + + return stmtStatsCnt, txnStatsCnt +} + +func getTopSortedFingerprints( + t *testing.T, sqlDb *sqlutils.SQLRunner, limit int, +) (stmtFingerprints, txnFingerprints []uint64) { + query := ` +SELECT fingerprint_id +FROM %s +ORDER BY aggregated_ts` + + if limit > 0 { + query = fmt.Sprintf("%s LIMIT %d", query, limit) + } + + stmtFingerprints = make([]uint64, 0) + txnFingerprints = make([]uint64, 0) + + fingerprintIDBuffer := make([]byte, 0, 8) + rows := sqlDb.Query(t, fmt.Sprintf(query, "system.statement_statistics")) + for rows.Next() { + fingerprintIDBuffer = fingerprintIDBuffer[:0] + require.NoError(t, rows.Scan(&fingerprintIDBuffer)) + _, fingerprintID, err := encoding.DecodeUint64Ascending(fingerprintIDBuffer) + require.NoError(t, err) + stmtFingerprints = append(stmtFingerprints, fingerprintID) + } + require.NoError(t, rows.Close()) + + rows = sqlDb.Query(t, fmt.Sprintf(query, "system.transaction_statistics")) + for rows.Next() { + fingerprintIDBuffer = fingerprintIDBuffer[:0] + require.NoError(t, rows.Scan(&fingerprintIDBuffer)) + _, fingerprintID, err := encoding.DecodeUint64Ascending(fingerprintIDBuffer) + require.NoError(t, err) + txnFingerprints = append(txnFingerprints, fingerprintID) + } + require.NoError(t, rows.Close()) + + return stmtFingerprints, txnFingerprints +} + +func createStatsRequestFilter( + t *testing.T, allowToProgress *chan struct{}, +) kvserverbase.ReplicaRequestFilter { + // Start a test server here so we can get the descriptor ID for the system + // table. This allows us to not hardcode the descriptor ID. + s, sqlConn, _ := serverutils.StartServer(t, base.TestServerArgs{}) + defer func() { + s.Stopper().Stop(context.Background()) + err := sqlConn.Close() + require.NoError(t, err) + }() + sqlDB := sqlutils.MakeSQLRunner(sqlConn) + + stmtStatsTableID, txnStatsTableID := getStatsTablesIDs(t, sqlDB) + return func(_ context.Context, ba roachpb.BatchRequest) *roachpb.Error { + if req, ok := ba.GetArg(roachpb.Scan); ok { + _, tableID, _ := encoding.DecodeUvarintAscending(req.(*roachpb.ScanRequest).Key) + if descpb.ID(tableID) == stmtStatsTableID || descpb.ID(tableID) == txnStatsTableID { + <-*allowToProgress + <-*allowToProgress + } + } + return nil + } +} + +func getStatsTablesIDs( + t *testing.T, sqlDB *sqlutils.SQLRunner, +) (stmtStatsTableID, txnStatsTableID descpb.ID) { + stmt := + "select 'system.statement_statistics'::regclass::oid, 'system.transaction_statistics'::regclass::oid" + sqlDB.QueryRow(t, stmt).Scan(&stmtStatsTableID, &txnStatsTableID) + return stmtStatsTableID, txnStatsTableID +} diff --git a/pkg/sql/sqlstats/persistedsqlstats/provider.go b/pkg/sql/sqlstats/persistedsqlstats/provider.go index 00b3ce5ff069..3810330fb8f4 100644 --- a/pkg/sql/sqlstats/persistedsqlstats/provider.go +++ b/pkg/sql/sqlstats/persistedsqlstats/provider.go @@ -19,6 +19,7 @@ import ( "time" "github.com/cockroachdb/cockroach/pkg/base" + "github.com/cockroachdb/cockroach/pkg/jobs" "github.com/cockroachdb/cockroach/pkg/kv" "github.com/cockroachdb/cockroach/pkg/settings/cluster" "github.com/cockroachdb/cockroach/pkg/sql/sqlstats" @@ -27,6 +28,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/util/metric" "github.com/cockroachdb/cockroach/pkg/util/stop" "github.com/cockroachdb/cockroach/pkg/util/timeutil" + "github.com/cockroachdb/errors" ) // TODO(azhng): currently we do not have the ability to compute a hash for @@ -35,16 +37,25 @@ import ( // update this. const dummyPlanHash = int64(0) +// ErrConcurrentSQLStatsCompaction is reported when two sql stats compaction +// jobs are issued concurrently. This is a sentinel error. +var ErrConcurrentSQLStatsCompaction = errors.New("another sql stats compaction job is already running") + // Config is a configuration struct for the persisted SQL stats subsystem. type Config struct { Settings *cluster.Settings InternalExecutor sqlutil.InternalExecutor KvDB *kv.DB SQLIDContainer *base.SQLIDContainer - Knobs *TestingKnobs - FlushCounter *metric.Counter - FlushDuration *metric.Histogram - FailureCounter *metric.Counter + JobRegistry *jobs.Registry + + // Metrics. + FlushCounter *metric.Counter + FlushDuration *metric.Histogram + FailureCounter *metric.Counter + + // Testing knobs. + Knobs *TestingKnobs } // PersistedSQLStats is a sqlstats.Provider that wraps a node-local in-memory diff --git a/pkg/sql/sqlstats/persistedsqlstats/test_utils.go b/pkg/sql/sqlstats/persistedsqlstats/test_utils.go index 337a4469d988..7c99d151e2c5 100644 --- a/pkg/sql/sqlstats/persistedsqlstats/test_utils.go +++ b/pkg/sql/sqlstats/persistedsqlstats/test_utils.go @@ -24,7 +24,8 @@ type TestingKnobs struct { // DisableFollowerRead disallows the PersistedSQLStats to use follower read. // This is used in the unit tests where it might be reading from the past - // where the stmt/txn stats system table are not yet created. + // where the stmt/txn stats system table are not yet created. This is not a + // scenario that is possible in outside of testing. DisableFollowerRead bool } diff --git a/pkg/ts/catalog/chart_catalog.go b/pkg/ts/catalog/chart_catalog.go index f4e5d7760dcf..e98a8a5fd6e1 100644 --- a/pkg/ts/catalog/chart_catalog.go +++ b/pkg/ts/catalog/chart_catalog.go @@ -2524,6 +2524,7 @@ var charts = []sectionDescription{ "jobs.typedesc_schema_change.currently_running", "jobs.stream_ingestion.currently_running", "jobs.migration.currently_running", + "jobs.sql_stats_compaction.currently_running", }, }, { @@ -2668,6 +2669,17 @@ var charts = []sectionDescription{ "jobs.migration.resume_retry_error", }, }, + { + Title: "SQL Stats Compaction", + Metrics: []string{ + "jobs.sql_stats_compaction.fail_or_cancel_completed", + "jobs.sql_stats_compaction.fail_or_cancel_failed", + "jobs.sql_stats_compaction.fail_or_cancel_retry_error", + "jobs.sql_stats_compaction.resume_completed", + "jobs.sql_stats_compaction.resume_failed", + "jobs.sql_stats_compaction.resume_retry_error", + }, + }, }, }, { diff --git a/pkg/util/jobutil/BUILD.bazel b/pkg/util/jobutil/BUILD.bazel new file mode 100644 index 000000000000..e69de29bb2d1