From 64286ead7314e36b9154de7f73d6d24f50605375 Mon Sep 17 00:00:00 2001 From: u9g Date: Mon, 24 Aug 2026 14:16:10 -0400 Subject: [PATCH 1/4] agent simulation: name the run window bounds start_time/end_time (#1738) * agent simulation: name the run window bounds start_time/end_time `from` is a Python keyword, so protoc's --pyi_out cannot emit a parameter for it: the stub drops the attribute and falls back to an untyped `**kwargs`, which python-sdks' strict mypy gate rejects, and no Python caller can reach the field except through getattr. Rename both bounds together to keep the pair symmetric and to match the _time suffix the timestamps elsewhere use. Field numbers are unchanged, so the wire format is compatible; only the JSON/text names move. * generated protobuf --- livekit/livekit_agent_simulation.pb.go | 68 ++-- livekit/livekit_agent_simulation.twirp.go | 469 +++++++++++----------- protobufs/livekit_agent_simulation.proto | 14 +- 3 files changed, 276 insertions(+), 275 deletions(-) diff --git a/livekit/livekit_agent_simulation.pb.go b/livekit/livekit_agent_simulation.pb.go index 96533c10b..9a1ec557f 100644 --- a/livekit/livekit_agent_simulation.pb.go +++ b/livekit/livekit_agent_simulation.pb.go @@ -2514,11 +2514,11 @@ type SimulationRun_List_Request struct { ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` Status *SimulationRun_Status `protobuf:"varint,2,opt,name=status,proto3,enum=livekit.SimulationRun_Status,oneof" json:"status,omitempty"` PageToken *TokenPagination `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3,oneof" json:"page_token,omitempty"` - // Half-open window [from, to) on created_at, the leading key of this - // list's keyset. Unset bounds mean no window, so existing callers keep - // their unbounded scan; the histogram's selected range sets both. - From *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=from,proto3,oneof" json:"from,omitempty"` - To *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=to,proto3,oneof" json:"to,omitempty"` + // Half-open window [start_time, end_time) on created_at, the leading key + // of this list's keyset. Unset bounds mean no window, so existing callers + // keep their unbounded scan; the histogram's selected range sets both. + StartTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` // Exact agent name. Unset means every agent — including the runs whose // name is empty, which a bare string could not tell from no filter. AgentName *string `protobuf:"bytes,6,opt,name=agent_name,json=agentName,proto3,oneof" json:"agent_name,omitempty"` @@ -2577,16 +2577,16 @@ func (x *SimulationRun_List_Request) GetPageToken() *TokenPagination { return nil } -func (x *SimulationRun_List_Request) GetFrom() *timestamppb.Timestamp { +func (x *SimulationRun_List_Request) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.From + return x.StartTime } return nil } -func (x *SimulationRun_List_Request) GetTo() *timestamppb.Timestamp { +func (x *SimulationRun_List_Request) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.To + return x.EndTime } return nil } @@ -2655,8 +2655,8 @@ type SimulationRun_Counts_Request struct { ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Both bounds required: a bucketed scan of a project's whole history is // never what a caller wants. - From *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"` - To *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=to,proto3" json:"to,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` // Applied as `List` applies it: a filter the rows honour and the bars // above them drop would make the histogram an answer about a wider set. Status *SimulationRun_Status `protobuf:"varint,4,opt,name=status,proto3,enum=livekit.SimulationRun_Status,oneof" json:"status,omitempty"` @@ -2702,16 +2702,16 @@ func (x *SimulationRun_Counts_Request) GetProjectId() string { return "" } -func (x *SimulationRun_Counts_Request) GetFrom() *timestamppb.Timestamp { +func (x *SimulationRun_Counts_Request) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.From + return x.StartTime } return nil } -func (x *SimulationRun_Counts_Request) GetTo() *timestamppb.Timestamp { +func (x *SimulationRun_Counts_Request) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.To + return x.EndTime } return nil } @@ -3089,7 +3089,7 @@ const file_livekit_agent_simulation_proto_rawDesc = "" + "\n" + "suggestion\x18\x02 \x01(\tR\n" + "suggestion\x12\x14\n" + - "\x05label\x18\x03 \x01(\tR\x05label\"\xadG\n" + + "\x05label\x18\x03 \x01(\tR\x05label\"\xe5G\n" + "\rSimulationRun\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + "\n" + @@ -3357,32 +3357,34 @@ const file_livekit_agent_simulation_proto_rawDesc = "" + "project_id\x18\x01 \x01(\tR\tprojectId\x12*\n" + "\x11simulation_run_id\x18\x02 \x01(\tR\x0fsimulationRunId\x1a4\n" + "\bResponse\x12(\n" + - "\x03run\x18\x01 \x01(\v2\x16.livekit.SimulationRunR\x03run\x1a\xe8\x03\n" + - "\x04List\x1a\xe5\x02\n" + + "\x03run\x18\x01 \x01(\v2\x16.livekit.SimulationRunR\x03run\x1a\x8a\x04\n" + + "\x04List\x1a\x87\x03\n" + "\aRequest\x12\x1d\n" + "\n" + "project_id\x18\x01 \x01(\tR\tprojectId\x12:\n" + "\x06status\x18\x02 \x01(\x0e2\x1d.livekit.SimulationRun.StatusH\x00R\x06status\x88\x01\x01\x12<\n" + "\n" + - "page_token\x18\x03 \x01(\v2\x18.livekit.TokenPaginationH\x01R\tpageToken\x88\x01\x01\x123\n" + - "\x04from\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampH\x02R\x04from\x88\x01\x01\x12/\n" + - "\x02to\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampH\x03R\x02to\x88\x01\x01\x12\"\n" + + "page_token\x18\x03 \x01(\v2\x18.livekit.TokenPaginationH\x01R\tpageToken\x88\x01\x01\x12>\n" + + "\n" + + "start_time\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampH\x02R\tstartTime\x88\x01\x01\x12:\n" + + "\bend_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampH\x03R\aendTime\x88\x01\x01\x12\"\n" + "\n" + "agent_name\x18\x06 \x01(\tH\x04R\tagentName\x88\x01\x01B\t\n" + "\a_statusB\r\n" + - "\v_page_tokenB\a\n" + - "\x05_fromB\x05\n" + - "\x03_toB\r\n" + + "\v_page_tokenB\r\n" + + "\v_start_timeB\v\n" + + "\t_end_timeB\r\n" + "\v_agent_name\x1ax\n" + "\bResponse\x12*\n" + "\x04runs\x18\x01 \x03(\v2\x16.livekit.SimulationRunR\x04runs\x12@\n" + - "\x0fnext_page_token\x18\x02 \x01(\v2\x18.livekit.TokenPaginationR\rnextPageToken\x1a\xec\x03\n" + - "\x06Counts\x1a\xfe\x01\n" + + "\x0fnext_page_token\x18\x02 \x01(\v2\x18.livekit.TokenPaginationR\rnextPageToken\x1a\x82\x04\n" + + "\x06Counts\x1a\x94\x02\n" + "\aRequest\x12\x1d\n" + "\n" + - "project_id\x18\x01 \x01(\tR\tprojectId\x12.\n" + - "\x04from\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x04from\x12*\n" + - "\x02to\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\x02to\x12:\n" + + "project_id\x18\x01 \x01(\tR\tprojectId\x129\n" + + "\n" + + "start_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\tstartTime\x125\n" + + "\bend_time\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\aendTime\x12:\n" + "\x06status\x18\x04 \x01(\x0e2\x1d.livekit.SimulationRun.StatusH\x00R\x06status\x88\x01\x01\x12\"\n" + "\n" + "agent_name\x18\x05 \x01(\tH\x01R\tagentName\x88\x01\x01B\t\n" + @@ -3553,12 +3555,12 @@ var file_livekit_agent_simulation_proto_depIdxs = []int32{ 4, // 34: livekit.SimulationRun.Get.Response.run:type_name -> livekit.SimulationRun 1, // 35: livekit.SimulationRun.List.Request.status:type_name -> livekit.SimulationRun.Status 47, // 36: livekit.SimulationRun.List.Request.page_token:type_name -> livekit.TokenPagination - 43, // 37: livekit.SimulationRun.List.Request.from:type_name -> google.protobuf.Timestamp - 43, // 38: livekit.SimulationRun.List.Request.to:type_name -> google.protobuf.Timestamp + 43, // 37: livekit.SimulationRun.List.Request.start_time:type_name -> google.protobuf.Timestamp + 43, // 38: livekit.SimulationRun.List.Request.end_time:type_name -> google.protobuf.Timestamp 4, // 39: livekit.SimulationRun.List.Response.runs:type_name -> livekit.SimulationRun 47, // 40: livekit.SimulationRun.List.Response.next_page_token:type_name -> livekit.TokenPagination - 43, // 41: livekit.SimulationRun.Counts.Request.from:type_name -> google.protobuf.Timestamp - 43, // 42: livekit.SimulationRun.Counts.Request.to:type_name -> google.protobuf.Timestamp + 43, // 41: livekit.SimulationRun.Counts.Request.start_time:type_name -> google.protobuf.Timestamp + 43, // 42: livekit.SimulationRun.Counts.Request.end_time:type_name -> google.protobuf.Timestamp 1, // 43: livekit.SimulationRun.Counts.Request.status:type_name -> livekit.SimulationRun.Status 36, // 44: livekit.SimulationRun.Counts.Response.buckets:type_name -> livekit.SimulationRun.Counts.Bucket 48, // 45: livekit.SimulationRun.Counts.Response.interval:type_name -> google.protobuf.Duration diff --git a/livekit/livekit_agent_simulation.twirp.go b/livekit/livekit_agent_simulation.twirp.go index f28b43857..522fce10e 100644 --- a/livekit/livekit_agent_simulation.twirp.go +++ b/livekit/livekit_agent_simulation.twirp.go @@ -2191,240 +2191,239 @@ func (s *agentSimulationServer) PathPrefix() string { } var twirpFileDescriptor10 = []byte{ - // 3745 bytes of a gzipped FileDescriptorProto + // 3743 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0x4b, 0x6f, 0x1c, 0x49, - 0x72, 0x56, 0x77, 0xf5, 0x33, 0xfa, 0xc9, 0x64, 0x93, 0x6a, 0xd5, 0x3c, 0xa4, 0xd1, 0x8c, 0x76, - 0xb5, 0xd2, 0x6c, 0x4b, 0xe6, 0x8c, 0x76, 0xcc, 0x99, 0x9d, 0xb5, 0xd9, 0x64, 0x8f, 0x9a, 0x32, - 0x49, 0x71, 0xb2, 0x9b, 0xb0, 0x77, 0x8c, 0x45, 0xa1, 0x58, 0x95, 0x6a, 0x96, 0x54, 0x5d, 0xd9, - 0x53, 0x99, 0x25, 0x8a, 0x0b, 0xf8, 0x60, 0x60, 0x0f, 0x03, 0xf8, 0x64, 0xff, 0x82, 0xbd, 0xec, - 0xc1, 0x0b, 0xf8, 0xe4, 0x5f, 0xe0, 0x9f, 0xe0, 0x8b, 0x01, 0x5f, 0x7c, 0x33, 0x60, 0x18, 0xbe, - 0x1a, 0xbe, 0x19, 0x46, 0x3e, 0xaa, 0xba, 0xfa, 0x45, 0x52, 0x8b, 0x1d, 0xc0, 0x87, 0xbd, 0x55, - 0x45, 0x7c, 0xf9, 0x8a, 0x8c, 0x2f, 0x32, 0xb2, 0xa2, 0xe0, 0x7d, 0xdf, 0x7b, 0x4d, 0x5e, 0x79, - 0xdc, 0xb2, 0x47, 0x24, 0xe0, 0x16, 0xf3, 0xc6, 0x91, 0x6f, 0x73, 0x8f, 0x06, 0x9d, 0x49, 0x48, - 0x39, 0x45, 0x45, 0xad, 0x37, 0x3f, 0x90, 0x80, 0x47, 0x73, 0x70, 0xc2, 0x58, 0x82, 0x35, 0xdf, - 0x1f, 0x51, 0x3a, 0xf2, 0xc9, 0x23, 0xf9, 0x76, 0x1a, 0xbd, 0x78, 0xe4, 0x46, 0x61, 0xaa, 0x2f, - 0xf3, 0xf6, 0xbc, 0x9e, 0x7b, 0x63, 0xc2, 0xb8, 0x3d, 0x9e, 0x68, 0xc0, 0xad, 0xb8, 0x77, 0xc7, - 0xa7, 0x91, 0xab, 0xc6, 0xd0, 0xaa, 0x56, 0xac, 0x1a, 0x53, 0x97, 0xf8, 0x4c, 0x49, 0xef, 0xfe, - 0xb3, 0x01, 0xad, 0x41, 0x32, 0x65, 0x1c, 0x05, 0x83, 0x68, 0x3c, 0xb6, 0xc3, 0x0b, 0xb4, 0x09, - 0x85, 0x89, 0xcd, 0x18, 0x71, 0xdb, 0x99, 0x3b, 0x99, 0xfb, 0x79, 0xac, 0xdf, 0x84, 0xfc, 0x85, - 0xed, 0xf9, 0xc4, 0x6d, 0x67, 0x95, 0x5c, 0xbd, 0xa1, 0xf7, 0x00, 0x46, 0xd4, 0x0b, 0x46, 0xd6, - 0x39, 0xf1, 0xfd, 0xb6, 0x71, 0x27, 0x73, 0xbf, 0x8c, 0xcb, 0x52, 0xf2, 0xe7, 0xc4, 0xf7, 0x85, - 0x9a, 0x53, 0xcb, 0x1b, 0x4f, 0x42, 0xfa, 0x9a, 0xb4, 0x73, 0x4a, 0xcd, 0xe9, 0xbe, 0x12, 0xa0, - 0x2f, 0xa0, 0xe0, 0x31, 0x16, 0x11, 0xd6, 0xce, 0xdf, 0x31, 0xee, 0x57, 0xb6, 0x3e, 0xec, 0xe8, - 0xd9, 0x76, 0x96, 0x4d, 0xae, 0xb3, 0x2f, 0xb0, 0x58, 0x37, 0x41, 0x5f, 0x43, 0xd5, 0x39, 0xb3, - 0xb9, 0x75, 0xe6, 0x31, 0x4e, 0xc3, 0x8b, 0x76, 0x41, 0x76, 0xd1, 0xb9, 0xbc, 0x8b, 0xdd, 0x33, - 0x9b, 0xf7, 0x55, 0x83, 0x5e, 0xc0, 0xc3, 0x0b, 0x5c, 0x71, 0xa6, 0x12, 0xf3, 0x1b, 0x68, 0xce, - 0x03, 0x50, 0x13, 0x8c, 0x57, 0xe4, 0x42, 0x9a, 0xa3, 0x8c, 0xc5, 0x23, 0x7a, 0x0c, 0xf9, 0xd7, - 0xb6, 0x1f, 0x11, 0x69, 0x8a, 0xca, 0x96, 0x99, 0x8c, 0xa8, 0xec, 0x2e, 0x7a, 0xd8, 0xa5, 0x01, - 0x27, 0x6f, 0x38, 0x56, 0xc0, 0xcf, 0xb3, 0x7f, 0x9c, 0x31, 0x2d, 0xc8, 0xcb, 0xf9, 0xa3, 0x3b, - 0x50, 0x71, 0x09, 0x73, 0x42, 0x6f, 0x22, 0xe6, 0xa6, 0x3b, 0x4e, 0x8b, 0xd0, 0xfb, 0x00, 0x2c, - 0x1a, 0x8d, 0x08, 0x93, 0x80, 0xac, 0x04, 0xa4, 0x24, 0xa8, 0x05, 0x79, 0xdf, 0x3e, 0x25, 0xb1, - 0xbd, 0xd5, 0xcb, 0xdd, 0x7f, 0x78, 0x0a, 0xb5, 0x99, 0x35, 0xa3, 0x3a, 0x64, 0x3d, 0x57, 0x0f, - 0x90, 0xf5, 0xe4, 0x66, 0x4d, 0x42, 0xfa, 0x92, 0x38, 0xdc, 0xf2, 0x5c, 0xdd, 0x6f, 0x59, 0x4b, - 0xf6, 0x5d, 0xf4, 0x04, 0x0a, 0x8c, 0xdb, 0x3c, 0x62, 0xb2, 0xdf, 0xfa, 0xd6, 0x7b, 0xcb, 0x4d, - 0xd9, 0x19, 0x48, 0x10, 0xd6, 0x60, 0xf4, 0x10, 0xd6, 0x94, 0x53, 0xa7, 0x57, 0xa5, 0xb6, 0xba, - 0x29, 0x15, 0x7b, 0xa9, 0xa5, 0xb5, 0x20, 0x4f, 0xc2, 0x90, 0x86, 0xed, 0xbc, 0x9a, 0xba, 0x7c, - 0x41, 0xdb, 0x00, 0x4e, 0x48, 0x6c, 0x4e, 0x5c, 0xcb, 0xe6, 0xed, 0x82, 0x36, 0xab, 0xf2, 0xfa, - 0x4e, 0xec, 0xf5, 0x9d, 0x61, 0xec, 0xf5, 0xb8, 0xac, 0xd1, 0x3b, 0x1c, 0x75, 0x20, 0xf7, 0x92, - 0x9e, 0xb2, 0x76, 0x51, 0xee, 0xbe, 0xb9, 0x62, 0xca, 0xcf, 0xe8, 0x29, 0x96, 0x38, 0x61, 0x03, - 0x35, 0xdb, 0xc0, 0x1e, 0x93, 0x76, 0x59, 0xd9, 0x40, 0x4a, 0x8e, 0xec, 0x31, 0x41, 0x5f, 0x42, - 0x9d, 0x39, 0x24, 0xb0, 0x43, 0x8f, 0x5a, 0xa3, 0x90, 0x46, 0x93, 0x36, 0xc8, 0xd9, 0x6c, 0x4e, - 0x3b, 0xd6, 0xea, 0xa7, 0x42, 0x8b, 0x6b, 0x2c, 0xfd, 0x8a, 0x9e, 0x40, 0x89, 0x04, 0xae, 0x5a, - 0x46, 0xe5, 0xca, 0x65, 0x14, 0x25, 0x76, 0x87, 0xa3, 0x77, 0xa0, 0xfc, 0x92, 0x9e, 0x5a, 0x0e, - 0x8d, 0x02, 0xde, 0xae, 0x4a, 0x82, 0x95, 0x5e, 0xd2, 0xd3, 0x5d, 0xf1, 0x8e, 0x3e, 0x80, 0xaa, - 0x22, 0xa1, 0xd6, 0xd7, 0xa4, 0xbe, 0xa2, 0x64, 0x09, 0x44, 0xf1, 0x51, 0x43, 0xea, 0x0a, 0xa2, - 0x64, 0x0a, 0xf2, 0x43, 0x68, 0x04, 0xd1, 0x38, 0x15, 0xa7, 0x58, 0xbb, 0x21, 0x51, 0xf5, 0x20, - 0x1a, 0x4f, 0x8d, 0xc5, 0xd0, 0x16, 0xe4, 0x23, 0x66, 0x8f, 0x48, 0xbb, 0x29, 0xe7, 0xff, 0xee, - 0x0a, 0x8b, 0x9e, 0x08, 0x0c, 0x56, 0x50, 0xe1, 0xd2, 0x0e, 0x0d, 0x9c, 0x28, 0x0c, 0x49, 0xe0, - 0x5c, 0xb4, 0xd7, 0xd4, 0xf0, 0x29, 0x11, 0x7a, 0x08, 0x39, 0x11, 0x80, 0xda, 0x48, 0x7a, 0xd6, - 0xcd, 0x25, 0x9d, 0x1e, 0x52, 0x97, 0x60, 0x09, 0x42, 0x5f, 0x40, 0x71, 0x4c, 0x78, 0xe8, 0x39, - 0xac, 0xbd, 0x2e, 0x27, 0xf1, 0xc1, 0x8a, 0x49, 0xe0, 0x28, 0x38, 0x54, 0x40, 0x1c, 0xb7, 0x10, - 0xb6, 0x60, 0x8a, 0xec, 0xd6, 0x2f, 0x19, 0x77, 0xdb, 0xad, 0x3b, 0x99, 0xfb, 0x55, 0x5c, 0xd1, - 0xb2, 0x6f, 0x18, 0x77, 0xcd, 0x7f, 0xc9, 0x83, 0xf1, 0x8c, 0x9e, 0x2e, 0xf0, 0x63, 0x3b, 0x21, - 0x40, 0x56, 0x4e, 0xf3, 0x83, 0xd5, 0xde, 0x34, 0x4f, 0x82, 0xbb, 0x50, 0xf5, 0x02, 0xc6, 0xc3, - 0xc8, 0x51, 0xb6, 0x55, 0xcc, 0x9c, 0x91, 0x4d, 0x7d, 0x3f, 0x97, 0xf6, 0xfd, 0x1f, 0x03, 0x52, - 0x0e, 0x49, 0xde, 0x4c, 0x88, 0xc3, 0xf5, 0xde, 0x28, 0x7a, 0x28, 0x62, 0xf5, 0x52, 0x8a, 0x29, - 0xf7, 0x0b, 0x29, 0xee, 0x23, 0x04, 0x39, 0x6e, 0x8f, 0x14, 0x0b, 0xca, 0x58, 0x3e, 0x0b, 0xa7, - 0x0a, 0x29, 0x1d, 0x2b, 0x47, 0x2f, 0x49, 0x74, 0x49, 0x08, 0xa4, 0x9f, 0x6f, 0x03, 0x30, 0x6e, - 0x87, 0x9a, 0x71, 0x70, 0x35, 0xe3, 0x34, 0x7a, 0x87, 0xff, 0xae, 0x3e, 0x7e, 0x13, 0x8a, 0x72, - 0x3a, 0x9e, 0x2b, 0x3d, 0xbc, 0x8c, 0x0b, 0xe2, 0x75, 0xdf, 0x45, 0x3f, 0x89, 0x1d, 0xae, 0x26, - 0x3b, 0xbb, 0x73, 0x89, 0xd1, 0x67, 0x9c, 0x2e, 0xe5, 0x25, 0xf5, 0x4b, 0xbd, 0xe4, 0x19, 0x3d, - 0x9d, 0xf7, 0x12, 0xf3, 0x17, 0x90, 0x97, 0x9d, 0xa1, 0xfb, 0xd0, 0x14, 0x91, 0xda, 0xe2, 0x51, - 0x18, 0x30, 0x4d, 0x1f, 0x75, 0xf4, 0xd5, 0x85, 0x7c, 0x28, 0xc4, 0x8a, 0x41, 0x0f, 0x60, 0xcd, - 0x8e, 0x5c, 0x8f, 0xce, 0x40, 0xd5, 0x69, 0xd8, 0x90, 0x8a, 0x29, 0xf6, 0x2e, 0x85, 0x82, 0x72, - 0x10, 0x84, 0xa0, 0x3e, 0x18, 0xee, 0x0c, 0x4f, 0x06, 0xd6, 0x71, 0xef, 0x68, 0x6f, 0xff, 0xe8, - 0x69, 0xf3, 0x46, 0x4a, 0x86, 0x4f, 0x8e, 0x8e, 0x84, 0x2c, 0x83, 0x5a, 0xd0, 0xd4, 0xb2, 0xdd, - 0xe7, 0x87, 0xc7, 0x07, 0xbd, 0x61, 0x6f, 0xaf, 0x99, 0x45, 0x6b, 0x50, 0xd3, 0xd2, 0xaf, 0x76, - 0xf6, 0x0f, 0x7a, 0x7b, 0x4d, 0x23, 0x0d, 0xdc, 0x39, 0xda, 0xed, 0x1d, 0x08, 0x69, 0xee, 0x59, - 0xae, 0x54, 0x6e, 0x82, 0xf9, 0x4f, 0xf7, 0x00, 0xa6, 0xab, 0x45, 0x0f, 0xa0, 0x6e, 0x3b, 0x4e, - 0x14, 0xda, 0xce, 0x85, 0xc5, 0x1c, 0x1a, 0x12, 0xb9, 0xb2, 0x6c, 0xff, 0x06, 0xae, 0xc5, 0xf2, - 0x81, 0x10, 0x7f, 0x97, 0xc9, 0xa0, 0x0e, 0x34, 0x85, 0x03, 0x86, 0x1e, 0x09, 0x1c, 0xa2, 0xd1, - 0x59, 0x89, 0xce, 0xe0, 0xc6, 0x54, 0x93, 0xe0, 0x3f, 0x86, 0x06, 0xb7, 0xd9, 0x2b, 0xcb, 0xa1, - 0xe3, 0x89, 0x4f, 0x64, 0xcc, 0x37, 0x24, 0x3c, 0x8b, 0xeb, 0x42, 0xb1, 0x9b, 0xc8, 0x05, 0xfa, - 0x33, 0x30, 0x18, 0xe7, 0xd2, 0xf1, 0x2b, 0x5b, 0xf7, 0xae, 0xdc, 0xa7, 0xce, 0x60, 0x38, 0xc4, - 0xa2, 0x85, 0x68, 0xe8, 0xfb, 0x63, 0x49, 0x87, 0x6b, 0x35, 0x3c, 0x38, 0x38, 0xc4, 0xa2, 0x85, - 0x68, 0xc8, 0x39, 0xd3, 0x67, 0xc9, 0x35, 0x1a, 0x0e, 0x87, 0x03, 0x2c, 0x5a, 0x20, 0x0c, 0x55, - 0x87, 0x06, 0xaf, 0x49, 0xc8, 0x24, 0xac, 0x5d, 0x94, 0x3d, 0x74, 0xae, 0xee, 0x61, 0x37, 0xd5, - 0x0a, 0xcf, 0xf4, 0x81, 0x7e, 0x0a, 0x79, 0xe9, 0x34, 0xed, 0xb2, 0x3c, 0xa5, 0x7e, 0x70, 0x8d, - 0xe9, 0x44, 0x61, 0x80, 0x55, 0x23, 0x74, 0x1b, 0x2a, 0x2f, 0x23, 0x77, 0x44, 0x54, 0x0a, 0x27, - 0xc9, 0x5a, 0xc6, 0x20, 0x45, 0x22, 0x68, 0xfa, 0xe8, 0x63, 0x40, 0x67, 0x36, 0xb3, 0x42, 0x32, - 0xa6, 0x9c, 0xc4, 0xb9, 0xa5, 0x64, 0x59, 0x09, 0x37, 0xcf, 0x6c, 0x86, 0xa5, 0x62, 0xa0, 0xe4, - 0xe8, 0x01, 0x64, 0xf9, 0x63, 0x4d, 0xb6, 0xcb, 0x98, 0x9b, 0xe5, 0x8f, 0xd1, 0x3d, 0x15, 0xd8, - 0x3d, 0x46, 0x02, 0xc2, 0x14, 0xcf, 0xb2, 0x7d, 0x03, 0xa7, 0x85, 0x62, 0x7b, 0xb7, 0x61, 0x33, - 0x0a, 0x02, 0xe2, 0x10, 0xc6, 0x44, 0xdc, 0xe5, 0x94, 0xfa, 0x96, 0x63, 0xfb, 0xbe, 0x3a, 0x63, - 0x4a, 0xfd, 0x1c, 0x6e, 0xa5, 0xf4, 0x43, 0x4a, 0xfd, 0x5d, 0xa1, 0xd5, 0x7e, 0xe7, 0x05, 0x2f, - 0x68, 0x38, 0x96, 0x56, 0xb0, 0x7c, 0xca, 0x98, 0x3c, 0x79, 0x4a, 0xfd, 0x3c, 0x6e, 0xa4, 0x34, - 0x07, 0x54, 0x0d, 0xf5, 0x13, 0x68, 0x85, 0xc4, 0x8d, 0x02, 0xd7, 0x16, 0x69, 0x34, 0xb7, 0x39, - 0x19, 0x93, 0x80, 0x33, 0x79, 0xe6, 0x94, 0xfa, 0x05, 0xbc, 0x9e, 0x68, 0x07, 0x89, 0x52, 0x79, - 0xe0, 0xc6, 0x84, 0xd2, 0xd0, 0xfa, 0x36, 0x52, 0x49, 0x94, 0xf5, 0x6d, 0x64, 0xfb, 0x1e, 0xbf, - 0x90, 0x27, 0x52, 0xa9, 0x5f, 0xc4, 0xeb, 0x42, 0xfd, 0xb5, 0xd6, 0x7e, 0xad, 0x94, 0xa2, 0xe1, - 0xcf, 0xa0, 0x9d, 0xde, 0x4b, 0x6b, 0x12, 0xd2, 0x51, 0xa8, 0x4d, 0xbc, 0x2e, 0xed, 0x51, 0xc2, - 0x37, 0xd3, 0x88, 0xe3, 0x29, 0xe0, 0xbb, 0x4c, 0xc6, 0xfc, 0xbb, 0x02, 0x18, 0x83, 0xe1, 0x10, - 0x6d, 0x80, 0x71, 0x4e, 0xc2, 0x84, 0x81, 0xe2, 0x45, 0x74, 0x7f, 0x0b, 0xf2, 0xe7, 0x34, 0x74, - 0xd5, 0x91, 0x53, 0xeb, 0x67, 0xb0, 0x7a, 0x15, 0xaa, 0x8f, 0xa0, 0x22, 0x9e, 0x2d, 0x79, 0x4e, - 0xa8, 0x23, 0xa5, 0xd6, 0xcf, 0x62, 0x10, 0xc2, 0x9e, 0x94, 0x09, 0xd4, 0x06, 0x18, 0x0e, 0x51, - 0x67, 0x8a, 0xd8, 0x1a, 0xf1, 0xa2, 0xfb, 0x75, 0xce, 0xec, 0x90, 0xc9, 0x14, 0xa7, 0xd6, 0xcf, - 0x61, 0xf5, 0xaa, 0xfb, 0x15, 0xcf, 0x71, 0xbf, 0x20, 0x01, 0x79, 0x0c, 0x42, 0x38, 0xed, 0xf7, - 0x1e, 0x54, 0x19, 0x17, 0x49, 0x9d, 0x6f, 0x5f, 0x58, 0x63, 0x26, 0x4f, 0x90, 0x5a, 0xbf, 0x80, - 0x81, 0x71, 0xbe, 0x27, 0x84, 0x87, 0x12, 0xb6, 0x05, 0x88, 0x04, 0xdc, 0xe3, 0x17, 0x56, 0x48, - 0x1c, 0x3a, 0x0a, 0x3c, 0x49, 0x9a, 0x8a, 0x9c, 0x4d, 0x11, 0xaf, 0x29, 0x1d, 0x9e, 0xaa, 0xe2, - 0x58, 0x23, 0xe4, 0x1e, 0x61, 0x56, 0xc4, 0x39, 0x09, 0x89, 0x3a, 0x13, 0x6a, 0xfd, 0x12, 0x6e, - 0xc4, 0x9a, 0x13, 0xa5, 0x10, 0xf8, 0x4f, 0x61, 0x3d, 0xc1, 0xeb, 0x51, 0x7e, 0x49, 0x5c, 0xe9, - 0xc2, 0xb5, 0x7e, 0x19, 0xa3, 0x58, 0x89, 0x13, 0x9d, 0x68, 0x75, 0x1f, 0x6a, 0xd3, 0x99, 0xd9, - 0xbe, 0xaf, 0xbd, 0x17, 0x70, 0x35, 0x99, 0x94, 0xed, 0xfb, 0x02, 0xf9, 0x27, 0x70, 0x2b, 0xe9, - 0xdf, 0x76, 0xbe, 0x8d, 0xbc, 0x90, 0xb8, 0xc9, 0xc4, 0x1a, 0x72, 0x94, 0x0a, 0xbe, 0x19, 0x43, - 0x76, 0x34, 0x22, 0x35, 0xc1, 0x1e, 0xbc, 0xbb, 0xd8, 0x41, 0x6a, 0xa6, 0x4d, 0xd9, 0x47, 0x15, - 0x9b, 0xf3, 0x7d, 0xcc, 0xcc, 0xb8, 0x5b, 0x80, 0x9c, 0x75, 0x4e, 0xc2, 0x6e, 0x09, 0x0a, 0x96, - 0xf4, 0x82, 0x6e, 0x1d, 0xaa, 0x56, 0xca, 0x07, 0x24, 0xc2, 0xd1, 0x08, 0xb9, 0x9f, 0x12, 0x91, - 0xda, 0xcd, 0x6e, 0x03, 0x6a, 0x56, 0x7a, 0xdf, 0xba, 0x1b, 0xb0, 0x6e, 0x2d, 0xee, 0x50, 0x77, - 0x1d, 0xd6, 0xac, 0xf9, 0x4d, 0xe8, 0x6e, 0x42, 0xcb, 0x5a, 0x62, 0xe9, 0x6e, 0x13, 0xea, 0xd6, - 0x8c, 0x2d, 0xbb, 0xef, 0x82, 0x69, 0xad, 0xb4, 0x59, 0xf7, 0x36, 0xbc, 0x67, 0x5d, 0x66, 0x10, - 0xf3, 0xd7, 0x19, 0x30, 0x0e, 0x0e, 0x0e, 0xd1, 0xbb, 0x50, 0xe4, 0xfc, 0x05, 0x17, 0xfe, 0x95, - 0x91, 0x36, 0xba, 0x81, 0x0b, 0x42, 0xa0, 0x7c, 0x4b, 0x69, 0x99, 0xd0, 0xc6, 0xec, 0x10, 0x5a, - 0xa6, 0xb4, 0x8f, 0x60, 0x8d, 0xd3, 0x57, 0x24, 0x60, 0xd6, 0x84, 0x84, 0x16, 0x23, 0x0e, 0x0d, - 0xdc, 0xe4, 0x0c, 0x6a, 0x28, 0xd5, 0x31, 0x09, 0x07, 0x52, 0x21, 0xcc, 0x0b, 0x50, 0xb2, 0xf4, - 0x68, 0xf1, 0xb3, 0xe8, 0xbb, 0xdb, 0x02, 0x64, 0x2d, 0xf4, 0x64, 0xfe, 0xaa, 0x00, 0xc6, 0x70, - 0x38, 0xd0, 0x93, 0x38, 0x9d, 0x4e, 0x42, 0x4d, 0xf1, 0xf4, 0x30, 0x66, 0x9f, 0x60, 0xb5, 0xa1, - 0x4f, 0xca, 0x05, 0x56, 0x17, 0x35, 0x69, 0x57, 0xb2, 0x5a, 0xd1, 0xca, 0x58, 0xc1, 0xea, 0xb2, - 0xec, 0x37, 0xb7, 0xc8, 0xea, 0x98, 0xb4, 0x2b, 0x59, 0x5d, 0x89, 0xe9, 0x3a, 0xcb, 0xea, 0xe5, - 0x74, 0xad, 0xbf, 0x35, 0x5d, 0x1b, 0x6f, 0x4f, 0xd7, 0xe6, 0x5b, 0xd2, 0x75, 0xed, 0x77, 0xa2, - 0x2b, 0xfa, 0x3d, 0xd0, 0x75, 0xfd, 0x7a, 0x74, 0xd5, 0x3e, 0x24, 0x5c, 0xe3, 0xf7, 0x42, 0xdd, - 0xff, 0x97, 0x4c, 0xfd, 0xef, 0x22, 0x54, 0xd3, 0x99, 0x8d, 0xa4, 0x5d, 0x14, 0x06, 0x16, 0xb7, - 0x5f, 0x79, 0xc1, 0x68, 0x2e, 0xaf, 0x6c, 0x08, 0xd5, 0x50, 0x6a, 0x92, 0x4c, 0xf1, 0x0b, 0x68, - 0x9f, 0x11, 0x5b, 0x18, 0x62, 0x8b, 0x58, 0xbe, 0xcd, 0xc5, 0x7d, 0xd0, 0x9a, 0x3c, 0x79, 0x1c, - 0x33, 0x2a, 0xdf, 0xcf, 0xe0, 0x96, 0x44, 0xf4, 0xb6, 0xc8, 0x81, 0xd2, 0x1f, 0x3f, 0x79, 0xac, - 0xf8, 0xb5, 0xbc, 0xf1, 0xf6, 0x13, 0xd1, 0xd8, 0x90, 0x8d, 0xb3, 0x8b, 0x8d, 0xb7, 0x9f, 0x5c, - 0xda, 0x78, 0x5b, 0x34, 0xce, 0xc9, 0xc6, 0xc6, 0x92, 0xc6, 0xdb, 0xaa, 0xf1, 0xc7, 0xd0, 0xe4, - 0xde, 0x98, 0x58, 0x9c, 0x5a, 0x17, 0x1e, 0xf1, 0x5d, 0xd1, 0x28, 0xaf, 0xcf, 0xd2, 0x9a, 0xd0, - 0x0c, 0xe9, 0xcf, 0x85, 0x3c, 0x1e, 0xea, 0x26, 0xa1, 0xdc, 0x1a, 0x7b, 0x6c, 0x12, 0x12, 0xd7, - 0x93, 0x37, 0x3e, 0x7d, 0x45, 0x28, 0x68, 0xaa, 0x6e, 0x10, 0xca, 0x0f, 0xd3, 0x7a, 0x79, 0x55, - 0xd0, 0xae, 0x4f, 0x5f, 0x93, 0xd0, 0xb7, 0x27, 0x96, 0xfc, 0xee, 0x27, 0xa3, 0x46, 0xb6, 0x5f, - 0xc0, 0x55, 0x2d, 0xc6, 0x42, 0xaa, 0x63, 0x5e, 0x8c, 0x64, 0x13, 0x42, 0x9c, 0xb3, 0xe9, 0xc9, - 0x5c, 0xc4, 0x0d, 0xad, 0x1a, 0x48, 0x8d, 0x9a, 0xd7, 0x43, 0x68, 0x70, 0xca, 0x6d, 0x3f, 0x05, - 0x2f, 0x6b, 0xea, 0xd6, 0xa4, 0x22, 0x0d, 0xfe, 0x0c, 0x36, 0xec, 0xf3, 0x57, 0xe7, 0xc2, 0x62, - 0xcc, 0xf3, 0xe5, 0x45, 0x40, 0x2d, 0xa1, 0xa2, 0xa9, 0xbb, 0xae, 0xd5, 0x03, 0xa5, 0x4d, 0x16, - 0xd0, 0x81, 0x66, 0x14, 0xd8, 0x01, 0x3b, 0x17, 0x3e, 0xa5, 0xee, 0x47, 0xfa, 0x40, 0x07, 0xdc, - 0x98, 0x6a, 0xe4, 0x05, 0x49, 0xe0, 0xbf, 0x84, 0xf6, 0x0b, 0xdb, 0x67, 0xc4, 0xf2, 0x02, 0x4e, - 0xc2, 0x30, 0x9a, 0xa4, 0xcc, 0x55, 0xd3, 0x04, 0xde, 0x94, 0x88, 0xfd, 0x14, 0x20, 0x19, 0xee, - 0x47, 0x50, 0x4f, 0xef, 0xe8, 0x98, 0xe9, 0x70, 0x54, 0xc5, 0x55, 0x92, 0x6c, 0xa4, 0x5c, 0x92, - 0x8a, 0xed, 0xf3, 0xee, 0xda, 0x7d, 0x07, 0x6e, 0x59, 0xab, 0x7c, 0x72, 0x95, 0x52, 0xfa, 0xdc, - 0x4a, 0xa5, 0xf0, 0x29, 0xc9, 0xd4, 0x79, 0x9f, 0xe9, 0x9a, 0xd0, 0xb6, 0x56, 0xb8, 0x86, 0x64, - 0xeb, 0xcc, 0xce, 0xcb, 0xf9, 0x2e, 0xec, 0x70, 0x17, 0x41, 0xd3, 0x9a, 0xdb, 0xc6, 0x6e, 0x1b, - 0x36, 0xad, 0xa5, 0xbb, 0x25, 0xa7, 0x31, 0xbf, 0x1d, 0x72, 0xe2, 0xab, 0x6c, 0xde, 0x5d, 0x83, - 0x86, 0x35, 0x6b, 0x51, 0xf3, 0xb7, 0x45, 0xc8, 0x89, 0xfd, 0x42, 0x2d, 0xc8, 0x7b, 0x81, 0x4b, - 0xde, 0xa8, 0x03, 0x1a, 0xab, 0x17, 0xf4, 0x10, 0x72, 0x21, 0xf5, 0x89, 0xfe, 0x50, 0x72, 0x73, - 0xc9, 0x27, 0x50, 0x4c, 0x7d, 0x82, 0x25, 0x08, 0xbd, 0x0f, 0x25, 0xf9, 0xf9, 0x20, 0x26, 0xad, - 0x38, 0x43, 0x8b, 0x52, 0xa2, 0xfc, 0xce, 0x84, 0x02, 0x09, 0xdc, 0x98, 0x95, 0x32, 0x09, 0x26, - 0x81, 0x26, 0xd6, 0x7c, 0x1a, 0x9a, 0x8f, 0xb3, 0xe0, 0xd9, 0x34, 0xf4, 0x43, 0xa8, 0xf8, 0xfe, - 0x38, 0x3e, 0xde, 0x35, 0xe7, 0x0c, 0x5c, 0xf6, 0xfd, 0xf1, 0x30, 0xc9, 0x27, 0xa6, 0x20, 0x99, - 0x53, 0x14, 0x35, 0x9b, 0x35, 0x88, 0x25, 0x49, 0x87, 0x04, 0x4d, 0x14, 0xb1, 0xb2, 0xfd, 0x3c, - 0x2e, 0x08, 0xc0, 0x24, 0xee, 0x82, 0x73, 0x16, 0x87, 0x7d, 0xcd, 0xa5, 0x02, 0x2e, 0x73, 0xce, - 0x86, 0x49, 0x52, 0xb0, 0xe8, 0x9f, 0xa0, 0x29, 0x3a, 0xef, 0x9f, 0xe8, 0x53, 0x68, 0x2d, 0xba, - 0xd3, 0x58, 0x1d, 0xdf, 0xf9, 0x7e, 0x09, 0xaf, 0xcd, 0x85, 0xa7, 0xd5, 0xb1, 0xa9, 0xaa, 0x39, - 0xba, 0x18, 0x9b, 0x96, 0x46, 0xec, 0x9a, 0x3e, 0x5d, 0x97, 0x45, 0xec, 0xa5, 0xb7, 0xbe, 0xca, - 0xc2, 0xad, 0xef, 0x31, 0xac, 0x2d, 0x38, 0xb6, 0xbe, 0xf0, 0x55, 0x71, 0x73, 0x3e, 0xda, 0xe9, - 0x8f, 0x06, 0x73, 0x2e, 0xab, 0xef, 0x7a, 0x35, 0x5c, 0x9f, 0x0d, 0x2d, 0xca, 0xd6, 0x30, 0x75, - 0x63, 0x7d, 0xc1, 0xab, 0xe3, 0x94, 0x4c, 0x10, 0xbc, 0x02, 0x65, 0x2b, 0x76, 0xae, 0x6e, 0x19, - 0x8a, 0x96, 0xf2, 0xa4, 0xc5, 0x3c, 0x58, 0x9c, 0xb6, 0x29, 0x17, 0x49, 0xbf, 0xb3, 0x38, 0x23, - 0xd4, 0x1b, 0x2f, 0x75, 0xa9, 0x6d, 0x5e, 0xc2, 0x8f, 0xee, 0x4d, 0xd8, 0xb0, 0x96, 0xed, 0xdc, - 0xf2, 0x20, 0xb0, 0x3c, 0x0c, 0xc9, 0x04, 0x60, 0x6a, 0x53, 0x89, 0x5a, 0xb0, 0xa8, 0x24, 0xff, - 0x9c, 0xd5, 0xba, 0x35, 0xa8, 0xa4, 0x28, 0x2e, 0xe7, 0x37, 0xfb, 0xa5, 0x47, 0x65, 0x0d, 0x73, - 0x1f, 0x74, 0x54, 0x1c, 0x99, 0xfd, 0x6a, 0xb3, 0x30, 0x89, 0x5b, 0x70, 0xd3, 0x5a, 0x7e, 0x99, - 0x97, 0x7d, 0xce, 0x5f, 0xd6, 0xa5, 0x21, 0x96, 0xdd, 0xc8, 0x65, 0x80, 0x5a, 0x7a, 0xe5, 0x96, - 0xb1, 0x68, 0xd5, 0x9d, 0xda, 0xfc, 0x57, 0x03, 0x60, 0xfa, 0x5d, 0xf7, 0x7b, 0xfd, 0x86, 0xf5, - 0x47, 0x80, 0x92, 0x8f, 0xfd, 0x13, 0x9b, 0x31, 0x11, 0x83, 0x49, 0x72, 0x85, 0x68, 0xc6, 0xba, - 0x63, 0x9b, 0x31, 0x6c, 0x73, 0xf2, 0x87, 0x0f, 0x59, 0xd7, 0x76, 0x34, 0x91, 0xca, 0x2e, 0x9a, - 0xd6, 0xfc, 0x9f, 0x1c, 0x14, 0x76, 0x65, 0xe9, 0xc6, 0xfc, 0x37, 0x03, 0x8a, 0x98, 0x48, 0xd7, - 0x98, 0xab, 0x4b, 0x65, 0xe6, 0xeb, 0x52, 0xb3, 0x25, 0x9b, 0xec, 0x7c, 0xc9, 0x66, 0x49, 0x65, - 0x23, 0xb7, 0xb4, 0xb2, 0xb1, 0x09, 0x85, 0x90, 0x8c, 0x84, 0x29, 0x0a, 0xfa, 0x03, 0xb4, 0x7c, - 0x43, 0xdd, 0x85, 0x9a, 0x4f, 0xf1, 0xb2, 0x9a, 0x8f, 0x70, 0xbd, 0x99, 0xaa, 0x4f, 0x2a, 0x64, - 0xc6, 0x15, 0x90, 0x92, 0xce, 0x6b, 0xd3, 0x42, 0x95, 0x8e, 0xa9, 0x32, 0x48, 0xf9, 0x3a, 0x65, - 0x90, 0x1f, 0x41, 0xf3, 0xd4, 0x76, 0x5e, 0x89, 0x29, 0x05, 0xae, 0x15, 0x50, 0x8f, 0x11, 0x79, - 0x90, 0x94, 0x70, 0x63, 0x2a, 0x3f, 0x12, 0x62, 0xf4, 0x29, 0x6c, 0xfa, 0xf4, 0x3c, 0x26, 0x98, - 0x35, 0xf6, 0x9c, 0x90, 0x4e, 0xce, 0x68, 0x40, 0xe4, 0x41, 0x52, 0xc2, 0x2d, 0x9f, 0x9e, 0xeb, - 0x6f, 0x5a, 0x87, 0x89, 0x0e, 0xdd, 0x86, 0xca, 0xc4, 0x76, 0x5e, 0x11, 0xae, 0x3e, 0xbb, 0xa9, - 0x0f, 0x86, 0xa0, 0x44, 0x07, 0x82, 0xdb, 0x62, 0xbb, 0x67, 0x4d, 0x93, 0x84, 0x0b, 0xbd, 0xa8, - 0x67, 0xb9, 0x92, 0xd1, 0xcc, 0xe1, 0xc5, 0x0a, 0xa0, 0xf9, 0x37, 0x19, 0x28, 0x61, 0xc2, 0x26, - 0x34, 0x60, 0x04, 0x3d, 0x80, 0xb5, 0xe9, 0xfe, 0x58, 0x61, 0x14, 0x4c, 0x37, 0xba, 0xc1, 0xd2, - 0x7e, 0xb8, 0xef, 0xa2, 0x01, 0x6c, 0x4e, 0x42, 0xc2, 0xbc, 0x51, 0x40, 0x5c, 0x6b, 0x42, 0x19, - 0xb7, 0x42, 0xe5, 0x27, 0xba, 0xde, 0x3a, 0x2d, 0x4b, 0x1e, 0xc7, 0xb0, 0x63, 0xca, 0xb8, 0x76, - 0x26, 0xdc, 0x9a, 0x2c, 0x91, 0x9a, 0xbf, 0xce, 0xc0, 0xfa, 0x2e, 0x0d, 0x5e, 0x78, 0xe1, 0x78, - 0x40, 0xa3, 0xd0, 0x21, 0x27, 0x13, 0x9f, 0xda, 0xae, 0xf9, 0x57, 0xd7, 0xf6, 0xc2, 0xa5, 0x4b, - 0xc8, 0x2e, 0x5f, 0xc2, 0x0f, 0xa1, 0xe1, 0x50, 0x97, 0x88, 0x9b, 0x55, 0x78, 0x31, 0xa1, 0x5e, - 0xc0, 0x75, 0x41, 0xa8, 0x2e, 0xc4, 0xbd, 0x44, 0x6a, 0xc2, 0xd4, 0x46, 0xe6, 0xdf, 0x66, 0xc0, - 0x78, 0x4a, 0xb8, 0x39, 0xfc, 0x3e, 0xa6, 0x64, 0x7e, 0x9a, 0xda, 0x8d, 0xfb, 0x60, 0x84, 0x91, - 0xaa, 0x3c, 0xcf, 0x78, 0x79, 0xba, 0x09, 0x16, 0x10, 0xf3, 0x3f, 0x0c, 0xc8, 0x1d, 0x78, 0x8c, - 0x9b, 0xff, 0x9e, 0xbd, 0xf6, 0xac, 0x3e, 0x9f, 0xab, 0xa2, 0x5d, 0x5e, 0x46, 0xee, 0xdf, 0x88, - 0x6b, 0x68, 0x82, 0x1f, 0x3f, 0x05, 0x98, 0xd8, 0x23, 0xa2, 0x3e, 0xc7, 0x48, 0x9b, 0x55, 0xb6, - 0xda, 0x49, 0xfb, 0xa1, 0x90, 0x1e, 0xdb, 0x23, 0x2f, 0x90, 0x9d, 0xf4, 0x33, 0xb8, 0x2c, 0xd0, - 0x52, 0x2c, 0x5a, 0x7f, 0x02, 0xb9, 0x17, 0x21, 0x1d, 0xeb, 0xe8, 0x7c, 0xc9, 0xb7, 0xed, 0x7e, - 0x16, 0x4b, 0xa4, 0xca, 0x8e, 0xb2, 0x9c, 0xea, 0xb8, 0x7c, 0x59, 0x13, 0x03, 0x67, 0xb9, 0xbc, - 0x83, 0xdd, 0x9d, 0x09, 0x47, 0x32, 0x94, 0x88, 0x24, 0x32, 0x09, 0x48, 0x22, 0x2b, 0x11, 0x89, - 0x88, 0x5a, 0x95, 0x3c, 0xaa, 0xa7, 0x6b, 0xea, 0x16, 0x21, 0x6f, 0x89, 0xa1, 0xbb, 0x79, 0x30, - 0x2c, 0x4e, 0xa5, 0x7a, 0xda, 0x9d, 0xf9, 0x66, 0x86, 0x34, 0xb9, 0x30, 0x0a, 0x58, 0x3b, 0x23, - 0x8b, 0x06, 0xab, 0xf6, 0x49, 0x62, 0xd0, 0x9f, 0x42, 0x23, 0x20, 0x6f, 0x78, 0x6a, 0x24, 0xcd, - 0x96, 0x95, 0xd6, 0xc3, 0x35, 0xd1, 0xe0, 0x38, 0xb6, 0x9f, 0xf9, 0x5f, 0x06, 0x14, 0xe4, 0x0d, - 0x8b, 0x99, 0xff, 0x9b, 0xb9, 0xf6, 0x66, 0x77, 0xb4, 0xc9, 0xb3, 0x57, 0x96, 0x13, 0x24, 0x4e, - 0x16, 0x1f, 0xa8, 0xde, 0xd8, 0xcb, 0x8b, 0x0f, 0x34, 0xe5, 0x48, 0xb9, 0xb7, 0x76, 0xa4, 0xd9, - 0x4d, 0x92, 0xd5, 0x54, 0xe1, 0x2e, 0x97, 0x6d, 0x52, 0x6a, 0x17, 0xfe, 0x3a, 0x1d, 0xbb, 0x7e, - 0x06, 0xc5, 0xd3, 0x48, 0x84, 0xc4, 0x78, 0x27, 0x3e, 0x5a, 0x31, 0x0f, 0x65, 0xbd, 0x4e, 0x57, - 0x82, 0x71, 0xdc, 0x08, 0x3d, 0x81, 0x92, 0xbc, 0x72, 0xbd, 0xb6, 0x7d, 0x6d, 0xa6, 0x5b, 0x0b, - 0x0b, 0xdf, 0xd3, 0x3f, 0xfc, 0xe0, 0x04, 0x6a, 0xfe, 0x02, 0x0a, 0xaa, 0x27, 0xf4, 0x25, 0x54, - 0x55, 0x5f, 0x2a, 0xd1, 0xd5, 0xbc, 0xbd, 0xcc, 0x7a, 0x15, 0x85, 0x1f, 0x08, 0xb8, 0xb8, 0xc0, - 0x4d, 0x6b, 0x95, 0x39, 0xac, 0x5e, 0xcc, 0x97, 0x50, 0xd8, 0xb5, 0x03, 0x87, 0xf8, 0xdf, 0x53, - 0xbc, 0x49, 0x47, 0xb6, 0xef, 0xb9, 0xd8, 0xfa, 0x9b, 0x4c, 0x52, 0x6d, 0xbd, 0x05, 0x1b, 0xb3, - 0xd5, 0x56, 0xeb, 0xe4, 0xf8, 0xe0, 0xf9, 0xce, 0x5e, 0xf3, 0x06, 0xda, 0x80, 0x35, 0xad, 0x7a, - 0xda, 0x3b, 0xea, 0xe1, 0x9d, 0xa1, 0xaa, 0xbb, 0x2e, 0xd6, 0x62, 0xb3, 0x68, 0x13, 0x90, 0x96, - 0x0d, 0x4e, 0x0e, 0x0f, 0x77, 0xf0, 0xfe, 0x37, 0x42, 0x6e, 0x2c, 0xad, 0xd1, 0xe6, 0x16, 0x6b, - 0xb4, 0xf9, 0xa5, 0x35, 0xda, 0xc2, 0xb3, 0x5c, 0xa9, 0xd4, 0x2c, 0xe3, 0xa2, 0xfe, 0x13, 0xe1, - 0xee, 0x6f, 0x0c, 0x28, 0xc5, 0x89, 0xc5, 0xb4, 0xac, 0x9f, 0x49, 0x97, 0xf5, 0xe7, 0xff, 0x2a, - 0xc8, 0x2e, 0xf9, 0xab, 0x60, 0xf9, 0xff, 0x03, 0xc6, 0xaa, 0xff, 0x07, 0x1e, 0xe9, 0x3f, 0x05, - 0x72, 0xd2, 0x95, 0xdf, 0x59, 0x48, 0x71, 0x3a, 0x43, 0x7b, 0xc4, 0xd4, 0xaf, 0x51, 0xea, 0x37, - 0x02, 0x13, 0x4a, 0x11, 0x23, 0xa1, 0x6b, 0x73, 0x5b, 0xff, 0x95, 0x90, 0xbc, 0x9b, 0x7f, 0x9f, - 0x81, 0x35, 0x95, 0xcf, 0x7d, 0x15, 0xd2, 0xb1, 0x2e, 0x30, 0x9a, 0x3f, 0xbf, 0xb6, 0x43, 0xa5, - 0xfe, 0x09, 0xc8, 0xce, 0xfc, 0x13, 0x30, 0x4d, 0xd5, 0x8c, 0x74, 0xaa, 0x66, 0x6e, 0xa7, 0x78, - 0xf9, 0x63, 0x28, 0xc5, 0xb9, 0x89, 0xa6, 0xc4, 0xda, 0xc2, 0x6a, 0x70, 0x02, 0x31, 0x3f, 0x83, - 0x72, 0xb2, 0xb4, 0x25, 0x3f, 0x75, 0xb5, 0xd2, 0x3f, 0x75, 0x95, 0x53, 0x3f, 0x6e, 0xdd, 0x1d, - 0x42, 0x6d, 0x26, 0xff, 0x43, 0x08, 0x72, 0x32, 0xaa, 0xa8, 0xd6, 0xf2, 0x19, 0x3d, 0x82, 0x72, - 0x3c, 0x92, 0xd8, 0x26, 0x63, 0xf9, 0x6c, 0xa6, 0x98, 0xbb, 0xff, 0x98, 0x01, 0x34, 0x0d, 0x1f, - 0x7b, 0x1e, 0x9b, 0xd8, 0xdc, 0x39, 0x7b, 0xab, 0x44, 0x69, 0x03, 0x0a, 0x2f, 0xe9, 0xe9, 0xd4, - 0x78, 0xf9, 0x97, 0xf4, 0x74, 0xdf, 0x9d, 0xb1, 0x8b, 0x71, 0xa5, 0x5d, 0x92, 0x94, 0x34, 0x77, - 0x8d, 0x94, 0xf4, 0xc1, 0x0b, 0xa8, 0xcf, 0xca, 0xd1, 0x6d, 0x78, 0x67, 0xb0, 0x7f, 0x78, 0x72, - 0xb0, 0x33, 0xdc, 0x7f, 0x7e, 0x64, 0x1d, 0x3e, 0xdf, 0xeb, 0x59, 0x27, 0x47, 0x83, 0xe3, 0xde, - 0xee, 0xfe, 0x57, 0xfb, 0x3d, 0xc1, 0xbb, 0x36, 0xb4, 0xe6, 0x01, 0xc3, 0xde, 0x5f, 0x0c, 0x9b, - 0x19, 0x49, 0xd6, 0x39, 0xcd, 0xce, 0xc9, 0xde, 0xfe, 0xf3, 0x66, 0x76, 0xeb, 0x57, 0x05, 0x68, - 0xec, 0x08, 0xdf, 0x9d, 0x8e, 0x86, 0x5c, 0x58, 0x57, 0xbe, 0x36, 0xfb, 0x93, 0xdb, 0xaa, 0x2b, - 0x91, 0xc2, 0x76, 0xe2, 0x04, 0xf0, 0x07, 0x57, 0xc1, 0xb4, 0x57, 0x7d, 0x97, 0x81, 0xf7, 0xe2, - 0x44, 0x31, 0x01, 0xa6, 0x53, 0x46, 0xb4, 0xb5, 0x32, 0xfc, 0x2f, 0xa4, 0x97, 0xc9, 0xe8, 0x9f, - 0xbc, 0x55, 0x1b, 0x3d, 0x95, 0xbf, 0x84, 0xe6, 0x53, 0xc2, 0x67, 0x57, 0x7b, 0x77, 0x45, 0x47, - 0x4f, 0x09, 0x4f, 0x06, 0xfb, 0xf0, 0x52, 0x8c, 0xee, 0xdc, 0x02, 0x24, 0x12, 0xbb, 0x19, 0x04, - 0x43, 0xab, 0x9a, 0x0a, 0x68, 0xd2, 0xff, 0x47, 0x97, 0x83, 0xf4, 0x00, 0x62, 0xbb, 0x44, 0x78, - 0x9e, 0x1b, 0xe1, 0xde, 0xe5, 0x87, 0xe7, 0x95, 0xdb, 0x15, 0xc3, 0x52, 0xa3, 0xc8, 0x63, 0xec, - 0x9a, 0x4e, 0x21, 0xb1, 0x57, 0x8f, 0x12, 0xc3, 0xf4, 0x28, 0xaf, 0xe1, 0x96, 0x76, 0x3d, 0xcd, - 0x9a, 0x54, 0xb8, 0x43, 0x0f, 0x17, 0x63, 0xe8, 0x42, 0x4c, 0x4c, 0x46, 0xfc, 0xf8, 0x7a, 0x60, - 0x35, 0x6e, 0xf7, 0xab, 0x6f, 0x3e, 0x1c, 0x79, 0xfc, 0x2c, 0x3a, 0xed, 0x38, 0x74, 0x1c, 0xff, - 0x42, 0xac, 0x7e, 0x03, 0x76, 0xa8, 0x1f, 0x0b, 0x7e, 0x9b, 0xad, 0x1d, 0x78, 0xaf, 0xc9, 0x9f, - 0xc9, 0x1b, 0x11, 0xe5, 0xf4, 0x3f, 0xb3, 0x75, 0xfd, 0xfe, 0xf9, 0xe7, 0x52, 0x70, 0x5a, 0x90, - 0x4d, 0x3e, 0xf9, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x52, 0x0c, 0xe0, 0x26, 0xb5, 0x2c, 0x00, - 0x00, + 0x72, 0x56, 0xbf, 0xbb, 0xa3, 0xd9, 0x0f, 0x26, 0x9b, 0x54, 0xab, 0xe6, 0x21, 0x0d, 0x67, 0xb4, + 0xab, 0x95, 0x66, 0x5b, 0x32, 0x77, 0xb4, 0x63, 0x6a, 0x76, 0xd6, 0x66, 0x93, 0x3d, 0x6a, 0xca, + 0x24, 0xc5, 0xc9, 0x6e, 0xc2, 0xde, 0x31, 0x16, 0x85, 0x62, 0x55, 0xaa, 0x59, 0x52, 0x75, 0x65, + 0x4f, 0x65, 0x96, 0x28, 0x2e, 0xe0, 0x83, 0x8d, 0x05, 0x3c, 0xb0, 0x4f, 0x36, 0xfc, 0x03, 0xf6, + 0xb2, 0x07, 0xef, 0xd5, 0xbf, 0xc0, 0x3f, 0xc1, 0x17, 0x03, 0xbe, 0xf8, 0xe6, 0x8b, 0xef, 0x86, + 0xaf, 0x46, 0x3e, 0xea, 0xd1, 0x2f, 0x92, 0x5a, 0x8c, 0x00, 0x1f, 0xf6, 0x56, 0x15, 0xf1, 0xe5, + 0xa3, 0x22, 0xe3, 0x8b, 0x8c, 0xac, 0x48, 0xf8, 0xd0, 0x73, 0x5f, 0x93, 0x57, 0x2e, 0x37, 0xad, + 0x11, 0xf1, 0xb9, 0xc9, 0xdc, 0x71, 0xe8, 0x59, 0xdc, 0xa5, 0x7e, 0x67, 0x12, 0x50, 0x4e, 0x51, + 0x49, 0xeb, 0x8d, 0x8f, 0x24, 0xe0, 0xe1, 0x0c, 0x9c, 0x30, 0x16, 0x63, 0x8d, 0x0f, 0x47, 0x94, + 0x8e, 0x3c, 0xf2, 0x50, 0xbe, 0x9d, 0x86, 0x2f, 0x1e, 0x3a, 0x61, 0x90, 0xea, 0xcb, 0xb8, 0x3d, + 0xab, 0xe7, 0xee, 0x98, 0x30, 0x6e, 0x8d, 0x27, 0x1a, 0x70, 0x2b, 0xea, 0xdd, 0xf6, 0x68, 0xe8, + 0xa8, 0x31, 0xb4, 0xaa, 0x15, 0xa9, 0xc6, 0xd4, 0x21, 0x1e, 0x53, 0xd2, 0xcd, 0x7f, 0xcb, 0x41, + 0x6b, 0x10, 0x4f, 0x19, 0x87, 0xfe, 0x20, 0x1c, 0x8f, 0xad, 0xe0, 0x02, 0x6d, 0x40, 0x71, 0x62, + 0x31, 0x46, 0x9c, 0x76, 0xe6, 0x4e, 0xe6, 0x5e, 0x01, 0xeb, 0x37, 0x21, 0x7f, 0x61, 0xb9, 0x1e, + 0x71, 0xda, 0x59, 0x25, 0x57, 0x6f, 0xe8, 0x03, 0x80, 0x11, 0x75, 0xfd, 0x91, 0x79, 0x4e, 0x3c, + 0xaf, 0x9d, 0xbb, 0x93, 0xb9, 0x57, 0xc1, 0x15, 0x29, 0xf9, 0x73, 0xe2, 0x79, 0x42, 0xcd, 0xa9, + 0xe9, 0x8e, 0x27, 0x01, 0x7d, 0x4d, 0xda, 0x79, 0xa5, 0xe6, 0x74, 0x5f, 0x09, 0xd0, 0x17, 0x50, + 0x74, 0x19, 0x0b, 0x09, 0x6b, 0x17, 0xee, 0xe4, 0xee, 0x55, 0xb7, 0x3e, 0xee, 0xe8, 0xd9, 0x76, + 0x16, 0x4d, 0xae, 0xb3, 0x2f, 0xb0, 0x58, 0x37, 0x41, 0x5f, 0xc3, 0x8a, 0x7d, 0x66, 0x71, 0xf3, + 0xcc, 0x65, 0x9c, 0x06, 0x17, 0xed, 0xa2, 0xec, 0xa2, 0x73, 0x79, 0x17, 0xbb, 0x67, 0x16, 0xef, + 0xab, 0x06, 0x3d, 0x9f, 0x07, 0x17, 0xb8, 0x6a, 0x27, 0x12, 0xe3, 0x1b, 0x68, 0xce, 0x02, 0x50, + 0x13, 0x72, 0xaf, 0xc8, 0x85, 0x34, 0x47, 0x05, 0x8b, 0x47, 0xf4, 0x08, 0x0a, 0xaf, 0x2d, 0x2f, + 0x24, 0xd2, 0x14, 0xd5, 0x2d, 0x23, 0x1e, 0x51, 0xd9, 0x5d, 0xf4, 0xb0, 0x4b, 0x7d, 0x4e, 0xde, + 0x70, 0xac, 0x80, 0x4f, 0xb2, 0x7f, 0x9c, 0x31, 0x4c, 0x28, 0xc8, 0xf9, 0xa3, 0x3b, 0x50, 0x75, + 0x08, 0xb3, 0x03, 0x77, 0x22, 0xe6, 0xa6, 0x3b, 0x4e, 0x8b, 0xd0, 0x87, 0x00, 0x2c, 0x1c, 0x8d, + 0x08, 0x93, 0x80, 0xac, 0x04, 0xa4, 0x24, 0xa8, 0x05, 0x05, 0xcf, 0x3a, 0x25, 0x91, 0xbd, 0xd5, + 0xcb, 0xe6, 0x7f, 0x3d, 0x85, 0xda, 0xd4, 0x37, 0xa3, 0x3a, 0x64, 0x5d, 0x47, 0x0f, 0x90, 0x75, + 0xe5, 0x62, 0x4d, 0x02, 0xfa, 0x92, 0xd8, 0xdc, 0x74, 0x1d, 0xdd, 0x6f, 0x45, 0x4b, 0xf6, 0x1d, + 0xf4, 0x18, 0x8a, 0x8c, 0x5b, 0x3c, 0x64, 0xb2, 0xdf, 0xfa, 0xd6, 0x07, 0x8b, 0x4d, 0xd9, 0x19, + 0x48, 0x10, 0xd6, 0x60, 0xf4, 0x00, 0x56, 0x95, 0x53, 0xa7, 0xbf, 0x4a, 0x2d, 0x75, 0x53, 0x2a, + 0xf6, 0x52, 0x9f, 0xd6, 0x82, 0x02, 0x09, 0x02, 0x1a, 0xb4, 0x0b, 0x6a, 0xea, 0xf2, 0x05, 0x6d, + 0x03, 0xd8, 0x01, 0xb1, 0x38, 0x71, 0x4c, 0x8b, 0xb7, 0x8b, 0xda, 0xac, 0xca, 0xeb, 0x3b, 0x91, + 0xd7, 0x77, 0x86, 0x91, 0xd7, 0xe3, 0x8a, 0x46, 0xef, 0x70, 0xd4, 0x81, 0xfc, 0x4b, 0x7a, 0xca, + 0xda, 0x25, 0xb9, 0xfa, 0xc6, 0x92, 0x29, 0x3f, 0xa3, 0xa7, 0x58, 0xe2, 0x84, 0x0d, 0xd4, 0x6c, + 0x7d, 0x6b, 0x4c, 0xda, 0x15, 0x65, 0x03, 0x29, 0x39, 0xb2, 0xc6, 0x04, 0x7d, 0x09, 0x75, 0x66, + 0x13, 0xdf, 0x0a, 0x5c, 0x6a, 0x8e, 0x02, 0x1a, 0x4e, 0xda, 0x20, 0x67, 0xb3, 0x91, 0x74, 0xac, + 0xd5, 0x4f, 0x85, 0x16, 0xd7, 0x58, 0xfa, 0x15, 0x3d, 0x86, 0x32, 0xf1, 0x1d, 0xf5, 0x19, 0xd5, + 0x2b, 0x3f, 0xa3, 0x24, 0xb1, 0x3b, 0x1c, 0xbd, 0x07, 0x95, 0x97, 0xf4, 0xd4, 0xb4, 0x69, 0xe8, + 0xf3, 0xf6, 0x8a, 0x24, 0x58, 0xf9, 0x25, 0x3d, 0xdd, 0x15, 0xef, 0xe8, 0x23, 0x58, 0x51, 0x24, + 0xd4, 0xfa, 0x9a, 0xd4, 0x57, 0x95, 0x2c, 0x86, 0x28, 0x3e, 0x6a, 0x48, 0x5d, 0x41, 0x94, 0x4c, + 0x41, 0x7e, 0x08, 0x0d, 0x3f, 0x1c, 0xa7, 0xe2, 0x14, 0x6b, 0x37, 0x24, 0xaa, 0xee, 0x87, 0xe3, + 0xc4, 0x58, 0x0c, 0x6d, 0x41, 0x21, 0x64, 0xd6, 0x88, 0xb4, 0x9b, 0x72, 0xfe, 0xef, 0x2f, 0xb1, + 0xe8, 0x89, 0xc0, 0x60, 0x05, 0x15, 0x2e, 0x6d, 0x53, 0xdf, 0x0e, 0x83, 0x80, 0xf8, 0xf6, 0x45, + 0x7b, 0x55, 0x0d, 0x9f, 0x12, 0xa1, 0x07, 0x90, 0x17, 0x01, 0xa8, 0x8d, 0xa4, 0x67, 0xdd, 0x5c, + 0xd0, 0xe9, 0x21, 0x75, 0x08, 0x96, 0x20, 0xf4, 0x05, 0x94, 0xc6, 0x84, 0x07, 0xae, 0xcd, 0xda, + 0x6b, 0x72, 0x12, 0x1f, 0x2d, 0x99, 0x04, 0x0e, 0xfd, 0x43, 0x05, 0xc4, 0x51, 0x0b, 0x61, 0x0b, + 0xa6, 0xc8, 0x6e, 0xfe, 0x8a, 0x71, 0xa7, 0xdd, 0xba, 0x93, 0xb9, 0xb7, 0x82, 0xab, 0x5a, 0xf6, + 0x0d, 0xe3, 0x8e, 0xf1, 0xef, 0x05, 0xc8, 0x3d, 0xa3, 0xa7, 0x73, 0xfc, 0xd8, 0x8e, 0x09, 0x90, + 0x95, 0xd3, 0xfc, 0x68, 0xb9, 0x37, 0xcd, 0x92, 0x60, 0x13, 0x56, 0x5c, 0x9f, 0xf1, 0x20, 0xb4, + 0x95, 0x6d, 0x15, 0x33, 0xa7, 0x64, 0x89, 0xef, 0xe7, 0xd3, 0xbe, 0xff, 0x63, 0x40, 0xca, 0x21, + 0xc9, 0x9b, 0x09, 0xb1, 0xb9, 0x5e, 0x1b, 0x45, 0x0f, 0x45, 0xac, 0x5e, 0x4a, 0x91, 0x70, 0xbf, + 0x98, 0xe2, 0x3e, 0x42, 0x90, 0xe7, 0xd6, 0x48, 0xb1, 0xa0, 0x82, 0xe5, 0xb3, 0x70, 0xaa, 0x80, + 0xd2, 0xb1, 0x72, 0xf4, 0xb2, 0x44, 0x97, 0x85, 0x40, 0xfa, 0xf9, 0x36, 0x00, 0xe3, 0x56, 0xa0, + 0x19, 0x07, 0x57, 0x33, 0x4e, 0xa3, 0x77, 0xf8, 0xef, 0xeb, 0xe3, 0x37, 0xa1, 0x24, 0xa7, 0xe3, + 0x3a, 0xd2, 0xc3, 0x2b, 0xb8, 0x28, 0x5e, 0xf7, 0x1d, 0xf4, 0xd3, 0xc8, 0xe1, 0x6a, 0xb2, 0xb3, + 0x3b, 0x97, 0x18, 0x7d, 0xca, 0xe9, 0x52, 0x5e, 0x52, 0xbf, 0xd4, 0x4b, 0x9e, 0xd1, 0xd3, 0x59, + 0x2f, 0x31, 0x7e, 0x09, 0x05, 0xd9, 0x19, 0xba, 0x07, 0x4d, 0x11, 0xa9, 0x4d, 0x1e, 0x06, 0x3e, + 0xd3, 0xf4, 0x51, 0x5b, 0x5f, 0x5d, 0xc8, 0x87, 0x42, 0xac, 0x18, 0x74, 0x1f, 0x56, 0xad, 0xd0, + 0x71, 0xe9, 0x14, 0x54, 0xed, 0x86, 0x0d, 0xa9, 0x48, 0xb0, 0x9b, 0x14, 0x8a, 0xca, 0x41, 0x10, + 0x82, 0xfa, 0x60, 0xb8, 0x33, 0x3c, 0x19, 0x98, 0xc7, 0xbd, 0xa3, 0xbd, 0xfd, 0xa3, 0xa7, 0xcd, + 0x1b, 0x29, 0x19, 0x3e, 0x39, 0x3a, 0x12, 0xb2, 0x0c, 0x6a, 0x41, 0x53, 0xcb, 0x76, 0x9f, 0x1f, + 0x1e, 0x1f, 0xf4, 0x86, 0xbd, 0xbd, 0x66, 0x16, 0xad, 0x42, 0x4d, 0x4b, 0xbf, 0xda, 0xd9, 0x3f, + 0xe8, 0xed, 0x35, 0x73, 0x69, 0xe0, 0xce, 0xd1, 0x6e, 0xef, 0x40, 0x48, 0xf3, 0xcf, 0xf2, 0xe5, + 0x4a, 0x13, 0x8c, 0x7f, 0xbd, 0x0b, 0x90, 0x7c, 0x2d, 0xba, 0x0f, 0x75, 0xcb, 0xb6, 0xc3, 0xc0, + 0xb2, 0x2f, 0x4c, 0x66, 0xd3, 0x80, 0xc8, 0x2f, 0xcb, 0xf6, 0x6f, 0xe0, 0x5a, 0x24, 0x1f, 0x08, + 0xf1, 0x77, 0x99, 0x0c, 0xea, 0x40, 0x53, 0x38, 0x60, 0xe0, 0x12, 0xdf, 0x26, 0x1a, 0x9d, 0x95, + 0xe8, 0x0c, 0x6e, 0x24, 0x9a, 0x18, 0xff, 0x29, 0x34, 0xb8, 0xc5, 0x5e, 0x99, 0x36, 0x1d, 0x4f, + 0x3c, 0x22, 0x63, 0x7e, 0x4e, 0xc2, 0xb3, 0xb8, 0x2e, 0x14, 0xbb, 0xb1, 0x5c, 0xa0, 0x3f, 0x87, + 0x1c, 0xe3, 0x5c, 0x3a, 0x7e, 0x75, 0xeb, 0xee, 0x95, 0xeb, 0xd4, 0x19, 0x0c, 0x87, 0x58, 0xb4, + 0x10, 0x0d, 0x3d, 0x6f, 0x2c, 0xe9, 0x70, 0xad, 0x86, 0x07, 0x07, 0x87, 0x58, 0xb4, 0x10, 0x0d, + 0x39, 0x67, 0x7a, 0x2f, 0xb9, 0x46, 0xc3, 0xe1, 0x70, 0x80, 0x45, 0x0b, 0x84, 0x61, 0xc5, 0xa6, + 0xfe, 0x6b, 0x12, 0x30, 0x09, 0x6b, 0x97, 0x64, 0x0f, 0x9d, 0xab, 0x7b, 0xd8, 0x4d, 0xb5, 0xc2, + 0x53, 0x7d, 0xa0, 0x9f, 0x41, 0x41, 0x3a, 0x4d, 0xbb, 0x22, 0x77, 0xa9, 0x1f, 0x5c, 0x63, 0x3a, + 0x61, 0xe0, 0x63, 0xd5, 0x08, 0xdd, 0x86, 0xea, 0xcb, 0xd0, 0x19, 0x11, 0x95, 0xc2, 0x49, 0xb2, + 0x56, 0x30, 0x48, 0x91, 0x08, 0x9a, 0x1e, 0xfa, 0x14, 0xd0, 0x99, 0xc5, 0xcc, 0x80, 0x8c, 0x29, + 0x27, 0x51, 0x6e, 0x29, 0x59, 0x56, 0xc6, 0xcd, 0x33, 0x8b, 0x61, 0xa9, 0x18, 0x28, 0x39, 0xba, + 0x0f, 0x59, 0xfe, 0x48, 0x93, 0xed, 0x32, 0xe6, 0x66, 0xf9, 0x23, 0x74, 0x57, 0x05, 0x76, 0x97, + 0x11, 0x9f, 0x30, 0xc5, 0xb3, 0x6c, 0x3f, 0x87, 0xd3, 0x42, 0xb1, 0xbc, 0xdb, 0xb0, 0x11, 0xfa, + 0x3e, 0xb1, 0x09, 0x63, 0x22, 0xee, 0x72, 0x4a, 0x3d, 0xd3, 0xb6, 0x3c, 0x4f, 0xed, 0x31, 0xe5, + 0x7e, 0x1e, 0xb7, 0x52, 0xfa, 0x21, 0xa5, 0xde, 0xae, 0xd0, 0x6a, 0xbf, 0x73, 0xfd, 0x17, 0x34, + 0x18, 0x4b, 0x2b, 0x98, 0x1e, 0x65, 0x4c, 0xee, 0x3c, 0xe5, 0x7e, 0x01, 0x37, 0x52, 0x9a, 0x03, + 0xaa, 0x86, 0xfa, 0x29, 0xb4, 0x02, 0xe2, 0x84, 0xbe, 0x63, 0x89, 0x34, 0x9a, 0x5b, 0x9c, 0x8c, + 0x89, 0xcf, 0x99, 0xdc, 0x73, 0xca, 0xfd, 0x22, 0x5e, 0x8b, 0xb5, 0x83, 0x58, 0xa9, 0x3c, 0x70, + 0x7d, 0x42, 0x69, 0x60, 0x7e, 0x1b, 0xaa, 0x24, 0xca, 0xfc, 0x36, 0xb4, 0x3c, 0x97, 0x5f, 0xc8, + 0x1d, 0xa9, 0xdc, 0x2f, 0xe1, 0x35, 0xa1, 0xfe, 0x5a, 0x6b, 0xbf, 0x56, 0x4a, 0xd1, 0xf0, 0xe7, + 0xd0, 0x4e, 0xaf, 0xa5, 0x39, 0x09, 0xe8, 0x28, 0xd0, 0x26, 0x5e, 0x93, 0xf6, 0x28, 0xe3, 0x9b, + 0x69, 0xc4, 0x71, 0x02, 0xf8, 0x2e, 0x93, 0x31, 0xfe, 0xb1, 0x08, 0xb9, 0xc1, 0x70, 0x88, 0xd6, + 0x21, 0x77, 0x4e, 0x82, 0x98, 0x81, 0xe2, 0x45, 0x74, 0x7f, 0x0b, 0x0a, 0xe7, 0x34, 0x70, 0xd4, + 0x96, 0x53, 0xeb, 0x67, 0xb0, 0x7a, 0x15, 0xaa, 0x4f, 0xa0, 0x2a, 0x9e, 0x4d, 0xb9, 0x4f, 0xa8, + 0x2d, 0xa5, 0xd6, 0xcf, 0x62, 0x10, 0xc2, 0x9e, 0x94, 0x09, 0xd4, 0x3a, 0xe4, 0x6c, 0xa2, 0xf6, + 0x14, 0xb1, 0x34, 0xe2, 0x45, 0xf7, 0x6b, 0x9f, 0x59, 0x01, 0x93, 0x29, 0x4e, 0xad, 0x9f, 0xc7, + 0xea, 0x55, 0xf7, 0x2b, 0x9e, 0xa3, 0x7e, 0x41, 0x02, 0x0a, 0x18, 0x84, 0x30, 0xe9, 0xf7, 0x2e, + 0xac, 0x30, 0x2e, 0x92, 0x3a, 0xcf, 0xba, 0x30, 0xc7, 0x4c, 0xee, 0x20, 0xb5, 0x7e, 0x11, 0x03, + 0xe3, 0x7c, 0x4f, 0x08, 0x0f, 0x25, 0x6c, 0x0b, 0x10, 0xf1, 0xb9, 0xcb, 0x2f, 0xcc, 0x80, 0xd8, + 0x74, 0xe4, 0xbb, 0x92, 0x34, 0x55, 0x39, 0x9b, 0x12, 0x5e, 0x55, 0x3a, 0x9c, 0xa8, 0xa2, 0x58, + 0x23, 0xe4, 0x2e, 0x61, 0x66, 0xc8, 0x39, 0x09, 0x88, 0xda, 0x13, 0x6a, 0xfd, 0x32, 0x6e, 0x44, + 0x9a, 0x13, 0xa5, 0x10, 0xf8, 0xcf, 0x60, 0x2d, 0xc6, 0xeb, 0x51, 0x7e, 0x45, 0x1c, 0xe9, 0xc2, + 0xb5, 0x7e, 0x05, 0xa3, 0x48, 0x89, 0x63, 0x9d, 0x68, 0x75, 0x0f, 0x6a, 0xc9, 0xcc, 0x2c, 0xcf, + 0xd3, 0xde, 0x0b, 0x78, 0x25, 0x9e, 0x94, 0xe5, 0x79, 0x02, 0xf9, 0x27, 0x70, 0x2b, 0xee, 0xdf, + 0xb2, 0xbf, 0x0d, 0xdd, 0x80, 0x38, 0xf1, 0xc4, 0x1a, 0x72, 0x94, 0x2a, 0xbe, 0x19, 0x41, 0x76, + 0x34, 0x22, 0x35, 0xc1, 0x1e, 0xbc, 0x3f, 0xdf, 0x41, 0x6a, 0xa6, 0x4d, 0xd9, 0xc7, 0x0a, 0x36, + 0x66, 0xfb, 0x98, 0x9a, 0x71, 0xb7, 0x08, 0x79, 0xf3, 0x9c, 0x04, 0xdd, 0x32, 0x14, 0x4d, 0xe9, + 0x05, 0xdd, 0x3a, 0xac, 0x98, 0x29, 0x1f, 0x90, 0x08, 0x5b, 0x23, 0xe4, 0x7a, 0x4a, 0x44, 0x6a, + 0x35, 0xbb, 0x0d, 0xa8, 0x99, 0xe9, 0x75, 0xeb, 0xae, 0xc3, 0x9a, 0x39, 0xbf, 0x42, 0xdd, 0x35, + 0x58, 0x35, 0x67, 0x17, 0xa1, 0xbb, 0x01, 0x2d, 0x73, 0x81, 0xa5, 0xbb, 0x4d, 0xa8, 0x9b, 0x53, + 0xb6, 0xec, 0xbe, 0x0f, 0x86, 0xb9, 0xd4, 0x66, 0xdd, 0xdb, 0xf0, 0x81, 0x79, 0x99, 0x41, 0x8c, + 0xdf, 0x64, 0x20, 0x77, 0x70, 0x70, 0x88, 0xde, 0x87, 0x12, 0xe7, 0x2f, 0xb8, 0xf0, 0xaf, 0x8c, + 0xb4, 0xd1, 0x0d, 0x5c, 0x14, 0x02, 0xe5, 0x5b, 0x4a, 0xcb, 0x84, 0x36, 0x62, 0x87, 0xd0, 0x32, + 0xa5, 0x7d, 0x08, 0xab, 0x9c, 0xbe, 0x22, 0x3e, 0x33, 0x27, 0x24, 0x30, 0x19, 0xb1, 0xa9, 0xef, + 0xc4, 0x7b, 0x50, 0x43, 0xa9, 0x8e, 0x49, 0x30, 0x90, 0x0a, 0x61, 0x5e, 0x80, 0xb2, 0xa9, 0x47, + 0x8b, 0x9e, 0x45, 0xdf, 0xdd, 0x16, 0x20, 0x73, 0xae, 0x27, 0xe3, 0xd7, 0x45, 0xc8, 0x0d, 0x87, + 0x03, 0x3d, 0x89, 0xd3, 0x64, 0x12, 0x6a, 0x8a, 0xa7, 0x87, 0x11, 0xfb, 0x04, 0xab, 0x73, 0x7a, + 0xa7, 0x9c, 0x63, 0x75, 0x49, 0x93, 0x76, 0x29, 0xab, 0x15, 0xad, 0x72, 0x4b, 0x58, 0x5d, 0x91, + 0xfd, 0xe6, 0xe7, 0x59, 0x1d, 0x91, 0x76, 0x29, 0xab, 0xab, 0x11, 0x5d, 0xa7, 0x59, 0xbd, 0x98, + 0xae, 0xf5, 0xb7, 0xa6, 0x6b, 0xe3, 0xed, 0xe9, 0xda, 0x7c, 0x4b, 0xba, 0xae, 0xfe, 0x5e, 0x74, + 0x45, 0xdf, 0x03, 0x5d, 0xd7, 0xae, 0x47, 0x57, 0xed, 0x43, 0xc2, 0x35, 0xbe, 0x17, 0xea, 0xfe, + 0xbf, 0x64, 0xea, 0xff, 0x94, 0x60, 0x25, 0x9d, 0xd9, 0x48, 0xda, 0x85, 0x81, 0x6f, 0x72, 0xeb, + 0x95, 0xeb, 0x8f, 0x66, 0xf2, 0xca, 0x86, 0x50, 0x0d, 0xa5, 0x26, 0xce, 0x14, 0xbf, 0x80, 0xf6, + 0x19, 0xb1, 0x84, 0x21, 0xb6, 0x88, 0xe9, 0x59, 0x5c, 0x9c, 0x07, 0xcd, 0xc9, 0xe3, 0x47, 0x11, + 0xa3, 0x0a, 0xfd, 0x0c, 0x6e, 0x49, 0x44, 0x6f, 0x8b, 0x1c, 0x28, 0xfd, 0xf1, 0xe3, 0x47, 0x8a, + 0x5f, 0x8b, 0x1b, 0x6f, 0x3f, 0x16, 0x8d, 0x73, 0xb2, 0x71, 0x76, 0xbe, 0xf1, 0xf6, 0xe3, 0x4b, + 0x1b, 0x6f, 0x8b, 0xc6, 0x79, 0xd9, 0x38, 0xb7, 0xa0, 0xf1, 0xb6, 0x6a, 0xfc, 0x29, 0x34, 0xb9, + 0x3b, 0x26, 0x26, 0xa7, 0xe6, 0x85, 0x4b, 0x3c, 0x47, 0x34, 0x2a, 0xe8, 0xbd, 0xb4, 0x26, 0x34, + 0x43, 0xfa, 0x0b, 0x21, 0x8f, 0x86, 0xba, 0x49, 0x28, 0x37, 0xc7, 0x2e, 0x9b, 0x04, 0xc4, 0x71, + 0xe5, 0x89, 0x4f, 0x1f, 0x11, 0x8a, 0x9a, 0xaa, 0xeb, 0x84, 0xf2, 0xc3, 0xb4, 0x5e, 0x1e, 0x15, + 0xb4, 0xeb, 0xd3, 0xd7, 0x24, 0xf0, 0xac, 0x89, 0x29, 0xff, 0xfb, 0xc9, 0xa8, 0x91, 0xed, 0x17, + 0xf1, 0x8a, 0x16, 0x63, 0x21, 0xd5, 0x31, 0x2f, 0x42, 0xb2, 0x09, 0x21, 0xf6, 0x59, 0xb2, 0x33, + 0x97, 0x70, 0x43, 0xab, 0x06, 0x52, 0xa3, 0xe6, 0xf5, 0x00, 0x1a, 0x9c, 0x72, 0xcb, 0x4b, 0xc1, + 0x2b, 0x9a, 0xba, 0x35, 0xa9, 0x48, 0x83, 0x3f, 0x87, 0x75, 0xeb, 0xfc, 0xd5, 0xb9, 0xb0, 0x18, + 0x73, 0x3d, 0x79, 0x10, 0x50, 0x9f, 0x50, 0xd5, 0xd4, 0x5d, 0xd3, 0xea, 0x81, 0xd2, 0xc6, 0x1f, + 0xd0, 0x81, 0x66, 0xe8, 0x5b, 0x3e, 0x3b, 0x17, 0x3e, 0xa5, 0xce, 0x47, 0x7a, 0x43, 0x07, 0xdc, + 0x48, 0x34, 0xf2, 0x80, 0x24, 0xf0, 0x5f, 0x42, 0xfb, 0x85, 0xe5, 0x31, 0x62, 0xba, 0x3e, 0x27, + 0x41, 0x10, 0x4e, 0x52, 0xe6, 0xaa, 0x69, 0x02, 0x6f, 0x48, 0xc4, 0x7e, 0x0a, 0x10, 0x0f, 0xf7, + 0x23, 0xa8, 0xa7, 0x57, 0x74, 0xcc, 0x74, 0x38, 0x5a, 0xc1, 0x2b, 0x24, 0x5e, 0x48, 0xf9, 0x49, + 0x2a, 0xb6, 0xcf, 0xba, 0x6b, 0xf7, 0x3d, 0xb8, 0x65, 0x2e, 0xf3, 0xc9, 0x65, 0x4a, 0xe9, 0x73, + 0x4b, 0x95, 0xc2, 0xa7, 0x24, 0x53, 0x67, 0x7d, 0xa6, 0x6b, 0x40, 0xdb, 0x5c, 0xe2, 0x1a, 0x92, + 0xad, 0x53, 0x2b, 0x2f, 0xe7, 0x3b, 0xb7, 0xc2, 0x5d, 0x04, 0x4d, 0x73, 0x66, 0x19, 0xbb, 0x6d, + 0xd8, 0x30, 0x17, 0xae, 0x96, 0x9c, 0xc6, 0xec, 0x72, 0xc8, 0x89, 0x2f, 0xb3, 0x79, 0x77, 0x15, + 0x1a, 0xe6, 0xb4, 0x45, 0x8d, 0xdf, 0x95, 0x20, 0x2f, 0xd6, 0x0b, 0xb5, 0xa0, 0xe0, 0xfa, 0x0e, + 0x79, 0xa3, 0x36, 0x68, 0xac, 0x5e, 0xd0, 0x03, 0xc8, 0x07, 0xd4, 0x23, 0xfa, 0x47, 0xc9, 0xcd, + 0x05, 0xbf, 0x40, 0x31, 0xf5, 0x08, 0x96, 0x20, 0xf4, 0x21, 0x94, 0xe5, 0xef, 0x83, 0x88, 0xb4, + 0x62, 0x0f, 0x2d, 0x49, 0x89, 0xf2, 0x3b, 0x03, 0x8a, 0xc4, 0x77, 0x22, 0x56, 0xca, 0x24, 0x98, + 0xf8, 0x9a, 0x58, 0xb3, 0x69, 0x68, 0x21, 0xca, 0x82, 0xa7, 0xd3, 0xd0, 0x8f, 0xa1, 0xea, 0x79, + 0xe3, 0x68, 0x7b, 0xd7, 0x9c, 0xcb, 0xe1, 0x8a, 0xe7, 0x8d, 0x87, 0x71, 0x3e, 0x91, 0x80, 0x64, + 0x4e, 0x51, 0xd2, 0x6c, 0xd6, 0x20, 0x16, 0x27, 0x1d, 0x12, 0x34, 0x51, 0xc4, 0xca, 0xf6, 0x0b, + 0xb8, 0x28, 0x00, 0x93, 0xa8, 0x0b, 0xce, 0x59, 0x14, 0xf6, 0x35, 0x97, 0x8a, 0xb8, 0xc2, 0x39, + 0x1b, 0xc6, 0x49, 0xc1, 0xbc, 0x7f, 0x82, 0xa6, 0xe8, 0xac, 0x7f, 0xa2, 0xcf, 0xa0, 0x35, 0xef, + 0x4e, 0x63, 0xb5, 0x7d, 0x17, 0xfa, 0x65, 0xbc, 0x3a, 0x13, 0x9e, 0x96, 0xc7, 0xa6, 0x15, 0xcd, + 0xd1, 0xf9, 0xd8, 0xb4, 0x30, 0x62, 0xd7, 0xf4, 0xee, 0xba, 0x28, 0x62, 0x2f, 0x3c, 0xf5, 0x55, + 0xe7, 0x4e, 0x7d, 0x8f, 0x60, 0x75, 0xce, 0xb1, 0xf5, 0x81, 0x6f, 0x05, 0x37, 0x67, 0xa3, 0x9d, + 0xfe, 0x69, 0x30, 0xe3, 0xb2, 0xfa, 0xac, 0x57, 0xc3, 0xf5, 0xe9, 0xd0, 0xa2, 0x6c, 0x0d, 0x89, + 0x1b, 0xeb, 0x03, 0x5e, 0x1d, 0xa7, 0x64, 0x82, 0xe0, 0x55, 0xa8, 0x98, 0x91, 0x73, 0x75, 0x2b, + 0x50, 0x32, 0x95, 0x27, 0xcd, 0xe7, 0xc1, 0x62, 0xb7, 0x4d, 0xb9, 0x48, 0xfa, 0x9d, 0x45, 0x19, + 0xa1, 0x5e, 0x78, 0xa9, 0x4b, 0x2d, 0xf3, 0x02, 0x7e, 0x74, 0x6f, 0xc2, 0xba, 0xb9, 0x68, 0xe5, + 0x16, 0x07, 0x81, 0xc5, 0x61, 0x48, 0x26, 0x00, 0x89, 0x4d, 0x25, 0x6a, 0xce, 0xa2, 0x92, 0xfc, + 0x33, 0x56, 0xeb, 0xd6, 0xa0, 0x9a, 0xa2, 0xb8, 0x9c, 0xdf, 0xf4, 0x9f, 0x1e, 0x95, 0x35, 0xcc, + 0xfc, 0xd0, 0x51, 0x71, 0x64, 0xfa, 0xaf, 0xcd, 0xdc, 0x24, 0x6e, 0xc1, 0x4d, 0x73, 0xf1, 0x61, + 0x5e, 0xf6, 0x39, 0x7b, 0x58, 0x97, 0x86, 0x58, 0x74, 0x22, 0x97, 0x01, 0x6a, 0xe1, 0x91, 0x5b, + 0xc6, 0xa2, 0x65, 0x67, 0x6a, 0xe3, 0x3f, 0x72, 0x00, 0xc9, 0x7f, 0xdd, 0x77, 0xfa, 0x0f, 0xeb, + 0x8f, 0x00, 0xc5, 0x3f, 0xfb, 0x27, 0x16, 0x63, 0x22, 0x06, 0x93, 0xf8, 0x08, 0xd1, 0x8c, 0x74, + 0xc7, 0x16, 0x63, 0xd8, 0xe2, 0xe4, 0x0f, 0x3f, 0xb2, 0xae, 0xed, 0x68, 0x22, 0x95, 0x9d, 0x37, + 0xad, 0xf1, 0xbf, 0x79, 0x28, 0xee, 0xca, 0xd2, 0x8d, 0xf1, 0x9f, 0x39, 0x28, 0x61, 0x22, 0x5d, + 0x63, 0xa6, 0x2e, 0x95, 0x99, 0xad, 0x4b, 0x4d, 0x97, 0x6c, 0xb2, 0xb3, 0x25, 0x9b, 0x05, 0x95, + 0x8d, 0xfc, 0xc2, 0xca, 0xc6, 0x06, 0x14, 0x03, 0x32, 0x12, 0xa6, 0x28, 0xea, 0x1f, 0xd0, 0xf2, + 0x0d, 0x75, 0xe7, 0x6a, 0x3e, 0xa5, 0xcb, 0x6a, 0x3e, 0xc2, 0xf5, 0xa6, 0xaa, 0x3e, 0xa9, 0x90, + 0x19, 0x55, 0x40, 0xca, 0x3a, 0xaf, 0x4d, 0x0b, 0x55, 0x3a, 0xa6, 0xca, 0x20, 0x95, 0xeb, 0x94, + 0x41, 0x7e, 0x04, 0xcd, 0x53, 0xcb, 0x7e, 0x25, 0xa6, 0xe4, 0x3b, 0xa6, 0x4f, 0x5d, 0x46, 0xe4, + 0x46, 0x52, 0xc6, 0x8d, 0x44, 0x7e, 0x24, 0xc4, 0xe8, 0x33, 0xd8, 0xf0, 0xe8, 0x79, 0x44, 0x30, + 0x73, 0xec, 0xda, 0x01, 0x9d, 0x9c, 0x51, 0x9f, 0xc8, 0x8d, 0xa4, 0x8c, 0x5b, 0x1e, 0x3d, 0xd7, + 0xff, 0xb4, 0x0e, 0x63, 0x1d, 0xba, 0x0d, 0xd5, 0x89, 0x65, 0xbf, 0x22, 0x5c, 0xfd, 0x76, 0x53, + 0x3f, 0x0c, 0x41, 0x89, 0x0e, 0x04, 0xb7, 0xc5, 0x72, 0x4f, 0x9b, 0x26, 0x0e, 0x17, 0xfa, 0xa3, + 0x9e, 0xe5, 0xcb, 0xb9, 0x66, 0x1e, 0xcf, 0x57, 0x00, 0x8d, 0xbf, 0xcf, 0x40, 0x19, 0x13, 0x36, + 0xa1, 0x3e, 0x23, 0xe8, 0x3e, 0xac, 0x26, 0xeb, 0x63, 0x06, 0xa1, 0x9f, 0x2c, 0x74, 0x83, 0xa5, + 0xfd, 0x70, 0xdf, 0x41, 0x03, 0xd8, 0x98, 0x04, 0x84, 0xb9, 0x23, 0x9f, 0x38, 0xe6, 0x84, 0x32, + 0x6e, 0x06, 0xca, 0x4f, 0x74, 0xbd, 0x35, 0x29, 0x4b, 0x1e, 0x47, 0xb0, 0x63, 0xca, 0xb8, 0x76, + 0x26, 0xdc, 0x9a, 0x2c, 0x90, 0x1a, 0xbf, 0xc9, 0xc0, 0xda, 0x2e, 0xf5, 0x5f, 0xb8, 0xc1, 0x78, + 0x40, 0xc3, 0xc0, 0x26, 0x27, 0x13, 0x8f, 0x5a, 0x8e, 0xf1, 0x57, 0xd7, 0xf6, 0xc2, 0x85, 0x9f, + 0x90, 0x5d, 0xfc, 0x09, 0x3f, 0x84, 0x86, 0x4d, 0x1d, 0x22, 0x4e, 0x56, 0xc1, 0xc5, 0x84, 0xba, + 0x3e, 0xd7, 0x05, 0xa1, 0xba, 0x10, 0xf7, 0x62, 0xa9, 0x01, 0x89, 0x8d, 0x8c, 0x7f, 0xc8, 0x40, + 0xee, 0x29, 0xe1, 0xc6, 0xf0, 0x5d, 0x4c, 0xc9, 0xf8, 0x2c, 0xb5, 0x1a, 0xf7, 0x20, 0x17, 0x84, + 0xaa, 0xf2, 0x3c, 0xe5, 0xe5, 0xe9, 0x26, 0x58, 0x40, 0x8c, 0xbf, 0xcb, 0x43, 0xfe, 0xc0, 0x65, + 0xdc, 0xf8, 0xdb, 0xeb, 0xd3, 0xf5, 0xc9, 0x4c, 0x15, 0xed, 0xf2, 0x32, 0x72, 0xff, 0x46, 0x54, + 0x43, 0x13, 0xfc, 0xf8, 0x19, 0xc0, 0xc4, 0x1a, 0x11, 0xf5, 0x3b, 0x46, 0xda, 0xac, 0xba, 0xd5, + 0x8e, 0xdb, 0x0f, 0x85, 0xf4, 0xd8, 0x1a, 0xb9, 0xbe, 0xec, 0xa4, 0x9f, 0xc1, 0x15, 0x81, 0x96, + 0x62, 0xf5, 0xab, 0x56, 0x15, 0xb5, 0xe4, 0xfe, 0xab, 0x63, 0xf4, 0x25, 0x7f, 0xb8, 0xfb, 0x59, + 0x5d, 0xd6, 0x12, 0x12, 0xd1, 0xfe, 0x89, 0xac, 0x6c, 0xa9, 0xd6, 0x85, 0x2b, 0x5b, 0xe7, 0x64, + 0x6d, 0x2b, 0x6a, 0xbb, 0x39, 0x15, 0xa4, 0x64, 0x80, 0x11, 0xa9, 0x65, 0x1c, 0xa6, 0x44, 0xae, + 0x22, 0xd2, 0x13, 0xf5, 0xad, 0x72, 0x03, 0x4f, 0xbe, 0x54, 0xbe, 0x26, 0x53, 0x97, 0x49, 0x4d, + 0x34, 0x13, 0xa9, 0x4b, 0xba, 0x36, 0xde, 0x4c, 0xd1, 0x2a, 0x1f, 0x84, 0x3e, 0x6b, 0x67, 0x64, + 0x59, 0x61, 0xd9, 0x4a, 0x4a, 0x0c, 0xfa, 0x53, 0x68, 0xf8, 0xe4, 0x0d, 0x4f, 0x8d, 0xaa, 0xf9, + 0xb4, 0xd4, 0xbe, 0xb8, 0x26, 0x1a, 0x1c, 0x47, 0x16, 0x36, 0xfe, 0x46, 0x44, 0x6f, 0x71, 0x5e, + 0x60, 0xc6, 0x3f, 0x65, 0xaf, 0xed, 0x0e, 0xdb, 0x53, 0x8b, 0x92, 0xbd, 0x66, 0xa5, 0x51, 0xbc, + 0xeb, 0x4a, 0xa3, 0x6a, 0x98, 0xbb, 0x56, 0xa5, 0x51, 0x36, 0x4b, 0x1c, 0x30, 0xff, 0xd6, 0x0e, + 0x38, 0xbd, 0x8c, 0xb2, 0x0a, 0x2b, 0xdc, 0xec, 0xb2, 0x65, 0x4c, 0xad, 0xcd, 0x5f, 0xa7, 0x63, + 0xde, 0xcf, 0xa1, 0x74, 0x1a, 0x8a, 0x50, 0x1a, 0xad, 0xcf, 0x27, 0x4b, 0xe6, 0xa1, 0x6c, 0xda, + 0xe9, 0x4a, 0x30, 0x8e, 0x1a, 0x89, 0xaf, 0x97, 0x47, 0xb5, 0xd7, 0x96, 0xa7, 0xcd, 0x76, 0x6b, + 0xee, 0xeb, 0xf7, 0xf4, 0x45, 0x21, 0x1c, 0x43, 0x8d, 0x5f, 0x42, 0x51, 0xf5, 0x84, 0xbe, 0x84, + 0x15, 0xd5, 0x97, 0x72, 0x2d, 0xcd, 0xf7, 0xcb, 0x4c, 0x58, 0x55, 0xf8, 0x81, 0x80, 0x8b, 0x83, + 0x5f, 0x52, 0xe3, 0xcc, 0x63, 0xf5, 0x62, 0xbc, 0x84, 0xe2, 0xae, 0xe5, 0xdb, 0xc4, 0x7b, 0x47, + 0x71, 0x2a, 0x1d, 0x11, 0xdf, 0x71, 0x91, 0xf6, 0xb7, 0x99, 0xb8, 0x4a, 0x7b, 0x0b, 0xd6, 0xa7, + 0xab, 0xb4, 0xe6, 0xc9, 0xf1, 0xc1, 0xf3, 0x9d, 0xbd, 0xe6, 0x0d, 0xb4, 0x0e, 0xab, 0x5a, 0xf5, + 0xb4, 0x77, 0xd4, 0xc3, 0x3b, 0x43, 0x55, 0xaf, 0x9d, 0xaf, 0xe1, 0x66, 0xd1, 0x06, 0x20, 0x2d, + 0x1b, 0x9c, 0x1c, 0x1e, 0xee, 0xe0, 0xfd, 0x6f, 0x84, 0x3c, 0xb7, 0xb0, 0xb6, 0x9b, 0x9f, 0xaf, + 0xed, 0x16, 0x16, 0xd6, 0x76, 0x8b, 0xcf, 0xf2, 0xe5, 0x72, 0xb3, 0x82, 0x4b, 0xfa, 0x06, 0xc3, + 0xe6, 0x6f, 0x73, 0x50, 0x8e, 0x12, 0x92, 0xe4, 0x3a, 0x40, 0x26, 0x7d, 0x1d, 0x60, 0xf6, 0x36, + 0x42, 0x76, 0xc1, 0x6d, 0x84, 0xc5, 0xf7, 0x0e, 0x72, 0xcb, 0xee, 0x1d, 0x3c, 0xd4, 0x37, 0x0c, + 0xf2, 0xd2, 0x95, 0xdf, 0x9b, 0x4b, 0x8d, 0x3a, 0x43, 0x6b, 0xc4, 0xd4, 0x95, 0x2a, 0x75, 0xfd, + 0xc0, 0x80, 0x72, 0xc8, 0x48, 0xe0, 0x58, 0xdc, 0xd2, 0xb7, 0x19, 0xe2, 0x77, 0xe3, 0x9f, 0x33, + 0xb0, 0xaa, 0xf2, 0xc0, 0xaf, 0x02, 0x3a, 0xd6, 0x85, 0x49, 0xe3, 0x17, 0xd7, 0x76, 0xa8, 0xd4, + 0x5d, 0x82, 0xec, 0xd4, 0x5d, 0x82, 0x24, 0xc5, 0xcb, 0xa5, 0x53, 0x3c, 0x63, 0x3b, 0xc5, 0xcb, + 0x1f, 0x43, 0x39, 0xca, 0x69, 0x34, 0x25, 0x56, 0xe7, 0xbe, 0x06, 0xc7, 0x10, 0xe3, 0x73, 0xa8, + 0xc4, 0x9f, 0xb6, 0xe0, 0x32, 0x58, 0x2b, 0x7d, 0x19, 0xac, 0x92, 0xba, 0xf0, 0xb5, 0x39, 0x84, + 0xda, 0x54, 0xde, 0x88, 0x10, 0xe4, 0x65, 0x54, 0x51, 0xad, 0xe5, 0x33, 0x7a, 0x08, 0x95, 0x68, + 0x24, 0xb1, 0x4c, 0xb9, 0xc5, 0xb3, 0x49, 0x30, 0x9b, 0xff, 0x92, 0x01, 0x94, 0x84, 0x8f, 0x3d, + 0x97, 0x4d, 0x2c, 0x6e, 0x9f, 0xbd, 0x55, 0x82, 0xb5, 0x0e, 0xc5, 0x97, 0xf4, 0x34, 0x31, 0x5e, + 0xe1, 0x25, 0x3d, 0xdd, 0x77, 0xa6, 0xec, 0x92, 0xbb, 0xd2, 0x2e, 0x71, 0x2a, 0x9b, 0xbf, 0x46, + 0x2a, 0x7b, 0xff, 0x05, 0xd4, 0xa7, 0xe5, 0xe8, 0x36, 0xbc, 0x37, 0xd8, 0x3f, 0x3c, 0x39, 0xd8, + 0x19, 0xee, 0x3f, 0x3f, 0x32, 0x0f, 0x9f, 0xef, 0xf5, 0xcc, 0x93, 0xa3, 0xc1, 0x71, 0x6f, 0x77, + 0xff, 0xab, 0xfd, 0x9e, 0xe0, 0x5d, 0x1b, 0x5a, 0xb3, 0x80, 0x61, 0xef, 0x2f, 0x86, 0xcd, 0x8c, + 0x24, 0xeb, 0x8c, 0x66, 0xe7, 0x64, 0x6f, 0xff, 0x79, 0x33, 0xbb, 0xf5, 0xeb, 0x22, 0x34, 0x76, + 0x84, 0xef, 0x26, 0xa3, 0x21, 0x07, 0xd6, 0x94, 0xaf, 0x4d, 0x5f, 0x8e, 0x5b, 0x76, 0x94, 0x52, + 0xd8, 0x4e, 0x94, 0x38, 0xfe, 0xe0, 0x2a, 0x98, 0xf6, 0xaa, 0xef, 0x32, 0xf0, 0x41, 0x94, 0x60, + 0xc6, 0xc0, 0x74, 0xaa, 0x89, 0xb6, 0x96, 0x86, 0xff, 0xb9, 0xb4, 0x34, 0x1e, 0xfd, 0x27, 0x6f, + 0xd5, 0x46, 0x4f, 0xe5, 0x2f, 0xa1, 0xf9, 0x94, 0xf0, 0xe9, 0xaf, 0xdd, 0x5c, 0xd2, 0xd1, 0x53, + 0xc2, 0xe3, 0xc1, 0x3e, 0xbe, 0x14, 0xa3, 0x3b, 0x37, 0x01, 0x89, 0x84, 0x70, 0x0a, 0xc1, 0xd0, + 0xb2, 0xa6, 0x02, 0x1a, 0xf7, 0xff, 0xc9, 0xe5, 0x20, 0x3d, 0x80, 0x58, 0x2e, 0x11, 0x9e, 0x67, + 0x46, 0xb8, 0x7b, 0xf9, 0xe6, 0x79, 0xe5, 0x72, 0x45, 0xb0, 0xd4, 0x28, 0x72, 0x1b, 0xbb, 0xa6, + 0x53, 0x48, 0xec, 0xd5, 0xa3, 0x44, 0x30, 0x3d, 0xca, 0x6b, 0xb8, 0xa5, 0x5d, 0x4f, 0xb3, 0x26, + 0x15, 0xee, 0xd0, 0x83, 0xf9, 0x18, 0x3a, 0x17, 0x13, 0xe3, 0x11, 0x3f, 0xbd, 0x1e, 0x58, 0x8d, + 0xdb, 0xfd, 0xea, 0x9b, 0x8f, 0x47, 0x2e, 0x3f, 0x0b, 0x4f, 0x3b, 0x36, 0x1d, 0x47, 0x57, 0x8f, + 0xd5, 0xf5, 0x61, 0x9b, 0x7a, 0x91, 0xe0, 0x77, 0xd9, 0xda, 0x81, 0xfb, 0x9a, 0xfc, 0x99, 0x3c, + 0x49, 0x51, 0x4e, 0xff, 0x3b, 0x5b, 0xd7, 0xef, 0x4f, 0x9e, 0x48, 0xc1, 0x69, 0x51, 0x36, 0xf9, + 0xc9, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x60, 0xbb, 0x5b, 0x56, 0xed, 0x2c, 0x00, 0x00, } diff --git a/protobufs/livekit_agent_simulation.proto b/protobufs/livekit_agent_simulation.proto index 7cffae6d9..0a75f86a1 100644 --- a/protobufs/livekit_agent_simulation.proto +++ b/protobufs/livekit_agent_simulation.proto @@ -267,11 +267,11 @@ message SimulationRun { string project_id = 1; optional Status status = 2; optional TokenPagination page_token = 3; - // Half-open window [from, to) on created_at, the leading key of this - // list's keyset. Unset bounds mean no window, so existing callers keep - // their unbounded scan; the histogram's selected range sets both. - optional google.protobuf.Timestamp from = 4; - optional google.protobuf.Timestamp to = 5; + // Half-open window [start_time, end_time) on created_at, the leading key + // of this list's keyset. Unset bounds mean no window, so existing callers + // keep their unbounded scan; the histogram's selected range sets both. + optional google.protobuf.Timestamp start_time = 4; + optional google.protobuf.Timestamp end_time = 5; // Exact agent name. Unset means every agent — including the runs whose // name is empty, which a bare string could not tell from no filter. optional string agent_name = 6; @@ -289,8 +289,8 @@ message SimulationRun { string project_id = 1; // Both bounds required: a bucketed scan of a project's whole history is // never what a caller wants. - google.protobuf.Timestamp from = 2; - google.protobuf.Timestamp to = 3; + google.protobuf.Timestamp start_time = 2; + google.protobuf.Timestamp end_time = 3; // Applied as `List` applies it: a filter the rows honour and the bars // above them drop would make the histogram an answer about a wider set. optional Status status = 4; From 14f581ad2ea2cfcb1861b996a3446b576075ef6d Mon Sep 17 00:00:00 2001 From: Erik Hortsch Date: Mon, 24 Aug 2026 11:25:37 -0700 Subject: [PATCH 2/4] rpc: gate the claim skip process-wide for every server (#1729) * rpc: gate the claim skip process-wide for every server Wires psrpc's WithServerSkipClaim into WithServerObservability, which is the one seam every server constructor shares -- WithDefaultServerOptions calls it, and the constructors that take only a logger reach it too. The setting is process-wide because the claim is a transport policy rather than a per-service one, and it is read per request so callers may set it before or after their servers exist and revoke it without a redeploy. Co-Authored-By: Claude Opus 5 * pin psrpc v0.7.5, trim comments Co-Authored-By: Claude Opus 5 * rename the skip-claim gate to carry the psrpc prefix Server and client mean too many things in this package for a bare SetServerSkipClaim to read clearly. Co-Authored-By: Claude Opus 5 --------- Co-authored-by: Claude Opus 5 --- go.mod | 2 +- go.sum | 4 ++++ rpc/typed_api.go | 18 ++++++++++++++++++ rpc/typed_api_test.go | 17 +++++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index cce8163f1..a0af0bde9 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/jxskiss/base62 v1.1.0 github.com/lithammer/shortuuid/v4 v4.2.0 github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731 - github.com/livekit/psrpc v0.7.3 + github.com/livekit/psrpc v0.7.5 github.com/mackerelio/go-osstat v0.2.8 github.com/maxbrunsfeld/counterfeiter/v6 v6.12.2 github.com/nyaruka/phonenumbers v1.8.1 diff --git a/go.sum b/go.sum index b96e9dc88..90b0c74aa 100644 --- a/go.sum +++ b/go.sum @@ -87,6 +87,10 @@ github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731 h1:9x+U2HGLrSw5AT github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731/go.mod h1:Rs3MhFwutWhGwmY1VQsygw28z5bWcnEYmS1OG9OxjOQ= github.com/livekit/psrpc v0.7.3 h1:bekuZt/ZQzg8+/M8G6G5jq7bvV9fAKdPHSOZeTwrIIc= github.com/livekit/psrpc v0.7.3/go.mod h1:rAI+m2+/cb4x9RXhLRtUx5ZwdfjjXOl4zi46IjEetaw= +github.com/livekit/psrpc v0.7.5-0.20260819230101-cbf56a2f6872 h1:T4+LTChYiNKWkK2yeW0FXB2CNpEXxiHEV75Xhh8lDUI= +github.com/livekit/psrpc v0.7.5-0.20260819230101-cbf56a2f6872/go.mod h1:rAI+m2+/cb4x9RXhLRtUx5ZwdfjjXOl4zi46IjEetaw= +github.com/livekit/psrpc v0.7.5 h1:WxfJIQ41X1b+48A1uzc8Gy9FhYEMxBJNCpCYqPdO/Ds= +github.com/livekit/psrpc v0.7.5/go.mod h1:rAI+m2+/cb4x9RXhLRtUx5ZwdfjjXOl4zi46IjEetaw= github.com/mackerelio/go-osstat v0.2.8 h1:I2duicTaCGWoM53XwAwA9OIe1inu0xnVs8/pqOWWVr4= github.com/mackerelio/go-osstat v0.2.8/go.mod h1:SyS3XxKdoSKJnTGTkN5Yrh6VUQVuAURACfE6y+2DN4k= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= diff --git a/rpc/typed_api.go b/rpc/typed_api.go index 49189d928..8a17819fa 100644 --- a/rpc/typed_api.go +++ b/rpc/typed_api.go @@ -17,6 +17,7 @@ package rpc import ( "context" "fmt" + "sync/atomic" "time" "github.com/livekit/psrpc" @@ -97,12 +98,29 @@ func (p *ClientParams) Args() (psrpc.MessageBus, psrpc.ClientOption) { return p.Bus, psrpc.WithClientOptions(p.Options()...) } +var psrpcServerSkipClaim atomic.Pointer[func() bool] + +// SetPSRPCServerSkipClaim gates the claim skip for every server built through +// WithServerObservability. Process-wide; read per request, so revocable at runtime. +func SetPSRPCServerSkipClaim(enabled func() bool) { + psrpcServerSkipClaim.Store(&enabled) +} + +func psrpcServerSkipClaimEnabled() bool { + if enabled := psrpcServerSkipClaim.Load(); enabled != nil { + return (*enabled)() + } + return false +} + func WithServerObservability(logger logger.Logger) psrpc.ServerOption { return psrpc.WithServerOptions( middleware.WithServerMetrics(PSRPCMetricsObserver{}), psrpc.WithServerObserver(PSRPCMetricsObserver{}), WithServerLogger(logger), otelpsrpc.ServerOptions(otelpsrpc.Config{}), + // here rather than WithDefaultServerOptions so logger-only servers get it too + psrpc.WithServerSkipClaim(psrpcServerSkipClaimEnabled), ) } diff --git a/rpc/typed_api_test.go b/rpc/typed_api_test.go index ffef3a94f..fe27e8775 100644 --- a/rpc/typed_api_test.go +++ b/rpc/typed_api_test.go @@ -6,6 +6,7 @@ import ( reflect "reflect" "runtime" "slices" + "sync/atomic" "testing" "time" @@ -76,3 +77,19 @@ func TestPropagateRequestTimeout(t *testing.T) { WithPropagateRequestTimeout(ctx)(&ro) require.InEpsilon(t, 42*time.Second, ro.Timeout, 0.01) } + +func TestServerSkipClaim(t *testing.T) { + t.Cleanup(func() { psrpcServerSkipClaim.Store(nil) }) + + require.False(t, psrpcServerSkipClaimEnabled(), "unset must mean claim") + + var on atomic.Bool + SetPSRPCServerSkipClaim(on.Load) + require.False(t, psrpcServerSkipClaimEnabled()) + + on.Store(true) + require.True(t, psrpcServerSkipClaimEnabled(), "must be read per call, not captured") + + on.Store(false) + require.False(t, psrpcServerSkipClaimEnabled(), "must stay revocable") +} From 1aa393dc9dfe238e9229a28458372617a58faf4e Mon Sep 17 00:00:00 2001 From: Paul Wells Date: Mon, 24 Aug 2026 11:44:51 -0700 Subject: [PATCH 3/4] log agent dispatch metadata size (#1739) * log agent dispatch metadata size * generated protobuf --------- Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- livekit/livekit_agent_dispatch.pb.go | 30 ++++----- livekit/livekit_agent_dispatch.twirp.go | 89 +++++++++++++------------ protobufs/livekit_agent_dispatch.proto | 30 +++++++-- 3 files changed, 85 insertions(+), 64 deletions(-) diff --git a/livekit/livekit_agent_dispatch.pb.go b/livekit/livekit_agent_dispatch.pb.go index 0f0702e4c..c08d0141f 100644 --- a/livekit/livekit_agent_dispatch.pb.go +++ b/livekit/livekit_agent_dispatch.pb.go @@ -556,32 +556,32 @@ var File_livekit_agent_dispatch_proto protoreflect.FileDescriptor const file_livekit_agent_dispatch_proto_rawDesc = "" + "\n" + - "\x1clivekit_agent_dispatch.proto\x12\alivekit\x1a\x13livekit_agent.proto\x1a\x14logger/options.proto\"\xeb\x02\n" + + "\x1clivekit_agent_dispatch.proto\x12\alivekit\x1a\x13livekit_agent.proto\x1a\x14logger/options.proto\"\xad\x03\n" + "\x1aCreateAgentDispatchRequest\x12\x1d\n" + "\n" + "agent_name\x18\x01 \x01(\tR\tagentName\x12\x12\n" + - "\x04room\x18\x02 \x01(\tR\x04room\x12\x1f\n" + - "\bmetadata\x18\x03 \x01(\tB\x03\xc0P\x01R\bmetadata\x12@\n" + + "\x04room\x18\x02 \x01(\tR\x04room\x12@\n" + + "\bmetadata\x18\x03 \x01(\tB$\xb2P\x1e\xc0P\x01R\bmetadata\x12@\n" + "\x0erestart_policy\x18\x04 \x01(\x0e2\x19.livekit.JobRestartPolicyR\rrestartPolicy\x12\x1e\n" + "\n" + "deployment\x18\x05 \x01(\tR\n" + - "deployment\x12X\n" + + "deployment\x12y\n" + "\n" + - "attributes\x18\x06 \x03(\v23.livekit.CreateAgentDispatchRequest.AttributesEntryB\x03\xc0P\x01R\n" + + "attributes\x18\x06 \x03(\v23.livekit.CreateAgentDispatchRequest.AttributesEntryB$\xb2P\x1e\xc0P\x01R\n" + "attributes\x1a=\n" + "\x0fAttributesEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xc5\x02\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x87\x03\n" + "\x11RoomAgentDispatch\x12\x1d\n" + "\n" + - "agent_name\x18\x01 \x01(\tR\tagentName\x12\x1f\n" + - "\bmetadata\x18\x02 \x01(\tB\x03\xc0P\x01R\bmetadata\x12@\n" + + "agent_name\x18\x01 \x01(\tR\tagentName\x12@\n" + + "\bmetadata\x18\x02 \x01(\tB$\xb2P\x1e\xc0P\x01R\bmetadata\x12@\n" + "\x0erestart_policy\x18\x03 \x01(\x0e2\x19.livekit.JobRestartPolicyR\rrestartPolicy\x12\x1e\n" + "\n" + "deployment\x18\x04 \x01(\tR\n" + - "deployment\x12O\n" + + "deployment\x12p\n" + "\n" + - "attributes\x18\x05 \x03(\v2*.livekit.RoomAgentDispatch.AttributesEntryB\x03\xc0P\x01R\n" + + "attributes\x18\x05 \x03(\v2*.livekit.RoomAgentDispatch.AttributesEntryB$\xb2P\x1e\xc0P\x01R\n" + "attributes\x1a=\n" + "\x0fAttributesEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + @@ -597,20 +597,20 @@ const file_livekit_agent_dispatch_proto_rawDesc = "" + "dispatchId\x12\x12\n" + "\x04room\x18\x02 \x01(\tR\x04room\"^\n" + "\x19ListAgentDispatchResponse\x12A\n" + - "\x10agent_dispatches\x18\x01 \x03(\v2\x16.livekit.AgentDispatchR\x0fagentDispatches\"\x94\x03\n" + + "\x10agent_dispatches\x18\x01 \x03(\v2\x16.livekit.AgentDispatchR\x0fagentDispatches\"\xd6\x03\n" + "\rAgentDispatch\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1d\n" + "\n" + "agent_name\x18\x02 \x01(\tR\tagentName\x12\x12\n" + - "\x04room\x18\x03 \x01(\tR\x04room\x12\x1f\n" + - "\bmetadata\x18\x04 \x01(\tB\x03\xc0P\x01R\bmetadata\x121\n" + + "\x04room\x18\x03 \x01(\tR\x04room\x12@\n" + + "\bmetadata\x18\x04 \x01(\tB$\xb2P\x1e\xc0P\x01R\bmetadata\x121\n" + "\x05state\x18\x05 \x01(\v2\x1b.livekit.AgentDispatchStateR\x05state\x12@\n" + "\x0erestart_policy\x18\x06 \x01(\x0e2\x19.livekit.JobRestartPolicyR\rrestartPolicy\x12\x1e\n" + "\n" + "deployment\x18\a \x01(\tR\n" + - "deployment\x12K\n" + + "deployment\x12l\n" + "\n" + - "attributes\x18\b \x03(\v2&.livekit.AgentDispatch.AttributesEntryB\x03\xc0P\x01R\n" + + "attributes\x18\b \x03(\v2&.livekit.AgentDispatch.AttributesEntryB$\xb2P\x1e\xc0P\x01R\n" + "attributes\x1a=\n" + "\x0fAttributesEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + diff --git a/livekit/livekit_agent_dispatch.twirp.go b/livekit/livekit_agent_dispatch.twirp.go index 89ec60ead..8733f708e 100644 --- a/livekit/livekit_agent_dispatch.twirp.go +++ b/livekit/livekit_agent_dispatch.twirp.go @@ -1075,47 +1075,50 @@ func (s *agentDispatchServiceServer) PathPrefix() string { } var twirpFileDescriptor1 = []byte{ - // 670 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0xcb, 0x6e, 0xd3, 0x40, - 0x14, 0xc5, 0x76, 0xd2, 0x36, 0xb7, 0x4d, 0x1a, 0x86, 0x0a, 0xb9, 0xe6, 0x15, 0x52, 0x09, 0x55, - 0x5d, 0xb8, 0x22, 0x15, 0x12, 0xaa, 0x84, 0x44, 0x4a, 0x53, 0xa9, 0x0f, 0xda, 0xc8, 0xa8, 0x08, - 0xb1, 0xc0, 0x4c, 0xe2, 0xab, 0x74, 0xa8, 0x9d, 0x09, 0xf6, 0x24, 0x52, 0xbe, 0x81, 0x2d, 0x5f, - 0xc1, 0x27, 0xb0, 0x62, 0xc3, 0xcf, 0xc0, 0x4f, 0x20, 0x8f, 0x1d, 0x13, 0x37, 0x36, 0x54, 0xaa, - 0xb2, 0xf3, 0x9c, 0x7b, 0xe7, 0xcc, 0x9d, 0x93, 0x73, 0x26, 0x70, 0xdf, 0x65, 0x23, 0xbc, 0x64, - 0xc2, 0xa6, 0x3d, 0xec, 0x0b, 0xdb, 0x61, 0xc1, 0x80, 0x8a, 0xee, 0x85, 0x39, 0xf0, 0xb9, 0xe0, - 0x64, 0x31, 0xae, 0x1a, 0x77, 0x52, 0x6d, 0x51, 0xd5, 0x58, 0x73, 0x79, 0xaf, 0x87, 0xfe, 0x36, - 0x1f, 0x08, 0xc6, 0xfb, 0x41, 0x84, 0xd6, 0x7f, 0xab, 0x60, 0xbc, 0xf2, 0x91, 0x0a, 0x6c, 0x86, - 0xbd, 0xfb, 0x31, 0xa3, 0x85, 0x9f, 0x87, 0x18, 0x08, 0xf2, 0x00, 0x20, 0x3a, 0xaa, 0x4f, 0x3d, - 0xd4, 0x95, 0x9a, 0xb2, 0x59, 0xb2, 0x4a, 0x12, 0x39, 0xa5, 0x1e, 0x12, 0x02, 0x05, 0x9f, 0x73, - 0x4f, 0x57, 0x65, 0x41, 0x7e, 0x93, 0x47, 0xb0, 0xe4, 0xa1, 0xa0, 0x0e, 0x15, 0x54, 0xd7, 0x42, - 0x7c, 0x4f, 0xfb, 0xd1, 0x56, 0xac, 0x04, 0x24, 0x2f, 0xa1, 0xe2, 0x63, 0x20, 0xa8, 0x2f, 0xec, - 0x01, 0x77, 0x59, 0x77, 0xac, 0x17, 0x6a, 0xca, 0x66, 0xa5, 0xb1, 0x6e, 0xc6, 0x63, 0x9b, 0x47, - 0xbc, 0x63, 0x45, 0x1d, 0x6d, 0xd9, 0x60, 0x95, 0xfd, 0xe9, 0x25, 0x79, 0x08, 0xe0, 0xe0, 0xc0, - 0xe5, 0x63, 0x0f, 0xfb, 0x42, 0x2f, 0xca, 0xc3, 0xa7, 0x10, 0xf2, 0x0e, 0x80, 0x0a, 0xe1, 0xb3, - 0xce, 0x50, 0x60, 0xa0, 0x2f, 0xd4, 0xb4, 0xcd, 0xe5, 0xc6, 0x4e, 0xc2, 0x9e, 0x7f, 0x5d, 0xb3, - 0x99, 0xec, 0x6a, 0xf5, 0x85, 0x3f, 0x8e, 0x26, 0x9f, 0xe2, 0x32, 0x5e, 0xc0, 0xea, 0x95, 0x1e, - 0x52, 0x05, 0xed, 0x12, 0xc7, 0xb1, 0x36, 0xe1, 0x27, 0x59, 0x83, 0xe2, 0x88, 0xba, 0x43, 0x8c, - 0x65, 0x89, 0x16, 0xbb, 0xea, 0x73, 0xa5, 0xfe, 0x53, 0x85, 0xdb, 0x16, 0xe7, 0x5e, 0xea, 0xf0, - 0xff, 0x89, 0x3c, 0x2d, 0xa8, 0x7a, 0x3d, 0x41, 0xb5, 0x1b, 0x09, 0x5a, 0x98, 0x11, 0xf4, 0x2c, - 0x25, 0x68, 0x51, 0x0a, 0xba, 0x95, 0xb0, 0xcf, 0xdc, 0x68, 0xee, 0x3a, 0x7e, 0x04, 0x63, 0x1f, - 0x5d, 0xcc, 0x31, 0xad, 0x09, 0xcb, 0x93, 0x64, 0xd8, 0xcc, 0x89, 0x18, 0xf7, 0xca, 0xdf, 0xdb, - 0x30, 0x41, 0x0f, 0xf7, 0xad, 0xbf, 0xdf, 0x4e, 0x96, 0x8b, 0xeb, 0x1f, 0x40, 0x3f, 0x61, 0x81, - 0x98, 0x23, 0xff, 0x7a, 0x06, 0x7f, 0x30, 0xe0, 0xfd, 0x00, 0x49, 0x13, 0xaa, 0xe9, 0x80, 0x63, - 0xa0, 0x2b, 0x52, 0xf4, 0xbb, 0x89, 0xe8, 0xe9, 0x9d, 0xab, 0x74, 0x7a, 0x89, 0x41, 0xfd, 0xab, - 0x06, 0xe5, 0xb4, 0xcb, 0x2a, 0xa0, 0x4e, 0x86, 0xb5, 0x54, 0xe6, 0x5c, 0x71, 0x9d, 0x9a, 0x17, - 0x6d, 0x2d, 0x27, 0xda, 0x85, 0x2c, 0x27, 0x3e, 0x85, 0x62, 0x20, 0xa8, 0x40, 0x99, 0xc9, 0xe5, - 0xc6, 0xbd, 0xec, 0x69, 0xdf, 0x84, 0x2d, 0x56, 0xd4, 0x99, 0x61, 0xde, 0x85, 0x1b, 0x99, 0x77, - 0x71, 0xc6, 0xbc, 0xc7, 0x29, 0xf3, 0x2e, 0x49, 0x1d, 0x9f, 0x64, 0x4f, 0x36, 0x77, 0xe3, 0x0a, - 0x20, 0xb3, 0x52, 0x90, 0x1a, 0x14, 0x3e, 0xf1, 0xce, 0xe4, 0x37, 0x5e, 0x49, 0xdd, 0x5c, 0x56, - 0xc2, 0x1f, 0xab, 0x2b, 0x9f, 0x2d, 0xc7, 0xa6, 0x42, 0xd2, 0x6a, 0x56, 0x29, 0x46, 0x9a, 0xf2, - 0x99, 0x76, 0x64, 0x1e, 0x64, 0x59, 0x8b, 0xca, 0x31, 0xd2, 0x14, 0x5b, 0xcf, 0xa0, 0x7a, 0x55, - 0x44, 0x42, 0xa0, 0x72, 0x64, 0xb5, 0xed, 0xb3, 0x53, 0xfb, 0xa0, 0x79, 0x78, 0x72, 0x6e, 0xb5, - 0xaa, 0xb7, 0x48, 0x19, 0x4a, 0x21, 0x76, 0xda, 0x7a, 0xdb, 0xb2, 0xaa, 0x4a, 0xe3, 0x8b, 0x0a, - 0x6b, 0xe9, 0x69, 0xd1, 0x1f, 0xb1, 0x2e, 0x92, 0xd7, 0x50, 0x89, 0x1e, 0xd1, 0xc4, 0x5c, 0x1b, - 0xd7, 0x78, 0x5d, 0x8d, 0x1c, 0xf3, 0x86, 0x74, 0x51, 0x9a, 0x33, 0xe8, 0xf2, 0x63, 0x9e, 0x4b, - 0x77, 0x0e, 0x2b, 0x61, 0xb4, 0x92, 0xf5, 0xe3, 0xa4, 0x2f, 0x2f, 0xd1, 0x46, 0xfd, 0x5f, 0x2d, - 0x51, 0x28, 0xf7, 0x0e, 0xde, 0x6f, 0xf4, 0x98, 0xb8, 0x18, 0x76, 0xcc, 0x2e, 0xf7, 0xb6, 0xe3, - 0xfe, 0x6d, 0xf9, 0x2f, 0xda, 0xe5, 0xee, 0x04, 0xf8, 0xa6, 0x96, 0x4f, 0xd8, 0x08, 0x8f, 0x99, - 0x30, 0xdb, 0x61, 0xe9, 0x97, 0x5a, 0x89, 0xd7, 0xbb, 0xbb, 0x12, 0xe8, 0x2c, 0xc8, 0x2d, 0x3b, - 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x5c, 0x1d, 0x6f, 0xd2, 0xcc, 0x07, 0x00, 0x00, + // 708 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0x25, 0x76, 0xd2, 0x36, 0xd3, 0x26, 0x0d, 0x4b, 0x85, 0xdc, 0x00, 0x95, 0x49, 0x11, 0x0a, + 0x3d, 0xb8, 0x22, 0x15, 0x12, 0xaa, 0x00, 0x35, 0xa5, 0xa9, 0xd4, 0x52, 0x4a, 0xe4, 0xaa, 0x1c, + 0x38, 0x10, 0x36, 0xf1, 0x28, 0x5d, 0xea, 0x64, 0x8d, 0xbd, 0x89, 0x14, 0xaa, 0x9e, 0x39, 0xf0, + 0x27, 0x48, 0x5c, 0x38, 0x72, 0xe2, 0x2b, 0xf8, 0x08, 0xbe, 0x02, 0x79, 0xed, 0x98, 0xb8, 0x89, + 0xa1, 0xa2, 0xa0, 0xde, 0x76, 0xdf, 0xcc, 0xbe, 0xec, 0xce, 0x7b, 0x33, 0x0e, 0xdc, 0xb4, 0x59, + 0x1f, 0x8f, 0x99, 0x68, 0xd0, 0x36, 0x76, 0x45, 0xc3, 0x62, 0x9e, 0x43, 0x45, 0xeb, 0xc8, 0x70, + 0x5c, 0x2e, 0x38, 0x99, 0x0e, 0xa3, 0xc5, 0x6b, 0xb1, 0xb4, 0x20, 0x5a, 0x5c, 0xb0, 0x79, 0xbb, + 0x8d, 0xee, 0x2a, 0x77, 0x04, 0xe3, 0x5d, 0x2f, 0x40, 0x4b, 0x9f, 0x55, 0x28, 0x3e, 0x75, 0x91, + 0x0a, 0xac, 0xfa, 0xb9, 0x5b, 0x21, 0xa3, 0x89, 0xef, 0x7a, 0xe8, 0x09, 0x72, 0x0b, 0x20, 0xf8, + 0xa9, 0x2e, 0xed, 0xa0, 0x96, 0xd2, 0x53, 0xe5, 0xac, 0x99, 0x95, 0xc8, 0x3e, 0xed, 0x20, 0x21, + 0x90, 0x76, 0x39, 0xef, 0x68, 0x8a, 0x0c, 0xc8, 0x35, 0xd9, 0x80, 0x99, 0x0e, 0x0a, 0x6a, 0x51, + 0x41, 0x35, 0xd5, 0xc7, 0x37, 0xef, 0x7c, 0xa9, 0x2f, 0x3d, 0x72, 0xd1, 0xa2, 0x2d, 0x81, 0x96, + 0x5e, 0x3e, 0x39, 0xd1, 0x8d, 0x03, 0xf6, 0x1e, 0xf5, 0xd3, 0x53, 0xbd, 0x39, 0x10, 0xe8, 0xdd, + 0x7b, 0xf2, 0xad, 0x9e, 0x32, 0xa3, 0x53, 0x64, 0x03, 0xf2, 0x2e, 0x7a, 0x82, 0xba, 0xa2, 0xe1, + 0x70, 0x9b, 0xb5, 0x06, 0x5a, 0x5a, 0x4f, 0x95, 0xf3, 0x95, 0x45, 0x23, 0x7c, 0x97, 0xb1, 0xcb, + 0x9b, 0x66, 0x90, 0x51, 0x97, 0x09, 0x66, 0xce, 0x1d, 0xdd, 0x92, 0x25, 0x00, 0x0b, 0x1d, 0x9b, + 0x0f, 0x3a, 0xd8, 0x15, 0x5a, 0x46, 0xde, 0x6e, 0x04, 0x21, 0x03, 0x00, 0x2a, 0x84, 0xcb, 0x9a, + 0x3d, 0x81, 0x9e, 0x36, 0xa5, 0xab, 0xe5, 0xd9, 0xca, 0x5a, 0xc4, 0x9e, 0x5c, 0x0f, 0xa3, 0x1a, + 0x9d, 0xaa, 0x75, 0x85, 0x3b, 0x38, 0xe7, 0xd3, 0x46, 0x7e, 0xac, 0xf8, 0x18, 0xe6, 0xcf, 0x90, + 0x90, 0x02, 0xa8, 0xc7, 0x38, 0x08, 0xab, 0xeb, 0x2f, 0xc9, 0x02, 0x64, 0xfa, 0xd4, 0xee, 0x61, + 0x58, 0xd8, 0x60, 0xb3, 0xae, 0x3c, 0x4c, 0x95, 0x3e, 0xa8, 0x70, 0xd5, 0xe4, 0xbc, 0x13, 0xbb, + 0xdd, 0x9f, 0x64, 0x1a, 0x95, 0x44, 0xf9, 0x47, 0x92, 0xa8, 0x17, 0x92, 0x24, 0x3d, 0x26, 0x89, + 0x13, 0x93, 0x24, 0x23, 0x25, 0x59, 0x89, 0xd8, 0xc7, 0x9e, 0x7c, 0xf9, 0x4a, 0xbc, 0x81, 0xe2, + 0x16, 0xda, 0x98, 0xd0, 0x38, 0x06, 0xcc, 0x0e, 0xbb, 0xb3, 0xc1, 0xac, 0x80, 0x71, 0x33, 0xf7, + 0xb5, 0x0e, 0x43, 0x74, 0x67, 0xcb, 0xfc, 0xb5, 0xb6, 0x26, 0x75, 0x52, 0xe9, 0x35, 0x68, 0x7b, + 0xcc, 0x13, 0xff, 0x91, 0x7f, 0x71, 0x02, 0xbf, 0xe7, 0xf0, 0xae, 0x87, 0xa4, 0x0a, 0x85, 0xf8, + 0x90, 0x41, 0x4f, 0x4b, 0x49, 0x55, 0xae, 0x47, 0xaa, 0xc4, 0x4f, 0xce, 0xd3, 0xd1, 0x2d, 0x7a, + 0xa5, 0xef, 0x2a, 0xe4, 0xe2, 0x3e, 0xcd, 0x83, 0x32, 0xbc, 0xac, 0xa9, 0x30, 0xeb, 0x8c, 0x6f, + 0x95, 0xa4, 0xf1, 0xa2, 0x26, 0x8c, 0x97, 0xf4, 0x5f, 0x79, 0xf9, 0x3e, 0x64, 0x3c, 0x41, 0x05, + 0xca, 0xb9, 0x30, 0x5b, 0xb9, 0x31, 0xf9, 0x39, 0x07, 0x7e, 0x8a, 0x19, 0x64, 0x4e, 0xb0, 0xff, + 0xd4, 0x85, 0xec, 0x3f, 0x3d, 0x66, 0x7f, 0x3b, 0x66, 0xff, 0x19, 0x59, 0xe8, 0xbb, 0x93, 0x6f, + 0x76, 0xf9, 0xd6, 0x17, 0x40, 0xc6, 0x6b, 0x45, 0x74, 0x48, 0xbf, 0xe5, 0xcd, 0xa1, 0x4b, 0xe6, + 0x62, 0xa5, 0x91, 0x11, 0x5f, 0xee, 0x96, 0x9c, 0xad, 0x56, 0x83, 0x0a, 0x49, 0xab, 0x9a, 0xd9, + 0x10, 0xa9, 0xca, 0x8f, 0x8d, 0x25, 0x3b, 0x4a, 0x86, 0xd5, 0x20, 0x1c, 0x22, 0x55, 0xb1, 0xf2, + 0x00, 0x0a, 0x67, 0xab, 0x4c, 0x08, 0xe4, 0x77, 0xcd, 0x7a, 0xe3, 0xc5, 0x7e, 0x63, 0xbb, 0xba, + 0xb3, 0x77, 0x68, 0xd6, 0x0a, 0x57, 0x48, 0x0e, 0xb2, 0x3e, 0xb6, 0x5f, 0x7b, 0x59, 0x33, 0x0b, + 0xa9, 0xca, 0x47, 0x05, 0x16, 0xe2, 0xb7, 0x45, 0xb7, 0xcf, 0x5a, 0x48, 0x9e, 0x43, 0x3e, 0x98, + 0xf4, 0x91, 0x3d, 0x97, 0xcf, 0xf1, 0x09, 0x28, 0x26, 0xd8, 0xdf, 0xa7, 0x0b, 0xe6, 0xc1, 0x04, + 0xba, 0xe4, 0x41, 0x91, 0x48, 0x77, 0x08, 0x73, 0x7e, 0x73, 0x46, 0xfb, 0xdb, 0x51, 0x5e, 0xd2, + 0x4c, 0x28, 0x96, 0x7e, 0x97, 0x12, 0xb4, 0xf5, 0xe6, 0xf6, 0xab, 0xe5, 0x36, 0x13, 0x47, 0xbd, + 0xa6, 0xd1, 0xe2, 0x9d, 0xd5, 0x30, 0x7f, 0x55, 0xfe, 0x17, 0x68, 0x71, 0x7b, 0x08, 0x7c, 0x52, + 0x72, 0x7b, 0xac, 0x8f, 0xcf, 0x98, 0x30, 0xea, 0x7e, 0xe8, 0x87, 0x92, 0x0f, 0xf7, 0xeb, 0xeb, + 0x12, 0x68, 0x4e, 0xc9, 0x23, 0x6b, 0x3f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x8a, 0xc3, 0xbb, 0xe3, + 0x92, 0x08, 0x00, 0x00, } diff --git a/protobufs/livekit_agent_dispatch.proto b/protobufs/livekit_agent_dispatch.proto index d06e8a099..aba251454 100644 --- a/protobufs/livekit_agent_dispatch.proto +++ b/protobufs/livekit_agent_dispatch.proto @@ -36,18 +36,30 @@ service AgentDispatchService { message CreateAgentDispatchRequest { string agent_name = 1; string room = 2; - string metadata = 3 [(logger.sensitivity) = SENSITIVITY_PII]; + string metadata = 3 [ + (logger.sensitivity) = SENSITIVITY_PII, + (logger.redact_format) = "" + ]; JobRestartPolicy restart_policy = 4; // cloud only string deployment = 5; - map attributes = 6 [(logger.sensitivity) = SENSITIVITY_PII]; + map attributes = 6 [ + (logger.sensitivity) = SENSITIVITY_PII, + (logger.redact_format) = "" + ]; } message RoomAgentDispatch { string agent_name = 1; - string metadata = 2 [(logger.sensitivity) = SENSITIVITY_PII]; + string metadata = 2 [ + (logger.sensitivity) = SENSITIVITY_PII, + (logger.redact_format) = "" + ]; JobRestartPolicy restart_policy = 3; // cloud only string deployment = 4; - map attributes = 5 [(logger.sensitivity) = SENSITIVITY_PII]; + map attributes = 5 [ + (logger.sensitivity) = SENSITIVITY_PII, + (logger.redact_format) = "" + ]; } message DeleteAgentDispatchRequest { @@ -68,11 +80,17 @@ message AgentDispatch { string id = 1; string agent_name = 2; string room = 3; - string metadata = 4 [(logger.sensitivity) = SENSITIVITY_PII]; + string metadata = 4 [ + (logger.sensitivity) = SENSITIVITY_PII, + (logger.redact_format) = "" + ]; AgentDispatchState state = 5; JobRestartPolicy restart_policy = 6; // cloud only string deployment = 7; - map attributes = 8 [(logger.sensitivity) = SENSITIVITY_PII]; + map attributes = 8 [ + (logger.sensitivity) = SENSITIVITY_PII, + (logger.redact_format) = "" + ]; } message AgentDispatchState { From 6f2fbbf9c47cbee7cf685560e9b990a98bd1ed55 Mon Sep 17 00:00:00 2001 From: Benjamin Pracht Date: Mon, 24 Aug 2026 13:52:38 -0700 Subject: [PATCH 4/4] Pin code generation and bring renovate.json to the org baseline (#1733) protoc's plugins were unpinned inputs to committed code: the generate workflow installed all four with `go install ...@latest`, ran mage from `mage-action` with `version: latest`, and floated protoc within its major. Worse, every `--plugin=` flag in the magefile used the short form (`--plugin=go=`), which protoc silently ignores, so generation actually ran whatever binary happened to be in GOPATH/bin. Pin each generator to the version stamped in the committed headers: - protoc-gen-go, -go-grpc, -psrpc, -twirp and mage become `tool` directives in go.mod, resolved at generation time with `go tool -n` - the `--plugin=` flags use the full-executable-name form protoc honours, so those pinned paths are actually used - protoc is pinned exactly rather than floated within its major; it stamps its version into every generated file, so a bump rewrites the committed output and should be a reviewable edit - release.yaml gets the same protoc pin: it builds the published JS package via `pnpm generate:proto`, so protoc is a release input google.golang.org/protobuf moves 1.36.11 -> 1.36.12 because 1.36.12 is what generated the committed files; pinning to 1.36.11 would land a downgrade of every header disguised as a pin. Verified by regenerating with the pinned protoc: the generated tree comes back byte-identical. GOPATH/bin here held older plugins (protoc-gen-go v1.36.11, psrpc v0.7.0), so an empty diff also proves the plugin paths are honoured rather than falling back to PATH. `mage bootstrap` stays as a developer convenience for installing the plugins system-wide, documented as such: it is not a build step, and generation ignores what it installs. bootstrap.sh is removed - it did the same job pinned to protoc-gen-go v1.31.0 and psrpc v0.5.1, and nothing referenced it. renovate.json moves off the deprecated config:base to the baseline used across the Go repos: third-party modules ungrouped so a bad bump reverts alone, livekit deps grouped and exempt from quarantine, pion grouped because they are co-released, a vulnerability fast path, and both the go and toolchain directives disabled - this module is a library, so its go directive is the minimum we ask of consumers. Drops the stale go 1.22 constraint, four minors behind go.mod. Co-authored-by: Claude Opus 5 (1M context) --- .github/workflows/generate.yaml | 24 ++++++-------- .github/workflows/release.yaml | 4 +++ bootstrap.sh | 57 --------------------------------- go.mod | 13 +++++++- go.sum | 8 +++-- magefile.go | 57 +++++++++++++++++++++++++-------- renovate.json | 51 ++++++++++++++++++++++++----- 7 files changed, 119 insertions(+), 95 deletions(-) delete mode 100755 bootstrap.sh diff --git a/.github/workflows/generate.yaml b/.github/workflows/generate.yaml index 4169f74e0..0352a5f19 100644 --- a/.github/workflows/generate.yaml +++ b/.github/workflows/generate.yaml @@ -25,31 +25,27 @@ jobs: steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + # Pinned exactly, not floated: protoc stamps its version into every generated + # file, so a release bump rewrites the committed output. Moving this is a + # deliberate edit whose header churn is reviewable on its own. - name: Install Protoc uses: arduino/setup-protoc@c65c819552d16ad3c9b72d9dfd5ba5237b9c906b # v3.0.0 with: - version: "35.x" + version: "35.1" repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Set up Go uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0 with: - go-version: ">=1.26" + go-version-file: "go.mod" - - name: Go mod tidy - run: go mod tidy - - - name: Install generators - uses: magefile/mage-action@a662bd8c29d8106879588cfff83b2faf6e6f59db # v4.0.0 - with: - version: latest - install-only: true - - - name: Bootstrap - run: mage bootstrap + - name: Download Go modules + run: go mod download + # The protoc plugins and mage itself come from the tool directives in go.mod, so + # generation runs the versions pinned there instead of whatever is latest today. - name: Generate Protobuf - run: mage proto + run: go tool mage proto - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2d73673b3..5988312c0 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -19,9 +19,13 @@ jobs: steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + # The published JS package is generated at build time by pnpm generate:proto, so + # protoc is a release input. Keep it on the same release as generate.yaml, or the + # published package is generated by a different compiler than the committed Go code. - name: Install Protoc uses: arduino/setup-protoc@c65c819552d16ad3c9b72d9dfd5ba5237b9c906b # v3.0.0 with: + version: "35.1" repo-token: ${{ secrets.GITHUB_TOKEN }} - uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10 diff --git a/bootstrap.sh b/bootstrap.sh deleted file mode 100755 index 0a3d09f07..000000000 --- a/bootstrap.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash -# Copyright 2023 LiveKit, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -if ! command -v protoc &> /dev/null -then - echo "protoc is required and not found. please install" - exit 1 -fi - -if ! command -v mage &> /dev/null -then - pushd /tmp - git clone https://github.com/magefile/mage - cd mage - go run bootstrap.go - rm -rf /tmp/mage - popd -fi - -if ! command -v mage &> /dev/null -then - echo "Ensure `go env GOPATH`/bin is in your \$PATH" - exit 1 -fi - -go mod download - -GO_VERSION=`go version | { read _ _ v _; echo ${v#go}; }` -GO_TARGET_VERSION=1.17 - -function version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; } - -if [ $(version $GO_VERSION) -ge $(version $GO_TARGET_VERSION) ]; - then - go install github.com/twitchtv/twirp/protoc-gen-twirp@v8.1.3 - go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.31.0 - go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3 - go install github.com/livekit/psrpc/protoc-gen-psrpc@v0.5.1 - else - go get -u github.com/twitchtv/twirp/protoc-gen-twirp@v8.1.3 - go get -u google.golang.org/protobuf/cmd/protoc-gen-go@v1.30.0 - go get -u google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2 - go get -u github.com/livekit/psrpc/protoc-gen-psrpc@v0.3.1 -fi diff --git a/go.mod b/go.mod index a0af0bde9..9c7951457 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( golang.org/x/text v0.40.0 google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa google.golang.org/grpc v1.83.0 - google.golang.org/protobuf v1.36.11 + google.golang.org/protobuf v1.36.12 gopkg.in/yaml.v3 v3.0.1 ) @@ -65,6 +65,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/klauspost/compress v1.19.1 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/magefile/mage v1.17.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nats-io/nats.go v1.52.0 // indirect github.com/nats-io/nkeys v0.4.16 // indirect @@ -82,6 +83,7 @@ require ( github.com/pion/stun/v3 v3.1.6 // indirect github.com/pion/transport/v4 v4.0.2 // indirect github.com/pion/turn/v5 v5.0.12 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/common v0.70.1 // indirect github.com/wlynxg/anet v0.0.5 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect @@ -95,4 +97,13 @@ require ( golang.org/x/time v0.15.0 // indirect golang.org/x/tools v0.47.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.2 // indirect +) + +tool ( + github.com/livekit/psrpc/protoc-gen-psrpc + github.com/magefile/mage + github.com/twitchtv/twirp/protoc-gen-twirp + google.golang.org/grpc/cmd/protoc-gen-go-grpc + google.golang.org/protobuf/cmd/protoc-gen-go ) diff --git a/go.sum b/go.sum index 90b0c74aa..9541e2c47 100644 --- a/go.sum +++ b/go.sum @@ -93,6 +93,8 @@ github.com/livekit/psrpc v0.7.5 h1:WxfJIQ41X1b+48A1uzc8Gy9FhYEMxBJNCpCYqPdO/Ds= github.com/livekit/psrpc v0.7.5/go.mod h1:rAI+m2+/cb4x9RXhLRtUx5ZwdfjjXOl4zi46IjEetaw= github.com/mackerelio/go-osstat v0.2.8 h1:I2duicTaCGWoM53XwAwA9OIe1inu0xnVs8/pqOWWVr4= github.com/mackerelio/go-osstat v0.2.8/go.mod h1:SyS3XxKdoSKJnTGTkN5Yrh6VUQVuAURACfE6y+2DN4k= +github.com/magefile/mage v1.17.2 h1:fyXVu1eadI8Ap1HCCNgEhJ5McIWiYhLR8uol64ZZc40= +github.com/magefile/mage v1.17.2/go.mod h1:Yj51kqllmsgFpvvSzgrZPK9WtluG3kUhFaBUVLo4feA= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -251,8 +253,10 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.83.0 h1:JeNZEKJFbQxArAMl+hiytHauacDNqJUllNfmIMmpqnQ= google.golang.org/grpc v1.83.0/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.2 h1:rgSNvqscFZ1JgV/4wH5GOsZFSFkR2Eua9As3KIr2LlM= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.2/go.mod h1:iMEtFwDlAhjDU9L5mY6U1XLwlIId/G3h+QcBHDIvrJ8= +google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= +google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/magefile.go b/magefile.go index 9a5783d47..5b42cfd6d 100644 --- a/magefile.go +++ b/magefile.go @@ -24,6 +24,7 @@ import ( "os" "os/exec" "path/filepath" + "strings" "github.com/livekit/mageutil" "github.com/livekit/protocol/psrpc" @@ -31,6 +32,20 @@ import ( var Default = Proto +// install the protoc plugins system-wide, for developers who want them on their PATH +// +// This is purely a developer convenience and is not required to generate anything: no +// build, release or CI step invokes it, and none should. `mage proto` resolves each +// plugin through the tool directives in go.mod (see goToolPath) and passes protoc an +// explicit path, so it works on a clean checkout and ignores whatever these installs put +// in GOPATH/bin. +// +// That separation is why @latest is safe here. These binaries are for ad-hoc use outside +// generation — inspecting a descriptor, compiling a scratch .proto — and are not inputs +// to any committed file. Two things keep them out of the committed output: the tool +// directives above, and the Generate workflow, which regenerates and commits the +// generated tree on every push to a non-main branch, so what lands on main always comes +// from the pinned versions regardless of what a contributor had installed locally. func Bootstrap() error { return mageutil.Run(context.Background(), "go install github.com/twitchtv/twirp/protoc-gen-twirp@latest", @@ -113,15 +128,15 @@ func Proto() error { if err != nil { return err } - protocGoPath, err := getToolPath("protoc-gen-go") + protocGoPath, err := goToolPath("protoc-gen-go") if err != nil { return err } - twirpPath, err := getToolPath("protoc-gen-twirp") + twirpPath, err := goToolPath("protoc-gen-twirp") if err != nil { return err } - protocGrpcGoPath, err := getToolPath("protoc-gen-go-grpc") + protocGrpcGoPath, err := goToolPath("protoc-gen-go-grpc") if err != nil { return err } @@ -132,8 +147,8 @@ func Proto() error { "--twirp_out", target, "--go_opt=paths=source_relative", "--twirp_opt=paths=source_relative", - "--plugin=go=" + protocGoPath, - "--plugin=twirp=" + twirpPath, + "--plugin=protoc-gen-go=" + protocGoPath, + "--plugin=protoc-gen-twirp=" + twirpPath, "-I=./protobufs", }, twirpProtoFiles...) cmd := exec.Command(protoc, args...) @@ -146,7 +161,7 @@ func Proto() error { args = append([]string{ "--go_out", target, "--go_opt=paths=source_relative", - "--plugin=go=" + protocGoPath, + "--plugin=protoc-gen-go=" + protocGoPath, "-I=./protobufs", }, protoFiles...) cmd = exec.Command(protoc, args...) @@ -160,7 +175,7 @@ func Proto() error { args := []string{ "--go_out", target, "--go_opt=paths=source_relative", - "--plugin=go=" + protocGoPath, + "--plugin=protoc-gen-go=" + protocGoPath, "-I=./protobufs", } args = append(args, agentProtoFiles...) @@ -181,7 +196,7 @@ func Proto() error { args := []string{ "--go_out", target, "--go_opt=paths=source_relative", - "--plugin=go=" + protocGoPath, + "--plugin=protoc-gen-go=" + protocGoPath, "-I=./protobufs", } for _, protoFile := range protoFiles { @@ -200,8 +215,8 @@ func Proto() error { "--go-grpc_out", ".", "--go_opt=paths=source_relative", "--go-grpc_opt=paths=source_relative", - "--plugin=go=" + protocGoPath, - "--plugin=go-grpc=" + protocGrpcGoPath, + "--plugin=protoc-gen-go=" + protocGoPath, + "--plugin=protoc-gen-go-grpc=" + protocGrpcGoPath, "-I=./protobufs", }, grpcProtoFiles...) cmd = exec.Command(protoc, args...) @@ -216,7 +231,7 @@ func Proto() error { if err != nil { return err } - psrpcPath, err := mageutil.GetToolPath("protoc-gen-psrpc") + psrpcPath, err := goToolPath("protoc-gen-psrpc") if err != nil { return err } @@ -229,8 +244,8 @@ func Proto() error { "--psrpc_out", ".", "--go_opt=paths=source_relative", "--psrpc_opt=paths=source_relative", - "--plugin=go=" + protocGoPath, - "--plugin=psrpc=" + psrpcPath, + "--plugin=protoc-gen-go=" + protocGoPath, + "--plugin=protoc-gen-psrpc=" + psrpcPath, "-I" + psrpcDir + "/protoc-gen-psrpc/options", "-I=./protobufs", }, psrpcProtoFiles...) @@ -252,6 +267,22 @@ func Test() error { // helpers +// goToolPath builds a protoc plugin from the tool directives in go.mod and returns its +// path, so generation uses the pinned version rather than whatever happens to be on PATH. +func goToolPath(name string) (string, error) { + out, err := exec.Command("go", "tool", "-n", name).Output() + if err != nil { + return "", fmt.Errorf("resolving tool %s: %w", name, err) + } + path := strings.TrimSpace(string(out)) + if path == "" { + return "", fmt.Errorf("resolving tool %s: no path returned", name) + } + return path, nil +} + +// getToolPath locates a binary that is not a Go tool, i.e. protoc itself, which CI +// installs with arduino/setup-protoc. func getToolPath(name string) (string, error) { if p, err := exec.LookPath(name); err == nil { return p, nil diff --git a/renovate.json b/renovate.json index fbe269eeb..4835c578c 100644 --- a/renovate.json +++ b/renovate.json @@ -1,25 +1,60 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base", "helpers:pinGitHubActionDigests"], - "constraints": { - "go": "1.22" - }, - "minimumReleaseAge": "2 weeks", + "extends": [ + "config:recommended", + "helpers:pinGitHubActionDigests" + ], "commitBody": "Generated by renovateBot", + "prConcurrentLimit": 5, + "minimumReleaseAge": "2 weeks", + "vulnerabilityAlerts": { + "enabled": true, + "minimumReleaseAge": "2 days", + "prConcurrentLimit": 0, + "prHourlyLimit": 0, + "schedule": [] + }, "packageRules": [ { "matchManagers": ["github-actions"], "groupName": "github workflows" }, { + "description": "Go modules are never grouped: each module gets its own PR so a bad bump can be reverted on its own", + "matchManagers": ["gomod"], + "groupName": null + }, + { + "description": "First-party deps are grouped and never quarantined: we track unreleased pseudo-versions that change constantly, so one PR per module would flood the queue", "matchManagers": ["gomod"], - "groupName": "go deps" + "groupName": "livekit deps", + "matchPackageNames": [ + "github.com/livekit{/,}**" + ], + "minimumReleaseAge": null + }, + { + "description": "Exception to the rule above: the pion modules are co-released and depend on each other, so bumping them one at a time produces PRs that don't build", + "matchManagers": ["gomod"], + "matchPackageNames": [ + "github.com/pion{/,}**" + ], + "groupName": "pion deps" + }, + { + "description": "Never bump the go/toolchain directives in go.mod: this module is a library, so the go directive is the minimum we ask of consumers and must stay at the lowest version our dependencies require.", + "matchManagers": ["gomod"], + "matchDepTypes": ["golang", "toolchain"], + "enabled": false }, { "matchManagers": ["npm"], "groupName": "npm deps" } ], - "postUpdateOptions": ["gomodTidy"], - "schedule": ["on monday"] + "postUpdateOptions": [ + "gomodTidy" + ], + "schedule": ["before 9am on monday"], + "updateNotScheduled": false }