From 97068e7150cf18e0a5462dc5e2c0fd5760f4bdda Mon Sep 17 00:00:00 2001 From: Zijian Date: Thu, 21 Nov 2024 23:33:50 +0000 Subject: [PATCH] Update weighted load balancer --- .gen/proto/matching/v1/service.pb.go | 665 +++++++++++++----- .gen/proto/matching/v1/service.pb.yarpc.go | 293 ++++---- client/matching/client.go | 11 +- client/matching/client_test.go | 3 +- client/matching/loadbalancer.go | 4 +- client/matching/loadbalancer_mock.go | 8 +- client/matching/loadbalancer_test.go | 2 +- client/matching/multi_loadbalancer.go | 4 +- client/matching/multi_loadbalancer_test.go | 57 +- client/matching/rr_loadbalancer.go | 2 +- client/matching/weighted_loadbalancer.go | 28 +- client/matching/weighted_loadbalancer_test.go | 75 +- common/types/mapper/proto/matching.go | 24 + common/types/mapper/thrift/matching_test.go | 6 +- common/types/matching.go | 7 + common/types/testdata/service_matching.go | 6 + .../uber/cadence/matching/v1/service.proto | 7 + service/matching/handler/engine.go | 32 +- service/matching/tasklist/interfaces.go | 1 + service/matching/tasklist/interfaces_mock.go | 14 + .../matching/tasklist/task_list_manager.go | 22 +- 21 files changed, 879 insertions(+), 392 deletions(-) diff --git a/.gen/proto/matching/v1/service.pb.go b/.gen/proto/matching/v1/service.pb.go index 9c8b26e5d74..144f5ca024f 100644 --- a/.gen/proto/matching/v1/service.pb.go +++ b/.gen/proto/matching/v1/service.pb.go @@ -26,6 +26,7 @@ package matchingv1 import ( + encoding_binary "encoding/binary" fmt "fmt" io "io" math "math" @@ -112,6 +113,61 @@ func (m *TaskListPartitionConfig) GetNumWritePartitions() int32 { return 0 } +type LoadBalancerHints struct { + BacklogCount int64 `protobuf:"varint,1,opt,name=backlog_count,json=backlogCount,proto3" json:"backlog_count,omitempty"` + RatePerSecond float64 `protobuf:"fixed64,2,opt,name=rate_per_second,json=ratePerSecond,proto3" json:"rate_per_second,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LoadBalancerHints) Reset() { *m = LoadBalancerHints{} } +func (m *LoadBalancerHints) String() string { return proto.CompactTextString(m) } +func (*LoadBalancerHints) ProtoMessage() {} +func (*LoadBalancerHints) Descriptor() ([]byte, []int) { + return fileDescriptor_826e827d3aabf7fc, []int{1} +} +func (m *LoadBalancerHints) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LoadBalancerHints) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_LoadBalancerHints.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *LoadBalancerHints) XXX_Merge(src proto.Message) { + xxx_messageInfo_LoadBalancerHints.Merge(m, src) +} +func (m *LoadBalancerHints) XXX_Size() int { + return m.Size() +} +func (m *LoadBalancerHints) XXX_DiscardUnknown() { + xxx_messageInfo_LoadBalancerHints.DiscardUnknown(m) +} + +var xxx_messageInfo_LoadBalancerHints proto.InternalMessageInfo + +func (m *LoadBalancerHints) GetBacklogCount() int64 { + if m != nil { + return m.BacklogCount + } + return 0 +} + +func (m *LoadBalancerHints) GetRatePerSecond() float64 { + if m != nil { + return m.RatePerSecond + } + return 0 +} + type PollForDecisionTaskRequest struct { Request *v1.PollForDecisionTaskRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` DomainId string `protobuf:"bytes,2,opt,name=domain_id,json=domainId,proto3" json:"domain_id,omitempty"` @@ -127,7 +183,7 @@ func (m *PollForDecisionTaskRequest) Reset() { *m = PollForDecisionTaskR func (m *PollForDecisionTaskRequest) String() string { return proto.CompactTextString(m) } func (*PollForDecisionTaskRequest) ProtoMessage() {} func (*PollForDecisionTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{1} + return fileDescriptor_826e827d3aabf7fc, []int{2} } func (m *PollForDecisionTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -211,6 +267,7 @@ type PollForDecisionTaskResponse struct { Queries map[string]*v1.WorkflowQuery `protobuf:"bytes,17,rep,name=queries,proto3" json:"queries,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` TotalHistoryBytes int64 `protobuf:"varint,18,opt,name=total_history_bytes,json=totalHistoryBytes,proto3" json:"total_history_bytes,omitempty"` PartitionConfig *TaskListPartitionConfig `protobuf:"bytes,19,opt,name=partition_config,json=partitionConfig,proto3" json:"partition_config,omitempty"` + LoadBalancerHints *LoadBalancerHints `protobuf:"bytes,20,opt,name=load_balancer_hints,json=loadBalancerHints,proto3" json:"load_balancer_hints,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -220,7 +277,7 @@ func (m *PollForDecisionTaskResponse) Reset() { *m = PollForDecisionTask func (m *PollForDecisionTaskResponse) String() string { return proto.CompactTextString(m) } func (*PollForDecisionTaskResponse) ProtoMessage() {} func (*PollForDecisionTaskResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{2} + return fileDescriptor_826e827d3aabf7fc, []int{3} } func (m *PollForDecisionTaskResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -382,6 +439,13 @@ func (m *PollForDecisionTaskResponse) GetPartitionConfig() *TaskListPartitionCon return nil } +func (m *PollForDecisionTaskResponse) GetLoadBalancerHints() *LoadBalancerHints { + if m != nil { + return m.LoadBalancerHints + } + return nil +} + type PollForActivityTaskRequest struct { Request *v1.PollForActivityTaskRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` DomainId string `protobuf:"bytes,2,opt,name=domain_id,json=domainId,proto3" json:"domain_id,omitempty"` @@ -397,7 +461,7 @@ func (m *PollForActivityTaskRequest) Reset() { *m = PollForActivityTaskR func (m *PollForActivityTaskRequest) String() string { return proto.CompactTextString(m) } func (*PollForActivityTaskRequest) ProtoMessage() {} func (*PollForActivityTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{3} + return fileDescriptor_826e827d3aabf7fc, []int{4} } func (m *PollForActivityTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -478,6 +542,7 @@ type PollForActivityTaskResponse struct { WorkflowType *v1.WorkflowType `protobuf:"bytes,14,opt,name=workflow_type,json=workflowType,proto3" json:"workflow_type,omitempty"` WorkflowDomain string `protobuf:"bytes,15,opt,name=workflow_domain,json=workflowDomain,proto3" json:"workflow_domain,omitempty"` Header *v1.Header `protobuf:"bytes,16,opt,name=header,proto3" json:"header,omitempty"` + LoadBalancerHints *LoadBalancerHints `protobuf:"bytes,17,opt,name=load_balancer_hints,json=loadBalancerHints,proto3" json:"load_balancer_hints,omitempty"` PartitionConfig *TaskListPartitionConfig `protobuf:"bytes,19,opt,name=partition_config,json=partitionConfig,proto3" json:"partition_config,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -488,7 +553,7 @@ func (m *PollForActivityTaskResponse) Reset() { *m = PollForActivityTask func (m *PollForActivityTaskResponse) String() string { return proto.CompactTextString(m) } func (*PollForActivityTaskResponse) ProtoMessage() {} func (*PollForActivityTaskResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{4} + return fileDescriptor_826e827d3aabf7fc, []int{5} } func (m *PollForActivityTaskResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -629,6 +694,13 @@ func (m *PollForActivityTaskResponse) GetHeader() *v1.Header { return nil } +func (m *PollForActivityTaskResponse) GetLoadBalancerHints() *LoadBalancerHints { + if m != nil { + return m.LoadBalancerHints + } + return nil +} + func (m *PollForActivityTaskResponse) GetPartitionConfig() *TaskListPartitionConfig { if m != nil { return m.PartitionConfig @@ -654,7 +726,7 @@ func (m *AddDecisionTaskRequest) Reset() { *m = AddDecisionTaskRequest{} func (m *AddDecisionTaskRequest) String() string { return proto.CompactTextString(m) } func (*AddDecisionTaskRequest) ProtoMessage() {} func (*AddDecisionTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{5} + return fileDescriptor_826e827d3aabf7fc, []int{6} } func (m *AddDecisionTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -750,7 +822,7 @@ func (m *AddDecisionTaskResponse) Reset() { *m = AddDecisionTaskResponse func (m *AddDecisionTaskResponse) String() string { return proto.CompactTextString(m) } func (*AddDecisionTaskResponse) ProtoMessage() {} func (*AddDecisionTaskResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{6} + return fileDescriptor_826e827d3aabf7fc, []int{7} } func (m *AddDecisionTaskResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -806,7 +878,7 @@ func (m *AddActivityTaskRequest) Reset() { *m = AddActivityTaskRequest{} func (m *AddActivityTaskRequest) String() string { return proto.CompactTextString(m) } func (*AddActivityTaskRequest) ProtoMessage() {} func (*AddActivityTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{7} + return fileDescriptor_826e827d3aabf7fc, []int{8} } func (m *AddActivityTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -922,7 +994,7 @@ func (m *ActivityTaskDispatchInfo) Reset() { *m = ActivityTaskDispatchIn func (m *ActivityTaskDispatchInfo) String() string { return proto.CompactTextString(m) } func (*ActivityTaskDispatchInfo) ProtoMessage() {} func (*ActivityTaskDispatchInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{8} + return fileDescriptor_826e827d3aabf7fc, []int{9} } func (m *ActivityTaskDispatchInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1011,7 +1083,7 @@ func (m *AddActivityTaskResponse) Reset() { *m = AddActivityTaskResponse func (m *AddActivityTaskResponse) String() string { return proto.CompactTextString(m) } func (*AddActivityTaskResponse) ProtoMessage() {} func (*AddActivityTaskResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{9} + return fileDescriptor_826e827d3aabf7fc, []int{10} } func (m *AddActivityTaskResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1061,7 +1133,7 @@ func (m *QueryWorkflowRequest) Reset() { *m = QueryWorkflowRequest{} } func (m *QueryWorkflowRequest) String() string { return proto.CompactTextString(m) } func (*QueryWorkflowRequest) ProtoMessage() {} func (*QueryWorkflowRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{10} + return fileDescriptor_826e827d3aabf7fc, []int{11} } func (m *QueryWorkflowRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1130,7 +1202,7 @@ func (m *QueryWorkflowResponse) Reset() { *m = QueryWorkflowResponse{} } func (m *QueryWorkflowResponse) String() string { return proto.CompactTextString(m) } func (*QueryWorkflowResponse) ProtoMessage() {} func (*QueryWorkflowResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{11} + return fileDescriptor_826e827d3aabf7fc, []int{12} } func (m *QueryWorkflowResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1187,7 +1259,7 @@ func (m *RespondQueryTaskCompletedRequest) Reset() { *m = RespondQueryTa func (m *RespondQueryTaskCompletedRequest) String() string { return proto.CompactTextString(m) } func (*RespondQueryTaskCompletedRequest) ProtoMessage() {} func (*RespondQueryTaskCompletedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{12} + return fileDescriptor_826e827d3aabf7fc, []int{13} } func (m *RespondQueryTaskCompletedRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1254,7 +1326,7 @@ func (m *RespondQueryTaskCompletedResponse) Reset() { *m = RespondQueryT func (m *RespondQueryTaskCompletedResponse) String() string { return proto.CompactTextString(m) } func (*RespondQueryTaskCompletedResponse) ProtoMessage() {} func (*RespondQueryTaskCompletedResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{13} + return fileDescriptor_826e827d3aabf7fc, []int{14} } func (m *RespondQueryTaskCompletedResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1297,7 +1369,7 @@ func (m *CancelOutstandingPollRequest) Reset() { *m = CancelOutstandingP func (m *CancelOutstandingPollRequest) String() string { return proto.CompactTextString(m) } func (*CancelOutstandingPollRequest) ProtoMessage() {} func (*CancelOutstandingPollRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{14} + return fileDescriptor_826e827d3aabf7fc, []int{15} } func (m *CancelOutstandingPollRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1364,7 +1436,7 @@ func (m *CancelOutstandingPollResponse) Reset() { *m = CancelOutstanding func (m *CancelOutstandingPollResponse) String() string { return proto.CompactTextString(m) } func (*CancelOutstandingPollResponse) ProtoMessage() {} func (*CancelOutstandingPollResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{15} + return fileDescriptor_826e827d3aabf7fc, []int{16} } func (m *CancelOutstandingPollResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1405,7 +1477,7 @@ func (m *DescribeTaskListRequest) Reset() { *m = DescribeTaskListRequest func (m *DescribeTaskListRequest) String() string { return proto.CompactTextString(m) } func (*DescribeTaskListRequest) ProtoMessage() {} func (*DescribeTaskListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{16} + return fileDescriptor_826e827d3aabf7fc, []int{17} } func (m *DescribeTaskListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1461,7 +1533,7 @@ func (m *DescribeTaskListResponse) Reset() { *m = DescribeTaskListRespon func (m *DescribeTaskListResponse) String() string { return proto.CompactTextString(m) } func (*DescribeTaskListResponse) ProtoMessage() {} func (*DescribeTaskListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{17} + return fileDescriptor_826e827d3aabf7fc, []int{18} } func (m *DescribeTaskListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1523,7 +1595,7 @@ func (m *ListTaskListPartitionsRequest) Reset() { *m = ListTaskListParti func (m *ListTaskListPartitionsRequest) String() string { return proto.CompactTextString(m) } func (*ListTaskListPartitionsRequest) ProtoMessage() {} func (*ListTaskListPartitionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{18} + return fileDescriptor_826e827d3aabf7fc, []int{19} } func (m *ListTaskListPartitionsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1578,7 +1650,7 @@ func (m *ListTaskListPartitionsResponse) Reset() { *m = ListTaskListPart func (m *ListTaskListPartitionsResponse) String() string { return proto.CompactTextString(m) } func (*ListTaskListPartitionsResponse) ProtoMessage() {} func (*ListTaskListPartitionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{19} + return fileDescriptor_826e827d3aabf7fc, []int{20} } func (m *ListTaskListPartitionsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1632,7 +1704,7 @@ func (m *GetTaskListsByDomainRequest) Reset() { *m = GetTaskListsByDomai func (m *GetTaskListsByDomainRequest) String() string { return proto.CompactTextString(m) } func (*GetTaskListsByDomainRequest) ProtoMessage() {} func (*GetTaskListsByDomainRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{20} + return fileDescriptor_826e827d3aabf7fc, []int{21} } func (m *GetTaskListsByDomainRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1680,7 +1752,7 @@ func (m *GetTaskListsByDomainResponse) Reset() { *m = GetTaskListsByDoma func (m *GetTaskListsByDomainResponse) String() string { return proto.CompactTextString(m) } func (*GetTaskListsByDomainResponse) ProtoMessage() {} func (*GetTaskListsByDomainResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{21} + return fileDescriptor_826e827d3aabf7fc, []int{22} } func (m *GetTaskListsByDomainResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1737,7 +1809,7 @@ func (m *UpdateTaskListPartitionConfigRequest) Reset() { *m = UpdateTask func (m *UpdateTaskListPartitionConfigRequest) String() string { return proto.CompactTextString(m) } func (*UpdateTaskListPartitionConfigRequest) ProtoMessage() {} func (*UpdateTaskListPartitionConfigRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{22} + return fileDescriptor_826e827d3aabf7fc, []int{23} } func (m *UpdateTaskListPartitionConfigRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1804,7 +1876,7 @@ func (m *UpdateTaskListPartitionConfigResponse) Reset() { *m = UpdateTas func (m *UpdateTaskListPartitionConfigResponse) String() string { return proto.CompactTextString(m) } func (*UpdateTaskListPartitionConfigResponse) ProtoMessage() {} func (*UpdateTaskListPartitionConfigResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{23} + return fileDescriptor_826e827d3aabf7fc, []int{24} } func (m *UpdateTaskListPartitionConfigResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1847,7 +1919,7 @@ func (m *RefreshTaskListPartitionConfigRequest) Reset() { *m = RefreshTa func (m *RefreshTaskListPartitionConfigRequest) String() string { return proto.CompactTextString(m) } func (*RefreshTaskListPartitionConfigRequest) ProtoMessage() {} func (*RefreshTaskListPartitionConfigRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{24} + return fileDescriptor_826e827d3aabf7fc, []int{25} } func (m *RefreshTaskListPartitionConfigRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1916,7 +1988,7 @@ func (m *RefreshTaskListPartitionConfigResponse) Reset() { func (m *RefreshTaskListPartitionConfigResponse) String() string { return proto.CompactTextString(m) } func (*RefreshTaskListPartitionConfigResponse) ProtoMessage() {} func (*RefreshTaskListPartitionConfigResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_826e827d3aabf7fc, []int{25} + return fileDescriptor_826e827d3aabf7fc, []int{26} } func (m *RefreshTaskListPartitionConfigResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1947,6 +2019,7 @@ var xxx_messageInfo_RefreshTaskListPartitionConfigResponse proto.InternalMessage func init() { proto.RegisterType((*TaskListPartitionConfig)(nil), "uber.cadence.matching.v1.TaskListPartitionConfig") + proto.RegisterType((*LoadBalancerHints)(nil), "uber.cadence.matching.v1.LoadBalancerHints") proto.RegisterType((*PollForDecisionTaskRequest)(nil), "uber.cadence.matching.v1.PollForDecisionTaskRequest") proto.RegisterType((*PollForDecisionTaskResponse)(nil), "uber.cadence.matching.v1.PollForDecisionTaskResponse") proto.RegisterMapType((map[string]*v1.WorkflowQuery)(nil), "uber.cadence.matching.v1.PollForDecisionTaskResponse.QueriesEntry") @@ -1984,152 +2057,157 @@ func init() { } var fileDescriptor_826e827d3aabf7fc = []byte{ - // 2313 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xdf, 0x6f, 0x1c, 0x49, - 0xf1, 0xd7, 0xf8, 0xd7, 0xda, 0xb5, 0xf6, 0xda, 0xe9, 0xe4, 0x9c, 0xc9, 0x26, 0x76, 0x9c, 0xbd, - 0x4b, 0xe2, 0xef, 0x57, 0xc7, 0x3a, 0xf6, 0x5d, 0x42, 0x2e, 0x27, 0x08, 0x8e, 0x1d, 0x27, 0x8b, - 0x08, 0xc9, 0x4d, 0x7c, 0x89, 0x84, 0x4e, 0x19, 0xb5, 0x77, 0x7a, 0xbd, 0x83, 0x77, 0x67, 0x26, - 0xd3, 0x3d, 0xeb, 0x5b, 0x1e, 0x78, 0x40, 0x80, 0x90, 0x78, 0x43, 0xf0, 0x0e, 0x1c, 0x7f, 0x0c, - 0x8f, 0x3c, 0x22, 0x9d, 0x90, 0x50, 0x24, 0x1e, 0x78, 0x04, 0x89, 0x47, 0x24, 0xd4, 0x3f, 0x66, - 0x77, 0x66, 0xb7, 0x67, 0x7f, 0xd8, 0xce, 0x1d, 0x0f, 0xbc, 0xb9, 0xbb, 0xab, 0xaa, 0xab, 0xaa, - 0xab, 0xea, 0x53, 0x35, 0x6b, 0xb8, 0x11, 0x1d, 0x90, 0x70, 0xa3, 0x8a, 0x1d, 0xe2, 0x55, 0xc9, - 0x46, 0x13, 0xb3, 0x6a, 0xdd, 0xf5, 0x0e, 0x37, 0x5a, 0x9b, 0x1b, 0x94, 0x84, 0x2d, 0xb7, 0x4a, - 0xca, 0x41, 0xe8, 0x33, 0x1f, 0x99, 0x9c, 0xae, 0xac, 0xe8, 0xca, 0x31, 0x5d, 0xb9, 0xb5, 0x59, - 0x5c, 0x3d, 0xf4, 0xfd, 0xc3, 0x06, 0xd9, 0x10, 0x74, 0x07, 0x51, 0x6d, 0xc3, 0x89, 0x42, 0xcc, - 0x5c, 0xdf, 0x93, 0x9c, 0xc5, 0xab, 0xbd, 0xe7, 0xcc, 0x6d, 0x12, 0xca, 0x70, 0x33, 0x50, 0x04, - 0x7d, 0x02, 0x8e, 0x43, 0x1c, 0x04, 0x24, 0xa4, 0xea, 0x7c, 0x2d, 0xa5, 0x22, 0x0e, 0x5c, 0xae, - 0x5d, 0xd5, 0x6f, 0x36, 0xbb, 0x57, 0xe8, 0x28, 0x5e, 0x47, 0x24, 0x6c, 0x2b, 0x82, 0x92, 0x8e, - 0x80, 0x61, 0x7a, 0xd4, 0x70, 0x29, 0x53, 0x34, 0xeb, 0x3a, 0x1a, 0xe5, 0x04, 0xfb, 0xd8, 0x0f, - 0x8f, 0x48, 0xa8, 0x28, 0xff, 0x7f, 0x18, 0x65, 0xad, 0xe1, 0x1f, 0x2b, 0xda, 0x6b, 0x3a, 0xda, - 0xba, 0x4b, 0x99, 0xdf, 0x51, 0xee, 0xbd, 0x14, 0x09, 0xad, 0xe3, 0x90, 0x38, 0xfd, 0x54, 0xd7, - 0x33, 0xa8, 0xd2, 0x56, 0x94, 0x7e, 0x63, 0xc0, 0xc5, 0x7d, 0x4c, 0x8f, 0xbe, 0xe7, 0x52, 0xf6, - 0x0c, 0x87, 0xcc, 0xe5, 0x2f, 0xb1, 0xe3, 0x7b, 0x35, 0xf7, 0x10, 0x99, 0x90, 0x6b, 0x91, 0x90, - 0xba, 0xbe, 0x67, 0x1a, 0x6b, 0xc6, 0xfa, 0xa4, 0x15, 0x2f, 0x51, 0x19, 0xce, 0x7b, 0x51, 0xd3, - 0x0e, 0x09, 0x76, 0xec, 0x20, 0xe6, 0xa2, 0xe6, 0xc4, 0x9a, 0xb1, 0x3e, 0x6d, 0x9d, 0xf3, 0xa2, - 0xa6, 0x45, 0xb0, 0xd3, 0x11, 0x47, 0xd1, 0x2d, 0xb8, 0xc0, 0xe9, 0x8f, 0x43, 0x97, 0x91, 0x24, - 0xc3, 0xa4, 0x60, 0x40, 0x5e, 0xd4, 0x7c, 0xc9, 0x8f, 0xba, 0x1c, 0xa5, 0x7f, 0x18, 0x50, 0x7c, - 0xe6, 0x37, 0x1a, 0x7b, 0x7e, 0xb8, 0x4b, 0xaa, 0x2e, 0xbf, 0x95, 0xab, 0x69, 0x91, 0xd7, 0x11, - 0xa1, 0x0c, 0x55, 0x20, 0x17, 0xca, 0x3f, 0x85, 0x6a, 0xf9, 0xad, 0x8d, 0x72, 0x2a, 0xe0, 0x70, - 0xe0, 0x96, 0x5b, 0x9b, 0xe5, 0x6c, 0x09, 0x56, 0xcc, 0x8f, 0x2e, 0xc3, 0x9c, 0xe3, 0x37, 0xb1, - 0xeb, 0xd9, 0xae, 0x23, 0x2c, 0x98, 0xb3, 0x66, 0xe5, 0x46, 0xc5, 0xe1, 0x87, 0x81, 0xdf, 0x68, - 0x90, 0x90, 0x1f, 0x4e, 0xca, 0x43, 0xb9, 0x51, 0x71, 0xd0, 0x75, 0x28, 0xd4, 0xfc, 0xf0, 0x18, - 0x87, 0x0e, 0x71, 0xec, 0x5a, 0xe8, 0x37, 0xcd, 0x29, 0x41, 0xb1, 0xd0, 0xd9, 0xdd, 0x0b, 0xfd, - 0x26, 0xba, 0x09, 0x8b, 0x2e, 0xf5, 0x1b, 0x22, 0xc6, 0xed, 0xc3, 0xd0, 0x8f, 0x02, 0x73, 0x5a, - 0xd0, 0x15, 0x3a, 0xdb, 0x8f, 0xf8, 0x6e, 0xe9, 0x57, 0x00, 0x97, 0xb5, 0x1a, 0xd3, 0xc0, 0xf7, - 0x28, 0x41, 0x2b, 0x00, 0xfc, 0xf5, 0x6c, 0xe6, 0x1f, 0x11, 0xf9, 0x24, 0xf3, 0xd6, 0x1c, 0xdf, - 0xd9, 0xe7, 0x1b, 0xe8, 0x53, 0x40, 0x71, 0x30, 0xd9, 0xe4, 0x73, 0x52, 0x8d, 0xb8, 0x64, 0x61, - 0x51, 0x7e, 0xeb, 0x86, 0xd6, 0x3d, 0x2f, 0x15, 0xf9, 0xc3, 0x98, 0xda, 0x3a, 0x77, 0xdc, 0xbb, - 0x85, 0xf6, 0x60, 0xa1, 0x23, 0x96, 0xb5, 0x03, 0x22, 0xdc, 0x90, 0xdf, 0xba, 0x36, 0x50, 0xe2, - 0x7e, 0x3b, 0x20, 0xd6, 0xfc, 0x71, 0x62, 0x85, 0x5e, 0xc0, 0xa5, 0x20, 0x24, 0x2d, 0xd7, 0x8f, - 0xa8, 0x4d, 0x19, 0x0e, 0x19, 0x71, 0x6c, 0xd2, 0x22, 0x1e, 0xe3, 0xae, 0x9d, 0x12, 0x32, 0x2f, - 0x97, 0x65, 0x6a, 0x97, 0xe3, 0xd4, 0x2e, 0x57, 0x3c, 0x76, 0xe7, 0xc3, 0x17, 0xb8, 0x11, 0x11, - 0x6b, 0x39, 0xe6, 0x7e, 0x2e, 0x99, 0x1f, 0x72, 0xde, 0x8a, 0x83, 0xd6, 0x61, 0xa9, 0x4f, 0xdc, - 0xb4, 0x08, 0xd7, 0x02, 0x4d, 0x53, 0x9a, 0x90, 0xc3, 0x8c, 0x91, 0x66, 0xc0, 0xcc, 0x19, 0x11, - 0x78, 0xf1, 0x12, 0x95, 0x60, 0xc1, 0x23, 0x9f, 0xb3, 0xae, 0x80, 0x9c, 0x10, 0x90, 0xe7, 0x9b, - 0x31, 0xf7, 0xfb, 0x80, 0x0e, 0x70, 0xf5, 0xa8, 0xe1, 0x1f, 0xda, 0x55, 0x3f, 0xf2, 0x98, 0x5d, - 0x77, 0x3d, 0x66, 0xce, 0x0a, 0xc2, 0x25, 0x75, 0xb2, 0xc3, 0x0f, 0x1e, 0xbb, 0x1e, 0x43, 0x77, - 0xc1, 0xa4, 0xcc, 0xad, 0x1e, 0xb5, 0xbb, 0x4f, 0x61, 0x13, 0x0f, 0x1f, 0x34, 0x88, 0x63, 0xce, - 0xad, 0x19, 0xeb, 0xb3, 0xd6, 0xb2, 0x3c, 0xef, 0x38, 0xfa, 0xa1, 0x3c, 0x45, 0x77, 0x61, 0x5a, - 0x94, 0x22, 0x13, 0x84, 0x4f, 0x4a, 0x03, 0xfd, 0xfc, 0x09, 0xa7, 0xb4, 0x24, 0x03, 0xb2, 0x60, - 0xc1, 0x51, 0x71, 0x63, 0xbb, 0x5e, 0xcd, 0x37, 0xf3, 0x42, 0xc2, 0x37, 0xd2, 0x12, 0x64, 0x29, - 0xe0, 0x42, 0xf6, 0x43, 0xec, 0x51, 0x97, 0x78, 0x2c, 0x8e, 0xb6, 0x8a, 0x57, 0xf3, 0xad, 0x79, - 0x27, 0xb1, 0x42, 0xaf, 0xe0, 0x4a, 0x7f, 0x50, 0xd9, 0x22, 0x0c, 0x79, 0x15, 0x31, 0xe7, 0xc5, - 0x15, 0x2b, 0x5a, 0x25, 0xe3, 0xba, 0x62, 0x5d, 0xea, 0x8b, 0xaa, 0xf8, 0x88, 0x57, 0x12, 0xe9, - 0x74, 0x5e, 0xbb, 0x88, 0x1d, 0xd7, 0x9b, 0x05, 0x59, 0x49, 0xc4, 0xd1, 0x73, 0x7e, 0xf2, 0x42, - 0x55, 0x9e, 0x6b, 0x30, 0x7f, 0x10, 0x62, 0xaf, 0x5a, 0x57, 0x59, 0x50, 0x10, 0x59, 0x90, 0x97, - 0x7b, 0x32, 0x0f, 0xb6, 0xa1, 0x40, 0xab, 0x75, 0xe2, 0x44, 0x0d, 0xe2, 0xd8, 0x1c, 0x3c, 0xcc, - 0x45, 0xa1, 0x64, 0xb1, 0x2f, 0xba, 0xf6, 0x63, 0x64, 0xb1, 0x16, 0x3a, 0x1c, 0x7c, 0x0f, 0x7d, - 0x0b, 0xe6, 0xe3, 0x98, 0x12, 0x02, 0x96, 0x86, 0x0a, 0xc8, 0x2b, 0x7a, 0xc1, 0xfe, 0x19, 0xe4, - 0xf8, 0x8b, 0xb8, 0x84, 0x9a, 0xe7, 0xd6, 0x26, 0xd7, 0xf3, 0x5b, 0x0f, 0xca, 0x59, 0x70, 0x58, - 0x1e, 0x90, 0xf0, 0xe5, 0x4f, 0xa4, 0x90, 0x87, 0x1e, 0x0b, 0xdb, 0x56, 0x2c, 0x92, 0xbb, 0x8c, - 0xf9, 0x0c, 0x37, 0x6c, 0x55, 0xf0, 0xed, 0x83, 0x36, 0x23, 0xd4, 0x44, 0x22, 0x12, 0xcf, 0x89, - 0xa3, 0xc7, 0xf2, 0xe4, 0x01, 0x3f, 0x40, 0x9f, 0xc1, 0x52, 0xa7, 0xe4, 0xda, 0x55, 0x51, 0xda, - 0xcd, 0xf3, 0xc2, 0xa0, 0xcd, 0x6c, 0xb5, 0x32, 0x30, 0xc1, 0x5a, 0x0c, 0xd2, 0x1b, 0xc5, 0x57, - 0x30, 0x9f, 0x54, 0x13, 0x2d, 0xc1, 0xe4, 0x11, 0x69, 0x8b, 0xea, 0x34, 0x67, 0xf1, 0x3f, 0x79, - 0x40, 0xb7, 0x78, 0x06, 0xab, 0x52, 0x34, 0x52, 0x40, 0x0b, 0x86, 0x7b, 0x13, 0x77, 0x8d, 0x24, - 0x10, 0x6c, 0x57, 0x99, 0xdb, 0x72, 0x59, 0xfb, 0xe4, 0x40, 0xa0, 0x91, 0xf0, 0xdf, 0x08, 0x04, - 0x7f, 0x9f, 0xed, 0x00, 0x41, 0x5a, 0xe3, 0xaf, 0x15, 0x08, 0xae, 0x42, 0x1e, 0x2b, 0x6d, 0xba, - 0x4e, 0x80, 0x78, 0xab, 0xe2, 0x70, 0xa4, 0xe8, 0x10, 0x08, 0xa4, 0x98, 0x1a, 0x80, 0x14, 0x1d, - 0xc3, 0x04, 0x52, 0xe0, 0xc4, 0x0a, 0x6d, 0xc1, 0xb4, 0xeb, 0x05, 0x11, 0x13, 0xde, 0xc9, 0x6f, - 0x5d, 0xd1, 0xbf, 0x28, 0x6e, 0x37, 0x7c, 0xec, 0x58, 0x92, 0x54, 0x93, 0xf4, 0x33, 0xa7, 0x4d, - 0xfa, 0xdc, 0x78, 0x49, 0xbf, 0x0f, 0x97, 0x62, 0x79, 0x36, 0xf3, 0xed, 0x6a, 0xc3, 0xa7, 0x44, - 0x08, 0xf2, 0x23, 0x09, 0x13, 0xf9, 0xad, 0x4b, 0x7d, 0xb2, 0x76, 0x55, 0xef, 0x6b, 0x2d, 0xc7, - 0xbc, 0xfb, 0xfe, 0x0e, 0xe7, 0xdc, 0x97, 0x8c, 0xe8, 0xfb, 0xb0, 0x2c, 0x2e, 0xe9, 0x17, 0x39, - 0x37, 0x4c, 0xe4, 0x79, 0xc1, 0xd8, 0x23, 0x6f, 0x0f, 0xce, 0xd5, 0x09, 0x0e, 0xd9, 0x01, 0xc1, - 0xac, 0x23, 0x0a, 0x86, 0x89, 0x5a, 0xea, 0xf0, 0xc4, 0x72, 0x12, 0x58, 0x9a, 0x4f, 0x63, 0xe9, - 0x2b, 0x58, 0x4d, 0xbf, 0x84, 0xed, 0xd7, 0x6c, 0x56, 0x77, 0xa9, 0x1d, 0x33, 0xcc, 0x0f, 0x75, - 0x6c, 0x31, 0xf5, 0x32, 0x4f, 0x6b, 0xfb, 0x75, 0x97, 0x6e, 0x2b, 0xf9, 0x95, 0xa4, 0x05, 0x0e, - 0x61, 0xd8, 0x6d, 0x50, 0x81, 0x17, 0xc3, 0x22, 0xa5, 0x6b, 0xc4, 0xae, 0xe4, 0xea, 0x6f, 0x6d, - 0x0a, 0x27, 0x6b, 0x6d, 0x6e, 0xc2, 0x62, 0x47, 0x8e, 0xac, 0x18, 0x02, 0x72, 0xe6, 0xac, 0x42, - 0xbc, 0xbd, 0x2b, 0x76, 0xd1, 0x07, 0x30, 0x53, 0x27, 0xd8, 0x21, 0xa1, 0x42, 0x94, 0xcb, 0xda, - 0x9b, 0x1e, 0x0b, 0x12, 0x4b, 0x91, 0xbe, 0xdd, 0xfa, 0x5d, 0xfa, 0xf3, 0x14, 0x2c, 0x6f, 0x3b, - 0x8e, 0xae, 0xc9, 0x4e, 0x15, 0x44, 0xa3, 0xa7, 0x20, 0xbe, 0xa5, 0x22, 0x73, 0x0f, 0xe6, 0xba, - 0xcd, 0xc5, 0xe4, 0x28, 0xcd, 0xc5, 0x2c, 0x8b, 0x7b, 0x89, 0xab, 0x90, 0xef, 0x64, 0xa0, 0xea, - 0x29, 0x27, 0x2d, 0x88, 0xb7, 0x2a, 0x4e, 0x6f, 0x8a, 0xaa, 0xc4, 0x52, 0x49, 0x30, 0x3d, 0x46, - 0x8a, 0x8a, 0x16, 0x34, 0x4e, 0x85, 0x7b, 0x30, 0x43, 0xfd, 0x28, 0xac, 0xca, 0x92, 0x53, 0xe8, - 0x05, 0xb8, 0x44, 0xbf, 0x85, 0xe9, 0xd1, 0x73, 0x41, 0x69, 0x29, 0x0e, 0x0d, 0x72, 0xe4, 0x74, - 0xc8, 0x11, 0x68, 0x42, 0x60, 0x56, 0x74, 0x16, 0x0f, 0xb3, 0x43, 0x40, 0xff, 0xaa, 0xe5, 0x9e, - 0x88, 0x90, 0xcd, 0x45, 0x1f, 0xac, 0x3f, 0x80, 0x0b, 0x3a, 0x42, 0x0d, 0xbc, 0x5f, 0x48, 0xc2, - 0xfb, 0x5c, 0x12, 0xba, 0x8f, 0xe1, 0x62, 0x9f, 0x0e, 0x0a, 0xc1, 0x74, 0x31, 0x6d, 0x9c, 0x59, - 0x4c, 0xff, 0x73, 0x5a, 0xc4, 0xb4, 0xae, 0x5f, 0xf8, 0x3a, 0x62, 0x9a, 0x4f, 0x28, 0xe2, 0xb9, - 0xed, 0xee, 0xd5, 0x12, 0x3d, 0x0b, 0x72, 0x7f, 0x37, 0x56, 0x20, 0x15, 0xfd, 0x53, 0xa7, 0x8a, - 0xfe, 0xe9, 0xf1, 0xa2, 0x7f, 0xe6, 0xf4, 0xd1, 0x9f, 0x3b, 0x83, 0xe8, 0x9f, 0xd5, 0x45, 0xbf, - 0x07, 0x26, 0x4e, 0x3c, 0xe5, 0xae, 0x4b, 0x03, 0x1e, 0x15, 0x7c, 0x3e, 0x51, 0x28, 0xb8, 0x35, - 0x20, 0x0b, 0x32, 0x38, 0xad, 0x4c, 0x99, 0xda, 0x6c, 0x83, 0x11, 0xb2, 0x4d, 0x13, 0x6f, 0x5f, - 0x61, 0xb6, 0x7d, 0x39, 0x09, 0x66, 0x96, 0xb1, 0xe8, 0xbb, 0xb0, 0xd8, 0x05, 0x65, 0x31, 0x55, - 0xa9, 0x74, 0xd3, 0x63, 0x9d, 0x9a, 0x1f, 0xc4, 0xe8, 0x6b, 0x75, 0x1b, 0x2b, 0xb1, 0xee, 0xeb, - 0x93, 0x26, 0xc6, 0xeb, 0x93, 0x12, 0x9d, 0xc3, 0xe4, 0xb8, 0x9d, 0xc3, 0xd4, 0xd9, 0x77, 0x0e, - 0xd3, 0x67, 0xd3, 0x39, 0xcc, 0x9c, 0x59, 0xe7, 0x90, 0xd3, 0x75, 0x0e, 0xaa, 0x96, 0x6a, 0xa7, - 0x81, 0xb7, 0x5b, 0x4b, 0xbf, 0x34, 0xe0, 0x82, 0x18, 0xca, 0x62, 0x2b, 0xe2, 0x4a, 0xba, 0xd3, - 0x3b, 0x79, 0xfd, 0x9f, 0xd6, 0x78, 0x1d, 0xef, 0x88, 0x33, 0xd7, 0x69, 0x7a, 0x81, 0xd1, 0x46, - 0xb2, 0xd2, 0x17, 0x06, 0xbc, 0xd3, 0xa3, 0xa1, 0xf2, 0xea, 0x7d, 0x98, 0x17, 0x5f, 0x55, 0xec, - 0x90, 0xd0, 0xa8, 0x11, 0xdb, 0x38, 0x38, 0x4e, 0xf2, 0x82, 0xc3, 0x12, 0x0c, 0xa8, 0x02, 0x85, - 0x58, 0xc0, 0x0f, 0x49, 0x95, 0x11, 0x67, 0xe0, 0xfc, 0x2b, 0xe7, 0x5e, 0x45, 0x69, 0x2d, 0xbc, - 0x4e, 0x2e, 0x4b, 0x7f, 0x33, 0x60, 0x4d, 0x2a, 0xe6, 0x08, 0x3a, 0x6e, 0xef, 0x8e, 0xdf, 0x0c, - 0x1a, 0x84, 0x13, 0x2b, 0x57, 0x3e, 0xed, 0x7d, 0x8f, 0xdb, 0xda, 0x8b, 0x86, 0xc9, 0xf9, 0x0a, - 0xde, 0xe6, 0x22, 0xe4, 0x04, 0xaf, 0xea, 0xd1, 0xe6, 0xac, 0x19, 0xbe, 0xac, 0x38, 0xa5, 0x77, - 0xe1, 0xda, 0x00, 0xf5, 0xe4, 0xc3, 0x94, 0xfe, 0x62, 0xc0, 0x95, 0x1d, 0xec, 0x55, 0x49, 0xe3, - 0x69, 0xc4, 0x28, 0xc3, 0x9e, 0xe3, 0x7a, 0x87, 0x7c, 0x5a, 0x1e, 0x09, 0xe2, 0x53, 0x73, 0xfc, - 0x44, 0xcf, 0x1c, 0xff, 0x08, 0x0a, 0x1d, 0xa3, 0xba, 0xdf, 0x3a, 0x0b, 0x19, 0x69, 0x1d, 0x5b, - 0x26, 0xd3, 0x9a, 0x25, 0x56, 0xa7, 0xc1, 0xf1, 0xd2, 0x55, 0x58, 0xc9, 0x30, 0x4f, 0x39, 0xe0, - 0xc7, 0x70, 0x71, 0x97, 0xd0, 0x6a, 0xe8, 0x1e, 0x90, 0x0e, 0xbb, 0x32, 0x7d, 0xaf, 0x37, 0x06, - 0xde, 0xd7, 0xde, 0x9a, 0xc1, 0x3e, 0xda, 0xd3, 0x97, 0xfe, 0x6d, 0x80, 0xd9, 0x2f, 0x41, 0xa5, - 0xcd, 0x47, 0x90, 0x93, 0xee, 0xa4, 0xa6, 0x21, 0x20, 0xf3, 0x6a, 0xe6, 0xf7, 0x18, 0x12, 0x0a, - 0x1c, 0x8e, 0xe9, 0xd1, 0x13, 0x58, 0xea, 0x7a, 0x9f, 0x32, 0xcc, 0x22, 0xaa, 0x52, 0xe6, 0xdd, - 0x81, 0xbe, 0x7b, 0x2e, 0x48, 0xad, 0x02, 0x4b, 0xad, 0xd1, 0x4b, 0x4d, 0x59, 0x9c, 0x1c, 0xe0, - 0x94, 0x91, 0x2b, 0x22, 0x85, 0x15, 0xf1, 0xd0, 0xbd, 0xf4, 0x34, 0x7e, 0x85, 0x65, 0x98, 0x51, - 0xb5, 0x5c, 0x46, 0x9f, 0x5a, 0xa5, 0xa3, 0x62, 0x62, 0xbc, 0xa8, 0xf8, 0xf9, 0x04, 0xac, 0x66, - 0xdd, 0xaa, 0x5c, 0xff, 0x1a, 0x56, 0xba, 0x9f, 0x5f, 0x3a, 0x8e, 0x4c, 0xfc, 0xda, 0x22, 0x1f, - 0xa4, 0x3c, 0x9a, 0xf5, 0x4f, 0x08, 0xc3, 0x0e, 0x66, 0xd8, 0x2a, 0x26, 0xfb, 0xa4, 0xf4, 0xd5, - 0xfc, 0xca, 0xce, 0x17, 0x67, 0xed, 0x95, 0x13, 0x27, 0xbb, 0xd2, 0x49, 0xcc, 0x0c, 0xe9, 0x2b, - 0x4b, 0xb7, 0xe1, 0xf2, 0x23, 0xd2, 0x71, 0x03, 0x7d, 0xd0, 0x96, 0x00, 0x39, 0xc4, 0xf7, 0xa5, - 0x3f, 0x4c, 0xc1, 0x15, 0x3d, 0x9f, 0xf2, 0xde, 0x4f, 0x0d, 0x58, 0xd6, 0xd8, 0xd2, 0xc4, 0x81, - 0xf2, 0xdb, 0xd3, 0x6c, 0x30, 0x1d, 0x24, 0xb8, 0xbc, 0xdb, 0x63, 0xcb, 0x13, 0x1c, 0xc8, 0x2e, - 0xf0, 0xbc, 0xd3, 0x7f, 0x22, 0xd4, 0xd0, 0xbc, 0x22, 0x57, 0x63, 0xe2, 0x54, 0x6a, 0x6c, 0xf7, - 0xbc, 0x62, 0x57, 0x0d, 0xdc, 0x7f, 0x52, 0xfc, 0x11, 0x4f, 0x71, 0xbd, 0xde, 0x9a, 0xa6, 0xf4, - 0x71, 0xfa, 0x0b, 0xef, 0x80, 0x6e, 0x3c, 0xab, 0x6e, 0x24, 0x1a, 0x59, 0x7e, 0x77, 0x96, 0xb2, - 0x6f, 0xfb, 0xee, 0xd2, 0xef, 0x26, 0xe0, 0xbd, 0x4f, 0x03, 0x07, 0x33, 0x92, 0x55, 0x0e, 0x46, - 0x01, 0x99, 0x53, 0x24, 0xfa, 0xd9, 0x61, 0x90, 0xae, 0xfe, 0x4d, 0x9d, 0x45, 0xfd, 0xbb, 0x09, - 0xd7, 0x87, 0xb8, 0x48, 0x01, 0xd5, 0xef, 0x27, 0xe0, 0xba, 0x45, 0x6a, 0x21, 0xa1, 0xf5, 0xff, - 0x79, 0x33, 0xcb, 0x9b, 0xeb, 0x70, 0x63, 0x98, 0x8f, 0xa4, 0x3b, 0xb7, 0xfe, 0x35, 0x0f, 0xf9, - 0x27, 0x2a, 0x9e, 0xb7, 0x9f, 0x55, 0xd0, 0x4f, 0x0c, 0x38, 0xaf, 0xf9, 0xf5, 0x08, 0x7d, 0x38, - 0xe6, 0x8f, 0x4d, 0xe2, 0x09, 0x8a, 0xb7, 0x4f, 0xf4, 0x13, 0x55, 0x52, 0x89, 0x64, 0xd2, 0x8e, - 0xa0, 0x84, 0x66, 0x5a, 0x1e, 0x41, 0x09, 0xed, 0x04, 0xd4, 0x82, 0xc5, 0x9e, 0x0f, 0x4d, 0xe8, - 0xd6, 0xb8, 0xdf, 0xc5, 0x8a, 0x9b, 0x63, 0x70, 0xa4, 0xee, 0x4d, 0xd9, 0x7d, 0x6b, 0xdc, 0x2f, - 0x04, 0x43, 0xee, 0xd5, 0xda, 0x1b, 0xc0, 0x42, 0x6a, 0x68, 0x41, 0xe5, 0x6c, 0x19, 0xba, 0xf9, - 0xab, 0xb8, 0x31, 0x32, 0xbd, 0xba, 0xf1, 0xd7, 0x06, 0x5c, 0xca, 0x6c, 0xcd, 0xd1, 0xbd, 0x6c, - 0x71, 0xc3, 0xc6, 0x8d, 0xe2, 0xc7, 0x27, 0xe2, 0x55, 0x6a, 0xfd, 0xc2, 0x80, 0x77, 0xb4, 0xcd, - 0x32, 0xba, 0x93, 0x2d, 0x76, 0xd0, 0xf0, 0x50, 0xfc, 0xe6, 0xd8, 0x7c, 0x4a, 0x95, 0x36, 0x2c, - 0xf5, 0x02, 0x0c, 0xda, 0x1c, 0x07, 0x8c, 0xe4, 0xfd, 0x27, 0xc0, 0x2f, 0xf4, 0x4b, 0x03, 0x96, - 0xf5, 0xbd, 0x21, 0x1a, 0x60, 0xce, 0xc0, 0x1e, 0xb6, 0x78, 0x77, 0x7c, 0x46, 0xa5, 0xcd, 0xcf, - 0x0c, 0xb8, 0xa0, 0xeb, 0x44, 0xd0, 0xed, 0x71, 0x3b, 0x17, 0xa9, 0xc9, 0x9d, 0x93, 0x35, 0x3c, - 0xe8, 0xb7, 0x06, 0xac, 0x0c, 0xc4, 0x29, 0xf4, 0xed, 0x6c, 0xc9, 0xa3, 0xf4, 0x00, 0xc5, 0xfb, - 0x27, 0xe6, 0x57, 0x2a, 0x7e, 0x61, 0xc0, 0xea, 0xe0, 0xe2, 0x8f, 0xee, 0x0f, 0x4a, 0x8f, 0x11, - 0xa0, 0xb5, 0xf8, 0x9d, 0x93, 0x0b, 0x90, 0x5a, 0x3e, 0x78, 0xf4, 0xc7, 0x37, 0xab, 0xc6, 0x9f, - 0xde, 0xac, 0x1a, 0x7f, 0x7d, 0xb3, 0x6a, 0xfc, 0xe0, 0xa3, 0x43, 0x97, 0xd5, 0xa3, 0x83, 0x72, - 0xd5, 0x6f, 0x6e, 0xa4, 0xfe, 0xc5, 0xac, 0x7c, 0x48, 0x3c, 0xf9, 0x3f, 0x79, 0xc9, 0x7f, 0x0b, - 0xfc, 0x38, 0xfe, 0xbb, 0xb5, 0x79, 0x30, 0x23, 0x4e, 0x3f, 0xf8, 0x4f, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x55, 0x97, 0xef, 0x77, 0x44, 0x28, 0x00, 0x00, + // 2396 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xdb, 0x6f, 0x1c, 0x49, + 0xd5, 0x57, 0xfb, 0x36, 0x9e, 0x33, 0xe3, 0xb1, 0x5d, 0xf6, 0x3a, 0x9d, 0x49, 0xec, 0x38, 0xb3, + 0x9b, 0xc4, 0xdf, 0xc7, 0x32, 0x8e, 0xbd, 0x9b, 0x90, 0xcd, 0x0a, 0x82, 0x2f, 0xb9, 0x0c, 0xda, + 0x90, 0x6c, 0xc7, 0x9b, 0x48, 0xb0, 0x4a, 0x53, 0x33, 0x5d, 0xf6, 0x34, 0x9e, 0xe9, 0xee, 0x74, + 0x55, 0x8f, 0x77, 0x78, 0xe0, 0x01, 0x01, 0x42, 0xe2, 0x15, 0xde, 0x81, 0xe5, 0x6f, 0x41, 0x3c, + 0xf2, 0x88, 0xb4, 0x42, 0x42, 0x91, 0x78, 0x46, 0x20, 0xf1, 0x88, 0x84, 0xaa, 0xba, 0x7a, 0xa6, + 0x7b, 0xa6, 0x7a, 0x2e, 0xb6, 0xb3, 0xcb, 0x03, 0x6f, 0xee, 0xaa, 0x73, 0xaf, 0x73, 0xce, 0xef, + 0x54, 0x8d, 0xe1, 0x7a, 0x50, 0x25, 0xfe, 0x66, 0x0d, 0x5b, 0xc4, 0xa9, 0x91, 0xcd, 0x26, 0x66, + 0xb5, 0xba, 0xed, 0x1c, 0x6d, 0xb6, 0xb6, 0x36, 0x29, 0xf1, 0x5b, 0x76, 0x8d, 0x94, 0x3d, 0xdf, + 0x65, 0x2e, 0xd2, 0x39, 0x5d, 0x59, 0xd2, 0x95, 0x23, 0xba, 0x72, 0x6b, 0xab, 0xb8, 0x76, 0xe4, + 0xba, 0x47, 0x0d, 0xb2, 0x29, 0xe8, 0xaa, 0xc1, 0xe1, 0xa6, 0x15, 0xf8, 0x98, 0xd9, 0xae, 0x13, + 0x72, 0x16, 0xaf, 0xf4, 0xee, 0x33, 0xbb, 0x49, 0x28, 0xc3, 0x4d, 0x4f, 0x12, 0xf4, 0x09, 0x38, + 0xf1, 0xb1, 0xe7, 0x11, 0x9f, 0xca, 0xfd, 0xf5, 0x84, 0x89, 0xd8, 0xb3, 0xb9, 0x75, 0x35, 0xb7, + 0xd9, 0xec, 0xaa, 0x50, 0x51, 0xbc, 0x0a, 0x88, 0xdf, 0x96, 0x04, 0x25, 0x15, 0x01, 0xc3, 0xf4, + 0xb8, 0x61, 0x53, 0x26, 0x69, 0x36, 0x54, 0x34, 0x32, 0x08, 0xe6, 0x89, 0xeb, 0x1f, 0x13, 0x5f, + 0x52, 0xfe, 0xff, 0x30, 0xca, 0xc3, 0x86, 0x7b, 0x22, 0x69, 0xaf, 0xaa, 0x68, 0xeb, 0x36, 0x65, + 0x6e, 0xc7, 0xb8, 0x77, 0x12, 0x24, 0xb4, 0x8e, 0x7d, 0x62, 0xf5, 0x53, 0x5d, 0x4b, 0xa1, 0x4a, + 0x7a, 0x51, 0xfa, 0xb5, 0x06, 0x17, 0x0e, 0x30, 0x3d, 0xfe, 0xc8, 0xa6, 0xec, 0x29, 0xf6, 0x99, + 0xcd, 0x4f, 0x62, 0xcf, 0x75, 0x0e, 0xed, 0x23, 0xa4, 0x43, 0xa6, 0x45, 0x7c, 0x6a, 0xbb, 0x8e, + 0xae, 0xad, 0x6b, 0x1b, 0x93, 0x46, 0xf4, 0x89, 0xca, 0xb0, 0xe4, 0x04, 0x4d, 0xd3, 0x27, 0xd8, + 0x32, 0xbd, 0x88, 0x8b, 0xea, 0x13, 0xeb, 0xda, 0xc6, 0xb4, 0xb1, 0xe8, 0x04, 0x4d, 0x83, 0x60, + 0xab, 0x23, 0x8e, 0xa2, 0x9b, 0xb0, 0xcc, 0xe9, 0x4f, 0x7c, 0x9b, 0x91, 0x38, 0xc3, 0xa4, 0x60, + 0x40, 0x4e, 0xd0, 0x7c, 0xc1, 0xb7, 0xba, 0x1c, 0xa5, 0x1f, 0xc0, 0xe2, 0x47, 0x2e, 0xb6, 0x76, + 0x71, 0x03, 0x3b, 0x35, 0xe2, 0x3f, 0xb2, 0x1d, 0x46, 0xd1, 0xdb, 0x30, 0x57, 0xc5, 0xb5, 0xe3, + 0x86, 0x7b, 0x64, 0xd6, 0xdc, 0xc0, 0x61, 0xd2, 0xac, 0xbc, 0x5c, 0xdc, 0xe3, 0x6b, 0xe8, 0x3a, + 0xcc, 0xfb, 0x98, 0xab, 0x21, 0xbe, 0x49, 0x49, 0xcd, 0x75, 0x2c, 0x61, 0x97, 0x66, 0xcc, 0xf1, + 0xe5, 0xa7, 0xc4, 0x7f, 0x26, 0x16, 0x4b, 0xff, 0xd0, 0xa0, 0xf8, 0xd4, 0x6d, 0x34, 0x1e, 0xb8, + 0xfe, 0x3e, 0xa9, 0xd9, 0xdc, 0x2f, 0x1e, 0x08, 0x83, 0xbc, 0x0a, 0x08, 0x65, 0xa8, 0x02, 0x19, + 0x3f, 0xfc, 0x53, 0x68, 0xc9, 0x6d, 0x6f, 0x96, 0x13, 0x29, 0x8d, 0x3d, 0xbb, 0xdc, 0xda, 0x2a, + 0xa7, 0x4b, 0x30, 0x22, 0x7e, 0x74, 0x09, 0xb2, 0x96, 0xdb, 0xc4, 0xb6, 0x63, 0xda, 0xa1, 0x2d, + 0x59, 0x63, 0x36, 0x5c, 0xa8, 0x58, 0x7c, 0xd3, 0x73, 0x1b, 0x0d, 0xe2, 0xf3, 0xcd, 0xc9, 0x70, + 0x33, 0x5c, 0xa8, 0x58, 0xe8, 0x1a, 0x14, 0x0e, 0x5d, 0xff, 0x04, 0xfb, 0x16, 0xb1, 0xcc, 0x43, + 0xdf, 0x6d, 0xea, 0x53, 0x82, 0x62, 0xae, 0xb3, 0xfa, 0xc0, 0x77, 0x9b, 0xe8, 0x06, 0xcc, 0xdb, + 0xd4, 0x6d, 0x88, 0x2a, 0x32, 0x8f, 0x7c, 0x37, 0xf0, 0xf4, 0x69, 0x41, 0x57, 0xe8, 0x2c, 0x3f, + 0xe4, 0xab, 0xa5, 0xbf, 0x03, 0x5c, 0x52, 0x5a, 0x4c, 0x3d, 0xd7, 0xa1, 0x04, 0xad, 0x02, 0xf0, + 0xfc, 0x30, 0x99, 0x7b, 0x4c, 0xc2, 0x43, 0xcf, 0x1b, 0x59, 0xbe, 0x72, 0xc0, 0x17, 0xd0, 0x27, + 0x80, 0xa2, 0x74, 0x35, 0xc9, 0x67, 0xa4, 0x16, 0x70, 0xc9, 0xc2, 0xa3, 0xdc, 0xf6, 0x75, 0x65, + 0x78, 0x5e, 0x48, 0xf2, 0xfb, 0x11, 0xb5, 0xb1, 0x78, 0xd2, 0xbb, 0x84, 0x1e, 0xc0, 0x5c, 0x47, + 0x2c, 0x6b, 0x7b, 0x44, 0x84, 0x21, 0xb7, 0x7d, 0x75, 0xa0, 0xc4, 0x83, 0xb6, 0x47, 0x8c, 0xfc, + 0x49, 0xec, 0x0b, 0x3d, 0x87, 0x8b, 0x9e, 0x4f, 0x5a, 0xb6, 0x1b, 0x50, 0x93, 0x32, 0xec, 0x33, + 0x62, 0x99, 0xa4, 0x45, 0x1c, 0xc6, 0x43, 0x3b, 0x25, 0x64, 0x5e, 0x2a, 0x87, 0xcd, 0xa3, 0x1c, + 0x35, 0x8f, 0x72, 0xc5, 0x61, 0xb7, 0xdf, 0x7f, 0x8e, 0x1b, 0x01, 0x31, 0x56, 0x22, 0xee, 0x67, + 0x21, 0xf3, 0x7d, 0xce, 0x5b, 0xb1, 0xd0, 0x06, 0x2c, 0xf4, 0x89, 0x9b, 0x16, 0x99, 0x57, 0xa0, + 0x49, 0x4a, 0x1d, 0x32, 0x98, 0x31, 0xd2, 0xf4, 0x98, 0x3e, 0x23, 0x52, 0x3b, 0xfa, 0x44, 0x25, + 0x98, 0x73, 0xc8, 0x67, 0xac, 0x2b, 0x20, 0x23, 0x04, 0xe4, 0xf8, 0x62, 0xc4, 0xfd, 0x2e, 0xa0, + 0x44, 0x7a, 0x9b, 0x75, 0xdb, 0x61, 0xfa, 0xac, 0x20, 0x5c, 0x88, 0xe7, 0x38, 0xaf, 0x06, 0x74, + 0x07, 0x74, 0xca, 0xec, 0xda, 0x71, 0xbb, 0x7b, 0x14, 0x26, 0x71, 0x70, 0xb5, 0x41, 0x2c, 0x3d, + 0xbb, 0xae, 0x6d, 0xcc, 0x1a, 0x2b, 0xe1, 0x7e, 0x27, 0xd0, 0xf7, 0xc3, 0x5d, 0x74, 0x07, 0xa6, + 0x45, 0xb3, 0xd3, 0x41, 0xc4, 0xa4, 0x34, 0x30, 0xce, 0x1f, 0x73, 0x4a, 0x23, 0x64, 0x40, 0x06, + 0xcc, 0x59, 0x32, 0x6f, 0x4c, 0xdb, 0x39, 0x74, 0xf5, 0x9c, 0x90, 0xf0, 0xf5, 0xa4, 0x84, 0xb0, + 0xd9, 0x70, 0x21, 0x07, 0x3e, 0x76, 0xa8, 0x4d, 0x1c, 0x16, 0x65, 0x5b, 0xc5, 0x39, 0x74, 0x8d, + 0xbc, 0x15, 0xfb, 0x42, 0x2f, 0xe1, 0x72, 0x7f, 0x52, 0x99, 0x22, 0x0d, 0x79, 0x9f, 0xd2, 0xf3, + 0x42, 0xc5, 0xaa, 0xd2, 0xc8, 0xa8, 0x73, 0x19, 0x17, 0xfb, 0xb2, 0x2a, 0xda, 0xe2, 0xbd, 0x2a, + 0x0c, 0x3a, 0xef, 0x8e, 0xc4, 0x8c, 0x3a, 0xda, 0x5c, 0xd8, 0xab, 0xc4, 0xd6, 0x33, 0xbe, 0xf3, + 0x5c, 0xf6, 0xb6, 0xab, 0x90, 0xaf, 0xfa, 0xd8, 0xa9, 0xd5, 0x65, 0x15, 0x14, 0x44, 0x15, 0xe4, + 0xc2, 0xb5, 0xb0, 0x0e, 0x76, 0xa0, 0x40, 0x6b, 0x75, 0x62, 0x05, 0x0d, 0x62, 0x99, 0x1c, 0x9e, + 0xf4, 0x79, 0x61, 0x64, 0xb1, 0x2f, 0xbb, 0x0e, 0x22, 0xec, 0x32, 0xe6, 0x3a, 0x1c, 0x7c, 0x0d, + 0x7d, 0x13, 0xf2, 0x51, 0x4e, 0x09, 0x01, 0x0b, 0x43, 0x05, 0xe4, 0x24, 0xbd, 0x60, 0xff, 0x14, + 0x32, 0xfc, 0x44, 0x6c, 0x42, 0xf5, 0xc5, 0xf5, 0xc9, 0x8d, 0xdc, 0xf6, 0x6e, 0x39, 0x0d, 0x70, + 0xcb, 0x03, 0x0a, 0xbe, 0xfc, 0x71, 0x28, 0xe4, 0xbe, 0xc3, 0xfc, 0xb6, 0x11, 0x89, 0xe4, 0x21, + 0x63, 0x2e, 0xc3, 0x0d, 0x53, 0x42, 0x8a, 0x59, 0x6d, 0x33, 0x42, 0x75, 0x24, 0x32, 0x71, 0x51, + 0x6c, 0x3d, 0x0a, 0x77, 0x76, 0xf9, 0x06, 0xfa, 0x14, 0x16, 0x3a, 0x4d, 0xdd, 0xac, 0x09, 0xf0, + 0xd0, 0x97, 0x84, 0x43, 0x5b, 0xe9, 0x66, 0xa5, 0xa0, 0x8e, 0x31, 0xef, 0xf5, 0xc0, 0xd0, 0xf7, + 0x61, 0xa9, 0xe1, 0x62, 0xcb, 0xac, 0x4a, 0x2c, 0x10, 0x65, 0x41, 0xf5, 0x65, 0xa1, 0xe0, 0x6b, + 0xe9, 0x0a, 0xfa, 0xf0, 0xc3, 0x58, 0x6c, 0xf4, 0x2e, 0x15, 0x5f, 0x42, 0x3e, 0x1e, 0x03, 0xb4, + 0x00, 0x93, 0xc7, 0xa4, 0x2d, 0x5a, 0x5f, 0xd6, 0xe0, 0x7f, 0xf2, 0x6a, 0x69, 0xf1, 0xf6, 0x20, + 0xfb, 0xdc, 0x48, 0xd5, 0x22, 0x18, 0xee, 0x4e, 0xdc, 0xd1, 0xe2, 0x28, 0xb3, 0x53, 0x63, 0x76, + 0xcb, 0x66, 0xed, 0xd3, 0xa3, 0x8c, 0x42, 0xc2, 0x7f, 0x23, 0xca, 0xfc, 0x21, 0xdb, 0x41, 0x99, + 0xa4, 0xc5, 0x5f, 0x29, 0xca, 0x5c, 0x81, 0x1c, 0x96, 0xd6, 0x74, 0x83, 0x00, 0xd1, 0x52, 0xc5, + 0xe2, 0x30, 0xd4, 0x21, 0x10, 0x30, 0x34, 0x35, 0x00, 0x86, 0x3a, 0x8e, 0x09, 0x18, 0xc2, 0xb1, + 0x2f, 0xb4, 0x0d, 0xd3, 0xb6, 0xe3, 0x05, 0x4c, 0x44, 0x27, 0xb7, 0x7d, 0x59, 0x7d, 0xa2, 0xb8, + 0xcd, 0x93, 0xd1, 0x08, 0x49, 0x15, 0x1d, 0x65, 0xe6, 0xac, 0x1d, 0x25, 0x33, 0x5e, 0x47, 0x39, + 0x80, 0x8b, 0x91, 0x3c, 0x93, 0xb9, 0x66, 0xad, 0xe1, 0x52, 0x22, 0x04, 0xb9, 0x41, 0x88, 0x41, + 0xb9, 0xed, 0x8b, 0x7d, 0xb2, 0xf6, 0xe5, 0xe8, 0x6e, 0xac, 0x44, 0xbc, 0x07, 0xee, 0x1e, 0xe7, + 0x3c, 0x08, 0x19, 0xd1, 0x77, 0x61, 0x45, 0x28, 0xe9, 0x17, 0x99, 0x1d, 0x26, 0x72, 0x49, 0x30, + 0xf6, 0xc8, 0x7b, 0x00, 0x8b, 0x75, 0x82, 0x7d, 0x56, 0x25, 0x98, 0x75, 0x44, 0xc1, 0x30, 0x51, + 0x0b, 0x1d, 0x9e, 0x48, 0x4e, 0x0c, 0xa8, 0x73, 0x49, 0xa0, 0x7e, 0x09, 0x6b, 0xc9, 0x93, 0x30, + 0xdd, 0x43, 0x93, 0xd5, 0x6d, 0x6a, 0x46, 0x0c, 0xf9, 0xa1, 0x81, 0x2d, 0x26, 0x4e, 0xe6, 0xc9, + 0xe1, 0x41, 0xdd, 0xa6, 0x3b, 0x52, 0x7e, 0x25, 0xee, 0x81, 0x45, 0x18, 0xb6, 0x1b, 0x54, 0x80, + 0xd1, 0xb0, 0x4c, 0xe9, 0x3a, 0xb1, 0x1f, 0x72, 0xf5, 0xcf, 0x4d, 0x85, 0xd3, 0xcd, 0x4d, 0x37, + 0x60, 0xbe, 0x23, 0x27, 0xec, 0x18, 0x02, 0xcf, 0xb2, 0x46, 0x21, 0x5a, 0xde, 0x17, 0xab, 0xe8, + 0x3d, 0x98, 0xa9, 0x13, 0x6c, 0x11, 0x5f, 0xc2, 0xd5, 0x25, 0xa5, 0xa6, 0x47, 0x82, 0xc4, 0x90, + 0xa4, 0x69, 0xed, 0x7b, 0xf1, 0x3c, 0xda, 0xf7, 0x9b, 0x45, 0x9e, 0xd2, 0x9f, 0xa7, 0x60, 0x65, + 0xc7, 0xb2, 0x54, 0xd7, 0x83, 0x44, 0xb7, 0xd5, 0x7a, 0xba, 0xed, 0x1b, 0xea, 0x60, 0x77, 0x21, + 0xdb, 0x1d, 0x8b, 0x26, 0x47, 0x19, 0x8b, 0x66, 0x59, 0x34, 0x05, 0x5d, 0x81, 0x5c, 0xa7, 0xbc, + 0xe5, 0x34, 0x3c, 0x69, 0x40, 0xb4, 0x54, 0xb1, 0x7a, 0xeb, 0x5f, 0x56, 0xad, 0xac, 0xb0, 0xe9, + 0x31, 0xea, 0x5f, 0x0c, 0xcf, 0x51, 0x9d, 0xdd, 0x85, 0x19, 0xea, 0x06, 0x7e, 0x2d, 0xec, 0x67, + 0x85, 0x5e, 0xf4, 0x8c, 0x4d, 0x8a, 0x98, 0x1e, 0x3f, 0x13, 0x94, 0x86, 0xe4, 0x50, 0xc0, 0x52, + 0x46, 0x05, 0x4b, 0x9e, 0x22, 0x05, 0x66, 0xc5, 0x4c, 0x74, 0x3f, 0x3d, 0x05, 0xd4, 0xa7, 0x5a, + 0xee, 0xc9, 0x88, 0x70, 0x2c, 0xea, 0x4d, 0x8b, 0xe2, 0x2e, 0x2c, 0xab, 0x08, 0x15, 0xb3, 0xc3, + 0x72, 0x7c, 0x76, 0xc8, 0xc6, 0xe7, 0x82, 0x13, 0xb8, 0xd0, 0x67, 0x83, 0x84, 0x47, 0x55, 0x4e, + 0x6b, 0xe7, 0x96, 0xd3, 0xff, 0x9c, 0x16, 0x39, 0xad, 0x1a, 0x46, 0xbe, 0x8a, 0x9c, 0xe6, 0x77, + 0x2b, 0x71, 0xdc, 0x66, 0x57, 0x75, 0x08, 0xcd, 0x85, 0x70, 0x7d, 0x3f, 0x32, 0x20, 0x91, 0xfd, + 0x53, 0x67, 0xca, 0xfe, 0xe9, 0xf1, 0xb2, 0x7f, 0xe6, 0xec, 0xd9, 0x9f, 0x39, 0x87, 0xec, 0x9f, + 0x55, 0x65, 0xbf, 0x03, 0x3a, 0x8e, 0x1d, 0xe5, 0xbe, 0x4d, 0x3d, 0x9e, 0x15, 0xfc, 0x66, 0x25, + 0x21, 0x76, 0x7b, 0x40, 0x15, 0xa4, 0x70, 0x1a, 0xa9, 0x32, 0x95, 0xd5, 0x06, 0x23, 0x54, 0x9b, + 0x22, 0xdf, 0xbe, 0xc4, 0x6a, 0xfb, 0x62, 0x12, 0xf4, 0x34, 0x67, 0xd1, 0x77, 0x60, 0xbe, 0x8b, + 0xf8, 0xe2, 0x3e, 0x28, 0xcb, 0x4d, 0x0d, 0xa4, 0xf2, 0xe6, 0x23, 0x2e, 0xed, 0x46, 0x77, 0x6a, + 0x13, 0xdf, 0x7d, 0x43, 0xd8, 0xc4, 0x78, 0x43, 0x58, 0x6c, 0x2c, 0x99, 0x1c, 0x77, 0x2c, 0x99, + 0x3a, 0xff, 0xb1, 0x64, 0xfa, 0x7c, 0xc6, 0x92, 0x99, 0x73, 0x1b, 0x4b, 0x32, 0xaa, 0xb1, 0x44, + 0xf6, 0x52, 0xe5, 0x55, 0xe3, 0xcd, 0xf6, 0xd2, 0x2f, 0x34, 0x58, 0x16, 0x37, 0xbe, 0xc8, 0x8b, + 0xa8, 0x93, 0xee, 0xf5, 0x5e, 0xeb, 0xfe, 0x4f, 0xe9, 0xbc, 0x8a, 0x77, 0xc4, 0x0b, 0xdd, 0x59, + 0x66, 0x81, 0xd1, 0xee, 0x7b, 0xa5, 0xcf, 0x35, 0x78, 0xab, 0xc7, 0x42, 0x19, 0xd5, 0x7b, 0x90, + 0x17, 0xef, 0x41, 0xa6, 0x4f, 0x68, 0xd0, 0x88, 0x7c, 0x1c, 0x9c, 0x27, 0x39, 0xc1, 0x61, 0x08, + 0x06, 0x54, 0x81, 0x42, 0x24, 0xe0, 0x87, 0xa4, 0xc6, 0x88, 0x35, 0xf0, 0x72, 0x1d, 0x5e, 0xaa, + 0x25, 0xa5, 0x31, 0xf7, 0x2a, 0xfe, 0x59, 0xfa, 0x9b, 0x06, 0xeb, 0xa1, 0x61, 0x96, 0xa0, 0xe3, + 0xfe, 0xee, 0xb9, 0x4d, 0xaf, 0x41, 0x38, 0xb1, 0x0c, 0xe5, 0x93, 0xde, 0xf3, 0xb8, 0xa5, 0x54, + 0x34, 0x4c, 0xce, 0x97, 0x70, 0x36, 0x17, 0x20, 0x23, 0x78, 0xe5, 0x8c, 0x96, 0x35, 0x66, 0xf8, + 0x67, 0xc5, 0x2a, 0xbd, 0x0d, 0x57, 0x07, 0x98, 0x17, 0x1e, 0x4c, 0xe9, 0x2f, 0x1a, 0x5c, 0xde, + 0xe3, 0xe3, 0x71, 0xe3, 0x49, 0xc0, 0x28, 0xc3, 0x8e, 0x65, 0x3b, 0x47, 0xfc, 0x2a, 0x3e, 0x12, + 0xc4, 0x27, 0x1e, 0x09, 0x26, 0x7a, 0x1e, 0x09, 0x1e, 0x42, 0xa1, 0xe3, 0x54, 0xf7, 0x95, 0xb6, + 0x90, 0x52, 0xd6, 0x91, 0x67, 0x61, 0x59, 0xb3, 0xd8, 0xd7, 0x59, 0x70, 0xbc, 0x74, 0x05, 0x56, + 0x53, 0xdc, 0x93, 0x01, 0xf8, 0x31, 0x5c, 0xd8, 0x27, 0xb4, 0xe6, 0xdb, 0x55, 0xd2, 0x61, 0x97, + 0xae, 0x3f, 0xe8, 0xcd, 0x81, 0x77, 0x95, 0x5a, 0x53, 0xd8, 0x47, 0x3b, 0xfa, 0xd2, 0xbf, 0x35, + 0xd0, 0xfb, 0x25, 0xc8, 0xb2, 0xf9, 0x00, 0x32, 0x61, 0x38, 0xa9, 0xae, 0x09, 0xc8, 0xbc, 0x92, + 0xfa, 0xd8, 0x43, 0x7c, 0x81, 0xc3, 0x11, 0x3d, 0x7a, 0x0c, 0x0b, 0xdd, 0xe8, 0x53, 0x86, 0x59, + 0x40, 0x65, 0xc9, 0xbc, 0x3d, 0x30, 0x76, 0xcf, 0x04, 0xa9, 0x51, 0x60, 0x89, 0x6f, 0xf4, 0x42, + 0xd1, 0x16, 0x27, 0x07, 0x04, 0x65, 0xe4, 0x8e, 0x48, 0x61, 0x55, 0x1c, 0x74, 0x2f, 0x3d, 0x8d, + 0x4e, 0x61, 0x05, 0x66, 0x64, 0x2f, 0x0f, 0xb3, 0x4f, 0x7e, 0x25, 0xb3, 0x62, 0x62, 0xbc, 0xac, + 0xf8, 0xf9, 0x04, 0xac, 0xa5, 0x69, 0x95, 0xa1, 0x7f, 0x05, 0xab, 0xdd, 0xb7, 0x9d, 0x4e, 0x20, + 0x63, 0xbf, 0x44, 0x85, 0x07, 0x52, 0x1e, 0xcd, 0xfb, 0xc7, 0x84, 0x61, 0x0b, 0x33, 0x6c, 0x14, + 0xe3, 0x73, 0x52, 0x52, 0x35, 0x57, 0xd9, 0x79, 0x2b, 0x57, 0xaa, 0x9c, 0x38, 0x9d, 0x4a, 0x2b, + 0x76, 0x67, 0x48, 0xaa, 0x2c, 0xdd, 0x82, 0x4b, 0x0f, 0x49, 0x27, 0x0c, 0x74, 0xb7, 0x1d, 0x02, + 0xe4, 0x90, 0xd8, 0x97, 0x7e, 0x3f, 0x05, 0x97, 0xd5, 0x7c, 0x32, 0x7a, 0x3f, 0xd5, 0x60, 0x45, + 0xe1, 0x4b, 0x13, 0x7b, 0x32, 0x6e, 0x4f, 0xd2, 0xc1, 0x74, 0x90, 0xe0, 0xf2, 0x7e, 0x8f, 0x2f, + 0x8f, 0xb1, 0x17, 0x4e, 0x81, 0x4b, 0x56, 0xff, 0x8e, 0x30, 0x43, 0x71, 0x8a, 0xdc, 0x8c, 0x89, + 0x33, 0x99, 0xb1, 0xd3, 0x73, 0x8a, 0x5d, 0x33, 0x70, 0xff, 0x4e, 0xf1, 0x47, 0xbc, 0xc4, 0xd5, + 0x76, 0x2b, 0x86, 0xd2, 0x47, 0xc9, 0xe7, 0xe3, 0x01, 0xd3, 0x78, 0x5a, 0xdf, 0x88, 0x0d, 0xb2, + 0x5c, 0x77, 0x9a, 0xb1, 0x6f, 0x5a, 0x77, 0xe9, 0xb7, 0x13, 0xf0, 0xce, 0x27, 0x9e, 0x85, 0x19, + 0x49, 0x6b, 0x07, 0xa3, 0x80, 0xcc, 0x19, 0x0a, 0xfd, 0xfc, 0x30, 0x48, 0xd5, 0xff, 0xa6, 0xce, + 0xa3, 0xff, 0xdd, 0x80, 0x6b, 0x43, 0x42, 0x24, 0x81, 0xea, 0x77, 0x13, 0x70, 0xcd, 0x20, 0x87, + 0x3e, 0xa1, 0xf5, 0xff, 0x45, 0x33, 0x2d, 0x9a, 0x1b, 0x70, 0x7d, 0x58, 0x8c, 0xc2, 0x70, 0x6e, + 0xff, 0x2b, 0x0f, 0xb9, 0xc7, 0x32, 0x9f, 0x77, 0x9e, 0x56, 0xd0, 0x4f, 0x34, 0x58, 0x52, 0xfc, + 0xee, 0x85, 0xde, 0x1f, 0xf3, 0x67, 0x32, 0x71, 0x04, 0xc5, 0x5b, 0xa7, 0xfa, 0x71, 0x2d, 0x6e, + 0x44, 0xbc, 0x68, 0x47, 0x30, 0x42, 0x71, 0x5b, 0x1e, 0xc1, 0x08, 0xe5, 0x0d, 0xa8, 0x05, 0xf3, + 0x3d, 0x0f, 0x4d, 0xe8, 0xe6, 0xb8, 0xef, 0x62, 0xc5, 0xad, 0x31, 0x38, 0x12, 0x7a, 0x13, 0x7e, + 0xdf, 0x1c, 0xf7, 0x85, 0x60, 0x88, 0x5e, 0xa5, 0xbf, 0x1e, 0xcc, 0x25, 0x2e, 0x2d, 0xa8, 0x9c, + 0x2e, 0x43, 0x75, 0xff, 0x2a, 0x6e, 0x8e, 0x4c, 0x2f, 0x35, 0xfe, 0x4a, 0x83, 0x8b, 0xa9, 0xa3, + 0x39, 0xba, 0x9b, 0x2e, 0x6e, 0xd8, 0x75, 0xa3, 0xf8, 0xe1, 0xa9, 0x78, 0xa5, 0x59, 0xbf, 0xd0, + 0xe0, 0x2d, 0xe5, 0xb0, 0x8c, 0x6e, 0xa7, 0x8b, 0x1d, 0x74, 0x79, 0x28, 0x7e, 0x63, 0x6c, 0x3e, + 0x69, 0x4a, 0x1b, 0x16, 0x7a, 0x01, 0x06, 0x6d, 0x8d, 0x03, 0x46, 0xa1, 0xfe, 0x53, 0xe0, 0x17, + 0xfa, 0xa5, 0x06, 0x2b, 0xea, 0xd9, 0x10, 0x0d, 0x70, 0x67, 0xe0, 0x0c, 0x5b, 0xbc, 0x33, 0x3e, + 0xa3, 0xb4, 0xe6, 0x67, 0x1a, 0x2c, 0xab, 0x26, 0x11, 0x74, 0x6b, 0xdc, 0xc9, 0x25, 0xb4, 0xe4, + 0xf6, 0xe9, 0x06, 0x1e, 0xf4, 0x1b, 0x0d, 0x56, 0x07, 0xe2, 0x14, 0xfa, 0x56, 0xba, 0xe4, 0x51, + 0x66, 0x80, 0xe2, 0xbd, 0x53, 0xf3, 0x4b, 0x13, 0x3f, 0xd7, 0x60, 0x6d, 0x70, 0xf3, 0x47, 0xf7, + 0x06, 0x95, 0xc7, 0x08, 0xd0, 0x5a, 0xfc, 0xf6, 0xe9, 0x05, 0x84, 0x56, 0xee, 0x3e, 0xfc, 0xe3, + 0xeb, 0x35, 0xed, 0x4f, 0xaf, 0xd7, 0xb4, 0xbf, 0xbe, 0x5e, 0xd3, 0xbe, 0xf7, 0xc1, 0x91, 0xcd, + 0xea, 0x41, 0xb5, 0x5c, 0x73, 0x9b, 0x9b, 0x89, 0x7f, 0xbf, 0x2b, 0x1f, 0x11, 0x27, 0xfc, 0x7f, + 0xc5, 0xf8, 0xbf, 0x4c, 0x7e, 0x18, 0xfd, 0xdd, 0xda, 0xaa, 0xce, 0x88, 0xdd, 0xf7, 0xfe, 0x13, + 0x00, 0x00, 0xff, 0xff, 0x68, 0x1d, 0xfb, 0x0b, 0x60, 0x29, 0x00, 0x00, } func (m *TaskListPartitionConfig) Marshal() (dAtA []byte, err error) { @@ -2174,6 +2252,44 @@ func (m *TaskListPartitionConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *LoadBalancerHints) 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 *LoadBalancerHints) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *LoadBalancerHints) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.RatePerSecond != 0 { + i -= 8 + encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.RatePerSecond)))) + i-- + dAtA[i] = 0x11 + } + if m.BacklogCount != 0 { + i = encodeVarintService(dAtA, i, uint64(m.BacklogCount)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *PollForDecisionTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2265,6 +2381,20 @@ func (m *PollForDecisionTaskResponse) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.LoadBalancerHints != nil { + { + size, err := m.LoadBalancerHints.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintService(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xa2 + } if m.PartitionConfig != nil { { size, err := m.PartitionConfig.MarshalToSizedBuffer(dAtA[:i]) @@ -2569,6 +2699,20 @@ func (m *PollForActivityTaskResponse) MarshalToSizedBuffer(dAtA []byte) (int, er i-- dAtA[i] = 0x9a } + if m.LoadBalancerHints != nil { + { + size, err := m.LoadBalancerHints.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintService(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x8a + } if m.Header != nil { { size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) @@ -3982,6 +4126,24 @@ func (m *TaskListPartitionConfig) Size() (n int) { return n } +func (m *LoadBalancerHints) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.BacklogCount != 0 { + n += 1 + sovService(uint64(m.BacklogCount)) + } + if m.RatePerSecond != 0 { + n += 9 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *PollForDecisionTaskRequest) Size() (n int) { if m == nil { return 0 @@ -4098,6 +4260,10 @@ func (m *PollForDecisionTaskResponse) Size() (n int) { l = m.PartitionConfig.Size() n += 2 + l + sovService(uint64(l)) } + if m.LoadBalancerHints != nil { + l = m.LoadBalancerHints.Size() + n += 2 + l + sovService(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -4205,6 +4371,10 @@ func (m *PollForActivityTaskResponse) Size() (n int) { l = m.Header.Size() n += 2 + l + sovService(uint64(l)) } + if m.LoadBalancerHints != nil { + l = m.LoadBalancerHints.Size() + n += 2 + l + sovService(uint64(l)) + } if m.PartitionConfig != nil { l = m.PartitionConfig.Size() n += 2 + l + sovService(uint64(l)) @@ -4849,6 +5019,87 @@ func (m *TaskListPartitionConfig) Unmarshal(dAtA []byte) error { } return nil } +func (m *LoadBalancerHints) 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 ErrIntOverflowService + } + 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: LoadBalancerHints: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LoadBalancerHints: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BacklogCount", wireType) + } + m.BacklogCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowService + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BacklogCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field RatePerSecond", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.RatePerSecond = float64(math.Float64frombits(v)) + default: + iNdEx = preIndex + skippy, err := skipService(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthService + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *PollForDecisionTaskRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -5748,6 +5999,42 @@ func (m *PollForDecisionTaskResponse) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LoadBalancerHints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowService + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthService + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthService + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LoadBalancerHints == nil { + m.LoadBalancerHints = &LoadBalancerHints{} + } + if err := m.LoadBalancerHints.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipService(dAtA[iNdEx:]) @@ -6563,6 +6850,42 @@ func (m *PollForActivityTaskResponse) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 17: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LoadBalancerHints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowService + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthService + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthService + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LoadBalancerHints == nil { + m.LoadBalancerHints = &LoadBalancerHints{} + } + if err := m.LoadBalancerHints.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex case 19: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PartitionConfig", wireType) diff --git a/.gen/proto/matching/v1/service.pb.yarpc.go b/.gen/proto/matching/v1/service.pb.yarpc.go index 1c5b266c484..fe62877d428 100644 --- a/.gen/proto/matching/v1/service.pb.yarpc.go +++ b/.gen/proto/matching/v1/service.pb.yarpc.go @@ -805,150 +805,155 @@ var ( var yarpcFileDescriptorClosure826e827d3aabf7fc = [][]byte{ // uber/cadence/matching/v1/service.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xdd, 0x6f, 0x1c, 0x49, - 0x11, 0xd7, 0xf8, 0x6b, 0xed, 0x5a, 0x7b, 0xed, 0x74, 0x72, 0xce, 0x64, 0x13, 0x27, 0xce, 0xde, - 0x25, 0x31, 0xe8, 0x58, 0xc7, 0xbe, 0x4b, 0xc8, 0x25, 0x82, 0xe0, 0xd8, 0x71, 0xb2, 0x88, 0x90, - 0xdc, 0xc4, 0x97, 0x48, 0xe8, 0x94, 0x51, 0x7b, 0xa7, 0xed, 0x1d, 0xbc, 0x3b, 0x33, 0x99, 0xee, - 0x59, 0xdf, 0xf2, 0xc0, 0x03, 0x02, 0x84, 0xc4, 0x1b, 0x82, 0x77, 0xe0, 0xf8, 0xa3, 0x90, 0x4e, - 0x3c, 0xf2, 0xc0, 0x23, 0x48, 0x3c, 0x22, 0xa1, 0xfe, 0x98, 0xd9, 0x99, 0xdd, 0x9e, 0xfd, 0xb0, - 0x9d, 0x3b, 0x1e, 0x78, 0x73, 0x77, 0x57, 0x55, 0x57, 0x55, 0x57, 0xd5, 0xaf, 0x6a, 0xd6, 0x70, - 0x33, 0xda, 0x27, 0xe1, 0x7a, 0x1d, 0x3b, 0xc4, 0xab, 0x93, 0xf5, 0x16, 0x66, 0xf5, 0x86, 0xeb, - 0x1d, 0xae, 0xb7, 0x37, 0xd6, 0x29, 0x09, 0xdb, 0x6e, 0x9d, 0x54, 0x83, 0xd0, 0x67, 0x3e, 0x32, - 0x39, 0x5d, 0x55, 0xd1, 0x55, 0x63, 0xba, 0x6a, 0x7b, 0xa3, 0x7c, 0xf5, 0xd0, 0xf7, 0x0f, 0x9b, - 0x64, 0x5d, 0xd0, 0xed, 0x47, 0x07, 0xeb, 0x4e, 0x14, 0x62, 0xe6, 0xfa, 0x9e, 0xe4, 0x2c, 0x5f, - 0xeb, 0x3d, 0x67, 0x6e, 0x8b, 0x50, 0x86, 0x5b, 0x81, 0x22, 0xe8, 0x13, 0x70, 0x1c, 0xe2, 0x20, - 0x20, 0x21, 0x55, 0xe7, 0xab, 0x19, 0x15, 0x71, 0xe0, 0x72, 0xed, 0xea, 0x7e, 0xab, 0xd5, 0xbd, - 0x42, 0x47, 0xf1, 0x36, 0x22, 0x61, 0x47, 0x11, 0x54, 0x74, 0x04, 0x0c, 0xd3, 0xa3, 0xa6, 0x4b, - 0x99, 0xa2, 0x59, 0xd3, 0xd1, 0x28, 0x27, 0xd8, 0xc7, 0x7e, 0x78, 0x44, 0x42, 0x45, 0xf9, 0xed, - 0x61, 0x94, 0x07, 0x4d, 0xff, 0x58, 0xd1, 0x5e, 0xd7, 0xd1, 0x36, 0x5c, 0xca, 0xfc, 0x44, 0xb9, - 0x0f, 0x32, 0x24, 0xb4, 0x81, 0x43, 0xe2, 0xf4, 0x53, 0xdd, 0xc8, 0xa1, 0xca, 0x5a, 0x51, 0xf9, - 0x83, 0x01, 0x17, 0xf7, 0x30, 0x3d, 0xfa, 0x91, 0x4b, 0xd9, 0x0b, 0x1c, 0x32, 0x97, 0xbf, 0xc4, - 0xb6, 0xef, 0x1d, 0xb8, 0x87, 0xc8, 0x84, 0x42, 0x9b, 0x84, 0xd4, 0xf5, 0x3d, 0xd3, 0x58, 0x35, - 0xd6, 0x26, 0xad, 0x78, 0x89, 0xaa, 0x70, 0xde, 0x8b, 0x5a, 0x76, 0x48, 0xb0, 0x63, 0x07, 0x31, - 0x17, 0x35, 0x27, 0x56, 0x8d, 0xb5, 0x69, 0xeb, 0x9c, 0x17, 0xb5, 0x2c, 0x82, 0x9d, 0x44, 0x1c, - 0x45, 0xb7, 0xe1, 0x02, 0xa7, 0x3f, 0x0e, 0x5d, 0x46, 0xd2, 0x0c, 0x93, 0x82, 0x01, 0x79, 0x51, - 0xeb, 0x35, 0x3f, 0xea, 0x72, 0x54, 0xfe, 0x69, 0x40, 0xf9, 0x85, 0xdf, 0x6c, 0xee, 0xfa, 0xe1, - 0x0e, 0xa9, 0xbb, 0xfc, 0x56, 0xae, 0xa6, 0x45, 0xde, 0x46, 0x84, 0x32, 0x54, 0x83, 0x42, 0x28, - 0xff, 0x14, 0xaa, 0x15, 0x37, 0xd7, 0xab, 0x99, 0x80, 0xc3, 0x81, 0x5b, 0x6d, 0x6f, 0x54, 0xf3, - 0x25, 0x58, 0x31, 0x3f, 0xba, 0x0c, 0x73, 0x8e, 0xdf, 0xc2, 0xae, 0x67, 0xbb, 0x8e, 0xb0, 0x60, - 0xce, 0x9a, 0x95, 0x1b, 0x35, 0x87, 0x1f, 0x06, 0x7e, 0xb3, 0x49, 0x42, 0x7e, 0x38, 0x29, 0x0f, - 0xe5, 0x46, 0xcd, 0x41, 0x37, 0xa0, 0x74, 0xe0, 0x87, 0xc7, 0x38, 0x74, 0x88, 0x63, 0x1f, 0x84, - 0x7e, 0xcb, 0x9c, 0x12, 0x14, 0x0b, 0xc9, 0xee, 0x6e, 0xe8, 0xb7, 0xd0, 0x2d, 0x58, 0x74, 0xa9, - 0xdf, 0x14, 0x31, 0x6e, 0x1f, 0x86, 0x7e, 0x14, 0x98, 0xd3, 0x82, 0xae, 0x94, 0x6c, 0x3f, 0xe1, - 0xbb, 0x95, 0xdf, 0x01, 0x5c, 0xd6, 0x6a, 0x4c, 0x03, 0xdf, 0xa3, 0x04, 0xad, 0x00, 0xf0, 0xd7, - 0xb3, 0x99, 0x7f, 0x44, 0xe4, 0x93, 0xcc, 0x5b, 0x73, 0x7c, 0x67, 0x8f, 0x6f, 0xa0, 0xcf, 0x00, - 0xc5, 0xc1, 0x64, 0x93, 0x2f, 0x48, 0x3d, 0xe2, 0x92, 0x85, 0x45, 0xc5, 0xcd, 0x9b, 0x5a, 0xf7, - 0xbc, 0x56, 0xe4, 0x8f, 0x63, 0x6a, 0xeb, 0xdc, 0x71, 0xef, 0x16, 0xda, 0x85, 0x85, 0x44, 0x2c, - 0xeb, 0x04, 0x44, 0xb8, 0xa1, 0xb8, 0x79, 0x7d, 0xa0, 0xc4, 0xbd, 0x4e, 0x40, 0xac, 0xf9, 0xe3, - 0xd4, 0x0a, 0xbd, 0x82, 0x4b, 0x41, 0x48, 0xda, 0xae, 0x1f, 0x51, 0x9b, 0x32, 0x1c, 0x32, 0xe2, - 0xd8, 0xa4, 0x4d, 0x3c, 0xc6, 0x5d, 0x3b, 0x25, 0x64, 0x5e, 0xae, 0xca, 0xd4, 0xae, 0xc6, 0xa9, - 0x5d, 0xad, 0x79, 0xec, 0xee, 0xc7, 0xaf, 0x70, 0x33, 0x22, 0xd6, 0x72, 0xcc, 0xfd, 0x52, 0x32, - 0x3f, 0xe6, 0xbc, 0x35, 0x07, 0xad, 0xc1, 0x52, 0x9f, 0xb8, 0x69, 0x11, 0xae, 0x25, 0x9a, 0xa5, - 0x34, 0xa1, 0x80, 0x19, 0x23, 0xad, 0x80, 0x99, 0x33, 0x22, 0xf0, 0xe2, 0x25, 0xaa, 0xc0, 0x82, - 0x47, 0xbe, 0x60, 0x5d, 0x01, 0x05, 0x21, 0xa0, 0xc8, 0x37, 0x63, 0xee, 0x0f, 0x01, 0xed, 0xe3, - 0xfa, 0x51, 0xd3, 0x3f, 0xb4, 0xeb, 0x7e, 0xe4, 0x31, 0xbb, 0xe1, 0x7a, 0xcc, 0x9c, 0x15, 0x84, - 0x4b, 0xea, 0x64, 0x9b, 0x1f, 0x3c, 0x75, 0x3d, 0x86, 0xee, 0x81, 0x49, 0x99, 0x5b, 0x3f, 0xea, - 0x74, 0x9f, 0xc2, 0x26, 0x1e, 0xde, 0x6f, 0x12, 0xc7, 0x9c, 0x5b, 0x35, 0xd6, 0x66, 0xad, 0x65, - 0x79, 0x9e, 0x38, 0xfa, 0xb1, 0x3c, 0x45, 0xf7, 0x60, 0x5a, 0x94, 0x22, 0x13, 0x84, 0x4f, 0x2a, - 0x03, 0xfd, 0xfc, 0x29, 0xa7, 0xb4, 0x24, 0x03, 0xb2, 0x60, 0xc1, 0x51, 0x71, 0x63, 0xbb, 0xde, - 0x81, 0x6f, 0x16, 0x85, 0x84, 0xef, 0x64, 0x25, 0xc8, 0x52, 0xc0, 0x85, 0xec, 0x85, 0xd8, 0xa3, - 0x2e, 0xf1, 0x58, 0x1c, 0x6d, 0x35, 0xef, 0xc0, 0xb7, 0xe6, 0x9d, 0xd4, 0x0a, 0xbd, 0x81, 0x2b, - 0xfd, 0x41, 0x65, 0x8b, 0x30, 0xe4, 0x55, 0xc4, 0x9c, 0x17, 0x57, 0xac, 0x68, 0x95, 0x8c, 0xeb, - 0x8a, 0x75, 0xa9, 0x2f, 0xaa, 0xe2, 0x23, 0x5e, 0x49, 0xa4, 0xd3, 0x79, 0xed, 0x22, 0x76, 0x5c, - 0x6f, 0x16, 0x64, 0x25, 0x11, 0x47, 0x2f, 0xf9, 0xc9, 0x2b, 0x55, 0x79, 0xae, 0xc3, 0xfc, 0x7e, - 0x88, 0xbd, 0x7a, 0x43, 0x65, 0x41, 0x49, 0x64, 0x41, 0x51, 0xee, 0xc9, 0x3c, 0xd8, 0x82, 0x12, - 0xad, 0x37, 0x88, 0x13, 0x35, 0x89, 0x63, 0x73, 0xf0, 0x30, 0x17, 0x85, 0x92, 0xe5, 0xbe, 0xe8, - 0xda, 0x8b, 0x91, 0xc5, 0x5a, 0x48, 0x38, 0xf8, 0x1e, 0xfa, 0x1e, 0xcc, 0xc7, 0x31, 0x25, 0x04, - 0x2c, 0x0d, 0x15, 0x50, 0x54, 0xf4, 0x82, 0xfd, 0x73, 0x28, 0xf0, 0x17, 0x71, 0x09, 0x35, 0xcf, - 0xad, 0x4e, 0xae, 0x15, 0x37, 0x1f, 0x55, 0xf3, 0xe0, 0xb0, 0x3a, 0x20, 0xe1, 0xab, 0x9f, 0x4a, - 0x21, 0x8f, 0x3d, 0x16, 0x76, 0xac, 0x58, 0x24, 0x77, 0x19, 0xf3, 0x19, 0x6e, 0xda, 0xaa, 0xe0, - 0xdb, 0xfb, 0x1d, 0x46, 0xa8, 0x89, 0x44, 0x24, 0x9e, 0x13, 0x47, 0x4f, 0xe5, 0xc9, 0x23, 0x7e, - 0x80, 0x3e, 0x87, 0xa5, 0xa4, 0xe4, 0xda, 0x75, 0x51, 0xda, 0xcd, 0xf3, 0xc2, 0xa0, 0x8d, 0x7c, - 0xb5, 0x72, 0x30, 0xc1, 0x5a, 0x0c, 0xb2, 0x1b, 0xe5, 0x37, 0x30, 0x9f, 0x56, 0x13, 0x2d, 0xc1, - 0xe4, 0x11, 0xe9, 0x88, 0xea, 0x34, 0x67, 0xf1, 0x3f, 0x79, 0x40, 0xb7, 0x79, 0x06, 0xab, 0x52, - 0x34, 0x52, 0x40, 0x0b, 0x86, 0xfb, 0x13, 0xf7, 0x8c, 0x34, 0x10, 0x6c, 0xd5, 0x99, 0xdb, 0x76, - 0x59, 0xe7, 0xe4, 0x40, 0xa0, 0x91, 0xf0, 0xbf, 0x08, 0x04, 0xff, 0x98, 0x4d, 0x80, 0x20, 0xab, - 0xf1, 0x37, 0x0a, 0x04, 0xd7, 0xa0, 0x88, 0x95, 0x36, 0x5d, 0x27, 0x40, 0xbc, 0x55, 0x73, 0x38, - 0x52, 0x24, 0x04, 0x02, 0x29, 0xa6, 0x06, 0x20, 0x45, 0x62, 0x98, 0x40, 0x0a, 0x9c, 0x5a, 0xa1, - 0x4d, 0x98, 0x76, 0xbd, 0x20, 0x62, 0xc2, 0x3b, 0xc5, 0xcd, 0x2b, 0xfa, 0x17, 0xc5, 0x9d, 0xa6, - 0x8f, 0x1d, 0x4b, 0x92, 0x6a, 0x92, 0x7e, 0xe6, 0xb4, 0x49, 0x5f, 0x18, 0x2f, 0xe9, 0xf7, 0xe0, - 0x52, 0x2c, 0xcf, 0x66, 0xbe, 0x5d, 0x6f, 0xfa, 0x94, 0x08, 0x41, 0x7e, 0x24, 0x61, 0xa2, 0xb8, - 0x79, 0xa9, 0x4f, 0xd6, 0x8e, 0xea, 0x7d, 0xad, 0xe5, 0x98, 0x77, 0xcf, 0xdf, 0xe6, 0x9c, 0x7b, - 0x92, 0x11, 0xfd, 0x18, 0x96, 0xc5, 0x25, 0xfd, 0x22, 0xe7, 0x86, 0x89, 0x3c, 0x2f, 0x18, 0x7b, - 0xe4, 0xed, 0xc2, 0xb9, 0x06, 0xc1, 0x21, 0xdb, 0x27, 0x98, 0x25, 0xa2, 0x60, 0x98, 0xa8, 0xa5, - 0x84, 0x27, 0x96, 0x93, 0xc2, 0xd2, 0x62, 0x16, 0x4b, 0xdf, 0xc0, 0xd5, 0xec, 0x4b, 0xd8, 0xfe, - 0x81, 0xcd, 0x1a, 0x2e, 0xb5, 0x63, 0x86, 0xf9, 0xa1, 0x8e, 0x2d, 0x67, 0x5e, 0xe6, 0xf9, 0xc1, - 0x5e, 0xc3, 0xa5, 0x5b, 0x4a, 0x7e, 0x2d, 0x6d, 0x81, 0x43, 0x18, 0x76, 0x9b, 0x54, 0xe0, 0xc5, - 0xb0, 0x48, 0xe9, 0x1a, 0xb1, 0x23, 0xb9, 0xfa, 0x5b, 0x9b, 0xd2, 0xc9, 0x5a, 0x9b, 0x5b, 0xb0, - 0x98, 0xc8, 0x91, 0x15, 0x43, 0x40, 0xce, 0x9c, 0x55, 0x8a, 0xb7, 0x77, 0xc4, 0x2e, 0xfa, 0x08, - 0x66, 0x1a, 0x04, 0x3b, 0x24, 0x54, 0x88, 0x72, 0x59, 0x7b, 0xd3, 0x53, 0x41, 0x62, 0x29, 0xd2, - 0x77, 0x5b, 0xbf, 0x2b, 0x7f, 0x9d, 0x82, 0xe5, 0x2d, 0xc7, 0xd1, 0x35, 0xd9, 0x99, 0x82, 0x68, - 0xf4, 0x14, 0xc4, 0x77, 0x54, 0x64, 0xee, 0xc3, 0x5c, 0xb7, 0xb9, 0x98, 0x1c, 0xa5, 0xb9, 0x98, - 0x65, 0x71, 0x2f, 0x71, 0x0d, 0x8a, 0x49, 0x06, 0xaa, 0x9e, 0x72, 0xd2, 0x82, 0x78, 0xab, 0xe6, - 0xf4, 0xa6, 0xa8, 0x4a, 0x2c, 0x95, 0x04, 0xd3, 0x63, 0xa4, 0xa8, 0x68, 0x41, 0xe3, 0x54, 0xb8, - 0x0f, 0x33, 0xd4, 0x8f, 0xc2, 0xba, 0x2c, 0x39, 0xa5, 0x5e, 0x80, 0x4b, 0xf5, 0x5b, 0x98, 0x1e, - 0xbd, 0x14, 0x94, 0x96, 0xe2, 0xd0, 0x20, 0x47, 0x41, 0x87, 0x1c, 0x81, 0x26, 0x04, 0x66, 0x45, - 0x67, 0xf1, 0x38, 0x3f, 0x04, 0xf4, 0xaf, 0x5a, 0xed, 0x89, 0x08, 0xd9, 0x5c, 0xf4, 0xc1, 0xfa, - 0x23, 0xb8, 0xa0, 0x23, 0xd4, 0xc0, 0xfb, 0x85, 0x34, 0xbc, 0xcf, 0xa5, 0xa1, 0xfb, 0x18, 0x2e, - 0xf6, 0xe9, 0xa0, 0x10, 0x4c, 0x17, 0xd3, 0xc6, 0x99, 0xc5, 0xf4, 0xbf, 0xa6, 0x45, 0x4c, 0xeb, - 0xfa, 0x85, 0x6f, 0x22, 0xa6, 0xf9, 0x84, 0x22, 0x9e, 0xdb, 0xee, 0x5e, 0x2d, 0xd1, 0xb3, 0x24, - 0xf7, 0x77, 0x62, 0x05, 0x32, 0xd1, 0x3f, 0x75, 0xaa, 0xe8, 0x9f, 0x1e, 0x2f, 0xfa, 0x67, 0x4e, - 0x1f, 0xfd, 0x85, 0x33, 0x88, 0xfe, 0x59, 0x5d, 0xf4, 0x7b, 0x60, 0xe2, 0xd4, 0x53, 0xee, 0xb8, - 0x34, 0xe0, 0x51, 0xc1, 0xe7, 0x13, 0x85, 0x82, 0x9b, 0x03, 0xb2, 0x20, 0x87, 0xd3, 0xca, 0x95, - 0xa9, 0xcd, 0x36, 0x18, 0x21, 0xdb, 0x34, 0xf1, 0xf6, 0x35, 0x66, 0xdb, 0x57, 0x93, 0x60, 0xe6, - 0x19, 0x8b, 0x7e, 0x08, 0x8b, 0x5d, 0x50, 0x16, 0x53, 0x95, 0x4a, 0x37, 0x3d, 0xd6, 0xa9, 0xf9, - 0x41, 0x8c, 0xbe, 0x56, 0xb7, 0xb1, 0x12, 0xeb, 0xbe, 0x3e, 0x69, 0x62, 0xbc, 0x3e, 0x29, 0xd5, - 0x39, 0x4c, 0x8e, 0xdb, 0x39, 0x4c, 0x9d, 0x7d, 0xe7, 0x30, 0x7d, 0x36, 0x9d, 0xc3, 0xcc, 0x99, - 0x75, 0x0e, 0x05, 0x5d, 0xe7, 0xa0, 0x6a, 0xa9, 0x76, 0x1a, 0x78, 0xb7, 0xb5, 0xf4, 0x2b, 0x03, - 0x2e, 0x88, 0xa1, 0x2c, 0xb6, 0x22, 0xae, 0xa4, 0xdb, 0xbd, 0x93, 0xd7, 0xb7, 0xb4, 0xc6, 0xeb, - 0x78, 0x47, 0x9c, 0xb9, 0x4e, 0xd3, 0x0b, 0x8c, 0x36, 0x92, 0x55, 0xbe, 0x34, 0xe0, 0xbd, 0x1e, - 0x0d, 0x95, 0x57, 0x1f, 0xc2, 0xbc, 0xf8, 0xaa, 0x62, 0x87, 0x84, 0x46, 0xcd, 0xd8, 0xc6, 0xc1, - 0x71, 0x52, 0x14, 0x1c, 0x96, 0x60, 0x40, 0x35, 0x28, 0xc5, 0x02, 0x7e, 0x4a, 0xea, 0x8c, 0x38, - 0x03, 0xe7, 0x5f, 0x39, 0xf7, 0x2a, 0x4a, 0x6b, 0xe1, 0x6d, 0x7a, 0x59, 0xf9, 0xbb, 0x01, 0xab, - 0x52, 0x31, 0x47, 0xd0, 0x71, 0x7b, 0xb7, 0xfd, 0x56, 0xd0, 0x24, 0x9c, 0x58, 0xb9, 0xf2, 0x79, - 0xef, 0x7b, 0xdc, 0xd1, 0x5e, 0x34, 0x4c, 0xce, 0xd7, 0xf0, 0x36, 0x17, 0xa1, 0x20, 0x78, 0x55, - 0x8f, 0x36, 0x67, 0xcd, 0xf0, 0x65, 0xcd, 0xa9, 0xbc, 0x0f, 0xd7, 0x07, 0xa8, 0x27, 0x1f, 0xa6, - 0xf2, 0x37, 0x03, 0xae, 0x6c, 0x63, 0xaf, 0x4e, 0x9a, 0xcf, 0x23, 0x46, 0x19, 0xf6, 0x1c, 0xd7, - 0x3b, 0xe4, 0xd3, 0xf2, 0x48, 0x10, 0x9f, 0x99, 0xe3, 0x27, 0x7a, 0xe6, 0xf8, 0x27, 0x50, 0x4a, - 0x8c, 0xea, 0x7e, 0xeb, 0x2c, 0xe5, 0xa4, 0x75, 0x6c, 0x99, 0x4c, 0x6b, 0x96, 0x5a, 0x9d, 0x06, - 0xc7, 0x2b, 0xd7, 0x60, 0x25, 0xc7, 0x3c, 0xe5, 0x80, 0x9f, 0xc3, 0xc5, 0x1d, 0x42, 0xeb, 0xa1, - 0xbb, 0x4f, 0x12, 0x76, 0x65, 0xfa, 0x6e, 0x6f, 0x0c, 0x7c, 0xa8, 0xbd, 0x35, 0x87, 0x7d, 0xb4, - 0xa7, 0xaf, 0xfc, 0xc7, 0x00, 0xb3, 0x5f, 0x82, 0x4a, 0x9b, 0x4f, 0xa0, 0x20, 0xdd, 0x49, 0x4d, - 0x43, 0x40, 0xe6, 0xb5, 0xdc, 0xef, 0x31, 0x24, 0x14, 0x38, 0x1c, 0xd3, 0xa3, 0x67, 0xb0, 0xd4, - 0xf5, 0x3e, 0x65, 0x98, 0x45, 0x54, 0xa5, 0xcc, 0xfb, 0x03, 0x7d, 0xf7, 0x52, 0x90, 0x5a, 0x25, - 0x96, 0x59, 0xa3, 0xd7, 0x9a, 0xb2, 0x38, 0x39, 0xc0, 0x29, 0x23, 0x57, 0x44, 0x0a, 0x2b, 0xe2, - 0xa1, 0x7b, 0xe9, 0x69, 0xfc, 0x0a, 0xcb, 0x30, 0xa3, 0x6a, 0xb9, 0x8c, 0x3e, 0xb5, 0xca, 0x46, - 0xc5, 0xc4, 0x78, 0x51, 0xf1, 0xeb, 0x09, 0xb8, 0x9a, 0x77, 0xab, 0x72, 0xfd, 0x5b, 0x58, 0xe9, - 0x7e, 0x7e, 0x49, 0x1c, 0x99, 0xfa, 0xb5, 0x45, 0x3e, 0x48, 0x75, 0x34, 0xeb, 0x9f, 0x11, 0x86, - 0x1d, 0xcc, 0xb0, 0x55, 0x4e, 0xf7, 0x49, 0xd9, 0xab, 0xf9, 0x95, 0xc9, 0x17, 0x67, 0xed, 0x95, - 0x13, 0x27, 0xbb, 0xd2, 0x49, 0xcd, 0x0c, 0xd9, 0x2b, 0x2b, 0x77, 0xe0, 0xf2, 0x13, 0x92, 0xb8, - 0x81, 0x3e, 0xea, 0x48, 0x80, 0x1c, 0xe2, 0xfb, 0xca, 0x5f, 0xa6, 0xe0, 0x8a, 0x9e, 0x4f, 0x79, - 0xef, 0x97, 0x06, 0x2c, 0x6b, 0x6c, 0x69, 0xe1, 0x40, 0xf9, 0xed, 0x79, 0x3e, 0x98, 0x0e, 0x12, - 0x5c, 0xdd, 0xe9, 0xb1, 0xe5, 0x19, 0x0e, 0x64, 0x17, 0x78, 0xde, 0xe9, 0x3f, 0x11, 0x6a, 0x68, - 0x5e, 0x91, 0xab, 0x31, 0x71, 0x2a, 0x35, 0xb6, 0x7a, 0x5e, 0xb1, 0xab, 0x06, 0xee, 0x3f, 0x29, - 0xff, 0x8c, 0xa7, 0xb8, 0x5e, 0x6f, 0x4d, 0x53, 0xfa, 0x34, 0xfb, 0x85, 0x77, 0x40, 0x37, 0x9e, - 0x57, 0x37, 0x52, 0x8d, 0x2c, 0xbf, 0x3b, 0x4f, 0xd9, 0x77, 0x7d, 0x77, 0xe5, 0x4f, 0x13, 0xf0, - 0xc1, 0x67, 0x81, 0x83, 0x19, 0xc9, 0x2b, 0x07, 0xa3, 0x80, 0xcc, 0x29, 0x12, 0xfd, 0xec, 0x30, - 0x48, 0x57, 0xff, 0xa6, 0xce, 0xa2, 0xfe, 0xdd, 0x82, 0x1b, 0x43, 0x5c, 0xa4, 0x80, 0xea, 0xcf, - 0x13, 0x70, 0xc3, 0x22, 0x07, 0x21, 0xa1, 0x8d, 0xff, 0x7b, 0x33, 0xcf, 0x9b, 0x6b, 0x70, 0x73, - 0x98, 0x8f, 0xa4, 0x3b, 0x37, 0xff, 0x3d, 0x0f, 0xc5, 0x67, 0x2a, 0x9e, 0xb7, 0x5e, 0xd4, 0xd0, - 0x2f, 0x0c, 0x38, 0xaf, 0xf9, 0xf5, 0x08, 0x7d, 0x3c, 0xe6, 0x8f, 0x4d, 0xe2, 0x09, 0xca, 0x77, - 0x4e, 0xf4, 0x13, 0x55, 0x5a, 0x89, 0x74, 0xd2, 0x8e, 0xa0, 0x84, 0x66, 0x5a, 0x1e, 0x41, 0x09, - 0xed, 0x04, 0xd4, 0x86, 0xc5, 0x9e, 0x0f, 0x4d, 0xe8, 0xf6, 0xb8, 0xdf, 0xc5, 0xca, 0x1b, 0x63, - 0x70, 0x64, 0xee, 0xcd, 0xd8, 0x7d, 0x7b, 0xdc, 0x2f, 0x04, 0x43, 0xee, 0xd5, 0xda, 0x1b, 0xc0, - 0x42, 0x66, 0x68, 0x41, 0xd5, 0x7c, 0x19, 0xba, 0xf9, 0xab, 0xbc, 0x3e, 0x32, 0xbd, 0xba, 0xf1, - 0xf7, 0x06, 0x5c, 0xca, 0x6d, 0xcd, 0xd1, 0xfd, 0x7c, 0x71, 0xc3, 0xc6, 0x8d, 0xf2, 0x83, 0x13, - 0xf1, 0x2a, 0xb5, 0x7e, 0x63, 0xc0, 0x7b, 0xda, 0x66, 0x19, 0xdd, 0xcd, 0x17, 0x3b, 0x68, 0x78, - 0x28, 0x7f, 0x77, 0x6c, 0x3e, 0xa5, 0x4a, 0x07, 0x96, 0x7a, 0x01, 0x06, 0x6d, 0x8c, 0x03, 0x46, - 0xf2, 0xfe, 0x13, 0xe0, 0x17, 0xfa, 0xad, 0x01, 0xcb, 0xfa, 0xde, 0x10, 0x0d, 0x30, 0x67, 0x60, - 0x0f, 0x5b, 0xbe, 0x37, 0x3e, 0xa3, 0xd2, 0xe6, 0x57, 0x06, 0x5c, 0xd0, 0x75, 0x22, 0xe8, 0xce, - 0xb8, 0x9d, 0x8b, 0xd4, 0xe4, 0xee, 0xc9, 0x1a, 0x1e, 0xf4, 0x47, 0x03, 0x56, 0x06, 0xe2, 0x14, - 0xfa, 0x7e, 0xbe, 0xe4, 0x51, 0x7a, 0x80, 0xf2, 0xc3, 0x13, 0xf3, 0x2b, 0x15, 0xbf, 0x34, 0xe0, - 0xea, 0xe0, 0xe2, 0x8f, 0x1e, 0x0e, 0x4a, 0x8f, 0x11, 0xa0, 0xb5, 0xfc, 0x83, 0x93, 0x0b, 0x90, - 0x5a, 0x3e, 0x7a, 0xf0, 0x93, 0x4f, 0x0e, 0x5d, 0xd6, 0x88, 0xf6, 0xab, 0x75, 0xbf, 0xb5, 0x9e, - 0xf9, 0xb7, 0xb2, 0xea, 0x21, 0xf1, 0xe4, 0xff, 0xe1, 0xa5, 0xff, 0x15, 0xf0, 0x41, 0xfc, 0x77, - 0x7b, 0x63, 0x7f, 0x46, 0x9c, 0x7e, 0xf4, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xef, 0x5a, - 0x97, 0x38, 0x28, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcb, 0x73, 0x1b, 0x49, + 0x19, 0xaf, 0xf1, 0x5b, 0x9f, 0x64, 0xd9, 0x6e, 0x7b, 0x9d, 0x89, 0x12, 0x27, 0x8e, 0x76, 0x93, + 0x18, 0x58, 0xe4, 0xd8, 0xbb, 0x09, 0xd9, 0xa4, 0x20, 0xf8, 0x91, 0x87, 0xa8, 0x0d, 0xc9, 0x4e, + 0xbc, 0x49, 0x15, 0x6c, 0x65, 0x68, 0x69, 0xda, 0xd6, 0x60, 0x69, 0x66, 0x32, 0xdd, 0x92, 0x57, + 0x1c, 0x38, 0x50, 0x40, 0x51, 0xc5, 0x15, 0xee, 0xc0, 0xf2, 0xb7, 0xf0, 0x37, 0x50, 0xb5, 0xc5, + 0x91, 0x33, 0x05, 0x55, 0x1c, 0xa9, 0xa2, 0xfa, 0x31, 0xd2, 0x8c, 0xd4, 0xa3, 0x87, 0xed, 0xec, + 0x72, 0xe0, 0xe6, 0xe9, 0xfe, 0xde, 0xfd, 0x7d, 0xdf, 0xef, 0xeb, 0x96, 0xe1, 0x46, 0xb3, 0x42, + 0xc2, 0xcd, 0x2a, 0x76, 0x88, 0x57, 0x25, 0x9b, 0x0d, 0xcc, 0xaa, 0x35, 0xd7, 0x3b, 0xda, 0x6c, + 0x6d, 0x6d, 0x52, 0x12, 0xb6, 0xdc, 0x2a, 0x29, 0x05, 0xa1, 0xcf, 0x7c, 0x64, 0x72, 0xba, 0x92, + 0xa2, 0x2b, 0x45, 0x74, 0xa5, 0xd6, 0x56, 0xe1, 0xca, 0x91, 0xef, 0x1f, 0xd5, 0xc9, 0xa6, 0xa0, + 0xab, 0x34, 0x0f, 0x37, 0x9d, 0x66, 0x88, 0x99, 0xeb, 0x7b, 0x92, 0xb3, 0x70, 0xb5, 0x77, 0x9f, + 0xb9, 0x0d, 0x42, 0x19, 0x6e, 0x04, 0x8a, 0xa0, 0x4f, 0xc0, 0x49, 0x88, 0x83, 0x80, 0x84, 0x54, + 0xed, 0xaf, 0x27, 0x4c, 0xc4, 0x81, 0xcb, 0xad, 0xab, 0xfa, 0x8d, 0x46, 0x57, 0x85, 0x8e, 0xe2, + 0x4d, 0x93, 0x84, 0x6d, 0x45, 0x50, 0xd4, 0x11, 0x30, 0x4c, 0x8f, 0xeb, 0x2e, 0x65, 0x8a, 0x66, + 0x43, 0x47, 0xa3, 0x82, 0x60, 0x9f, 0xf8, 0xe1, 0x31, 0x09, 0x15, 0xe5, 0x37, 0x87, 0x51, 0x1e, + 0xd6, 0xfd, 0x13, 0x45, 0x7b, 0x4d, 0x47, 0x5b, 0x73, 0x29, 0xf3, 0x3b, 0xc6, 0xbd, 0x97, 0x20, + 0xa1, 0x35, 0x1c, 0x12, 0xa7, 0x9f, 0xea, 0x7a, 0x0a, 0x55, 0xd2, 0x8b, 0xe2, 0xef, 0x0d, 0xb8, + 0x70, 0x80, 0xe9, 0xf1, 0xc7, 0x2e, 0x65, 0xcf, 0x71, 0xc8, 0x5c, 0x7e, 0x12, 0x7b, 0xbe, 0x77, + 0xe8, 0x1e, 0x21, 0x13, 0x66, 0x5b, 0x24, 0xa4, 0xae, 0xef, 0x99, 0xc6, 0xba, 0xb1, 0x31, 0x69, + 0x45, 0x9f, 0xa8, 0x04, 0xcb, 0x5e, 0xb3, 0x61, 0x87, 0x04, 0x3b, 0x76, 0x10, 0x71, 0x51, 0x73, + 0x62, 0xdd, 0xd8, 0x98, 0xb6, 0x96, 0xbc, 0x66, 0xc3, 0x22, 0xd8, 0xe9, 0x88, 0xa3, 0xe8, 0x16, + 0xac, 0x70, 0xfa, 0x93, 0xd0, 0x65, 0x24, 0xce, 0x30, 0x29, 0x18, 0x90, 0xd7, 0x6c, 0xbc, 0xe2, + 0x5b, 0x5d, 0x8e, 0xe2, 0x4f, 0x60, 0xe9, 0x63, 0x1f, 0x3b, 0xbb, 0xb8, 0x8e, 0xbd, 0x2a, 0x09, + 0x9f, 0xb8, 0x1e, 0xa3, 0xe8, 0x5d, 0x98, 0xaf, 0xe0, 0xea, 0x71, 0xdd, 0x3f, 0xb2, 0xab, 0x7e, + 0xd3, 0x63, 0xca, 0xac, 0x9c, 0x5a, 0xdc, 0xe3, 0x6b, 0xe8, 0x06, 0x2c, 0x84, 0x98, 0xab, 0x21, + 0xa1, 0x4d, 0x49, 0xd5, 0xf7, 0x1c, 0x61, 0x97, 0x61, 0xcd, 0xf3, 0xe5, 0xe7, 0x24, 0x7c, 0x21, + 0x16, 0x8b, 0xff, 0x34, 0xa0, 0xf0, 0xdc, 0xaf, 0xd7, 0x1f, 0xf9, 0xe1, 0x3e, 0xa9, 0xba, 0xdc, + 0x2f, 0x1e, 0x08, 0x8b, 0xbc, 0x69, 0x12, 0xca, 0x50, 0x19, 0x66, 0x43, 0xf9, 0xa7, 0xd0, 0x92, + 0xdd, 0xde, 0x2c, 0x25, 0x52, 0x1a, 0x07, 0x6e, 0xa9, 0xb5, 0x55, 0x4a, 0x97, 0x60, 0x45, 0xfc, + 0xe8, 0x12, 0x64, 0x1c, 0xbf, 0x81, 0x5d, 0xcf, 0x76, 0xa5, 0x2d, 0x19, 0x6b, 0x4e, 0x2e, 0x94, + 0x1d, 0xbe, 0x19, 0xf8, 0xf5, 0x3a, 0x09, 0xf9, 0xe6, 0xa4, 0xdc, 0x94, 0x0b, 0x65, 0x07, 0x5d, + 0x87, 0xfc, 0xa1, 0x1f, 0x9e, 0xe0, 0xd0, 0x21, 0x8e, 0x7d, 0x18, 0xfa, 0x0d, 0x73, 0x4a, 0x50, + 0xcc, 0x77, 0x56, 0x1f, 0x85, 0x7e, 0x03, 0xdd, 0x84, 0x05, 0x97, 0xfa, 0x75, 0x51, 0x45, 0xf6, + 0x51, 0xe8, 0x37, 0x03, 0x73, 0x5a, 0xd0, 0xe5, 0x3b, 0xcb, 0x8f, 0xf9, 0x6a, 0xf1, 0x1f, 0x00, + 0x97, 0xb4, 0x16, 0xd3, 0xc0, 0xf7, 0x28, 0x41, 0x6b, 0x00, 0x3c, 0x3f, 0x6c, 0xe6, 0x1f, 0x13, + 0x79, 0xe8, 0x39, 0x2b, 0xc3, 0x57, 0x0e, 0xf8, 0x02, 0xfa, 0x14, 0x50, 0x94, 0xae, 0x36, 0xf9, + 0x9c, 0x54, 0x9b, 0x5c, 0xb2, 0xf0, 0x28, 0xbb, 0x7d, 0x43, 0x1b, 0x9e, 0x57, 0x8a, 0xfc, 0x61, + 0x44, 0x6d, 0x2d, 0x9d, 0xf4, 0x2e, 0xa1, 0x47, 0x30, 0xdf, 0x11, 0xcb, 0xda, 0x01, 0x11, 0x61, + 0xc8, 0x6e, 0x5f, 0x1b, 0x28, 0xf1, 0xa0, 0x1d, 0x10, 0x2b, 0x77, 0x12, 0xfb, 0x42, 0x2f, 0xe1, + 0x62, 0x10, 0x92, 0x96, 0xeb, 0x37, 0xa9, 0x4d, 0x19, 0x0e, 0x19, 0x71, 0x6c, 0xd2, 0x22, 0x1e, + 0xe3, 0xa1, 0x9d, 0x12, 0x32, 0x2f, 0x95, 0x64, 0xf3, 0x28, 0x45, 0xcd, 0xa3, 0x54, 0xf6, 0xd8, + 0x9d, 0x0f, 0x5f, 0xe2, 0x7a, 0x93, 0x58, 0xab, 0x11, 0xf7, 0x0b, 0xc9, 0xfc, 0x90, 0xf3, 0x96, + 0x1d, 0xb4, 0x01, 0x8b, 0x7d, 0xe2, 0xa6, 0x45, 0xe6, 0xe5, 0x69, 0x92, 0xd2, 0x84, 0x59, 0xcc, + 0x18, 0x69, 0x04, 0xcc, 0x9c, 0x11, 0xa9, 0x1d, 0x7d, 0xa2, 0x22, 0xcc, 0x7b, 0xe4, 0x73, 0xd6, + 0x15, 0x30, 0x2b, 0x04, 0x64, 0xf9, 0x62, 0xc4, 0xfd, 0x3e, 0xa0, 0x44, 0x7a, 0xdb, 0x35, 0xd7, + 0x63, 0xe6, 0x9c, 0x20, 0x5c, 0x8c, 0xe7, 0x38, 0xaf, 0x06, 0x74, 0x17, 0x4c, 0xca, 0xdc, 0xea, + 0x71, 0xbb, 0x7b, 0x14, 0x36, 0xf1, 0x70, 0xa5, 0x4e, 0x1c, 0x33, 0xb3, 0x6e, 0x6c, 0xcc, 0x59, + 0xab, 0x72, 0xbf, 0x13, 0xe8, 0x87, 0x72, 0x17, 0xdd, 0x85, 0x69, 0xd1, 0xec, 0x4c, 0x10, 0x31, + 0x29, 0x0e, 0x8c, 0xf3, 0x27, 0x9c, 0xd2, 0x92, 0x0c, 0xc8, 0x82, 0x79, 0x47, 0xe5, 0x8d, 0xed, + 0x7a, 0x87, 0xbe, 0x99, 0x15, 0x12, 0xbe, 0x9d, 0x94, 0x20, 0x9b, 0x0d, 0x17, 0x72, 0x10, 0x62, + 0x8f, 0xba, 0xc4, 0x63, 0x51, 0xb6, 0x95, 0xbd, 0x43, 0xdf, 0xca, 0x39, 0xb1, 0x2f, 0xf4, 0x1a, + 0x2e, 0xf7, 0x27, 0x95, 0x2d, 0xd2, 0x90, 0xf7, 0x29, 0x33, 0x27, 0x54, 0xac, 0x69, 0x8d, 0x8c, + 0x3a, 0x97, 0x75, 0xb1, 0x2f, 0xab, 0xa2, 0x2d, 0xde, 0xab, 0x64, 0xd0, 0x79, 0x77, 0x24, 0x76, + 0xd4, 0xd1, 0xe6, 0x65, 0xaf, 0x12, 0x5b, 0x2f, 0xf8, 0xce, 0x4b, 0xd5, 0xdb, 0xae, 0x41, 0xae, + 0x12, 0x62, 0xaf, 0x5a, 0x53, 0x55, 0x90, 0x17, 0x55, 0x90, 0x95, 0x6b, 0xb2, 0x0e, 0x76, 0x20, + 0x4f, 0xab, 0x35, 0xe2, 0x34, 0xeb, 0xc4, 0xb1, 0x39, 0x3c, 0x99, 0x0b, 0xc2, 0xc8, 0x42, 0x5f, + 0x76, 0x1d, 0x44, 0xd8, 0x65, 0xcd, 0x77, 0x38, 0xf8, 0x1a, 0xfa, 0x2e, 0xe4, 0xa2, 0x9c, 0x12, + 0x02, 0x16, 0x87, 0x0a, 0xc8, 0x2a, 0x7a, 0xc1, 0xfe, 0x19, 0xcc, 0xf2, 0x13, 0x71, 0x09, 0x35, + 0x97, 0xd6, 0x27, 0x37, 0xb2, 0xdb, 0xbb, 0xa5, 0x34, 0xc0, 0x2d, 0x0d, 0x28, 0xf8, 0xd2, 0x27, + 0x52, 0xc8, 0x43, 0x8f, 0x85, 0x6d, 0x2b, 0x12, 0xc9, 0x43, 0xc6, 0x7c, 0x86, 0xeb, 0xb6, 0x82, + 0x14, 0xbb, 0xd2, 0x66, 0x84, 0x9a, 0x48, 0x64, 0xe2, 0x92, 0xd8, 0x7a, 0x22, 0x77, 0x76, 0xf9, + 0x06, 0xfa, 0x0c, 0x16, 0x3b, 0x4d, 0xdd, 0xae, 0x0a, 0xf0, 0x30, 0x97, 0x85, 0x43, 0x5b, 0xe9, + 0x66, 0xa5, 0xa0, 0x8e, 0xb5, 0x10, 0xf4, 0xc0, 0xd0, 0x8f, 0x61, 0xb9, 0xee, 0x63, 0xc7, 0xae, + 0x28, 0x2c, 0x10, 0x65, 0x41, 0xcd, 0x15, 0xa1, 0xe0, 0x5b, 0xe9, 0x0a, 0xfa, 0xf0, 0xc3, 0x5a, + 0xaa, 0xf7, 0x2e, 0x15, 0x5e, 0x43, 0x2e, 0x1e, 0x03, 0xb4, 0x08, 0x93, 0xc7, 0xa4, 0x2d, 0x5a, + 0x5f, 0xc6, 0xe2, 0x7f, 0xf2, 0x6a, 0x69, 0xf1, 0xf6, 0xa0, 0xfa, 0xdc, 0x48, 0xd5, 0x22, 0x18, + 0xee, 0x4d, 0xdc, 0x35, 0xe2, 0x28, 0xb3, 0x53, 0x65, 0x6e, 0xcb, 0x65, 0xed, 0xd3, 0xa3, 0x8c, + 0x46, 0xc2, 0xff, 0x22, 0xca, 0xfc, 0x25, 0xd3, 0x41, 0x99, 0xa4, 0xc5, 0x5f, 0x2b, 0xca, 0x5c, + 0x85, 0x2c, 0x56, 0xd6, 0x74, 0x83, 0x00, 0xd1, 0x52, 0xd9, 0xe1, 0x30, 0xd4, 0x21, 0x10, 0x30, + 0x34, 0x35, 0x00, 0x86, 0x3a, 0x8e, 0x09, 0x18, 0xc2, 0xb1, 0x2f, 0xb4, 0x0d, 0xd3, 0xae, 0x17, + 0x34, 0x99, 0x88, 0x4e, 0x76, 0xfb, 0xb2, 0xfe, 0x44, 0x71, 0x9b, 0x27, 0xa3, 0x25, 0x49, 0x35, + 0x1d, 0x65, 0xe6, 0xac, 0x1d, 0x65, 0x76, 0xbc, 0x8e, 0x72, 0x00, 0x17, 0x23, 0x79, 0x36, 0xf3, + 0xed, 0x6a, 0xdd, 0xa7, 0x44, 0x08, 0xf2, 0x9b, 0x12, 0x83, 0xb2, 0xdb, 0x17, 0xfb, 0x64, 0xed, + 0xab, 0xd1, 0xdd, 0x5a, 0x8d, 0x78, 0x0f, 0xfc, 0x3d, 0xce, 0x79, 0x20, 0x19, 0xd1, 0x0f, 0x61, + 0x55, 0x28, 0xe9, 0x17, 0x99, 0x19, 0x26, 0x72, 0x59, 0x30, 0xf6, 0xc8, 0x7b, 0x04, 0x4b, 0x35, + 0x82, 0x43, 0x56, 0x21, 0x98, 0x75, 0x44, 0xc1, 0x30, 0x51, 0x8b, 0x1d, 0x9e, 0x48, 0x4e, 0x0c, + 0xa8, 0xb3, 0x49, 0xa0, 0x7e, 0x0d, 0x57, 0x92, 0x27, 0x61, 0xfb, 0x87, 0x36, 0xab, 0xb9, 0xd4, + 0x8e, 0x18, 0x72, 0x43, 0x03, 0x5b, 0x48, 0x9c, 0xcc, 0xb3, 0xc3, 0x83, 0x9a, 0x4b, 0x77, 0x94, + 0xfc, 0x72, 0xdc, 0x03, 0x87, 0x30, 0xec, 0xd6, 0xa9, 0x00, 0xa3, 0x61, 0x99, 0xd2, 0x75, 0x62, + 0x5f, 0x72, 0xf5, 0xcf, 0x4d, 0xf9, 0xd3, 0xcd, 0x4d, 0x37, 0x61, 0xa1, 0x23, 0x47, 0x76, 0x0c, + 0x81, 0x67, 0x19, 0x2b, 0x1f, 0x2d, 0xef, 0x8b, 0x55, 0xf4, 0x01, 0xcc, 0xd4, 0x08, 0x76, 0x48, + 0xa8, 0xe0, 0xea, 0x92, 0x56, 0xd3, 0x13, 0x41, 0x62, 0x29, 0xd2, 0xb4, 0xf6, 0xbd, 0x74, 0x1e, + 0xed, 0xfb, 0xed, 0x22, 0x4f, 0xf1, 0xaf, 0x53, 0xb0, 0xba, 0xe3, 0x38, 0xba, 0xeb, 0x41, 0xa2, + 0xdb, 0x1a, 0x3d, 0xdd, 0xf6, 0x2d, 0x75, 0xb0, 0x7b, 0x90, 0xe9, 0x8e, 0x45, 0x93, 0xa3, 0x8c, + 0x45, 0x73, 0x2c, 0x9a, 0x82, 0xae, 0x42, 0xb6, 0x53, 0xde, 0x6a, 0x1a, 0x9e, 0xb4, 0x20, 0x5a, + 0x2a, 0x3b, 0xbd, 0xf5, 0xaf, 0xaa, 0x56, 0x55, 0xd8, 0xf4, 0x18, 0xf5, 0x2f, 0x86, 0xe7, 0xa8, + 0xce, 0xee, 0xc1, 0x0c, 0xf5, 0x9b, 0x61, 0x55, 0xf6, 0xb3, 0x7c, 0x2f, 0x7a, 0xc6, 0x26, 0x45, + 0x4c, 0x8f, 0x5f, 0x08, 0x4a, 0x4b, 0x71, 0x68, 0x60, 0x69, 0x56, 0x07, 0x4b, 0x81, 0x26, 0x05, + 0xe6, 0xc4, 0x4c, 0xf4, 0x30, 0x3d, 0x05, 0xf4, 0xa7, 0x5a, 0xea, 0xc9, 0x08, 0x39, 0x16, 0xf5, + 0xa6, 0x45, 0x61, 0x17, 0x56, 0x74, 0x84, 0x9a, 0xd9, 0x61, 0x25, 0x3e, 0x3b, 0x64, 0xe2, 0x73, + 0xc1, 0x09, 0x5c, 0xe8, 0xb3, 0x41, 0xc1, 0xa3, 0x2e, 0xa7, 0x8d, 0x73, 0xcb, 0xe9, 0x7f, 0x4d, + 0x8b, 0x9c, 0xd6, 0x0d, 0x23, 0x5f, 0x47, 0x4e, 0xf3, 0xbb, 0x95, 0x38, 0x6e, 0xbb, 0xab, 0x5a, + 0x42, 0x73, 0x5e, 0xae, 0xef, 0x47, 0x06, 0x24, 0xb2, 0x7f, 0xea, 0x4c, 0xd9, 0x3f, 0x3d, 0x5e, + 0xf6, 0xcf, 0x9c, 0x3d, 0xfb, 0x67, 0xcf, 0x21, 0xfb, 0xe7, 0x74, 0xd9, 0xef, 0x81, 0x89, 0x63, + 0x47, 0xb9, 0xef, 0xd2, 0x80, 0x67, 0x05, 0xbf, 0x59, 0x29, 0x88, 0xdd, 0x1e, 0x50, 0x05, 0x29, + 0x9c, 0x56, 0xaa, 0x4c, 0x6d, 0xb5, 0xc1, 0x08, 0xd5, 0xa6, 0xc9, 0xb7, 0xaf, 0xb0, 0xda, 0xbe, + 0x9c, 0x04, 0x33, 0xcd, 0x59, 0xf4, 0x03, 0x58, 0xe8, 0x22, 0xbe, 0xb8, 0x0f, 0xaa, 0x72, 0xd3, + 0x03, 0xa9, 0xba, 0xf9, 0x88, 0x4b, 0xbb, 0xd5, 0x9d, 0xda, 0xc4, 0x77, 0xdf, 0x10, 0x36, 0x31, + 0xde, 0x10, 0x16, 0x1b, 0x4b, 0x26, 0xc7, 0x1d, 0x4b, 0xa6, 0xce, 0x7f, 0x2c, 0x99, 0x3e, 0x9f, + 0xb1, 0x64, 0xe6, 0xdc, 0xc6, 0x92, 0x59, 0xdd, 0x58, 0xa2, 0x7a, 0xa9, 0xf6, 0xaa, 0xf1, 0x76, + 0x7b, 0xe9, 0x97, 0x06, 0xac, 0x88, 0x1b, 0x5f, 0xe4, 0x45, 0xd4, 0x49, 0xf7, 0x7a, 0xaf, 0x75, + 0xdf, 0xd0, 0x3a, 0xaf, 0xe3, 0x1d, 0xf1, 0x42, 0x77, 0x96, 0x59, 0x60, 0xb4, 0xfb, 0x5e, 0xf1, + 0x0b, 0x03, 0xde, 0xe9, 0xb1, 0x50, 0x45, 0xf5, 0x01, 0xe4, 0xc4, 0x7b, 0x90, 0x1d, 0x12, 0xda, + 0xac, 0x47, 0x3e, 0x0e, 0xce, 0x93, 0xac, 0xe0, 0xb0, 0x04, 0x03, 0x2a, 0x43, 0x3e, 0x12, 0xf0, + 0x53, 0x52, 0x65, 0xc4, 0x19, 0x78, 0xb9, 0x96, 0x97, 0x6a, 0x45, 0x69, 0xcd, 0xbf, 0x89, 0x7f, + 0x16, 0xff, 0x6e, 0xc0, 0xba, 0x34, 0xcc, 0x11, 0x74, 0xdc, 0xdf, 0x3d, 0xbf, 0x11, 0xd4, 0x09, + 0x27, 0x56, 0xa1, 0x7c, 0xd6, 0x7b, 0x1e, 0xb7, 0xb5, 0x8a, 0x86, 0xc9, 0xf9, 0x0a, 0xce, 0xe6, + 0x02, 0xcc, 0x0a, 0x5e, 0x35, 0xa3, 0x65, 0xac, 0x19, 0xfe, 0x59, 0x76, 0x8a, 0xef, 0xc2, 0xb5, + 0x01, 0xe6, 0xc9, 0x83, 0x29, 0xfe, 0xcd, 0x80, 0xcb, 0x7b, 0x7c, 0x3c, 0xae, 0x3f, 0x6b, 0x32, + 0xca, 0xb0, 0xe7, 0xb8, 0xde, 0x11, 0xbf, 0x8a, 0x8f, 0x04, 0xf1, 0x89, 0x47, 0x82, 0x89, 0x9e, + 0x47, 0x82, 0xc7, 0x90, 0xef, 0x38, 0xd5, 0x7d, 0xa5, 0xcd, 0xa7, 0x94, 0x75, 0xe4, 0x99, 0x2c, + 0x6b, 0x16, 0xfb, 0x3a, 0x0b, 0x8e, 0x17, 0xaf, 0xc2, 0x5a, 0x8a, 0x7b, 0x2a, 0x00, 0x3f, 0x87, + 0x0b, 0xfb, 0x84, 0x56, 0x43, 0xb7, 0x42, 0x3a, 0xec, 0xca, 0xf5, 0x47, 0xbd, 0x39, 0xf0, 0xbe, + 0x56, 0x6b, 0x0a, 0xfb, 0x68, 0x47, 0x5f, 0xfc, 0x8f, 0x01, 0x66, 0xbf, 0x04, 0x55, 0x36, 0x1f, + 0xc1, 0xac, 0x0c, 0x27, 0x35, 0x0d, 0x01, 0x99, 0x57, 0x53, 0x1f, 0x7b, 0x48, 0x28, 0x70, 0x38, + 0xa2, 0x47, 0x4f, 0x61, 0xb1, 0x1b, 0x7d, 0xca, 0x30, 0x6b, 0x52, 0x55, 0x32, 0xef, 0x0e, 0x8c, + 0xdd, 0x0b, 0x41, 0x6a, 0xe5, 0x59, 0xe2, 0x1b, 0xbd, 0xd2, 0xb4, 0xc5, 0xc9, 0x01, 0x41, 0x19, + 0xb9, 0x23, 0x52, 0x58, 0x13, 0x07, 0xdd, 0x4b, 0x4f, 0xa3, 0x53, 0x58, 0x85, 0x19, 0xd5, 0xcb, + 0x65, 0xf6, 0xa9, 0xaf, 0x64, 0x56, 0x4c, 0x8c, 0x97, 0x15, 0xbf, 0x9e, 0x80, 0x2b, 0x69, 0x5a, + 0x55, 0xe8, 0xdf, 0xc0, 0x5a, 0xf7, 0x6d, 0xa7, 0x13, 0xc8, 0xd8, 0x2f, 0x51, 0xf2, 0x40, 0x4a, + 0xa3, 0x79, 0xff, 0x94, 0x30, 0xec, 0x60, 0x86, 0xad, 0x42, 0x7c, 0x4e, 0x4a, 0xaa, 0xe6, 0x2a, + 0x3b, 0x6f, 0xe5, 0x5a, 0x95, 0x13, 0xa7, 0x53, 0xe9, 0xc4, 0xee, 0x0c, 0x49, 0x95, 0xc5, 0xdb, + 0x70, 0xe9, 0x31, 0xe9, 0x84, 0x81, 0xee, 0xb6, 0x25, 0x40, 0x0e, 0x89, 0x7d, 0xf1, 0xcf, 0x53, + 0x70, 0x59, 0xcf, 0xa7, 0xa2, 0xf7, 0x4b, 0x03, 0x56, 0x35, 0xbe, 0x34, 0x70, 0xa0, 0xe2, 0xf6, + 0x2c, 0x1d, 0x4c, 0x07, 0x09, 0x2e, 0xed, 0xf7, 0xf8, 0xf2, 0x14, 0x07, 0x72, 0x0a, 0x5c, 0x76, + 0xfa, 0x77, 0x84, 0x19, 0x9a, 0x53, 0xe4, 0x66, 0x4c, 0x9c, 0xc9, 0x8c, 0x9d, 0x9e, 0x53, 0xec, + 0x9a, 0x81, 0xfb, 0x77, 0x0a, 0x3f, 0xe3, 0x25, 0xae, 0xb7, 0x5b, 0x33, 0x94, 0x3e, 0x49, 0x3e, + 0x1f, 0x0f, 0x98, 0xc6, 0xd3, 0xfa, 0x46, 0x6c, 0x90, 0xe5, 0xba, 0xd3, 0x8c, 0x7d, 0xdb, 0xba, + 0x8b, 0x7f, 0x9c, 0x80, 0xf7, 0x3e, 0x0d, 0x1c, 0xcc, 0x48, 0x5a, 0x3b, 0x18, 0x05, 0x64, 0xce, + 0x50, 0xe8, 0xe7, 0x87, 0x41, 0xba, 0xfe, 0x37, 0x75, 0x1e, 0xfd, 0xef, 0x26, 0x5c, 0x1f, 0x12, + 0x22, 0x05, 0x54, 0x7f, 0x9a, 0x80, 0xeb, 0x16, 0x39, 0x0c, 0x09, 0xad, 0xfd, 0x3f, 0x9a, 0x69, + 0xd1, 0xdc, 0x80, 0x1b, 0xc3, 0x62, 0x24, 0xc3, 0xb9, 0xfd, 0xef, 0x1c, 0x64, 0x9f, 0xaa, 0x7c, + 0xde, 0x79, 0x5e, 0x46, 0xbf, 0x30, 0x60, 0x59, 0xf3, 0xbb, 0x17, 0xfa, 0x70, 0xcc, 0x9f, 0xc9, + 0xc4, 0x11, 0x14, 0x6e, 0x9f, 0xea, 0xc7, 0xb5, 0xb8, 0x11, 0xf1, 0xa2, 0x1d, 0xc1, 0x08, 0xcd, + 0x6d, 0x79, 0x04, 0x23, 0xb4, 0x37, 0xa0, 0x16, 0x2c, 0xf4, 0x3c, 0x34, 0xa1, 0x5b, 0xe3, 0xbe, + 0x8b, 0x15, 0xb6, 0xc6, 0xe0, 0x48, 0xe8, 0x4d, 0xf8, 0x7d, 0x6b, 0xdc, 0x17, 0x82, 0x21, 0x7a, + 0xb5, 0xfe, 0x06, 0x30, 0x9f, 0xb8, 0xb4, 0xa0, 0x52, 0xba, 0x0c, 0xdd, 0xfd, 0xab, 0xb0, 0x39, + 0x32, 0xbd, 0xd2, 0xf8, 0x3b, 0x03, 0x2e, 0xa6, 0x8e, 0xe6, 0xe8, 0x5e, 0xba, 0xb8, 0x61, 0xd7, + 0x8d, 0xc2, 0xfd, 0x53, 0xf1, 0x2a, 0xb3, 0x7e, 0x63, 0xc0, 0x3b, 0xda, 0x61, 0x19, 0xdd, 0x49, + 0x17, 0x3b, 0xe8, 0xf2, 0x50, 0xf8, 0xce, 0xd8, 0x7c, 0xca, 0x94, 0x36, 0x2c, 0xf6, 0x02, 0x0c, + 0xda, 0x1a, 0x07, 0x8c, 0xa4, 0xfe, 0x53, 0xe0, 0x17, 0xfa, 0xad, 0x01, 0xab, 0xfa, 0xd9, 0x10, + 0x0d, 0x70, 0x67, 0xe0, 0x0c, 0x5b, 0xb8, 0x3b, 0x3e, 0xa3, 0xb2, 0xe6, 0x57, 0x06, 0xac, 0xe8, + 0x26, 0x11, 0x74, 0x7b, 0xdc, 0xc9, 0x45, 0x5a, 0x72, 0xe7, 0x74, 0x03, 0x0f, 0xfa, 0x83, 0x01, + 0x6b, 0x03, 0x71, 0x0a, 0x7d, 0x2f, 0x5d, 0xf2, 0x28, 0x33, 0x40, 0xe1, 0xc1, 0xa9, 0xf9, 0x95, + 0x89, 0x5f, 0x18, 0x70, 0x65, 0x70, 0xf3, 0x47, 0x0f, 0x06, 0x95, 0xc7, 0x08, 0xd0, 0x5a, 0xf8, + 0xfe, 0xe9, 0x05, 0x48, 0x2b, 0x77, 0xef, 0xff, 0xe8, 0xa3, 0x23, 0x97, 0xd5, 0x9a, 0x95, 0x52, + 0xd5, 0x6f, 0x6c, 0x26, 0xfe, 0xe5, 0xae, 0x74, 0x44, 0x3c, 0xf9, 0x3f, 0x8a, 0xf1, 0x7f, 0x93, + 0xbc, 0x1f, 0xfd, 0xdd, 0xda, 0xaa, 0xcc, 0x88, 0xdd, 0x0f, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, + 0x1c, 0x3d, 0x9d, 0x58, 0x54, 0x29, 0x00, 0x00, }, // google/protobuf/duration.proto []byte{ diff --git a/client/matching/client.go b/client/matching/client.go index 01686cb953d..cad61feea03 100644 --- a/client/matching/client.go +++ b/client/matching/client.go @@ -133,7 +133,6 @@ func (c *clientImpl) PollForActivityTask( if err != nil { return nil, err } - // TODO: update activity response to include backlog count hint and update the weight for partitions resp, err := c.client.PollForActivityTask(ctx, request, append(opts, yarpc.WithShardKey(peer))...) if err != nil { return nil, err @@ -145,6 +144,14 @@ func (c *clientImpl) PollForActivityTask( persistence.TaskListTypeActivity, resp.PartitionConfig, ) + c.loadBalancer.UpdateWeight( + request.GetDomainUUID(), + *request.PollRequest.GetTaskList(), + persistence.TaskListTypeActivity, + request.GetForwardedFrom(), + partition, + resp.LoadBalancerHints, + ) return resp, nil } @@ -182,7 +189,7 @@ func (c *clientImpl) PollForDecisionTask( persistence.TaskListTypeDecision, request.GetForwardedFrom(), partition, - resp.BacklogCountHint, + resp.LoadBalancerHints, ) return resp, nil } diff --git a/client/matching/client_test.go b/client/matching/client_test.go index 695bf5c3a8f..61091cf299e 100644 --- a/client/matching/client_test.go +++ b/client/matching/client_test.go @@ -236,6 +236,7 @@ func TestClient_withResponse(t *testing.T) { p.EXPECT().FromTaskList(_testPartition).Return("peer0", nil) c.EXPECT().PollForActivityTask(gomock.Any(), gomock.Any(), []yarpc.CallOption{yarpc.WithShardKey("peer0")}).Return(&types.MatchingPollForActivityTaskResponse{}, nil) mp.EXPECT().UpdatePartitionConfig(_testDomainUUID, types.TaskList{Name: _testTaskList}, persistence.TaskListTypeActivity, nil) + balancer.EXPECT().UpdateWeight(_testDomainUUID, types.TaskList{Name: _testTaskList}, persistence.TaskListTypeActivity, "", _testPartition, nil) }, want: &types.MatchingPollForActivityTaskResponse{}, }, @@ -274,7 +275,7 @@ func TestClient_withResponse(t *testing.T) { p.EXPECT().FromTaskList(_testPartition).Return("peer0", nil) c.EXPECT().PollForDecisionTask(gomock.Any(), gomock.Any(), []yarpc.CallOption{yarpc.WithShardKey("peer0")}).Return(&types.MatchingPollForDecisionTaskResponse{}, nil) mp.EXPECT().UpdatePartitionConfig(_testDomainUUID, types.TaskList{Name: _testTaskList}, persistence.TaskListTypeDecision, nil) - balancer.EXPECT().UpdateWeight(_testDomainUUID, types.TaskList{Name: _testTaskList}, persistence.TaskListTypeDecision, "", _testPartition, int64(0)) + balancer.EXPECT().UpdateWeight(_testDomainUUID, types.TaskList{Name: _testTaskList}, persistence.TaskListTypeDecision, "", _testPartition, nil) }, want: &types.MatchingPollForDecisionTaskResponse{}, }, diff --git a/client/matching/loadbalancer.go b/client/matching/loadbalancer.go index 6d4b0d6ef80..9a051815e30 100644 --- a/client/matching/loadbalancer.go +++ b/client/matching/loadbalancer.go @@ -68,7 +68,7 @@ type ( taskListType int, forwardedFrom string, partition string, - weight int64, + info *types.LoadBalancerHints, ) } @@ -138,7 +138,7 @@ func (lb *defaultLoadBalancer) UpdateWeight( taskListType int, forwardedFrom string, partition string, - weight int64, + info *types.LoadBalancerHints, ) { } diff --git a/client/matching/loadbalancer_mock.go b/client/matching/loadbalancer_mock.go index 290930bc0ce..1edc26d30b1 100644 --- a/client/matching/loadbalancer_mock.go +++ b/client/matching/loadbalancer_mock.go @@ -86,13 +86,13 @@ func (mr *MockLoadBalancerMockRecorder) PickWritePartition(domainID, taskList, t } // UpdateWeight mocks base method. -func (m *MockLoadBalancer) UpdateWeight(domainID string, taskList types.TaskList, taskListType int, forwardedFrom, partition string, weight int64) { +func (m *MockLoadBalancer) UpdateWeight(domainID string, taskList types.TaskList, taskListType int, forwardedFrom, partition string, info *types.LoadBalancerHints) { m.ctrl.T.Helper() - m.ctrl.Call(m, "UpdateWeight", domainID, taskList, taskListType, forwardedFrom, partition, weight) + m.ctrl.Call(m, "UpdateWeight", domainID, taskList, taskListType, forwardedFrom, partition, info) } // UpdateWeight indicates an expected call of UpdateWeight. -func (mr *MockLoadBalancerMockRecorder) UpdateWeight(domainID, taskList, taskListType, forwardedFrom, partition, weight interface{}) *gomock.Call { +func (mr *MockLoadBalancerMockRecorder) UpdateWeight(domainID, taskList, taskListType, forwardedFrom, partition, info interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWeight", reflect.TypeOf((*MockLoadBalancer)(nil).UpdateWeight), domainID, taskList, taskListType, forwardedFrom, partition, weight) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWeight", reflect.TypeOf((*MockLoadBalancer)(nil).UpdateWeight), domainID, taskList, taskListType, forwardedFrom, partition, info) } diff --git a/client/matching/loadbalancer_test.go b/client/matching/loadbalancer_test.go index c1a2289b6a9..7b2c0eb47d5 100644 --- a/client/matching/loadbalancer_test.go +++ b/client/matching/loadbalancer_test.go @@ -161,7 +161,7 @@ func Test_defaultLoadBalancer_UpdateWeight(t *testing.T) { taskList := types.TaskList{Name: "test-task-list", Kind: types.TaskListKindNormal.Ptr()} // Call UpdateWeight, should do nothing - loadBalancer.UpdateWeight("test-domain-id", taskList, 0, "", "partition", 10) + loadBalancer.UpdateWeight("test-domain-id", taskList, 0, "", "partition", nil) // No expectations, just ensure no-op }) diff --git a/client/matching/multi_loadbalancer.go b/client/matching/multi_loadbalancer.go index 05516060ce9..555f59eef7b 100644 --- a/client/matching/multi_loadbalancer.go +++ b/client/matching/multi_loadbalancer.go @@ -99,7 +99,7 @@ func (lb *multiLoadBalancer) UpdateWeight( taskListType int, forwardedFrom string, partition string, - weight int64, + info *types.LoadBalancerHints, ) { domainName, err := lb.domainIDToName(domainID) if err != nil { @@ -111,5 +111,5 @@ func (lb *multiLoadBalancer) UpdateWeight( lb.logger.Warn("unsupported load balancer strategy", tag.Value(strategy)) return } - loadBalancer.UpdateWeight(domainID, taskList, taskListType, forwardedFrom, partition, weight) + loadBalancer.UpdateWeight(domainID, taskList, taskListType, forwardedFrom, partition, info) } diff --git a/client/matching/multi_loadbalancer_test.go b/client/matching/multi_loadbalancer_test.go index 24bd301ea89..9a7f0939487 100644 --- a/client/matching/multi_loadbalancer_test.go +++ b/client/matching/multi_loadbalancer_test.go @@ -240,40 +240,49 @@ func TestMultiLoadBalancer_UpdateWeight(t *testing.T) { taskListType int forwardedFrom string partition string - weight int64 + loadBalancerHints *types.LoadBalancerHints loadbalancerStrategy string shouldUpdate bool }{ { - name: "do nothing when domainIDToName fails", - domainID: "invalid-domain", - taskList: types.TaskList{Name: "test-tasklist"}, - taskListType: 1, - forwardedFrom: "", - partition: "partition-1", - weight: 10, + name: "do nothing when domainIDToName fails", + domainID: "invalid-domain", + taskList: types.TaskList{Name: "test-tasklist"}, + taskListType: 1, + forwardedFrom: "", + partition: "partition-1", + loadBalancerHints: &types.LoadBalancerHints{ + BacklogCount: 10, + RatePerSecond: 1, + }, loadbalancerStrategy: "random", shouldUpdate: false, }, { - name: "update weight with round-robin load balancer", - domainID: "valid-domain", - taskList: types.TaskList{Name: "test-tasklist"}, - taskListType: 1, - forwardedFrom: "", - partition: "partition-2", - weight: 20, + name: "update weight with round-robin load balancer", + domainID: "valid-domain", + taskList: types.TaskList{Name: "test-tasklist"}, + taskListType: 1, + forwardedFrom: "", + partition: "partition-2", + loadBalancerHints: &types.LoadBalancerHints{ + BacklogCount: 20, + RatePerSecond: 2, + }, loadbalancerStrategy: "round-robin", shouldUpdate: true, }, { - name: "do nothing when strategy is unsupported", - domainID: "valid-domain", - taskList: types.TaskList{Name: "test-tasklist"}, - taskListType: 1, - forwardedFrom: "", - partition: "partition-3", - weight: 30, + name: "do nothing when strategy is unsupported", + domainID: "valid-domain", + taskList: types.TaskList{Name: "test-tasklist"}, + taskListType: 1, + forwardedFrom: "", + partition: "partition-3", + loadBalancerHints: &types.LoadBalancerHints{ + BacklogCount: 30, + RatePerSecond: 3, + }, loadbalancerStrategy: "invalid-strategy", shouldUpdate: false, }, @@ -289,7 +298,7 @@ func TestMultiLoadBalancer_UpdateWeight(t *testing.T) { roundRobinMock := NewMockLoadBalancer(ctrl) if tt.shouldUpdate { - roundRobinMock.EXPECT().UpdateWeight(tt.domainID, tt.taskList, tt.taskListType, tt.forwardedFrom, tt.partition, tt.weight).Times(1) + roundRobinMock.EXPECT().UpdateWeight(tt.domainID, tt.taskList, tt.taskListType, tt.forwardedFrom, tt.partition, tt.loadBalancerHints).Times(1) } else { roundRobinMock.EXPECT().UpdateWeight(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(0) } @@ -310,7 +319,7 @@ func TestMultiLoadBalancer_UpdateWeight(t *testing.T) { } // Call UpdateWeight - lb.UpdateWeight(tt.domainID, tt.taskList, tt.taskListType, tt.forwardedFrom, tt.partition, tt.weight) + lb.UpdateWeight(tt.domainID, tt.taskList, tt.taskListType, tt.forwardedFrom, tt.partition, tt.loadBalancerHints) }) } } diff --git a/client/matching/rr_loadbalancer.go b/client/matching/rr_loadbalancer.go index f299280c8d6..597b96a2e9d 100644 --- a/client/matching/rr_loadbalancer.go +++ b/client/matching/rr_loadbalancer.go @@ -140,6 +140,6 @@ func (lb *roundRobinLoadBalancer) UpdateWeight( taskListType int, forwardedFrom string, partition string, - weight int64, + info *types.LoadBalancerHints, ) { } diff --git a/client/matching/weighted_loadbalancer.go b/client/matching/weighted_loadbalancer.go index 60dfc72a9ce..58f3c32c3c7 100644 --- a/client/matching/weighted_loadbalancer.go +++ b/client/matching/weighted_loadbalancer.go @@ -23,6 +23,7 @@ package matching import ( + "math" "math/rand" "path" "sort" @@ -112,6 +113,12 @@ func (pw *weightSelector) update(n, p int, weight int64) { pw.initialized = true } +func (pw *weightSelector) getWeights() []int64 { + pw.RLock() + defer pw.RUnlock() + return pw.weights +} + func NewWeightedLoadBalancer( lb LoadBalancer, provider PartitionConfigProvider, @@ -179,7 +186,7 @@ func (lb *weightedLoadBalancer) UpdateWeight( taskListType int, forwardedFrom string, partition string, - weight int64, + info *types.LoadBalancerHints, ) { if forwardedFrom != "" || taskList.GetKind() == types.TaskListKindSticky { return @@ -187,6 +194,9 @@ func (lb *weightedLoadBalancer) UpdateWeight( if strings.HasPrefix(taskList.GetName(), common.ReservedTaskListPrefix) { return } + if info == nil { + return + } p := 0 if partition != taskList.GetName() { var err error @@ -218,6 +228,20 @@ func (lb *weightedLoadBalancer) UpdateWeight( if !ok { return } - lb.logger.Debug("update tasklist partition weight", tag.WorkflowDomainID(domainID), tag.WorkflowTaskListName(taskList.GetName()), tag.WorkflowTaskListType(taskListType), tag.Dynamic("weights", w.weights), tag.Dynamic("tasklist-partition", p), tag.Dynamic("weight", weight)) + weight := calcWeightFromLoadBalancerHints(info) + lb.logger.Debug("update tasklist partition weight", tag.WorkflowDomainID(domainID), tag.WorkflowTaskListName(taskList.GetName()), tag.WorkflowTaskListType(taskListType), tag.Dynamic("weights", w.getWeights()), tag.Dynamic("tasklist-partition", p), tag.Dynamic("weight", weight), tag.Dynamic("load-balancer-hints", info)) w.update(n, p, weight) } + +func calcWeightFromLoadBalancerHints(info *types.LoadBalancerHints) int64 { + // according to Little's Law, the average number of tasks in the queue L = λW + // where λ is the average arrival rate and W is the average wait time a task spends in the queue + // here λ is the QPS and W is the average match latency which is 10ms + // so the backlog hint should be backlog count + L. + smoothingNumber := int64(0) + qps := info.RatePerSecond + if qps > 0.01 { + smoothingNumber = int64(math.Ceil(qps * 0.01)) + } + return info.BacklogCount + smoothingNumber +} diff --git a/client/matching/weighted_loadbalancer_test.go b/client/matching/weighted_loadbalancer_test.go index 99b6b2b897c..f5fa6a4f838 100644 --- a/client/matching/weighted_loadbalancer_test.go +++ b/client/matching/weighted_loadbalancer_test.go @@ -23,6 +23,7 @@ package matching import ( + "math" "math/rand" "testing" "time" @@ -250,14 +251,14 @@ func TestWeightedLoadBalancer_PickReadPartition(t *testing.T) { func TestWeightedLoadBalancer_UpdateWeight(t *testing.T) { testCases := []struct { - name string - domainID string - taskList types.TaskList - taskListType int - forwardedFrom string - partition string - weight int64 - setupMock func(*cache.MockCache, *MockPartitionConfigProvider) + name string + domainID string + taskList types.TaskList + taskListType int + forwardedFrom string + partition string + loadBalancerHints *types.LoadBalancerHints + setupMock func(*cache.MockCache, *MockPartitionConfigProvider) }{ { name: "Sticky task list", @@ -276,8 +277,8 @@ func TestWeightedLoadBalancer_UpdateWeight(t *testing.T) { taskList: types.TaskList{Name: "/__cadence_sys/aaa/1"}, }, { - name: "domain Name lookup error", - domainID: "invalid-domainID", + name: "nil loadBalancerHints", + domainID: "domainA", taskList: types.TaskList{Name: "a"}, }, { @@ -285,6 +286,9 @@ func TestWeightedLoadBalancer_UpdateWeight(t *testing.T) { domainID: "domainA", taskList: types.TaskList{Name: "a"}, partition: "a", + loadBalancerHints: &types.LoadBalancerHints{ + BacklogCount: 1, + }, setupMock: func(mockCache *cache.MockCache, mockPartitionConfigProvider *MockPartitionConfigProvider) { mockPartitionConfigProvider.EXPECT().GetNumberOfReadPartitions("domainA", types.TaskList{Name: "a"}, 0).Return(1) mockCache.EXPECT().Delete(key{ @@ -299,7 +303,9 @@ func TestWeightedLoadBalancer_UpdateWeight(t *testing.T) { domainID: "domainA", taskList: types.TaskList{Name: "a"}, partition: "a", - weight: 1, + loadBalancerHints: &types.LoadBalancerHints{ + BacklogCount: 1, + }, setupMock: func(mockCache *cache.MockCache, mockPartitionConfigProvider *MockPartitionConfigProvider) { mockPartitionConfigProvider.EXPECT().GetNumberOfReadPartitions("domainA", types.TaskList{Name: "a"}, 0).Return(2) mockCache.EXPECT().Get(key{ @@ -319,7 +325,9 @@ func TestWeightedLoadBalancer_UpdateWeight(t *testing.T) { domainID: "domainA", taskList: types.TaskList{Name: "a"}, partition: "/__cadence_sys/a/1", - weight: 1, + loadBalancerHints: &types.LoadBalancerHints{ + BacklogCount: 1, + }, setupMock: func(mockCache *cache.MockCache, mockPartitionConfigProvider *MockPartitionConfigProvider) { mockPartitionConfigProvider.EXPECT().GetNumberOfReadPartitions("domainA", types.TaskList{Name: "a"}, 0).Return(2) mockCache.EXPECT().Get(key{ @@ -345,7 +353,48 @@ func TestWeightedLoadBalancer_UpdateWeight(t *testing.T) { tc.setupMock(mockWeightCache, mockPartitionConfigProvider) } - lb.UpdateWeight(tc.domainID, tc.taskList, tc.taskListType, tc.forwardedFrom, tc.partition, tc.weight) + lb.UpdateWeight(tc.domainID, tc.taskList, tc.taskListType, tc.forwardedFrom, tc.partition, tc.loadBalancerHints) + }) + } +} + +func TestCalcWeightFromLoadBalancerHints(t *testing.T) { + tests := []struct { + name string + info types.LoadBalancerHints + expected int64 + }{ + { + name: "Zero QPS and backlog count", + info: types.LoadBalancerHints{BacklogCount: 0, RatePerSecond: 0}, + expected: 0, + }, + { + name: "Small QPS below threshold", + info: types.LoadBalancerHints{BacklogCount: 10, RatePerSecond: 0.005}, + expected: 10, + }, + { + name: "QPS above threshold with no backlog", + info: types.LoadBalancerHints{BacklogCount: 0, RatePerSecond: 2}, + expected: int64(math.Ceil(2 * 0.01)), // smoothingNumber calculation + }, + { + name: "QPS above threshold with backlog", + info: types.LoadBalancerHints{BacklogCount: 100, RatePerSecond: 5}, + expected: 100 + int64(math.Ceil(5*0.01)), // backlog + smoothingNumber + }, + { + name: "Large QPS", + info: types.LoadBalancerHints{BacklogCount: 50, RatePerSecond: 100}, + expected: 50 + int64(math.Ceil(100*0.01)), // backlog + smoothingNumber + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := calcWeightFromLoadBalancerHints(&tt.info) + assert.Equal(t, tt.expected, result, "unexpected result for %s", tt.name) }) } } diff --git a/common/types/mapper/proto/matching.go b/common/types/mapper/proto/matching.go index 015b2729051..e7781240083 100644 --- a/common/types/mapper/proto/matching.go +++ b/common/types/mapper/proto/matching.go @@ -406,6 +406,7 @@ func FromMatchingPollForActivityTaskResponse(t *types.MatchingPollForActivityTas WorkflowDomain: t.WorkflowDomain, Header: FromHeader(t.Header), PartitionConfig: FromTaskListPartitionConfig(t.PartitionConfig), + LoadBalancerHints: FromLoadBalancerHints(t.LoadBalancerHints), } } @@ -431,6 +432,7 @@ func ToMatchingPollForActivityTaskResponse(t *matchingv1.PollForActivityTaskResp WorkflowDomain: t.WorkflowDomain, Header: ToHeader(t.Header), PartitionConfig: ToTaskListPartitionConfig(t.PartitionConfig), + LoadBalancerHints: ToLoadBalancerHints(t.LoadBalancerHints), } } @@ -484,6 +486,7 @@ func FromMatchingPollForDecisionTaskResponse(t *types.MatchingPollForDecisionTas Queries: FromWorkflowQueryMap(t.Queries), TotalHistoryBytes: t.TotalHistoryBytes, PartitionConfig: FromTaskListPartitionConfig(t.PartitionConfig), + LoadBalancerHints: FromLoadBalancerHints(t.LoadBalancerHints), } } @@ -511,6 +514,7 @@ func ToMatchingPollForDecisionTaskResponse(t *matchingv1.PollForDecisionTaskResp Queries: ToWorkflowQueryMap(t.Queries), TotalHistoryBytes: t.TotalHistoryBytes, PartitionConfig: ToTaskListPartitionConfig(t.PartitionConfig), + LoadBalancerHints: ToLoadBalancerHints(t.LoadBalancerHints), } } @@ -657,3 +661,23 @@ func ToMatchingRefreshTaskListPartitionConfigResponse(t *matchingv1.RefreshTaskL } return &types.MatchingRefreshTaskListPartitionConfigResponse{} } + +func FromLoadBalancerHints(t *types.LoadBalancerHints) *matchingv1.LoadBalancerHints { + if t == nil { + return nil + } + return &matchingv1.LoadBalancerHints{ + BacklogCount: t.BacklogCount, + RatePerSecond: t.RatePerSecond, + } +} + +func ToLoadBalancerHints(t *matchingv1.LoadBalancerHints) *types.LoadBalancerHints { + if t == nil { + return nil + } + return &types.LoadBalancerHints{ + BacklogCount: t.BacklogCount, + RatePerSecond: t.RatePerSecond, + } +} diff --git a/common/types/mapper/thrift/matching_test.go b/common/types/mapper/thrift/matching_test.go index 95452af8f4b..a875e33c31f 100644 --- a/common/types/mapper/thrift/matching_test.go +++ b/common/types/mapper/thrift/matching_test.go @@ -257,7 +257,8 @@ func TestMatchingPollForDecisionResponse(t *testing.T) { roundTripObj := ToMatchingPollForDecisionTaskResponse(thriftObj) opt := cmpopts.IgnoreFields(types.WorkflowExecutionStartedEventAttributes{}, "ParentWorkflowDomainID") opt2 := cmpopts.IgnoreFields(types.MatchingPollForDecisionTaskResponse{}, "PartitionConfig") - if diff := cmp.Diff(tc.input, roundTripObj, opt, opt2); diff != "" { + opt3 := cmpopts.IgnoreFields(types.MatchingPollForDecisionTaskResponse{}, "LoadBalancerHints") + if diff := cmp.Diff(tc.input, roundTripObj, opt, opt2, opt3); diff != "" { t.Fatalf("Mismatch (-want +got):\n%s", diff) } } @@ -285,7 +286,8 @@ func TestMatchingPollForActivityTaskResponse(t *testing.T) { thriftObj := FromMatchingPollForActivityTaskResponse(tc.input) roundTripObj := ToMatchingPollForActivityTaskResponse(thriftObj) opt := cmpopts.IgnoreFields(types.MatchingPollForActivityTaskResponse{}, "PartitionConfig") - if diff := cmp.Diff(tc.input, roundTripObj, opt); diff != "" { + opt2 := cmpopts.IgnoreFields(types.MatchingPollForActivityTaskResponse{}, "LoadBalancerHints") + if diff := cmp.Diff(tc.input, roundTripObj, opt, opt2); diff != "" { t.Fatalf("Mismatch (-want +got):\n%s", diff) } } diff --git a/common/types/matching.go b/common/types/matching.go index d82892a7db6..c9daadc24c9 100644 --- a/common/types/matching.go +++ b/common/types/matching.go @@ -445,6 +445,7 @@ type MatchingPollForDecisionTaskResponse struct { Queries map[string]*WorkflowQuery `json:"queries,omitempty"` TotalHistoryBytes int64 `json:"currentHistorySize,omitempty"` PartitionConfig *TaskListPartitionConfig + LoadBalancerHints *LoadBalancerHints } // GetWorkflowExecution is an internal getter (TBD...) @@ -514,6 +515,7 @@ type MatchingPollForActivityTaskResponse struct { Header *Header `json:"header,omitempty"` BacklogCountHint int64 `json:"backlogCountHint,omitempty"` PartitionConfig *TaskListPartitionConfig + LoadBalancerHints *LoadBalancerHints } // MatchingQueryWorkflowRequest is an internal type (TBD...) @@ -678,3 +680,8 @@ func (v *MatchingRefreshTaskListPartitionConfigRequest) GetTaskListType() (o Tas } type MatchingRefreshTaskListPartitionConfigResponse struct{} + +type LoadBalancerHints struct { + BacklogCount int64 + RatePerSecond float64 +} diff --git a/common/types/testdata/service_matching.go b/common/types/testdata/service_matching.go index d721ae87195..566727a46ff 100644 --- a/common/types/testdata/service_matching.go +++ b/common/types/testdata/service_matching.go @@ -36,6 +36,10 @@ var ( NumReadPartitions: 3, NumWritePartitions: 2, } + LoadBalancerHints = types.LoadBalancerHints{ + BacklogCount: 1000, + RatePerSecond: 1.0, + } MatchingAddActivityTaskRequest = types.AddActivityTaskRequest{ DomainUUID: DomainID, Execution: &WorkflowExecution, @@ -110,6 +114,7 @@ var ( WorkflowDomain: DomainName, Header: &Header, PartitionConfig: &TaskListPartitionConfig, + LoadBalancerHints: &LoadBalancerHints, } MatchingPollForDecisionTaskRequest = types.MatchingPollForDecisionTaskRequest{ DomainUUID: DomainID, @@ -137,6 +142,7 @@ var ( StartedTimestamp: &Timestamp2, Queries: WorkflowQueryMap, PartitionConfig: &TaskListPartitionConfig, + LoadBalancerHints: &LoadBalancerHints, } MatchingQueryWorkflowRequest = types.MatchingQueryWorkflowRequest{ DomainUUID: DomainID, diff --git a/proto/internal/uber/cadence/matching/v1/service.proto b/proto/internal/uber/cadence/matching/v1/service.proto index 020405ebcfa..a80608d5292 100644 --- a/proto/internal/uber/cadence/matching/v1/service.proto +++ b/proto/internal/uber/cadence/matching/v1/service.proto @@ -103,6 +103,11 @@ message TaskListPartitionConfig { int32 num_write_partitions = 3; } +message LoadBalancerHints { + int64 backlog_count = 1; + double rate_per_second = 2; +} + message PollForDecisionTaskRequest { api.v1.PollForDecisionTaskRequest request = 1; string domain_id = 2; @@ -131,6 +136,7 @@ message PollForDecisionTaskResponse { map queries = 17; int64 total_history_bytes = 18; TaskListPartitionConfig partition_config = 19; + LoadBalancerHints load_balancer_hints = 20; } message PollForActivityTaskRequest { @@ -158,6 +164,7 @@ message PollForActivityTaskResponse { api.v1.WorkflowType workflow_type = 14; string workflow_domain = 15; api.v1.Header header = 16; + LoadBalancerHints load_balancer_hints = 17; TaskListPartitionConfig partition_config = 19; } diff --git a/service/matching/handler/engine.go b/service/matching/handler/engine.go index 6e29dcc0450..bde7c3175d1 100644 --- a/service/matching/handler/engine.go +++ b/service/matching/handler/engine.go @@ -561,7 +561,8 @@ pollLoop: }, }) return &types.MatchingPollForDecisionTaskResponse{ - PartitionConfig: tlMgr.TaskListPartitionConfig(), + PartitionConfig: tlMgr.TaskListPartitionConfig(), + LoadBalancerHints: tlMgr.LoadBalancerHints(), }, nil } return nil, fmt.Errorf("couldn't get task: %w", err) @@ -577,8 +578,8 @@ pollLoop: Host: e.config.HostName, }) resp := task.PollForDecisionResponse() - // set the backlog count to the current partition's backlog count - resp.BacklogCountHint = task.BacklogCountHint + resp.PartitionConfig = tlMgr.TaskListPartitionConfig() + resp.LoadBalancerHints = tlMgr.LoadBalancerHints() return resp, nil // TODO: Maybe add history expose here? } @@ -597,7 +598,8 @@ pollLoop: // will notify query client that the query task failed e.deliverQueryResult(task.Query.TaskID, &queryResult{internalError: err}) //nolint:errcheck return &types.MatchingPollForDecisionTaskResponse{ - PartitionConfig: tlMgr.TaskListPartitionConfig(), + PartitionConfig: tlMgr.TaskListPartitionConfig(), + LoadBalancerHints: tlMgr.LoadBalancerHints(), }, nil } @@ -615,7 +617,7 @@ pollLoop: BranchToken: mutableStateResp.CurrentBranchToken, HistorySize: mutableStateResp.HistorySize, } - return e.createPollForDecisionTaskResponse(task, resp, hCtx.scope, tlMgr.TaskListPartitionConfig()), nil + return e.createPollForDecisionTaskResponse(task, resp, hCtx.scope, tlMgr.TaskListPartitionConfig(), tlMgr.LoadBalancerHints()), nil } e.emitTaskIsolationMetrics(hCtx.scope, task.Event.PartitionConfig, req.GetIsolationGroup()) @@ -672,7 +674,7 @@ pollLoop: }, }) - return e.createPollForDecisionTaskResponse(task, resp, hCtx.scope, tlMgr.TaskListPartitionConfig()), nil + return e.createPollForDecisionTaskResponse(task, resp, hCtx.scope, tlMgr.TaskListPartitionConfig(), tlMgr.LoadBalancerHints()), nil } } @@ -723,7 +725,8 @@ pollLoop: // TODO: Is empty poll the best reply for errPumpClosed? if errors.Is(err, tasklist.ErrNoTasks) || errors.Is(err, errPumpClosed) { return &types.MatchingPollForActivityTaskResponse{ - PartitionConfig: tlMgr.TaskListPartitionConfig(), + PartitionConfig: tlMgr.TaskListPartitionConfig(), + LoadBalancerHints: tlMgr.LoadBalancerHints(), }, nil } e.logger.Error("Received unexpected err while getting task", @@ -736,13 +739,16 @@ pollLoop: if task.IsStarted() { // tasks received from remote are already started. So, simply forward the response - return task.PollForActivityResponse(), nil + resp := task.PollForActivityResponse() + resp.PartitionConfig = tlMgr.TaskListPartitionConfig() + resp.LoadBalancerHints = tlMgr.LoadBalancerHints() + return resp, nil } e.emitForwardedFromStats(hCtx.scope, task.IsForwarded(), req.GetForwardedFrom()) e.emitTaskIsolationMetrics(hCtx.scope, task.Event.PartitionConfig, req.GetIsolationGroup()) if task.ActivityTaskDispatchInfo != nil { task.Finish(nil) - return e.createSyncMatchPollForActivityTaskResponse(task, task.ActivityTaskDispatchInfo, tlMgr.TaskListPartitionConfig()), nil + return e.createSyncMatchPollForActivityTaskResponse(task, task.ActivityTaskDispatchInfo, tlMgr.TaskListPartitionConfig(), tlMgr.LoadBalancerHints()), nil } resp, err := e.recordActivityTaskStarted(hCtx.Context, request, task) @@ -774,7 +780,7 @@ pollLoop: continue pollLoop } task.Finish(nil) - return e.createPollForActivityTaskResponse(task, resp, hCtx.scope, tlMgr.TaskListPartitionConfig()), nil + return e.createPollForActivityTaskResponse(task, resp, hCtx.scope, tlMgr.TaskListPartitionConfig(), tlMgr.LoadBalancerHints()), nil } } @@ -782,6 +788,7 @@ func (e *matchingEngineImpl) createSyncMatchPollForActivityTaskResponse( task *tasklist.InternalTask, activityTaskDispatchInfo *types.ActivityTaskDispatchInfo, partitionConfig *types.TaskListPartitionConfig, + loadBalancerHints *types.LoadBalancerHints, ) *types.MatchingPollForActivityTaskResponse { scheduledEvent := activityTaskDispatchInfo.ScheduledEvent @@ -816,6 +823,7 @@ func (e *matchingEngineImpl) createSyncMatchPollForActivityTaskResponse( response.WorkflowType = activityTaskDispatchInfo.WorkflowType response.WorkflowDomain = activityTaskDispatchInfo.WorkflowDomain response.PartitionConfig = partitionConfig + response.LoadBalancerHints = loadBalancerHints return response } @@ -1150,6 +1158,7 @@ func (e *matchingEngineImpl) createPollForDecisionTaskResponse( historyResponse *types.RecordDecisionTaskStartedResponse, scope metrics.Scope, partitionConfig *types.TaskListPartitionConfig, + loadBalancerHints *types.LoadBalancerHints, ) *types.MatchingPollForDecisionTaskResponse { var token []byte @@ -1185,6 +1194,7 @@ func (e *matchingEngineImpl) createPollForDecisionTaskResponse( } response.BacklogCountHint = task.BacklogCountHint response.PartitionConfig = partitionConfig + response.LoadBalancerHints = loadBalancerHints return response } @@ -1194,6 +1204,7 @@ func (e *matchingEngineImpl) createPollForActivityTaskResponse( historyResponse *types.RecordActivityTaskStartedResponse, scope metrics.Scope, partitionConfig *types.TaskListPartitionConfig, + loadBalancerHints *types.LoadBalancerHints, ) *types.MatchingPollForActivityTaskResponse { scheduledEvent := historyResponse.ScheduledEvent @@ -1238,6 +1249,7 @@ func (e *matchingEngineImpl) createPollForActivityTaskResponse( response.WorkflowType = historyResponse.WorkflowType response.WorkflowDomain = historyResponse.WorkflowDomain response.PartitionConfig = partitionConfig + response.LoadBalancerHints = loadBalancerHints return response } diff --git a/service/matching/tasklist/interfaces.go b/service/matching/tasklist/interfaces.go index 12e8218a69b..a698f87881d 100644 --- a/service/matching/tasklist/interfaces.go +++ b/service/matching/tasklist/interfaces.go @@ -62,6 +62,7 @@ type ( TaskListPartitionConfig() *types.TaskListPartitionConfig UpdateTaskListPartitionConfig(context.Context, *types.TaskListPartitionConfig) error RefreshTaskListPartitionConfig(context.Context, *types.TaskListPartitionConfig) error + LoadBalancerHints() *types.LoadBalancerHints } TaskMatcher interface { diff --git a/service/matching/tasklist/interfaces_mock.go b/service/matching/tasklist/interfaces_mock.go index 0892d65d3d9..b6201019831 100644 --- a/service/matching/tasklist/interfaces_mock.go +++ b/service/matching/tasklist/interfaces_mock.go @@ -186,6 +186,20 @@ func (mr *MockManagerMockRecorder) HasPollerAfter(accessTime interface{}) *gomoc return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasPollerAfter", reflect.TypeOf((*MockManager)(nil).HasPollerAfter), accessTime) } +// LoadBalancerHints mocks base method. +func (m *MockManager) LoadBalancerHints() *types.LoadBalancerHints { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LoadBalancerHints") + ret0, _ := ret[0].(*types.LoadBalancerHints) + return ret0 +} + +// LoadBalancerHints indicates an expected call of LoadBalancerHints. +func (mr *MockManagerMockRecorder) LoadBalancerHints() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LoadBalancerHints", reflect.TypeOf((*MockManager)(nil).LoadBalancerHints)) +} + // RefreshTaskListPartitionConfig mocks base method. func (m *MockManager) RefreshTaskListPartitionConfig(arg0 context.Context, arg1 *types.TaskListPartitionConfig) error { m.ctrl.T.Helper() diff --git a/service/matching/tasklist/task_list_manager.go b/service/matching/tasklist/task_list_manager.go index 78e5ce89968..8fcc8183649 100644 --- a/service/matching/tasklist/task_list_manager.go +++ b/service/matching/tasklist/task_list_manager.go @@ -27,7 +27,6 @@ import ( "context" "errors" "fmt" - "math" "reflect" "sort" "sync" @@ -325,6 +324,14 @@ func (c *taskListManagerImpl) TaskListPartitionConfig() *types.TaskListPartition return &config } +func (c *taskListManagerImpl) LoadBalancerHints() *types.LoadBalancerHints { + c.startWG.Wait() + return &types.LoadBalancerHints{ + BacklogCount: c.taskAckManager.GetBacklogCount(), + RatePerSecond: c.qpsTracker.QPS(), + } +} + func isTaskListPartitionConfigEqual(a types.TaskListPartitionConfig, b types.TaskListPartitionConfig) bool { a.Version = b.Version return reflect.DeepEqual(a, b) @@ -563,18 +570,7 @@ func (c *taskListManagerImpl) GetTask( return nil, fmt.Errorf("couldn't get task: %w", err) } task.domainName = c.domainName - // according to Little's Law, the average number of tasks in the queue L = λW - // where λ is the average arrival rate and W is the average wait time a task spends in the queue - // here λ is the QPS and W is the average match latency which is 10ms - // so the backlog hint should be backlog count + L. - smoothingNumber := int64(0) - if c.taskListKind != types.TaskListKindSticky { - qps := c.qpsTracker.QPS() - if qps > 0.01 { - smoothingNumber = int64(math.Ceil(qps * 0.01)) - } - } - task.BacklogCountHint = c.taskAckManager.GetBacklogCount() + smoothingNumber + task.BacklogCountHint = c.taskAckManager.GetBacklogCount() return task, nil }