diff --git a/Makefile b/Makefile index a6ab6f7f6001f..a10f66054bad8 100644 --- a/Makefile +++ b/Makefile @@ -890,7 +890,9 @@ buildbox-grpc: @echo "PROTO_INCLUDE = $$PROTO_INCLUDE" $(CLANG_FORMAT) -i -style='{ColumnLimit: 100, IndentWidth: 4, Language: Proto}' \ api/client/proto/authservice.proto \ + api/client/proto/certs.proto \ api/client/proto/joinservice.proto \ + api/client/proto/proxyservice.proto \ api/types/events/events.proto \ api/types/types.proto \ api/types/webauthn/webauthn.proto \ @@ -902,7 +904,7 @@ buildbox-grpc: cd api/client/proto && protoc -I=.:$$PROTO_INCLUDE \ --gogofast_out=plugins=grpc,$(GOGOPROTO_IMPORTMAP):. \ - certs.proto authservice.proto joinservice.proto + authservice.proto certs.proto joinservice.proto proxyservice.proto cd api/types/events && protoc -I=.:$$PROTO_INCLUDE \ --gogofast_out=plugins=grpc,$(GOGOPROTO_IMPORTMAP):. \ diff --git a/api/client/proto/proxyservice.pb.go b/api/client/proto/proxyservice.pb.go new file mode 100644 index 0000000000000..913bafc1e3997 --- /dev/null +++ b/api/client/proto/proxyservice.pb.go @@ -0,0 +1,1596 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: proxyservice.proto + +package proto + +import ( + context "context" + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + github_com_gravitational_teleport_api_types "github.com/gravitational/teleport/api/types" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// Frame wraps different message types to be sent over a stream. +type Frame struct { + // Types that are valid to be assigned to Message: + // *Frame_DialRequest + // *Frame_ConnectionEstablished + // *Frame_Data + Message isFrame_Message `protobuf_oneof:"Message"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Frame) Reset() { *m = Frame{} } +func (m *Frame) String() string { return proto.CompactTextString(m) } +func (*Frame) ProtoMessage() {} +func (*Frame) Descriptor() ([]byte, []int) { + return fileDescriptor_05583632bd3d8a58, []int{0} +} +func (m *Frame) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Frame) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Frame.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Frame) XXX_Merge(src proto.Message) { + xxx_messageInfo_Frame.Merge(m, src) +} +func (m *Frame) XXX_Size() int { + return m.Size() +} +func (m *Frame) XXX_DiscardUnknown() { + xxx_messageInfo_Frame.DiscardUnknown(m) +} + +var xxx_messageInfo_Frame proto.InternalMessageInfo + +type isFrame_Message interface { + isFrame_Message() + MarshalTo([]byte) (int, error) + Size() int +} + +type Frame_DialRequest struct { + DialRequest *DialRequest `protobuf:"bytes,1,opt,name=DialRequest,proto3,oneof" json:"DialRequest,omitempty"` +} +type Frame_ConnectionEstablished struct { + ConnectionEstablished *ConnectionEstablished `protobuf:"bytes,2,opt,name=ConnectionEstablished,proto3,oneof" json:"ConnectionEstablished,omitempty"` +} +type Frame_Data struct { + Data *Data `protobuf:"bytes,3,opt,name=Data,proto3,oneof" json:"Data,omitempty"` +} + +func (*Frame_DialRequest) isFrame_Message() {} +func (*Frame_ConnectionEstablished) isFrame_Message() {} +func (*Frame_Data) isFrame_Message() {} + +func (m *Frame) GetMessage() isFrame_Message { + if m != nil { + return m.Message + } + return nil +} + +func (m *Frame) GetDialRequest() *DialRequest { + if x, ok := m.GetMessage().(*Frame_DialRequest); ok { + return x.DialRequest + } + return nil +} + +func (m *Frame) GetConnectionEstablished() *ConnectionEstablished { + if x, ok := m.GetMessage().(*Frame_ConnectionEstablished); ok { + return x.ConnectionEstablished + } + return nil +} + +func (m *Frame) GetData() *Data { + if x, ok := m.GetMessage().(*Frame_Data); ok { + return x.Data + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*Frame) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*Frame_DialRequest)(nil), + (*Frame_ConnectionEstablished)(nil), + (*Frame_Data)(nil), + } +} + +// DialRequest contains details for connecting to a node. +type DialRequest struct { + // NodeID is the {UUID}.{ClusterName} of the node to connect to. + NodeID string `protobuf:"bytes,1,opt,name=NodeID,proto3" json:"NodeID,omitempty"` + // TunnelType is the type of service being accessed. This differentiates agents that + // create multiple reverse tunnels for different services. + TunnelType github_com_gravitational_teleport_api_types.TunnelType `protobuf:"bytes,2,opt,name=TunnelType,proto3,casttype=github.com/gravitational/teleport/api/types.TunnelType" json:"TunnelType,omitempty"` + // Source is the original source address of the client. + Source *NetAddr `protobuf:"bytes,3,opt,name=Source,proto3" json:"Source,omitempty"` + // Destination is the destination address to connect to over the reverse tunnel. + Destination *NetAddr `protobuf:"bytes,4,opt,name=Destination,proto3" json:"Destination,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DialRequest) Reset() { *m = DialRequest{} } +func (m *DialRequest) String() string { return proto.CompactTextString(m) } +func (*DialRequest) ProtoMessage() {} +func (*DialRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_05583632bd3d8a58, []int{1} +} +func (m *DialRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DialRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DialRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *DialRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DialRequest.Merge(m, src) +} +func (m *DialRequest) XXX_Size() int { + return m.Size() +} +func (m *DialRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DialRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_DialRequest proto.InternalMessageInfo + +func (m *DialRequest) GetNodeID() string { + if m != nil { + return m.NodeID + } + return "" +} + +func (m *DialRequest) GetTunnelType() github_com_gravitational_teleport_api_types.TunnelType { + if m != nil { + return m.TunnelType + } + return "" +} + +func (m *DialRequest) GetSource() *NetAddr { + if m != nil { + return m.Source + } + return nil +} + +func (m *DialRequest) GetDestination() *NetAddr { + if m != nil { + return m.Destination + } + return nil +} + +// Addr is a network address. +type NetAddr struct { + // Network is the type of network socket. For example tcp or udp. + Network string `protobuf:"bytes,1,opt,name=Network,proto3" json:"Network,omitempty"` + // Addr is the host:port address. For example 'localhost:22' + Addr string `protobuf:"bytes,2,opt,name=Addr,proto3" json:"Addr,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NetAddr) Reset() { *m = NetAddr{} } +func (m *NetAddr) String() string { return proto.CompactTextString(m) } +func (*NetAddr) ProtoMessage() {} +func (*NetAddr) Descriptor() ([]byte, []int) { + return fileDescriptor_05583632bd3d8a58, []int{2} +} +func (m *NetAddr) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NetAddr) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NetAddr.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *NetAddr) XXX_Merge(src proto.Message) { + xxx_messageInfo_NetAddr.Merge(m, src) +} +func (m *NetAddr) XXX_Size() int { + return m.Size() +} +func (m *NetAddr) XXX_DiscardUnknown() { + xxx_messageInfo_NetAddr.DiscardUnknown(m) +} + +var xxx_messageInfo_NetAddr proto.InternalMessageInfo + +func (m *NetAddr) GetNetwork() string { + if m != nil { + return m.Network + } + return "" +} + +func (m *NetAddr) GetAddr() string { + if m != nil { + return m.Addr + } + return "" +} + +// Data contains the raw bytes of a connection. +type Data struct { + Bytes []byte `protobuf:"bytes,1,opt,name=Bytes,proto3" json:"Bytes,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Data) Reset() { *m = Data{} } +func (m *Data) String() string { return proto.CompactTextString(m) } +func (*Data) ProtoMessage() {} +func (*Data) Descriptor() ([]byte, []int) { + return fileDescriptor_05583632bd3d8a58, []int{3} +} +func (m *Data) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Data) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Data.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Data) XXX_Merge(src proto.Message) { + xxx_messageInfo_Data.Merge(m, src) +} +func (m *Data) XXX_Size() int { + return m.Size() +} +func (m *Data) XXX_DiscardUnknown() { + xxx_messageInfo_Data.DiscardUnknown(m) +} + +var xxx_messageInfo_Data proto.InternalMessageInfo + +func (m *Data) GetBytes() []byte { + if m != nil { + return m.Bytes + } + return nil +} + +// ConnectionEstablished signals to the client a connection to the node has been established. +type ConnectionEstablished struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ConnectionEstablished) Reset() { *m = ConnectionEstablished{} } +func (m *ConnectionEstablished) String() string { return proto.CompactTextString(m) } +func (*ConnectionEstablished) ProtoMessage() {} +func (*ConnectionEstablished) Descriptor() ([]byte, []int) { + return fileDescriptor_05583632bd3d8a58, []int{4} +} +func (m *ConnectionEstablished) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ConnectionEstablished) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ConnectionEstablished.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ConnectionEstablished) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConnectionEstablished.Merge(m, src) +} +func (m *ConnectionEstablished) XXX_Size() int { + return m.Size() +} +func (m *ConnectionEstablished) XXX_DiscardUnknown() { + xxx_messageInfo_ConnectionEstablished.DiscardUnknown(m) +} + +var xxx_messageInfo_ConnectionEstablished proto.InternalMessageInfo + +func init() { + proto.RegisterType((*Frame)(nil), "proto.Frame") + proto.RegisterType((*DialRequest)(nil), "proto.DialRequest") + proto.RegisterType((*NetAddr)(nil), "proto.NetAddr") + proto.RegisterType((*Data)(nil), "proto.Data") + proto.RegisterType((*ConnectionEstablished)(nil), "proto.ConnectionEstablished") +} + +func init() { proto.RegisterFile("proxyservice.proto", fileDescriptor_05583632bd3d8a58) } + +var fileDescriptor_05583632bd3d8a58 = []byte{ + // 400 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x52, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0xcd, 0x42, 0x92, 0x92, 0x49, 0xc4, 0x61, 0x54, 0xc0, 0xaa, 0xaa, 0x00, 0x3e, 0xa0, 0x8a, + 0x83, 0x5d, 0x15, 0xa9, 0x48, 0xbd, 0x61, 0x0c, 0x0a, 0x07, 0x2a, 0xb4, 0xcd, 0x89, 0xdb, 0xc6, + 0x1e, 0xb9, 0x2b, 0x5c, 0xaf, 0xd9, 0x5d, 0x17, 0xfc, 0x7d, 0x5c, 0x38, 0x72, 0x47, 0x42, 0x28, + 0x9f, 0xc1, 0x09, 0x79, 0xbd, 0x15, 0xae, 0x14, 0x4e, 0x9e, 0xe7, 0xf7, 0xe6, 0xf9, 0xcd, 0x78, + 0x00, 0x6b, 0xad, 0xbe, 0xb6, 0x86, 0xf4, 0xb5, 0xcc, 0x28, 0xaa, 0xb5, 0xb2, 0x0a, 0x27, 0xee, + 0x71, 0xb0, 0x5f, 0xa8, 0x42, 0xb9, 0x32, 0xee, 0xaa, 0x9e, 0x0c, 0xbf, 0x31, 0x98, 0xbc, 0xd5, + 0xe2, 0x8a, 0xf0, 0x14, 0xe6, 0xa9, 0x14, 0x25, 0xa7, 0xcf, 0x0d, 0x19, 0x1b, 0xb0, 0x27, 0xec, + 0x68, 0x7e, 0x82, 0xbd, 0x2c, 0x1a, 0x30, 0xab, 0x11, 0x1f, 0x0a, 0x71, 0x0d, 0x0f, 0x5e, 0xab, + 0xaa, 0xa2, 0xcc, 0x4a, 0x55, 0xbd, 0x31, 0x56, 0x6c, 0x4a, 0x69, 0x2e, 0x29, 0x0f, 0xee, 0x38, + 0x87, 0x43, 0xef, 0xb0, 0x53, 0xb3, 0x1a, 0xf1, 0xdd, 0xcd, 0xf8, 0x14, 0xc6, 0xa9, 0xb0, 0x22, + 0xb8, 0xeb, 0x4c, 0xe6, 0x37, 0x31, 0x84, 0x15, 0xab, 0x11, 0x77, 0x54, 0x32, 0x83, 0xbd, 0xf7, + 0x64, 0x8c, 0x28, 0x28, 0xfc, 0xc9, 0x6e, 0x85, 0xc7, 0x87, 0x30, 0x3d, 0x57, 0x39, 0xbd, 0x4b, + 0xdd, 0x18, 0x33, 0xee, 0x11, 0x7e, 0x04, 0x58, 0x37, 0x55, 0x45, 0xe5, 0xba, 0xad, 0xc9, 0x05, + 0x9c, 0x25, 0x67, 0x7f, 0x7e, 0x3d, 0x3e, 0x2d, 0xa4, 0xbd, 0x6c, 0x36, 0x51, 0xa6, 0xae, 0xe2, + 0x42, 0x8b, 0x6b, 0x69, 0x45, 0x17, 0x48, 0x94, 0xb1, 0xa5, 0x92, 0x6a, 0xa5, 0x6d, 0x2c, 0x6a, + 0x19, 0xdb, 0xb6, 0x26, 0x13, 0xfd, 0x73, 0xe0, 0x03, 0x37, 0x7c, 0x06, 0xd3, 0x0b, 0xd5, 0xe8, + 0x8c, 0x7c, 0xe6, 0xfb, 0x3e, 0xf3, 0x39, 0xd9, 0x57, 0x79, 0xae, 0xb9, 0x67, 0xf1, 0x18, 0xe6, + 0x29, 0x19, 0x2b, 0x2b, 0xf7, 0x89, 0x60, 0xbc, 0x53, 0x3c, 0x94, 0x84, 0x2f, 0x61, 0xcf, 0xbf, + 0xc7, 0xc0, 0x95, 0x5f, 0x94, 0xfe, 0xe4, 0x27, 0xbb, 0x81, 0x88, 0x30, 0xee, 0x14, 0xfd, 0x50, + 0xdc, 0xd5, 0xe1, 0x61, 0xbf, 0x44, 0xdc, 0x87, 0x49, 0xd2, 0x5a, 0x32, 0xae, 0x67, 0xc1, 0x7b, + 0x10, 0x3e, 0xfa, 0xcf, 0x8f, 0x3b, 0x39, 0x83, 0xc5, 0x87, 0xee, 0x8c, 0x2e, 0xfa, 0x33, 0xc2, + 0xe7, 0x70, 0xaf, 0x5b, 0x6e, 0xb7, 0x43, 0x5c, 0xf8, 0xa0, 0xee, 0x66, 0x0e, 0x6e, 0xa1, 0x23, + 0x76, 0xcc, 0x92, 0xc5, 0xf7, 0xed, 0x92, 0xfd, 0xd8, 0x2e, 0xd9, 0xef, 0xed, 0x92, 0x6d, 0xa6, + 0x8e, 0x7e, 0xf1, 0x37, 0x00, 0x00, 0xff, 0xff, 0x24, 0x14, 0x9c, 0x65, 0x97, 0x02, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// ProxyServiceClient is the client API for ProxyService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ProxyServiceClient interface { + // DialNode opens a bidrectional stream to the requested node. + DialNode(ctx context.Context, opts ...grpc.CallOption) (ProxyService_DialNodeClient, error) +} + +type proxyServiceClient struct { + cc *grpc.ClientConn +} + +func NewProxyServiceClient(cc *grpc.ClientConn) ProxyServiceClient { + return &proxyServiceClient{cc} +} + +func (c *proxyServiceClient) DialNode(ctx context.Context, opts ...grpc.CallOption) (ProxyService_DialNodeClient, error) { + stream, err := c.cc.NewStream(ctx, &_ProxyService_serviceDesc.Streams[0], "/proto.ProxyService/DialNode", opts...) + if err != nil { + return nil, err + } + x := &proxyServiceDialNodeClient{stream} + return x, nil +} + +type ProxyService_DialNodeClient interface { + Send(*Frame) error + Recv() (*Frame, error) + grpc.ClientStream +} + +type proxyServiceDialNodeClient struct { + grpc.ClientStream +} + +func (x *proxyServiceDialNodeClient) Send(m *Frame) error { + return x.ClientStream.SendMsg(m) +} + +func (x *proxyServiceDialNodeClient) Recv() (*Frame, error) { + m := new(Frame) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// ProxyServiceServer is the server API for ProxyService service. +type ProxyServiceServer interface { + // DialNode opens a bidrectional stream to the requested node. + DialNode(ProxyService_DialNodeServer) error +} + +// UnimplementedProxyServiceServer can be embedded to have forward compatible implementations. +type UnimplementedProxyServiceServer struct { +} + +func (*UnimplementedProxyServiceServer) DialNode(srv ProxyService_DialNodeServer) error { + return status.Errorf(codes.Unimplemented, "method DialNode not implemented") +} + +func RegisterProxyServiceServer(s *grpc.Server, srv ProxyServiceServer) { + s.RegisterService(&_ProxyService_serviceDesc, srv) +} + +func _ProxyService_DialNode_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(ProxyServiceServer).DialNode(&proxyServiceDialNodeServer{stream}) +} + +type ProxyService_DialNodeServer interface { + Send(*Frame) error + Recv() (*Frame, error) + grpc.ServerStream +} + +type proxyServiceDialNodeServer struct { + grpc.ServerStream +} + +func (x *proxyServiceDialNodeServer) Send(m *Frame) error { + return x.ServerStream.SendMsg(m) +} + +func (x *proxyServiceDialNodeServer) Recv() (*Frame, error) { + m := new(Frame) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +var _ProxyService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "proto.ProxyService", + HandlerType: (*ProxyServiceServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "DialNode", + Handler: _ProxyService_DialNode_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "proxyservice.proto", +} + +func (m *Frame) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Frame) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Frame) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Message != nil { + { + size := m.Message.Size() + i -= size + if _, err := m.Message.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *Frame_DialRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Frame_DialRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.DialRequest != nil { + { + size, err := m.DialRequest.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProxyservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *Frame_ConnectionEstablished) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Frame_ConnectionEstablished) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ConnectionEstablished != nil { + { + size, err := m.ConnectionEstablished.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProxyservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *Frame_Data) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Frame_Data) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Data != nil { + { + size, err := m.Data.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProxyservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *DialRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DialRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DialRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Destination != nil { + { + size, err := m.Destination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProxyservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if m.Source != nil { + { + size, err := m.Source.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProxyservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if len(m.TunnelType) > 0 { + i -= len(m.TunnelType) + copy(dAtA[i:], m.TunnelType) + i = encodeVarintProxyservice(dAtA, i, uint64(len(m.TunnelType))) + i-- + dAtA[i] = 0x12 + } + if len(m.NodeID) > 0 { + i -= len(m.NodeID) + copy(dAtA[i:], m.NodeID) + i = encodeVarintProxyservice(dAtA, i, uint64(len(m.NodeID))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *NetAddr) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NetAddr) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NetAddr) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Addr) > 0 { + i -= len(m.Addr) + copy(dAtA[i:], m.Addr) + i = encodeVarintProxyservice(dAtA, i, uint64(len(m.Addr))) + i-- + dAtA[i] = 0x12 + } + if len(m.Network) > 0 { + i -= len(m.Network) + copy(dAtA[i:], m.Network) + i = encodeVarintProxyservice(dAtA, i, uint64(len(m.Network))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Data) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Data) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Data) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Bytes) > 0 { + i -= len(m.Bytes) + copy(dAtA[i:], m.Bytes) + i = encodeVarintProxyservice(dAtA, i, uint64(len(m.Bytes))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ConnectionEstablished) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConnectionEstablished) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConnectionEstablished) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func encodeVarintProxyservice(dAtA []byte, offset int, v uint64) int { + offset -= sovProxyservice(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Frame) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Message != nil { + n += m.Message.Size() + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Frame_DialRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.DialRequest != nil { + l = m.DialRequest.Size() + n += 1 + l + sovProxyservice(uint64(l)) + } + return n +} +func (m *Frame_ConnectionEstablished) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ConnectionEstablished != nil { + l = m.ConnectionEstablished.Size() + n += 1 + l + sovProxyservice(uint64(l)) + } + return n +} +func (m *Frame_Data) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Data != nil { + l = m.Data.Size() + n += 1 + l + sovProxyservice(uint64(l)) + } + return n +} +func (m *DialRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NodeID) + if l > 0 { + n += 1 + l + sovProxyservice(uint64(l)) + } + l = len(m.TunnelType) + if l > 0 { + n += 1 + l + sovProxyservice(uint64(l)) + } + if m.Source != nil { + l = m.Source.Size() + n += 1 + l + sovProxyservice(uint64(l)) + } + if m.Destination != nil { + l = m.Destination.Size() + n += 1 + l + sovProxyservice(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *NetAddr) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Network) + if l > 0 { + n += 1 + l + sovProxyservice(uint64(l)) + } + l = len(m.Addr) + if l > 0 { + n += 1 + l + sovProxyservice(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Data) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Bytes) + if l > 0 { + n += 1 + l + sovProxyservice(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ConnectionEstablished) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovProxyservice(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozProxyservice(x uint64) (n int) { + return sovProxyservice(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Frame) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Frame: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Frame: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DialRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProxyservice + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProxyservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &DialRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Message = &Frame_DialRequest{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionEstablished", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProxyservice + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProxyservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ConnectionEstablished{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Message = &Frame_ConnectionEstablished{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProxyservice + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProxyservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Data{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Message = &Frame_Data{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProxyservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProxyservice + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DialRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DialRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DialRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthProxyservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProxyservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodeID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TunnelType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthProxyservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProxyservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TunnelType = github_com_gravitational_teleport_api_types.TunnelType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProxyservice + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProxyservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Source == nil { + m.Source = &NetAddr{} + } + if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Destination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProxyservice + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProxyservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Destination == nil { + m.Destination = &NetAddr{} + } + if err := m.Destination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProxyservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProxyservice + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NetAddr) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NetAddr: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NetAddr: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Network", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthProxyservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProxyservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Network = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthProxyservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProxyservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Addr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProxyservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProxyservice + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Data) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Data: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Data: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Bytes", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProxyservice + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProxyservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Bytes = append(m.Bytes[:0], dAtA[iNdEx:postIndex]...) + if m.Bytes == nil { + m.Bytes = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProxyservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProxyservice + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConnectionEstablished) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProxyservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConnectionEstablished: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConnectionEstablished: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipProxyservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProxyservice + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipProxyservice(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowProxyservice + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowProxyservice + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowProxyservice + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthProxyservice + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupProxyservice + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthProxyservice + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthProxyservice = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowProxyservice = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupProxyservice = fmt.Errorf("proto: unexpected end of group") +) diff --git a/api/client/proto/proxyservice.proto b/api/client/proto/proxyservice.proto new file mode 100644 index 0000000000000..8c2e28a2076bf --- /dev/null +++ b/api/client/proto/proxyservice.proto @@ -0,0 +1,61 @@ +// Copyright 2022 Gravitational, 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. + +syntax = "proto3"; +package proto; + +import "gogoproto/gogo.proto"; + +// ProxyPeerService is a proxy to proxy api. +service ProxyService { + // DialNode opens a bidrectional stream to the requested node. + rpc DialNode(stream Frame) returns (stream Frame); +} + +// Frame wraps different message types to be sent over a stream. +message Frame { + oneof Message { + DialRequest DialRequest = 1; + ConnectionEstablished ConnectionEstablished = 2; + Data Data = 3; + } +} + +// DialRequest contains details for connecting to a node. +message DialRequest { + // NodeID is the {UUID}.{ClusterName} of the node to connect to. + string NodeID = 1; + // TunnelType is the type of service being accessed. This differentiates agents that + // create multiple reverse tunnels for different services. + string TunnelType = 2 + [ (gogoproto.casttype) = "github.com/gravitational/teleport/api/types.TunnelType" ]; + // Source is the original source address of the client. + NetAddr Source = 3; + // Destination is the destination address to connect to over the reverse tunnel. + NetAddr Destination = 4; +} + +// Addr is a network address. +message NetAddr { + // Network is the type of network socket. For example tcp or udp. + string Network = 1; + // Addr is the host:port address. For example 'localhost:22' + string Addr = 2; +} + +// Data contains the raw bytes of a connection. +message Data { bytes Bytes = 1; } + +// ConnectionEstablished signals to the client a connection to the node has been established. +message ConnectionEstablished {} \ No newline at end of file diff --git a/api/metadata/metadata.go b/api/metadata/metadata.go index 103bd04c8a6ea..ac246b37d5712 100644 --- a/api/metadata/metadata.go +++ b/api/metadata/metadata.go @@ -52,6 +52,16 @@ func AddMetadataToContext(ctx context.Context, raw map[string]string) context.Co // to stop the client interceptors from adding any metadata to the context (useful for testing). type DisableInterceptors struct{} +// StreamServerInterceptor intercepts a GRPC client stream call and adds +// default metadata to the context. +func StreamServerInterceptor(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + if disable := stream.Context().Value(DisableInterceptors{}); disable == nil { + header := metadata.New(defaultMetadata()) + grpc.SendHeader(stream.Context(), header) + } + return handler(srv, stream) +} + // StreamClientInterceptor intercepts a GRPC client stream call and adds // default metadata to the context. func StreamClientInterceptor(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { diff --git a/api/types/constants.go b/api/types/constants.go index 2741415482af1..363801f035bc6 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -372,6 +372,17 @@ const ( WindowsDesktopTunnel TunnelType = "windows_desktop" ) +type TunnelStrategyType string + +const ( + // AgentMesh requires agents to create a reverse tunnel to + // every proxy server. + AgentMesh TunnelStrategyType = "agent_mesh" + // ProxyPeering requires agents to create a reverse tunnel to a configured + // number of proxy servers and enables proxy to proxy communication. + ProxyPeering TunnelStrategyType = "proxy_peering" +) + const ( // ResourceMetadataName refers to a resource metadata field named "name". ResourceMetadataName = "name" diff --git a/api/types/networking.go b/api/types/networking.go index e76478ffb9f9d..102e1c931dea7 100644 --- a/api/types/networking.go +++ b/api/types/networking.go @@ -88,6 +88,18 @@ type ClusterNetworkingConfig interface { // SetRoutingStrategy sets the routing strategy setting. SetRoutingStrategy(strategy RoutingStrategy) + + // GetTunnelStrategy gets the tunnel strategy. + GetTunnelStrategyType() (TunnelStrategyType, error) + + // GetAgentMeshTunnelStrategy gets the agent mesh tunnel strategy. + GetAgentMeshTunnelStrategy() *AgentMeshTunnelStrategy + + // GetProxyPeeringTunnelStrategy gets the proxy peering tunnel strategy. + GetProxyPeeringTunnelStrategy() *ProxyPeeringTunnelStrategy + + // SetTunnelStrategy sets the tunnel strategy. + SetTunnelStrategy(*TunnelStrategyV1) } // NewClusterNetworkingConfigFromConfigFile is a convenience method to create @@ -278,6 +290,33 @@ func (c *ClusterNetworkingConfigV2) SetRoutingStrategy(strategy RoutingStrategy) c.Spec.RoutingStrategy = strategy } +// GetTunnelStrategy gets the tunnel strategy type. +func (c *ClusterNetworkingConfigV2) GetTunnelStrategyType() (TunnelStrategyType, error) { + switch c.Spec.TunnelStrategy.Strategy.(type) { + case *TunnelStrategyV1_AgentMesh: + return AgentMesh, nil + case *TunnelStrategyV1_ProxyPeering: + return ProxyPeering, nil + } + + return "", trace.BadParameter("unknown tunnel strategy type: %T", c.Spec.TunnelStrategy.Strategy) +} + +// GetAgentMeshTunnelStrategy gets the agent mesh tunnel strategy. +func (c *ClusterNetworkingConfigV2) GetAgentMeshTunnelStrategy() *AgentMeshTunnelStrategy { + return c.Spec.TunnelStrategy.GetAgentMesh() +} + +// GetProxyPeeringTunnelStrategy gets the proxy peering tunnel strategy. +func (c *ClusterNetworkingConfigV2) GetProxyPeeringTunnelStrategy() *ProxyPeeringTunnelStrategy { + return c.Spec.TunnelStrategy.GetProxyPeering() +} + +// SetTunnelStrategy sets the tunnel strategy. +func (c *ClusterNetworkingConfigV2) SetTunnelStrategy(strategy *TunnelStrategyV1) { + c.Spec.TunnelStrategy = strategy +} + // CheckAndSetDefaults verifies the constraints for ClusterNetworkingConfig. func (c *ClusterNetworkingConfigV2) CheckAndSetDefaults() error { c.setStaticFields() @@ -298,6 +337,15 @@ func (c *ClusterNetworkingConfigV2) CheckAndSetDefaults() error { c.Spec.KeepAliveCountMax = int64(defaults.KeepAliveCountMax) } + if c.Spec.TunnelStrategy == nil { + c.Spec.TunnelStrategy = &TunnelStrategyV1{ + Strategy: DefaultTunnelStrategy(), + } + } + if err := c.Spec.TunnelStrategy.CheckAndSetDefaults(); err != nil { + return trace.Wrap(err) + } + return nil } diff --git a/api/types/server.go b/api/types/server.go index e6cd77e5dfa54..0dae8b559456e 100644 --- a/api/types/server.go +++ b/api/types/server.go @@ -77,6 +77,10 @@ type Server interface { GetKubernetesClusters() []*KubernetesCluster // SetKubeClusters sets the kubernetes clusters handled by this server. SetKubernetesClusters([]*KubernetesCluster) + // GetPeerAddr returns the peer address of the server. + GetPeerAddr() string + // SetPeerAddr sets the peer address of the server. + SetPeerAddr(string) // MatchAgainst takes a map of labels and returns True if this server // has ALL of them // @@ -310,6 +314,16 @@ func (s *ServerV2) SetKubernetesClusters(clusters []*KubernetesCluster) { s.Spec.KubernetesClusters = clusters } +// GetPeerAddr returns the peer address of the server. +func (s *ServerV2) GetPeerAddr() string { + return s.Spec.PeerAddr +} + +// SetPeerAddr sets the peer address of the server. +func (s *ServerV2) SetPeerAddr(addr string) { + s.Spec.PeerAddr = addr +} + // MatchAgainst takes a map of labels and returns True if this server // has ALL of them // diff --git a/api/types/tunnel_strategy.go b/api/types/tunnel_strategy.go new file mode 100644 index 0000000000000..b210cc333f4d1 --- /dev/null +++ b/api/types/tunnel_strategy.go @@ -0,0 +1,257 @@ +/* +Copyright 2022 Gravitational, 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. +*/ + +package types + +import ( + "encoding/json" + + "github.com/gravitational/teleport/api/utils" + + "github.com/gravitational/trace" +) + +const ( + tunnelStrategyTypeParam = "type" + defaultAgentConnectionCount = 1 +) + +// DefaultAgentMeshTunnelStrategy sets default values for a agent mesh +// tunnel strategy. +func DefaultAgentMeshTunnelStrategy() *AgentMeshTunnelStrategy { + return &AgentMeshTunnelStrategy{} +} + +// DefaultProxyPeeringTunnelStrategy sets default values for a proxy peering +// tunnel strategy. +func DefaultProxyPeeringTunnelStrategy() *ProxyPeeringTunnelStrategy { + return &ProxyPeeringTunnelStrategy{ + AgentConnectionCount: defaultAgentConnectionCount, + } +} + +// DefaultTunnelStrategy is the default tunnel strategy used when one is not +// specified. +func DefaultTunnelStrategy() TunnelStrategy { + return &TunnelStrategyV1_AgentMesh{ + AgentMesh: DefaultAgentMeshTunnelStrategy(), + } +} + +// TunnelStrategy defines methods to be implemented by any TunnelStrategy. +type TunnelStrategy interface { + isTunnelStrategyV1_Strategy + CheckAndSetDefaults() error +} + +// tunnelStrategyConfig represents a unparsed tunnel strategy configuration. +type tunnelStrategyConfig struct { + Type TunnelStrategyType `yaml:"type" json:"type"` + Params map[string]interface{} `yaml:",inline" json:"-"` +} + +// newTunnelStrategyConfig creates a new tunnelStrategyConfig instance. +func newTunnelStrategyConfig() *tunnelStrategyConfig { + return &tunnelStrategyConfig{} +} + +// setFromMap sets a TunnelStrategyConfig from a map. +func (c *tunnelStrategyConfig) setFromMap(m map[string]interface{}) error { + rawStrategy, ok := m[tunnelStrategyTypeParam] + if !ok { + return trace.BadParameter("missing type parameter") + } + + // The map representation of TunnelStrategyType is expected to be a string. + strategyType, ok := rawStrategy.(string) + if !ok { + return trace.BadParameter("invalid type parameter") + } + c.Type = TunnelStrategyType(strategyType) + + c.Params = make(map[string]interface{}, len(m)-1) + for k, v := range m { + if k == tunnelStrategyTypeParam { + continue + } + c.Params[k] = v + } + return nil +} + +// getMapCopy returns a TunnelStrategyConfig as a map. +func (c *tunnelStrategyConfig) getMapCopy() map[string]interface{} { + mCopy := make(map[string]interface{}, len(c.Params)+1) + for k, v := range c.Params { + mCopy[k] = v + } + + // The map representation of TunnelStrategyType is expected to be a string. + mCopy[tunnelStrategyTypeParam] = string(c.Type) + return mCopy +} + +// MarshalYAML converts a TunnelStrategyV1 to yaml. +func (s *TunnelStrategyV1) MarshalYAML() (interface{}, error) { + var config *tunnelStrategyConfig + err := s.marshal(func(c *tunnelStrategyConfig) error { + config = c + return nil + }) + if err != nil { + return nil, trace.Wrap(err) + } + return config.getMapCopy(), nil +} + +// UnmarshalYAML converts yaml to a TunnelStrategyV1 using a strict policy to +// disallow unknown fields. +func (s *TunnelStrategyV1) UnmarshalYAML(unmarshal func(interface{}) error) error { + err := s.unmarshal(utils.StrictObjectToStruct, func(c *tunnelStrategyConfig) error { + return trace.Wrap(unmarshal(c)) + }) + return trace.Wrap(err) +} + +// MarshalJSON converts a TunnelStrategyV1 to json. +func (s *TunnelStrategyV1) MarshalJSON() ([]byte, error) { + var data []byte + err := s.marshal(func(c *tunnelStrategyConfig) error { + var err error + data, err = json.Marshal(c.getMapCopy()) + return trace.Wrap(err) + }) + if err != nil { + return nil, trace.Wrap(err) + } + return data, nil +} + +// UnmarshalJSON converts json to a TunnelStrategyV1. Unknown fields are allowed +// to prevent rollbacks causing issues decoding this data from the backend. +func (s *TunnelStrategyV1) UnmarshalJSON(data []byte) error { + err := s.unmarshal(utils.ObjectToStruct, func(c *tunnelStrategyConfig) error { + params := make(map[string]interface{}) + err := json.Unmarshal(data, ¶ms) + if err != nil { + return trace.Wrap(err) + } + return trace.Wrap(c.setFromMap(params)) + }) + return trace.Wrap(err) +} + +// marshal converts a TunnelStrategyV1 to a TunnelStrategyConfig before calling +// the given marshal function. +func (s *TunnelStrategyV1) marshal(marshal func(*tunnelStrategyConfig) error) error { + config := newTunnelStrategyConfig() + switch strategy := s.Strategy.(type) { + case *TunnelStrategyV1_AgentMesh: + config.Type = AgentMesh + err := utils.ObjectToStruct(strategy.AgentMesh, &config.Params) + if err != nil { + return trace.Wrap(err) + } + case *TunnelStrategyV1_ProxyPeering: + config.Type = ProxyPeering + err := utils.ObjectToStruct(strategy.ProxyPeering, &config.Params) + if err != nil { + return trace.Wrap(err) + } + default: + return trace.BadParameter("unknown tunnel strategy: \"%s\"", config.Type) + } + + return trace.Wrap(marshal(config)) +} + +// objectToStructFunc is a function that converts one struct to another. +type objectToStructFunc func(interface{}, interface{}) error + +func (s *TunnelStrategyV1) unmarshal(ots objectToStructFunc, unmarshal func(*tunnelStrategyConfig) error) error { + config := newTunnelStrategyConfig() + err := unmarshal(config) + if err != nil { + return trace.Wrap(err) + } + + switch config.Type { + case AgentMesh: + strategy := &TunnelStrategyV1_AgentMesh{ + AgentMesh: &AgentMeshTunnelStrategy{}, + } + + err = ots(&config.Params, strategy.AgentMesh) + if err != nil { + return trace.Wrap(err) + } + s.Strategy = strategy + case ProxyPeering: + strategy := &TunnelStrategyV1_ProxyPeering{ + ProxyPeering: &ProxyPeeringTunnelStrategy{}, + } + + err = ots(&config.Params, strategy.ProxyPeering) + if err != nil { + return trace.Wrap(err) + } + s.Strategy = strategy + default: + return trace.BadParameter("unknown tunnel strategy: \"%s\"", config.Type) + } + + return nil +} + +// CheckAndSetDefaults validates and sets default values for a tunnel strategy. +func (s *TunnelStrategyV1) CheckAndSetDefaults() error { + if s.Strategy == nil { + s.Strategy = DefaultTunnelStrategy() + } + + switch strategy := s.Strategy.(type) { + case TunnelStrategy: + err := strategy.CheckAndSetDefaults() + if err != nil { + return trace.Wrap(err) + } + default: + return trace.BadParameter("unknown tunnel strategy: %T", strategy) + } + + return nil +} + +// CheckAndSetDefaults validates an agent mesh tunnel strategy. +func (s *TunnelStrategyV1_AgentMesh) CheckAndSetDefaults() error { + if s.AgentMesh == nil { + s.AgentMesh = DefaultAgentMeshTunnelStrategy() + } + + return nil +} + +// CheckAndSetDefaults validates a proxy peering tunnel strategy. +func (s *TunnelStrategyV1_ProxyPeering) CheckAndSetDefaults() error { + if s.ProxyPeering == nil { + s.ProxyPeering = DefaultProxyPeeringTunnelStrategy() + } + if s.ProxyPeering.AgentConnectionCount == 0 { + s.ProxyPeering.AgentConnectionCount = defaultAgentConnectionCount + } + + return nil +} diff --git a/api/types/tunnel_strategy_test.go b/api/types/tunnel_strategy_test.go new file mode 100644 index 0000000000000..d3f35615255e4 --- /dev/null +++ b/api/types/tunnel_strategy_test.go @@ -0,0 +1,76 @@ +/* +Copyright 2022 Gravitational, 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. +*/ + +package types + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v2" +) + +func TestTunnelStrategyMarshalling(t *testing.T) { + tests := []struct { + json string + yaml string + strategy *TunnelStrategyV1 + }{ + { + json: `{"type":"agent_mesh"}`, + yaml: "type: agent_mesh\n", + strategy: &TunnelStrategyV1{Strategy: &TunnelStrategyV1_AgentMesh{ + AgentMesh: &AgentMeshTunnelStrategy{}, + }}, + }, + { + json: `{"type":"proxy_peering"}`, + yaml: "type: proxy_peering\n", + strategy: &TunnelStrategyV1{Strategy: &TunnelStrategyV1_ProxyPeering{ + ProxyPeering: &ProxyPeeringTunnelStrategy{}, + }}}, + { + json: `{"agent_connection_count":2,"type":"proxy_peering"}`, + yaml: "agent_connection_count: 2\ntype: proxy_peering\n", + strategy: &TunnelStrategyV1{Strategy: &TunnelStrategyV1_ProxyPeering{ + ProxyPeering: &ProxyPeeringTunnelStrategy{ + AgentConnectionCount: 2, + }, + }}, + }, + } + + for _, tc := range tests { + data, err := yaml.Marshal(tc.strategy) + require.NoError(t, err) + require.Equal(t, []byte(tc.yaml), data) + + data, err = json.Marshal(tc.strategy) + require.NoError(t, err) + require.Equal(t, []byte(tc.json), data) + + strategy := &TunnelStrategyV1{} + err = json.Unmarshal([]byte(tc.json), strategy) + require.NoError(t, err) + require.Equal(t, tc.strategy, strategy) + + strategy = &TunnelStrategyV1{} + err = yaml.Unmarshal([]byte(tc.yaml), strategy) + require.NoError(t, err) + require.Equal(t, tc.strategy, strategy) + } +} diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 5b9e82a11ae36..05e32fe528e36 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -1405,10 +1405,12 @@ type ServerSpecV2 struct { // Important: jsontag must not be "kubernetes_clusters", because a // different field with that jsontag existed in 4.4: // https://github.com/gravitational/teleport/issues/4862 - KubernetesClusters []*KubernetesCluster `protobuf:"bytes,10,rep,name=KubernetesClusters,proto3" json:"kube_clusters,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + KubernetesClusters []*KubernetesCluster `protobuf:"bytes,10,rep,name=KubernetesClusters,proto3" json:"kube_clusters,omitempty"` + // PeerAddr is the address a proxy server is reachable at by its peer proxies. + PeerAddr string `protobuf:"bytes,11,opt,name=PeerAddr,proto3" json:"peer_addr,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ServerSpecV2) Reset() { *m = ServerSpecV2{} } @@ -2864,10 +2866,12 @@ type ClusterNetworkingConfigSpecV2 struct { // ProxyListenerMode is proxy listener mode used by Teleport Proxies. ProxyListenerMode ProxyListenerMode `protobuf:"varint,7,opt,name=ProxyListenerMode,proto3,enum=types.ProxyListenerMode" json:"proxy_listener_mode,omitempty"` // RoutingStrategy determines the strategy used to route to nodes. - RoutingStrategy RoutingStrategy `protobuf:"varint,8,opt,name=RoutingStrategy,proto3,enum=types.RoutingStrategy" json:"routing_strategy,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + RoutingStrategy RoutingStrategy `protobuf:"varint,8,opt,name=RoutingStrategy,proto3,enum=types.RoutingStrategy" json:"routing_strategy,omitempty"` + // TunnelStrategyV1 determines the tunnel strategy used in the cluster. + TunnelStrategy *TunnelStrategyV1 `protobuf:"bytes,9,opt,name=TunnelStrategy,proto3" json:"tunnel_strategy,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ClusterNetworkingConfigSpecV2) Reset() { *m = ClusterNetworkingConfigSpecV2{} } @@ -2903,6 +2907,176 @@ func (m *ClusterNetworkingConfigSpecV2) XXX_DiscardUnknown() { var xxx_messageInfo_ClusterNetworkingConfigSpecV2 proto.InternalMessageInfo +// TunnelStrategyV1 defines possible tunnel strategy types. +type TunnelStrategyV1 struct { + // Types that are valid to be assigned to Strategy: + // *TunnelStrategyV1_AgentMesh + // *TunnelStrategyV1_ProxyPeering + Strategy isTunnelStrategyV1_Strategy `protobuf_oneof:"Strategy"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TunnelStrategyV1) Reset() { *m = TunnelStrategyV1{} } +func (m *TunnelStrategyV1) String() string { return proto.CompactTextString(m) } +func (*TunnelStrategyV1) ProtoMessage() {} +func (*TunnelStrategyV1) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{50} +} +func (m *TunnelStrategyV1) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TunnelStrategyV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TunnelStrategyV1.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TunnelStrategyV1) XXX_Merge(src proto.Message) { + xxx_messageInfo_TunnelStrategyV1.Merge(m, src) +} +func (m *TunnelStrategyV1) XXX_Size() int { + return m.Size() +} +func (m *TunnelStrategyV1) XXX_DiscardUnknown() { + xxx_messageInfo_TunnelStrategyV1.DiscardUnknown(m) +} + +var xxx_messageInfo_TunnelStrategyV1 proto.InternalMessageInfo + +type isTunnelStrategyV1_Strategy interface { + isTunnelStrategyV1_Strategy() + MarshalTo([]byte) (int, error) + Size() int +} + +type TunnelStrategyV1_AgentMesh struct { + AgentMesh *AgentMeshTunnelStrategy `protobuf:"bytes,1,opt,name=AgentMesh,proto3,oneof" json:"agent_mesh,omitempty"` +} +type TunnelStrategyV1_ProxyPeering struct { + ProxyPeering *ProxyPeeringTunnelStrategy `protobuf:"bytes,2,opt,name=ProxyPeering,proto3,oneof" json:"proxy_peering,omitempty"` +} + +func (*TunnelStrategyV1_AgentMesh) isTunnelStrategyV1_Strategy() {} +func (*TunnelStrategyV1_ProxyPeering) isTunnelStrategyV1_Strategy() {} + +func (m *TunnelStrategyV1) GetStrategy() isTunnelStrategyV1_Strategy { + if m != nil { + return m.Strategy + } + return nil +} + +func (m *TunnelStrategyV1) GetAgentMesh() *AgentMeshTunnelStrategy { + if x, ok := m.GetStrategy().(*TunnelStrategyV1_AgentMesh); ok { + return x.AgentMesh + } + return nil +} + +func (m *TunnelStrategyV1) GetProxyPeering() *ProxyPeeringTunnelStrategy { + if x, ok := m.GetStrategy().(*TunnelStrategyV1_ProxyPeering); ok { + return x.ProxyPeering + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*TunnelStrategyV1) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*TunnelStrategyV1_AgentMesh)(nil), + (*TunnelStrategyV1_ProxyPeering)(nil), + } +} + +// AgentMeshTunnelStrategy requires reverse tunnels to dial every proxy. +type AgentMeshTunnelStrategy struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AgentMeshTunnelStrategy) Reset() { *m = AgentMeshTunnelStrategy{} } +func (m *AgentMeshTunnelStrategy) String() string { return proto.CompactTextString(m) } +func (*AgentMeshTunnelStrategy) ProtoMessage() {} +func (*AgentMeshTunnelStrategy) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{51} +} +func (m *AgentMeshTunnelStrategy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AgentMeshTunnelStrategy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AgentMeshTunnelStrategy.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AgentMeshTunnelStrategy) XXX_Merge(src proto.Message) { + xxx_messageInfo_AgentMeshTunnelStrategy.Merge(m, src) +} +func (m *AgentMeshTunnelStrategy) XXX_Size() int { + return m.Size() +} +func (m *AgentMeshTunnelStrategy) XXX_DiscardUnknown() { + xxx_messageInfo_AgentMeshTunnelStrategy.DiscardUnknown(m) +} + +var xxx_messageInfo_AgentMeshTunnelStrategy proto.InternalMessageInfo + +// ProxyPeeringTunnelStrategy requires reverse tunnels to dial a fixed number of proxies. +type ProxyPeeringTunnelStrategy struct { + AgentConnectionCount int64 `protobuf:"varint,1,opt,name=AgentConnectionCount,proto3" json:"agent_connection_count,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ProxyPeeringTunnelStrategy) Reset() { *m = ProxyPeeringTunnelStrategy{} } +func (m *ProxyPeeringTunnelStrategy) String() string { return proto.CompactTextString(m) } +func (*ProxyPeeringTunnelStrategy) ProtoMessage() {} +func (*ProxyPeeringTunnelStrategy) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{52} +} +func (m *ProxyPeeringTunnelStrategy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ProxyPeeringTunnelStrategy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ProxyPeeringTunnelStrategy.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ProxyPeeringTunnelStrategy) XXX_Merge(src proto.Message) { + xxx_messageInfo_ProxyPeeringTunnelStrategy.Merge(m, src) +} +func (m *ProxyPeeringTunnelStrategy) XXX_Size() int { + return m.Size() +} +func (m *ProxyPeeringTunnelStrategy) XXX_DiscardUnknown() { + xxx_messageInfo_ProxyPeeringTunnelStrategy.DiscardUnknown(m) +} + +var xxx_messageInfo_ProxyPeeringTunnelStrategy proto.InternalMessageInfo + // SessionRecordingConfigV2 contains session recording configuration. type SessionRecordingConfigV2 struct { // Kind is a resource kind @@ -2924,7 +3098,7 @@ func (m *SessionRecordingConfigV2) Reset() { *m = SessionRecordingConfig func (m *SessionRecordingConfigV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigV2) ProtoMessage() {} func (*SessionRecordingConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{50} + return fileDescriptor_d938547f84707355, []int{53} } func (m *SessionRecordingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2970,7 +3144,7 @@ func (m *SessionRecordingConfigSpecV2) Reset() { *m = SessionRecordingCo func (m *SessionRecordingConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigSpecV2) ProtoMessage() {} func (*SessionRecordingConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{51} + return fileDescriptor_d938547f84707355, []int{54} } func (m *SessionRecordingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3019,7 +3193,7 @@ type AuthPreferenceV2 struct { func (m *AuthPreferenceV2) Reset() { *m = AuthPreferenceV2{} } func (*AuthPreferenceV2) ProtoMessage() {} func (*AuthPreferenceV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{52} + return fileDescriptor_d938547f84707355, []int{55} } func (m *AuthPreferenceV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3086,7 +3260,7 @@ func (m *AuthPreferenceSpecV2) Reset() { *m = AuthPreferenceSpecV2{} } func (m *AuthPreferenceSpecV2) String() string { return proto.CompactTextString(m) } func (*AuthPreferenceSpecV2) ProtoMessage() {} func (*AuthPreferenceSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{53} + return fileDescriptor_d938547f84707355, []int{56} } func (m *AuthPreferenceSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3135,7 +3309,7 @@ func (m *U2F) Reset() { *m = U2F{} } func (m *U2F) String() string { return proto.CompactTextString(m) } func (*U2F) ProtoMessage() {} func (*U2F) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{54} + return fileDescriptor_d938547f84707355, []int{57} } func (m *U2F) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3203,7 +3377,7 @@ func (m *Webauthn) Reset() { *m = Webauthn{} } func (m *Webauthn) String() string { return proto.CompactTextString(m) } func (*Webauthn) ProtoMessage() {} func (*Webauthn) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{55} + return fileDescriptor_d938547f84707355, []int{58} } func (m *Webauthn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3253,7 +3427,7 @@ func (m *Namespace) Reset() { *m = Namespace{} } func (m *Namespace) String() string { return proto.CompactTextString(m) } func (*Namespace) ProtoMessage() {} func (*Namespace) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{56} + return fileDescriptor_d938547f84707355, []int{59} } func (m *Namespace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3293,7 +3467,7 @@ func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (m *NamespaceSpec) String() string { return proto.CompactTextString(m) } func (*NamespaceSpec) ProtoMessage() {} func (*NamespaceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{57} + return fileDescriptor_d938547f84707355, []int{60} } func (m *NamespaceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3341,7 +3515,7 @@ type UserTokenV3 struct { func (m *UserTokenV3) Reset() { *m = UserTokenV3{} } func (*UserTokenV3) ProtoMessage() {} func (*UserTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{58} + return fileDescriptor_d938547f84707355, []int{61} } func (m *UserTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3388,7 +3562,7 @@ func (m *UserTokenSpecV3) Reset() { *m = UserTokenSpecV3{} } func (m *UserTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSpecV3) ProtoMessage() {} func (*UserTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{59} + return fileDescriptor_d938547f84707355, []int{62} } func (m *UserTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3436,7 +3610,7 @@ type UserTokenSecretsV3 struct { func (m *UserTokenSecretsV3) Reset() { *m = UserTokenSecretsV3{} } func (*UserTokenSecretsV3) ProtoMessage() {} func (*UserTokenSecretsV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{60} + return fileDescriptor_d938547f84707355, []int{63} } func (m *UserTokenSecretsV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3481,7 +3655,7 @@ func (m *UserTokenSecretsSpecV3) Reset() { *m = UserTokenSecretsSpecV3{} func (m *UserTokenSecretsSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSecretsSpecV3) ProtoMessage() {} func (*UserTokenSecretsSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{61} + return fileDescriptor_d938547f84707355, []int{64} } func (m *UserTokenSecretsSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3530,7 +3704,7 @@ type AccessRequestV3 struct { func (m *AccessRequestV3) Reset() { *m = AccessRequestV3{} } func (*AccessRequestV3) ProtoMessage() {} func (*AccessRequestV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{62} + return fileDescriptor_d938547f84707355, []int{65} } func (m *AccessRequestV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3582,7 +3756,7 @@ func (m *AccessReviewThreshold) Reset() { *m = AccessReviewThreshold{} } func (m *AccessReviewThreshold) String() string { return proto.CompactTextString(m) } func (*AccessReviewThreshold) ProtoMessage() {} func (*AccessReviewThreshold) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{63} + return fileDescriptor_d938547f84707355, []int{66} } func (m *AccessReviewThreshold) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3638,7 +3812,7 @@ func (m *AccessReview) Reset() { *m = AccessReview{} } func (m *AccessReview) String() string { return proto.CompactTextString(m) } func (*AccessReview) ProtoMessage() {} func (*AccessReview) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{64} + return fileDescriptor_d938547f84707355, []int{67} } func (m *AccessReview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3683,7 +3857,7 @@ func (m *AccessReviewSubmission) Reset() { *m = AccessReviewSubmission{} func (m *AccessReviewSubmission) String() string { return proto.CompactTextString(m) } func (*AccessReviewSubmission) ProtoMessage() {} func (*AccessReviewSubmission) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{65} + return fileDescriptor_d938547f84707355, []int{68} } func (m *AccessReviewSubmission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3726,7 +3900,7 @@ func (m *ThresholdIndexSet) Reset() { *m = ThresholdIndexSet{} } func (m *ThresholdIndexSet) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSet) ProtoMessage() {} func (*ThresholdIndexSet) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{66} + return fileDescriptor_d938547f84707355, []int{69} } func (m *ThresholdIndexSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3769,7 +3943,7 @@ func (m *ThresholdIndexSets) Reset() { *m = ThresholdIndexSets{} } func (m *ThresholdIndexSets) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSets) ProtoMessage() {} func (*ThresholdIndexSets) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{67} + return fileDescriptor_d938547f84707355, []int{70} } func (m *ThresholdIndexSets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3854,7 +4028,7 @@ func (m *AccessRequestSpecV3) Reset() { *m = AccessRequestSpecV3{} } func (m *AccessRequestSpecV3) String() string { return proto.CompactTextString(m) } func (*AccessRequestSpecV3) ProtoMessage() {} func (*AccessRequestSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{68} + return fileDescriptor_d938547f84707355, []int{71} } func (m *AccessRequestSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3900,7 +4074,7 @@ func (m *AccessRequestFilter) Reset() { *m = AccessRequestFilter{} } func (m *AccessRequestFilter) String() string { return proto.CompactTextString(m) } func (*AccessRequestFilter) ProtoMessage() {} func (*AccessRequestFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{69} + return fileDescriptor_d938547f84707355, []int{72} } func (m *AccessRequestFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3946,7 +4120,7 @@ func (m *AccessCapabilities) Reset() { *m = AccessCapabilities{} } func (m *AccessCapabilities) String() string { return proto.CompactTextString(m) } func (*AccessCapabilities) ProtoMessage() {} func (*AccessCapabilities) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{70} + return fileDescriptor_d938547f84707355, []int{73} } func (m *AccessCapabilities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3995,7 +4169,7 @@ func (m *AccessCapabilitiesRequest) Reset() { *m = AccessCapabilitiesReq func (m *AccessCapabilitiesRequest) String() string { return proto.CompactTextString(m) } func (*AccessCapabilitiesRequest) ProtoMessage() {} func (*AccessCapabilitiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{71} + return fileDescriptor_d938547f84707355, []int{74} } func (m *AccessCapabilitiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4044,7 +4218,7 @@ type PluginDataV3 struct { func (m *PluginDataV3) Reset() { *m = PluginDataV3{} } func (*PluginDataV3) ProtoMessage() {} func (*PluginDataV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{72} + return fileDescriptor_d938547f84707355, []int{75} } func (m *PluginDataV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4087,7 +4261,7 @@ func (m *PluginDataEntry) Reset() { *m = PluginDataEntry{} } func (m *PluginDataEntry) String() string { return proto.CompactTextString(m) } func (*PluginDataEntry) ProtoMessage() {} func (*PluginDataEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{73} + return fileDescriptor_d938547f84707355, []int{76} } func (m *PluginDataEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4129,7 +4303,7 @@ func (m *PluginDataSpecV3) Reset() { *m = PluginDataSpecV3{} } func (m *PluginDataSpecV3) String() string { return proto.CompactTextString(m) } func (*PluginDataSpecV3) ProtoMessage() {} func (*PluginDataSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{74} + return fileDescriptor_d938547f84707355, []int{77} } func (m *PluginDataSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4176,7 +4350,7 @@ func (m *PluginDataFilter) Reset() { *m = PluginDataFilter{} } func (m *PluginDataFilter) String() string { return proto.CompactTextString(m) } func (*PluginDataFilter) ProtoMessage() {} func (*PluginDataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{75} + return fileDescriptor_d938547f84707355, []int{78} } func (m *PluginDataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4227,7 +4401,7 @@ func (m *PluginDataUpdateParams) Reset() { *m = PluginDataUpdateParams{} func (m *PluginDataUpdateParams) String() string { return proto.CompactTextString(m) } func (*PluginDataUpdateParams) ProtoMessage() {} func (*PluginDataUpdateParams) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{76} + return fileDescriptor_d938547f84707355, []int{79} } func (m *PluginDataUpdateParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4276,7 +4450,7 @@ type RoleV5 struct { func (m *RoleV5) Reset() { *m = RoleV5{} } func (*RoleV5) ProtoMessage() {} func (*RoleV5) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{77} + return fileDescriptor_d938547f84707355, []int{80} } func (m *RoleV5) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4323,7 +4497,7 @@ func (m *RoleSpecV5) Reset() { *m = RoleSpecV5{} } func (m *RoleSpecV5) String() string { return proto.CompactTextString(m) } func (*RoleSpecV5) ProtoMessage() {} func (*RoleSpecV5) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{78} + return fileDescriptor_d938547f84707355, []int{81} } func (m *RoleSpecV5) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4411,7 +4585,7 @@ func (m *RoleOptions) Reset() { *m = RoleOptions{} } func (m *RoleOptions) String() string { return proto.CompactTextString(m) } func (*RoleOptions) ProtoMessage() {} func (*RoleOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{79} + return fileDescriptor_d938547f84707355, []int{82} } func (m *RoleOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4453,7 +4627,7 @@ func (m *RecordSession) Reset() { *m = RecordSession{} } func (m *RecordSession) String() string { return proto.CompactTextString(m) } func (*RecordSession) ProtoMessage() {} func (*RecordSession) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{80} + return fileDescriptor_d938547f84707355, []int{83} } func (m *RecordSession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4503,7 +4677,7 @@ func (m *CertExtension) Reset() { *m = CertExtension{} } func (m *CertExtension) String() string { return proto.CompactTextString(m) } func (*CertExtension) ProtoMessage() {} func (*CertExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{81} + return fileDescriptor_d938547f84707355, []int{84} } func (m *CertExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4588,7 +4762,7 @@ func (m *RoleConditions) Reset() { *m = RoleConditions{} } func (m *RoleConditions) String() string { return proto.CompactTextString(m) } func (*RoleConditions) ProtoMessage() {} func (*RoleConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{82} + return fileDescriptor_d938547f84707355, []int{85} } func (m *RoleConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4641,7 +4815,7 @@ func (m *SessionRequirePolicy) Reset() { *m = SessionRequirePolicy{} } func (m *SessionRequirePolicy) String() string { return proto.CompactTextString(m) } func (*SessionRequirePolicy) ProtoMessage() {} func (*SessionRequirePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{83} + return fileDescriptor_d938547f84707355, []int{86} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4689,7 +4863,7 @@ func (m *SessionJoinPolicy) Reset() { *m = SessionJoinPolicy{} } func (m *SessionJoinPolicy) String() string { return proto.CompactTextString(m) } func (*SessionJoinPolicy) ProtoMessage() {} func (*SessionJoinPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{84} + return fileDescriptor_d938547f84707355, []int{87} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4753,7 +4927,7 @@ func (m *AccessRequestConditions) Reset() { *m = AccessRequestConditions func (m *AccessRequestConditions) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditions) ProtoMessage() {} func (*AccessRequestConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{85} + return fileDescriptor_d938547f84707355, []int{88} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4801,7 +4975,7 @@ func (m *AccessReviewConditions) Reset() { *m = AccessReviewConditions{} func (m *AccessReviewConditions) String() string { return proto.CompactTextString(m) } func (*AccessReviewConditions) ProtoMessage() {} func (*AccessReviewConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{86} + return fileDescriptor_d938547f84707355, []int{89} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4847,7 +5021,7 @@ func (m *ClaimMapping) Reset() { *m = ClaimMapping{} } func (m *ClaimMapping) String() string { return proto.CompactTextString(m) } func (*ClaimMapping) ProtoMessage() {} func (*ClaimMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{87} + return fileDescriptor_d938547f84707355, []int{90} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4896,7 +5070,7 @@ func (m *Rule) Reset() { *m = Rule{} } func (m *Rule) String() string { return proto.CompactTextString(m) } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{88} + return fileDescriptor_d938547f84707355, []int{91} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4944,7 +5118,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} } func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) } func (*ImpersonateConditions) ProtoMessage() {} func (*ImpersonateConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{89} + return fileDescriptor_d938547f84707355, []int{92} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4986,7 +5160,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} } func (m *BoolValue) String() string { return proto.CompactTextString(m) } func (*BoolValue) ProtoMessage() {} func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{90} + return fileDescriptor_d938547f84707355, []int{93} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5035,7 +5209,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{91} + return fileDescriptor_d938547f84707355, []int{94} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5099,7 +5273,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} } func (m *UserSpecV2) String() string { return proto.CompactTextString(m) } func (*UserSpecV2) ProtoMessage() {} func (*UserSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{92} + return fileDescriptor_d938547f84707355, []int{95} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5144,7 +5318,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{93} + return fileDescriptor_d938547f84707355, []int{96} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5196,7 +5370,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} } func (m *LoginStatus) String() string { return proto.CompactTextString(m) } func (*LoginStatus) ProtoMessage() {} func (*LoginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{94} + return fileDescriptor_d938547f84707355, []int{97} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5241,7 +5415,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{95} + return fileDescriptor_d938547f84707355, []int{98} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5290,7 +5464,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} } func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) } func (*LocalAuthSecrets) ProtoMessage() {} func (*LocalAuthSecrets) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{96} + return fileDescriptor_d938547f84707355, []int{99} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5345,7 +5519,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} } func (m *MFADevice) String() string { return proto.CompactTextString(m) } func (*MFADevice) ProtoMessage() {} func (*MFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{97} + return fileDescriptor_d938547f84707355, []int{100} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5443,7 +5617,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} } func (m *TOTPDevice) String() string { return proto.CompactTextString(m) } func (*TOTPDevice) ProtoMessage() {} func (*TOTPDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{98} + return fileDescriptor_d938547f84707355, []int{101} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5489,7 +5663,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} } func (m *U2FDevice) String() string { return proto.CompactTextString(m) } func (*U2FDevice) ProtoMessage() {} func (*U2FDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{99} + return fileDescriptor_d938547f84707355, []int{102} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5556,7 +5730,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} } func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) } func (*WebauthnDevice) ProtoMessage() {} func (*WebauthnDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{100} + return fileDescriptor_d938547f84707355, []int{103} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5599,7 +5773,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} } func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) } func (*WebauthnLocalAuth) ProtoMessage() {} func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{101} + return fileDescriptor_d938547f84707355, []int{104} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5645,7 +5819,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} } func (m *ConnectorRef) String() string { return proto.CompactTextString(m) } func (*ConnectorRef) ProtoMessage() {} func (*ConnectorRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{102} + return fileDescriptor_d938547f84707355, []int{105} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5687,7 +5861,7 @@ func (m *UserRef) Reset() { *m = UserRef{} } func (m *UserRef) String() string { return proto.CompactTextString(m) } func (*UserRef) ProtoMessage() {} func (*UserRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{103} + return fileDescriptor_d938547f84707355, []int{106} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5737,7 +5911,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} } func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelV2) ProtoMessage() {} func (*ReverseTunnelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{104} + return fileDescriptor_d938547f84707355, []int{107} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5784,7 +5958,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} } func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelSpecV2) ProtoMessage() {} func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{105} + return fileDescriptor_d938547f84707355, []int{108} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5833,7 +6007,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{106} + return fileDescriptor_d938547f84707355, []int{109} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5881,7 +6055,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{} func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) } func (*TunnelConnectionSpecV2) ProtoMessage() {} func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{107} + return fileDescriptor_d938547f84707355, []int{110} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5929,7 +6103,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} } func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) } func (*SemaphoreFilter) ProtoMessage() {} func (*SemaphoreFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{108} + return fileDescriptor_d938547f84707355, []int{111} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5980,7 +6154,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) } func (*AcquireSemaphoreRequest) ProtoMessage() {} func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{109} + return fileDescriptor_d938547f84707355, []int{112} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6028,7 +6202,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} } func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) } func (*SemaphoreLease) ProtoMessage() {} func (*SemaphoreLease) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{110} + return fileDescriptor_d938547f84707355, []int{113} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6074,7 +6248,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} } func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) } func (*SemaphoreLeaseRef) ProtoMessage() {} func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{111} + return fileDescriptor_d938547f84707355, []int{114} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6123,7 +6297,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{112} + return fileDescriptor_d938547f84707355, []int{115} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6165,7 +6339,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} } func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) } func (*SemaphoreSpecV3) ProtoMessage() {} func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{113} + return fileDescriptor_d938547f84707355, []int{116} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6214,7 +6388,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{114} + return fileDescriptor_d938547f84707355, []int{117} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6275,7 +6449,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} } func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) } func (*WebSessionSpecV2) ProtoMessage() {} func (*WebSessionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{115} + return fileDescriptor_d938547f84707355, []int{118} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6317,7 +6491,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} } func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) } func (*WebSessionFilter) ProtoMessage() {} func (*WebSessionFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{116} + return fileDescriptor_d938547f84707355, []int{119} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6366,7 +6540,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{117} + return fileDescriptor_d938547f84707355, []int{120} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6410,7 +6584,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} } func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) } func (*RemoteClusterStatusV3) ProtoMessage() {} func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{118} + return fileDescriptor_d938547f84707355, []int{121} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6460,7 +6634,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} } func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) } func (*KubernetesCluster) ProtoMessage() {} func (*KubernetesCluster) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{119} + return fileDescriptor_d938547f84707355, []int{122} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6509,7 +6683,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{120} + return fileDescriptor_d938547f84707355, []int{123} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6551,7 +6725,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3 func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterSpecV3) ProtoMessage() {} func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{121} + return fileDescriptor_d938547f84707355, []int{124} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6603,7 +6777,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{122} + return fileDescriptor_d938547f84707355, []int{125} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6647,7 +6821,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} } func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*WebTokenSpecV3) ProtoMessage() {} func (*WebTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{123} + return fileDescriptor_d938547f84707355, []int{126} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6691,7 +6865,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} } func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetWebSessionRequest) ProtoMessage() {} func (*GetWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{124} + return fileDescriptor_d938547f84707355, []int{127} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6735,7 +6909,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebSessionRequest) ProtoMessage() {} func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{125} + return fileDescriptor_d938547f84707355, []int{128} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6779,7 +6953,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} } func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetWebTokenRequest) ProtoMessage() {} func (*GetWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{126} + return fileDescriptor_d938547f84707355, []int{129} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6823,7 +6997,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} } func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebTokenRequest) ProtoMessage() {} func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{127} + return fileDescriptor_d938547f84707355, []int{130} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6865,7 +7039,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } func (m *ResourceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceRequest) ProtoMessage() {} func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{128} + return fileDescriptor_d938547f84707355, []int{131} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6909,7 +7083,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourceWithSecretsRequest) ProtoMessage() {} func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{129} + return fileDescriptor_d938547f84707355, []int{132} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6951,7 +7125,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesWithSecretsRequest) ProtoMessage() {} func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{130} + return fileDescriptor_d938547f84707355, []int{133} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6995,7 +7169,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceInNamespaceRequest) ProtoMessage() {} func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{131} + return fileDescriptor_d938547f84707355, []int{134} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7037,7 +7211,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesInNamespaceRequest) ProtoMessage() {} func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{132} + return fileDescriptor_d938547f84707355, []int{135} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7087,7 +7261,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} } func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3) ProtoMessage() {} func (*OIDCConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{133} + return fileDescriptor_d938547f84707355, []int{136} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7129,7 +7303,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} } func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3List) ProtoMessage() {} func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{134} + return fileDescriptor_d938547f84707355, []int{137} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7202,7 +7376,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} } func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorSpecV3) ProtoMessage() {} func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{135} + return fileDescriptor_d938547f84707355, []int{138} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7252,7 +7426,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} } func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2) ProtoMessage() {} func (*SAMLConnectorV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{136} + return fileDescriptor_d938547f84707355, []int{139} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7294,7 +7468,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} } func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2List) ProtoMessage() {} func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{137} + return fileDescriptor_d938547f84707355, []int{140} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7363,7 +7537,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} } func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorSpecV2) ProtoMessage() {} func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{138} + return fileDescriptor_d938547f84707355, []int{141} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7409,7 +7583,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} } func (m *AttributeMapping) String() string { return proto.CompactTextString(m) } func (*AttributeMapping) ProtoMessage() {} func (*AttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{139} + return fileDescriptor_d938547f84707355, []int{142} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7454,7 +7628,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} } func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) } func (*AsymmetricKeyPair) ProtoMessage() {} func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{140} + return fileDescriptor_d938547f84707355, []int{143} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7504,7 +7678,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} } func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3) ProtoMessage() {} func (*GithubConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{141} + return fileDescriptor_d938547f84707355, []int{144} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7546,7 +7720,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} } func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3List) ProtoMessage() {} func (*GithubConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{142} + return fileDescriptor_d938547f84707355, []int{145} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7596,7 +7770,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} } func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorSpecV3) ProtoMessage() {} func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{143} + return fileDescriptor_d938547f84707355, []int{146} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7646,7 +7820,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{144} + return fileDescriptor_d938547f84707355, []int{147} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7695,7 +7869,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{145} + return fileDescriptor_d938547f84707355, []int{148} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7737,7 +7911,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{146} + return fileDescriptor_d938547f84707355, []int{149} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7793,7 +7967,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{147} + return fileDescriptor_d938547f84707355, []int{150} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7846,7 +8020,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{148} + return fileDescriptor_d938547f84707355, []int{151} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7892,7 +8066,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{149} + return fileDescriptor_d938547f84707355, []int{152} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7947,7 +8121,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{150} + return fileDescriptor_d938547f84707355, []int{153} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7991,7 +8165,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{151} + return fileDescriptor_d938547f84707355, []int{154} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8034,7 +8208,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{152} + return fileDescriptor_d938547f84707355, []int{155} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8087,7 +8261,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{153} + return fileDescriptor_d938547f84707355, []int{156} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8131,7 +8305,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{154} + return fileDescriptor_d938547f84707355, []int{157} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8177,7 +8351,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{155} + return fileDescriptor_d938547f84707355, []int{158} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8221,7 +8395,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{156} + return fileDescriptor_d938547f84707355, []int{159} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8265,7 +8439,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{157} + return fileDescriptor_d938547f84707355, []int{160} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8311,7 +8485,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{158} + return fileDescriptor_d938547f84707355, []int{161} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8377,7 +8551,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{159} + return fileDescriptor_d938547f84707355, []int{162} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8431,7 +8605,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{160} + return fileDescriptor_d938547f84707355, []int{163} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8476,7 +8650,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{161} + return fileDescriptor_d938547f84707355, []int{164} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8520,7 +8694,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{162} + return fileDescriptor_d938547f84707355, []int{165} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8564,7 +8738,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{163} + return fileDescriptor_d938547f84707355, []int{166} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8646,7 +8820,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{164} + return fileDescriptor_d938547f84707355, []int{167} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8693,7 +8867,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{165} + return fileDescriptor_d938547f84707355, []int{168} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8741,7 +8915,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{166} + return fileDescriptor_d938547f84707355, []int{169} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8785,7 +8959,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{167} + return fileDescriptor_d938547f84707355, []int{170} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8883,6 +9057,9 @@ func init() { proto.RegisterType((*ClusterAuditConfigSpecV2)(nil), "types.ClusterAuditConfigSpecV2") proto.RegisterType((*ClusterNetworkingConfigV2)(nil), "types.ClusterNetworkingConfigV2") proto.RegisterType((*ClusterNetworkingConfigSpecV2)(nil), "types.ClusterNetworkingConfigSpecV2") + proto.RegisterType((*TunnelStrategyV1)(nil), "types.TunnelStrategyV1") + proto.RegisterType((*AgentMeshTunnelStrategy)(nil), "types.AgentMeshTunnelStrategy") + proto.RegisterType((*ProxyPeeringTunnelStrategy)(nil), "types.ProxyPeeringTunnelStrategy") proto.RegisterType((*SessionRecordingConfigV2)(nil), "types.SessionRecordingConfigV2") proto.RegisterType((*SessionRecordingConfigSpecV2)(nil), "types.SessionRecordingConfigSpecV2") proto.RegisterType((*AuthPreferenceV2)(nil), "types.AuthPreferenceV2") @@ -9014,734 +9191,745 @@ func init() { func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) } var fileDescriptor_d938547f84707355 = []byte{ - // 11630 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x5d, 0x6c, 0x24, 0x49, - 0x72, 0x18, 0x3c, 0xd5, 0xdd, 0x24, 0xbb, 0x83, 0x4d, 0xb2, 0x99, 0x9c, 0x1f, 0xce, 0xec, 0xec, - 0xf6, 0x5c, 0xed, 0xdf, 0xcc, 0xdc, 0xee, 0xf0, 0x86, 0x73, 0x3b, 0xd2, 0xde, 0xfe, 0x5d, 0x37, - 0xc9, 0x99, 0xe1, 0x0e, 0x87, 0xe4, 0x56, 0xf3, 0xe7, 0x4e, 0x77, 0xa7, 0x52, 0xb1, 0x2b, 0x87, - 0xac, 0x65, 0x77, 0x57, 0xab, 0xaa, 0x7a, 0x66, 0x28, 0x7d, 0x82, 0xf4, 0xc1, 0x90, 0x05, 0x41, - 0xd0, 0xfd, 0x08, 0x27, 0x4b, 0x32, 0x64, 0x48, 0x16, 0x2c, 0xd8, 0xb2, 0x71, 0x7a, 0x90, 0x0d, - 0xd8, 0x06, 0x0c, 0x03, 0x02, 0x0c, 0xe1, 0x1e, 0x6c, 0x58, 0x6f, 0x86, 0x64, 0x83, 0xb6, 0xee, - 0xfc, 0x62, 0x02, 0x36, 0x0c, 0xe8, 0x49, 0x67, 0x0b, 0x30, 0x32, 0x32, 0xb3, 0x2a, 0xb3, 0xba, - 0x9a, 0x6c, 0xee, 0xce, 0x02, 0x37, 0xf3, 0x44, 0x76, 0x64, 0x44, 0x54, 0xfe, 0x46, 0x46, 0x64, - 0x46, 0x44, 0xc2, 0x78, 0x74, 0xd0, 0xa5, 0xe1, 0x8d, 0x6e, 0xe0, 0x47, 0x3e, 0x19, 0xc1, 0x1f, - 0x97, 0xce, 0xee, 0xfa, 0xbb, 0x3e, 0x42, 0xe6, 0xd8, 0x7f, 0xbc, 0xf0, 0x52, 0x75, 0xd7, 0xf7, - 0x77, 0x5b, 0x74, 0x0e, 0x7f, 0xed, 0xf4, 0x1e, 0xce, 0x45, 0x5e, 0x9b, 0x86, 0x91, 0xd3, 0xee, - 0x0a, 0x84, 0x85, 0x5d, 0x2f, 0xda, 0xeb, 0xed, 0xdc, 0x68, 0xfa, 0xed, 0xb9, 0xdd, 0xc0, 0x79, - 0xe4, 0x45, 0x4e, 0xe4, 0xf9, 0x1d, 0xa7, 0x35, 0x17, 0xd1, 0x16, 0xed, 0xfa, 0x41, 0x34, 0xe7, - 0x74, 0xbd, 0x39, 0xfc, 0xc6, 0xdc, 0xe3, 0xc0, 0xe9, 0x76, 0x69, 0x90, 0xfc, 0xc3, 0x99, 0x98, - 0xff, 0x30, 0x0f, 0xa5, 0xfb, 0x94, 0x76, 0x6b, 0x2d, 0xef, 0x11, 0x25, 0x2f, 0x43, 0x61, 0xd5, - 0x69, 0xd3, 0x59, 0xe3, 0x8a, 0x71, 0xb5, 0x54, 0x9f, 0x3a, 0x3a, 0xac, 0x8e, 0x87, 0x34, 0x78, - 0x44, 0x03, 0xbb, 0xe3, 0xb4, 0xa9, 0x85, 0x85, 0xe4, 0xf3, 0x50, 0x62, 0x7f, 0xc3, 0xae, 0xd3, - 0xa4, 0xb3, 0x39, 0xc4, 0x9c, 0x38, 0x3a, 0xac, 0x96, 0x3a, 0x12, 0x68, 0x25, 0xe5, 0xe4, 0x35, - 0x18, 0x5b, 0xa1, 0x4e, 0x48, 0x97, 0x17, 0x67, 0xf3, 0x57, 0x8c, 0xab, 0xf9, 0x7a, 0xf9, 0xe8, - 0xb0, 0x5a, 0x6c, 0x31, 0x90, 0xed, 0xb9, 0x96, 0x2c, 0x24, 0xcb, 0x30, 0xb6, 0xf4, 0xa4, 0xeb, - 0x05, 0x34, 0x9c, 0x2d, 0x5c, 0x31, 0xae, 0x8e, 0xcf, 0x5f, 0xba, 0xc1, 0xdb, 0x7f, 0x43, 0xb6, - 0xff, 0xc6, 0x86, 0x6c, 0x7f, 0x7d, 0xe6, 0xfb, 0x87, 0xd5, 0x33, 0x47, 0x87, 0xd5, 0x31, 0xca, - 0x49, 0xbe, 0xfd, 0x5f, 0xab, 0x86, 0x25, 0xe9, 0xc9, 0xbb, 0x50, 0xd8, 0x38, 0xe8, 0xd2, 0xd9, - 0xd2, 0x15, 0xe3, 0xea, 0xe4, 0xfc, 0x4b, 0x37, 0x78, 0x8f, 0xc7, 0x8d, 0x4c, 0xfe, 0x63, 0x58, - 0xf5, 0xe2, 0xd1, 0x61, 0xb5, 0xc0, 0x50, 0x2c, 0xa4, 0x22, 0x6f, 0xc2, 0xe8, 0x3d, 0x3f, 0x8c, - 0x96, 0x17, 0x67, 0x01, 0x9b, 0x76, 0xee, 0xe8, 0xb0, 0x3a, 0xbd, 0xe7, 0x87, 0x91, 0xed, 0xb9, - 0x6f, 0xf8, 0x6d, 0x2f, 0xa2, 0xed, 0x6e, 0x74, 0x60, 0x09, 0x24, 0x73, 0x07, 0x26, 0x34, 0x7e, - 0x64, 0x1c, 0xc6, 0x36, 0x57, 0xef, 0xaf, 0xae, 0x6d, 0xaf, 0x56, 0xce, 0x90, 0x22, 0x14, 0x56, - 0xd7, 0x16, 0x97, 0x2a, 0x06, 0x19, 0x83, 0x7c, 0x6d, 0x7d, 0xbd, 0x92, 0x23, 0x65, 0x28, 0x2e, - 0xd6, 0x36, 0x6a, 0xf5, 0x5a, 0x63, 0xa9, 0x92, 0x27, 0x33, 0x30, 0xb5, 0xbd, 0xbc, 0xba, 0xb8, - 0xb6, 0xdd, 0xb0, 0x17, 0x97, 0x1a, 0xf7, 0x37, 0xd6, 0xd6, 0x2b, 0x05, 0x32, 0x09, 0x70, 0x7f, - 0xb3, 0xbe, 0x64, 0xad, 0x2e, 0x6d, 0x2c, 0x35, 0x2a, 0x23, 0xe6, 0xaf, 0xe4, 0xa1, 0xf8, 0x80, - 0x46, 0x8e, 0xeb, 0x44, 0x0e, 0xb9, 0xac, 0x0d, 0x11, 0xd6, 0x5e, 0x19, 0x9b, 0x97, 0xfb, 0xc7, - 0x66, 0xe4, 0xe8, 0xb0, 0x6a, 0xbc, 0xa9, 0x8e, 0xc9, 0x3b, 0x30, 0xbe, 0x48, 0xc3, 0x66, 0xe0, - 0x75, 0xd9, 0x7c, 0xc1, 0x71, 0x29, 0xd5, 0x2f, 0x1e, 0x1d, 0x56, 0xcf, 0xb9, 0x09, 0x58, 0x69, - 0xab, 0x8a, 0x4d, 0x96, 0x61, 0x74, 0xc5, 0xd9, 0xa1, 0xad, 0x70, 0x76, 0xe4, 0x4a, 0xfe, 0xea, - 0xf8, 0xfc, 0x0b, 0xa2, 0x7f, 0x65, 0x05, 0x6f, 0xf0, 0xd2, 0xa5, 0x4e, 0x14, 0x1c, 0xd4, 0xcf, - 0x1e, 0x1d, 0x56, 0x2b, 0x2d, 0x04, 0xa8, 0x7d, 0xc7, 0x51, 0x48, 0x23, 0x19, 0xf3, 0xd1, 0x13, - 0xc7, 0xfc, 0xc5, 0xef, 0x1f, 0x56, 0x0d, 0x36, 0x16, 0x62, 0xcc, 0x13, 0x7e, 0xfa, 0xe8, 0x5f, - 0x81, 0xdc, 0xf2, 0xe2, 0xec, 0x18, 0xce, 0xb5, 0xca, 0xd1, 0x61, 0xb5, 0xac, 0x0d, 0x5b, 0x6e, - 0x79, 0xf1, 0xd2, 0xdb, 0x30, 0xae, 0xd4, 0x91, 0x54, 0x20, 0xbf, 0x4f, 0x0f, 0x78, 0x7f, 0x5a, - 0xec, 0x5f, 0x72, 0x16, 0x46, 0x1e, 0x39, 0xad, 0x9e, 0xe8, 0x40, 0x8b, 0xff, 0xf8, 0x52, 0xee, - 0x27, 0x0d, 0xf3, 0x37, 0x0a, 0x50, 0xb4, 0x7c, 0xbe, 0xce, 0xc8, 0x35, 0x18, 0x69, 0x44, 0x4e, - 0x24, 0x87, 0x62, 0xe6, 0xe8, 0xb0, 0x3a, 0x15, 0x32, 0x80, 0xf2, 0x3d, 0x8e, 0xc1, 0x50, 0xd7, - 0xf7, 0x9c, 0x50, 0x0e, 0x09, 0xa2, 0x76, 0x19, 0x40, 0x45, 0x45, 0x0c, 0xf2, 0x1a, 0x14, 0x1e, - 0xf8, 0x2e, 0x15, 0xa3, 0x42, 0x8e, 0x0e, 0xab, 0x93, 0x6d, 0xdf, 0x55, 0x11, 0xb1, 0x9c, 0xbc, - 0x01, 0xa5, 0x85, 0x5e, 0x10, 0xd0, 0x0e, 0x9b, 0xaa, 0x05, 0x44, 0x9e, 0x3c, 0x3a, 0xac, 0x42, - 0x93, 0x03, 0xd9, 0xe2, 0x4a, 0x10, 0x58, 0x57, 0x37, 0x22, 0x27, 0x88, 0xa8, 0x3b, 0x3b, 0x32, - 0x54, 0x57, 0xb3, 0xe5, 0x35, 0x1d, 0x72, 0x92, 0x74, 0x57, 0x0b, 0x4e, 0xe4, 0x1e, 0x8c, 0xdf, - 0x0d, 0x9c, 0x26, 0x5d, 0xa7, 0x81, 0xe7, 0xbb, 0x38, 0x86, 0xf9, 0xfa, 0x6b, 0x47, 0x87, 0xd5, - 0xf3, 0xbb, 0x0c, 0x6c, 0x77, 0x11, 0x9e, 0x50, 0xff, 0xe8, 0xb0, 0x5a, 0x5c, 0xec, 0x05, 0xd8, - 0x7b, 0x96, 0x4a, 0x4a, 0x7e, 0x86, 0x0d, 0x49, 0x18, 0x61, 0xd7, 0x52, 0x17, 0x47, 0xef, 0xf8, - 0x2a, 0x9a, 0xa2, 0x8a, 0xe7, 0x5b, 0x4e, 0x18, 0xd9, 0x01, 0xa7, 0x4b, 0xd5, 0x53, 0x65, 0x49, - 0xd6, 0xa0, 0xd8, 0x68, 0xee, 0x51, 0xb7, 0xd7, 0xa2, 0xb3, 0x45, 0x64, 0x7f, 0x41, 0x4c, 0x5c, - 0x39, 0x9e, 0xb2, 0xb8, 0x7e, 0x49, 0xf0, 0x26, 0xa1, 0x80, 0x28, 0x7d, 0x1f, 0x33, 0xf9, 0x52, - 0xf1, 0xb7, 0x7f, 0xbf, 0x7a, 0xe6, 0x97, 0xfe, 0xcb, 0x95, 0x33, 0xe6, 0xbf, 0xcc, 0x41, 0x25, - 0xcd, 0x84, 0x3c, 0x84, 0x89, 0xcd, 0xae, 0xeb, 0x44, 0x74, 0xa1, 0xe5, 0xd1, 0x4e, 0x14, 0xe2, - 0x24, 0x39, 0xbe, 0x4d, 0xaf, 0x88, 0xef, 0xce, 0xf6, 0x90, 0xd0, 0x6e, 0x72, 0xca, 0x54, 0xab, - 0x74, 0xb6, 0xc9, 0x77, 0x1a, 0x28, 0xa7, 0x43, 0x9c, 0x61, 0xa7, 0xfb, 0x0e, 0x97, 0xf0, 0x03, - 0xbe, 0x23, 0xd8, 0x8a, 0x09, 0xd4, 0x71, 0x77, 0x0e, 0x70, 0x66, 0x0e, 0x3f, 0x81, 0x18, 0x49, - 0xc6, 0x04, 0x62, 0x60, 0xf3, 0xbf, 0x1b, 0x30, 0x69, 0xd1, 0xd0, 0xef, 0x05, 0x4d, 0x7a, 0x8f, - 0x3a, 0x2e, 0x0d, 0xd8, 0xf4, 0xbf, 0xef, 0x75, 0x5c, 0xb1, 0xa6, 0x70, 0xfa, 0xef, 0x7b, 0x1d, - 0x75, 0x09, 0x63, 0x39, 0xf9, 0x02, 0x8c, 0x35, 0x7a, 0x3b, 0x88, 0xca, 0xd7, 0xd4, 0x79, 0x1c, - 0xb1, 0xde, 0x8e, 0x9d, 0x42, 0x97, 0x68, 0x64, 0x0e, 0xc6, 0xb6, 0x68, 0x10, 0x26, 0x12, 0x0f, - 0x25, 0xfb, 0x23, 0x0e, 0x52, 0x09, 0x04, 0x16, 0xb9, 0x9b, 0x48, 0x5d, 0xb1, 0x27, 0x4d, 0xa5, - 0x64, 0x5d, 0x32, 0x55, 0xda, 0x02, 0xa2, 0x4e, 0x15, 0x89, 0x65, 0x7e, 0x27, 0x07, 0x95, 0x45, - 0x27, 0x72, 0x76, 0x9c, 0x50, 0xf4, 0xe7, 0xd6, 0x2d, 0x26, 0xc7, 0x95, 0x86, 0xa2, 0x1c, 0x67, - 0x35, 0xff, 0xc4, 0xcd, 0x7b, 0x35, 0xdd, 0xbc, 0x71, 0xb6, 0x41, 0x8a, 0xe6, 0x25, 0x8d, 0x7a, - 0xef, 0xe4, 0x46, 0x55, 0x44, 0xa3, 0x8a, 0xb2, 0x51, 0x49, 0x53, 0xc8, 0x7b, 0x50, 0x68, 0x74, - 0x69, 0x53, 0x08, 0x11, 0x29, 0xfb, 0xf5, 0xc6, 0x31, 0x84, 0xad, 0x5b, 0xf5, 0xb2, 0x60, 0x53, - 0x08, 0xbb, 0xb4, 0x69, 0x21, 0x99, 0xb2, 0x68, 0xbe, 0x3b, 0x0a, 0x67, 0xb3, 0xc8, 0xc8, 0x7b, - 0xfa, 0xe6, 0xc4, 0xbb, 0xe7, 0x85, 0x81, 0x9b, 0xd3, 0xac, 0xa1, 0x6f, 0x4f, 0xd7, 0xa1, 0xb8, - 0xce, 0x26, 0x64, 0xd3, 0x6f, 0x89, 0x9e, 0x63, 0x52, 0xb1, 0xd8, 0x95, 0x30, 0xc3, 0x8a, 0xcb, - 0xc9, 0x0b, 0x90, 0xdf, 0xb4, 0x96, 0x45, 0x77, 0x95, 0x8e, 0x0e, 0xab, 0xf9, 0x5e, 0xe0, 0xcd, - 0x1a, 0x16, 0x83, 0x92, 0x39, 0x18, 0x5d, 0xa8, 0x2d, 0xd0, 0x20, 0xc2, 0x6e, 0x2a, 0xd7, 0x2f, - 0xb0, 0xd9, 0xd2, 0x74, 0xec, 0x26, 0x0d, 0x22, 0xed, 0xf3, 0x02, 0x8d, 0x7c, 0x1e, 0xf2, 0xb5, - 0xed, 0x86, 0xe8, 0x19, 0x10, 0x3d, 0x53, 0xdb, 0x6e, 0xd4, 0x27, 0x44, 0x47, 0xe4, 0x9d, 0xc7, - 0x21, 0xe3, 0x5e, 0xdb, 0x6e, 0xa8, 0xa3, 0x35, 0x7a, 0xcc, 0x68, 0x5d, 0x85, 0x22, 0xd3, 0x33, - 0xd8, 0x06, 0x8f, 0x42, 0xb1, 0xc4, 0xd5, 0xa7, 0x3d, 0x01, 0xb3, 0xe2, 0x52, 0xf2, 0x72, 0xac, - 0xb6, 0x14, 0x13, 0x7e, 0x42, 0x6d, 0x91, 0xca, 0x0a, 0x79, 0x02, 0x13, 0x8b, 0x07, 0x1d, 0xa7, - 0xed, 0x35, 0xc5, 0x16, 0x5e, 0xc2, 0x2d, 0xfc, 0xc6, 0x31, 0xc3, 0x78, 0x43, 0x23, 0xe0, 0xbb, - 0xba, 0x14, 0xbe, 0xb3, 0x2e, 0x2f, 0xb3, 0xd3, 0x3b, 0xfc, 0xac, 0x61, 0xe9, 0x1f, 0x62, 0x6b, - 0x49, 0x8a, 0x48, 0xd4, 0xab, 0x92, 0x69, 0x27, 0xc1, 0xc9, 0x5a, 0x0a, 0x04, 0x44, 0x5d, 0x4b, - 0xf1, 0xa6, 0xfb, 0x1e, 0xe4, 0xef, 0x2e, 0xac, 0xcf, 0x8e, 0x23, 0x0f, 0x22, 0x78, 0xdc, 0x5d, - 0x58, 0x5f, 0x68, 0xf9, 0x3d, 0xb7, 0xf1, 0xd1, 0x4a, 0xfd, 0x82, 0x60, 0x33, 0xb1, 0xdb, 0xec, - 0x6a, 0x35, 0x62, 0x74, 0x64, 0x09, 0x8a, 0xb2, 0x95, 0xb3, 0x65, 0xe4, 0x31, 0x9d, 0x6a, 0xfc, - 0xd6, 0x2d, 0xbe, 0xd6, 0x5c, 0xf1, 0x5b, 0xad, 0x85, 0xc4, 0xb9, 0xb4, 0x0d, 0xa4, 0xbf, 0x5f, - 0x32, 0x34, 0x89, 0xcf, 0xab, 0x9a, 0xc4, 0xf8, 0xfc, 0x39, 0xf1, 0xad, 0x05, 0xbf, 0xdd, 0x76, - 0x3a, 0x2e, 0xd2, 0x6e, 0xcd, 0xab, 0x0a, 0x46, 0x0d, 0x26, 0x93, 0x8a, 0xac, 0x78, 0x61, 0x44, - 0xe6, 0xa0, 0x24, 0x21, 0x6c, 0x13, 0xc9, 0x67, 0x56, 0xd9, 0x4a, 0x70, 0xcc, 0x3f, 0xcb, 0x01, - 0x24, 0x25, 0xcf, 0xa8, 0x9c, 0xf9, 0x09, 0x4d, 0xce, 0x9c, 0x4b, 0x4f, 0xd0, 0x81, 0x12, 0x86, - 0x7c, 0x00, 0xa3, 0x4c, 0xe5, 0xea, 0x49, 0x95, 0xf2, 0x42, 0x9a, 0x14, 0x0b, 0xb7, 0x6e, 0xd5, - 0x27, 0x05, 0xf1, 0x68, 0x88, 0x10, 0x4b, 0x90, 0x29, 0x22, 0xea, 0x7f, 0x15, 0x92, 0xc1, 0x10, - 0xc2, 0xe9, 0xaa, 0x22, 0x5d, 0x8c, 0x64, 0x3d, 0x4a, 0xe9, 0xa2, 0xc8, 0x96, 0x8b, 0x5c, 0xb6, - 0xf0, 0x4e, 0x1d, 0x13, 0xb2, 0x25, 0x2d, 0x59, 0x78, 0x07, 0x9e, 0x28, 0x59, 0xba, 0xe9, 0x65, - 0x5b, 0xc0, 0x69, 0x70, 0x35, 0xb3, 0x57, 0xb2, 0x16, 0xec, 0x95, 0x93, 0x16, 0x6c, 0x7a, 0xb9, - 0xde, 0x1a, 0x24, 0xcb, 0xce, 0xc9, 0xd5, 0xe5, 0x3c, 0x56, 0xc9, 0x51, 0xa6, 0xbd, 0xc3, 0x97, - 0xe6, 0xe8, 0xc0, 0xa5, 0x79, 0x2e, 0x73, 0x69, 0xf2, 0x85, 0xf9, 0x0e, 0x8c, 0xd4, 0x7e, 0xae, - 0x17, 0x50, 0xa1, 0xfb, 0x95, 0xe5, 0x37, 0x19, 0x2c, 0x5e, 0xd3, 0x53, 0x0e, 0xfb, 0xa9, 0xea, - 0xcc, 0x58, 0xce, 0xbe, 0xbc, 0xb1, 0xd2, 0x10, 0x7a, 0x1d, 0x49, 0x75, 0xcb, 0xc6, 0x8a, 0x52, - 0xed, 0x48, 0x6b, 0x35, 0xa3, 0x22, 0x73, 0x90, 0xab, 0x2d, 0xa2, 0xb1, 0x38, 0x3e, 0x5f, 0x92, - 0x9f, 0x5d, 0xac, 0x9f, 0x15, 0x24, 0x65, 0x47, 0xb3, 0x1f, 0x6a, 0x8b, 0x9f, 0xdd, 0xe2, 0x6f, - 0x29, 0x6a, 0x82, 0x98, 0xa6, 0xcc, 0x1c, 0x15, 0x93, 0xc5, 0x48, 0x94, 0x96, 0xbe, 0xc9, 0x12, - 0x4f, 0x95, 0x6b, 0x7c, 0xe0, 0x72, 0x7d, 0x03, 0x37, 0xae, 0x6c, 0x42, 0x38, 0x5c, 0xe6, 0xff, - 0x30, 0x10, 0x97, 0xbc, 0x01, 0xa3, 0x16, 0xdd, 0x4d, 0xf6, 0x5a, 0xb4, 0xd9, 0x02, 0x84, 0xa8, - 0x1f, 0xe0, 0x38, 0x28, 0xc8, 0xa9, 0x1b, 0xee, 0x79, 0x0f, 0x23, 0xf1, 0x95, 0x58, 0x90, 0x0b, - 0xb0, 0x22, 0xc8, 0x05, 0x44, 0x13, 0xe4, 0x02, 0xc6, 0xa6, 0x98, 0xb5, 0xd8, 0x10, 0xca, 0xa4, - 0xac, 0xa9, 0xb5, 0xa8, 0x8c, 0x55, 0xe0, 0x6a, 0x63, 0x65, 0x2d, 0x36, 0xc8, 0x6d, 0x28, 0xd5, - 0x9a, 0x4d, 0xbf, 0xa7, 0x18, 0x3d, 0xb3, 0x47, 0x87, 0xd5, 0xb3, 0x0e, 0x07, 0xea, 0x26, 0x7a, - 0x82, 0x6a, 0xd6, 0x93, 0x5a, 0x33, 0x1e, 0x0b, 0xad, 0x5e, 0x18, 0xd1, 0x60, 0x79, 0x51, 0x34, - 0x19, 0x79, 0x34, 0x39, 0x30, 0xc5, 0x23, 0x46, 0x35, 0xff, 0xb3, 0x81, 0x35, 0x26, 0x6f, 0x03, - 0x2c, 0x77, 0x98, 0x62, 0xdb, 0xa4, 0x31, 0x03, 0x34, 0x9e, 0x3d, 0x01, 0xd5, 0x39, 0x28, 0xc8, - 0xfa, 0xa7, 0x73, 0x43, 0x7f, 0x9a, 0x7d, 0x52, 0xaa, 0xc9, 0xe2, 0x1c, 0x45, 0x7c, 0x32, 0x10, - 0xd0, 0xd4, 0x27, 0x13, 0x64, 0xf2, 0x1a, 0x8c, 0x2d, 0xd7, 0x1e, 0xd4, 0x7a, 0xd1, 0x1e, 0xf6, - 0x57, 0x91, 0x0b, 0x2c, 0xcf, 0x69, 0xdb, 0x4e, 0x2f, 0xda, 0xb3, 0x64, 0xa1, 0xf9, 0x4b, 0x06, - 0x8c, 0x2b, 0x6b, 0x95, 0x55, 0x75, 0x3d, 0xf0, 0x3f, 0xa6, 0xcd, 0x48, 0xef, 0xa5, 0x2e, 0x07, - 0xa6, 0xaa, 0x1a, 0xa3, 0xa6, 0x7a, 0x27, 0x77, 0x8a, 0xde, 0x31, 0xe7, 0x84, 0x08, 0x60, 0x36, - 0x80, 0x72, 0xc4, 0x81, 0x36, 0x00, 0xd3, 0x71, 0x54, 0x1b, 0x80, 0x95, 0x9b, 0x7f, 0x64, 0xb0, - 0xa5, 0x4b, 0xe6, 0x00, 0xee, 0xd3, 0x83, 0xc8, 0xd9, 0xb9, 0xe3, 0xb5, 0xb4, 0xa3, 0xab, 0x7d, - 0x84, 0xda, 0x0f, 0xbd, 0x16, 0xb5, 0x14, 0x14, 0x72, 0x0b, 0x8a, 0xf7, 0x83, 0x9d, 0xb7, 0x10, - 0x3d, 0x17, 0x8b, 0xe0, 0x99, 0xfd, 0x60, 0xe7, 0x2d, 0x44, 0x56, 0xe7, 0xab, 0x44, 0x24, 0x26, - 0x8c, 0x2e, 0xfa, 0x6d, 0xc7, 0x93, 0xdb, 0x1e, 0xb0, 0xbd, 0xc3, 0x45, 0x88, 0x25, 0x4a, 0x98, - 0xd0, 0x6f, 0xac, 0xaf, 0x8a, 0x89, 0x89, 0x42, 0x3f, 0xec, 0x76, 0x2c, 0x06, 0x33, 0xbf, 0x67, - 0xc0, 0xb8, 0x22, 0x91, 0xc8, 0x17, 0x85, 0x99, 0x6f, 0xe0, 0x21, 0xd5, 0xf9, 0x7e, 0x99, 0xc5, - 0x4a, 0xf9, 0x76, 0xcd, 0xcc, 0x7f, 0x61, 0xf4, 0x27, 0xd2, 0x20, 0x37, 0x8c, 0x34, 0x78, 0x1b, - 0x80, 0xeb, 0x72, 0xd8, 0x9d, 0xca, 0xbc, 0x51, 0x0e, 0xf5, 0xd4, 0xc1, 0x48, 0x90, 0xcd, 0xff, - 0x3f, 0x07, 0x45, 0x61, 0xab, 0xcc, 0x3f, 0xa3, 0x3a, 0xc4, 0x5b, 0x9a, 0x0e, 0x31, 0x23, 0x48, - 0x15, 0xe5, 0x76, 0xfe, 0x04, 0x1b, 0xe5, 0x6d, 0x28, 0xcb, 0x2e, 0x40, 0x55, 0xec, 0x1a, 0x8c, - 0x49, 0x2b, 0x9b, 0x2b, 0x62, 0x53, 0x1a, 0xcf, 0xad, 0x79, 0x4b, 0x96, 0x9b, 0xdf, 0x19, 0x91, - 0xb4, 0xfc, 0x4b, 0xac, 0x0b, 0x6b, 0xae, 0x1b, 0xa8, 0x5d, 0xe8, 0xb8, 0x6e, 0x60, 0x21, 0x94, - 0x0d, 0xd4, 0x7a, 0x6f, 0xa7, 0xe5, 0x35, 0x11, 0x47, 0x59, 0x35, 0x5d, 0x84, 0xda, 0x0c, 0x55, - 0x1d, 0xa8, 0x04, 0x59, 0x33, 0x11, 0xf2, 0xc7, 0x9a, 0x08, 0x3f, 0x0d, 0xa5, 0x85, 0xb6, 0xab, - 0xa9, 0x10, 0x66, 0x46, 0xa7, 0xdc, 0x88, 0x91, 0xb8, 0xf2, 0x70, 0x59, 0xf4, 0xd1, 0xd9, 0x66, - 0xdb, 0xed, 0x57, 0x1c, 0x12, 0x96, 0x9a, 0x8e, 0x3f, 0xf2, 0x69, 0x74, 0xfc, 0xdb, 0x50, 0xda, - 0x0c, 0xe9, 0x46, 0xaf, 0xd3, 0xa1, 0x2d, 0x54, 0x27, 0x8a, 0x5c, 0xf6, 0xf4, 0x42, 0x6a, 0x47, - 0x08, 0x55, 0x2b, 0x10, 0xa3, 0xaa, 0xd3, 0x6a, 0xec, 0x98, 0x69, 0xf5, 0x45, 0x28, 0xd4, 0xba, - 0x5d, 0x69, 0xfc, 0xc4, 0x9b, 0x64, 0xb7, 0x8b, 0x5b, 0xdf, 0xa4, 0xd3, 0xed, 0xea, 0xa6, 0x0c, - 0x62, 0x13, 0x0a, 0xe4, 0x7e, 0x6f, 0x87, 0x06, 0x1d, 0x1a, 0xd1, 0x50, 0x88, 0xe6, 0x70, 0x16, - 0x90, 0xc7, 0xac, 0x3c, 0x63, 0x4e, 0x23, 0xa0, 0xe1, 0x7a, 0x61, 0xbf, 0xb7, 0x43, 0x6d, 0x21, - 0xe3, 0xd5, 0xbe, 0xcb, 0x60, 0x78, 0xa9, 0x01, 0x93, 0x7a, 0xff, 0x3f, 0x05, 0xc5, 0xe2, 0xc3, - 0x42, 0xb1, 0x58, 0x29, 0x99, 0xbf, 0x92, 0x83, 0xf1, 0x5a, 0xb7, 0xfb, 0x8c, 0x9f, 0x40, 0xfc, - 0xa4, 0xb6, 0xaa, 0xcf, 0x27, 0xa3, 0x77, 0x8a, 0xc3, 0x87, 0xbf, 0x31, 0x60, 0x2a, 0x45, 0xa1, - 0xd6, 0xde, 0x18, 0xd2, 0x22, 0xcf, 0x0d, 0x69, 0x91, 0xe7, 0x07, 0x5b, 0xe4, 0xea, 0x9a, 0x29, - 0x7c, 0x9a, 0x35, 0xf3, 0x3a, 0xe4, 0x6b, 0xdd, 0xae, 0xe8, 0x95, 0x72, 0xd2, 0x2b, 0x5b, 0xb7, - 0xf8, 0x46, 0xe4, 0x74, 0xbb, 0x16, 0xc3, 0x30, 0xdf, 0x84, 0x12, 0x82, 0x51, 0xa2, 0x5d, 0x11, - 0x4b, 0x81, 0x8b, 0x33, 0x8d, 0x8c, 0x4f, 0x7b, 0xf3, 0xff, 0x18, 0x30, 0x82, 0xbf, 0x9f, 0xd1, - 0xe9, 0x32, 0xaf, 0x4d, 0x97, 0x8a, 0x32, 0x5d, 0x86, 0x99, 0x28, 0x7f, 0x92, 0xc7, 0xde, 0x12, - 0x53, 0x44, 0xd8, 0x74, 0x46, 0x86, 0x4d, 0xf7, 0x29, 0x04, 0xf8, 0x7e, 0xda, 0xba, 0xcb, 0xe3, - 0x60, 0xbc, 0x9c, 0xae, 0xea, 0x53, 0x31, 0xec, 0xee, 0x01, 0x59, 0xee, 0x84, 0xb4, 0xd9, 0x0b, - 0x68, 0x63, 0xdf, 0xeb, 0x6e, 0xd1, 0xc0, 0x7b, 0x78, 0x20, 0x34, 0x43, 0x94, 0xb1, 0x9e, 0x28, - 0xb5, 0xc3, 0x7d, 0xaf, 0x6b, 0x3f, 0xc2, 0x72, 0x2b, 0x83, 0x86, 0x7c, 0x00, 0x63, 0x16, 0x7d, - 0x1c, 0x78, 0x11, 0x15, 0x7d, 0x3b, 0x19, 0xdb, 0x01, 0x08, 0xe5, 0xba, 0x49, 0xc0, 0x7f, 0xa8, - 0xe3, 0x2f, 0xca, 0x3f, 0x3b, 0x33, 0xea, 0xbb, 0x23, 0xb8, 0x16, 0x4e, 0xb8, 0x29, 0x3b, 0xc6, - 0x40, 0xd7, 0x07, 0x33, 0x7f, 0x9a, 0xc1, 0xdc, 0x82, 0x32, 0x33, 0xdd, 0x52, 0x96, 0xfa, 0xe5, - 0x64, 0x2c, 0x6f, 0xa8, 0xc5, 0xc7, 0x5d, 0x92, 0x69, 0x7c, 0x88, 0x9d, 0x9e, 0x24, 0xfc, 0xf2, - 0xed, 0x45, 0x85, 0x71, 0xc6, 0xf4, 0x88, 0x45, 0x47, 0x93, 0x77, 0xd6, 0xa9, 0x27, 0xc6, 0xe8, - 0xa7, 0x9b, 0x18, 0x63, 0x9f, 0x64, 0x62, 0xa4, 0xaf, 0x27, 0x8b, 0xa7, 0xb9, 0x9e, 0xbc, 0xf4, - 0x01, 0x4c, 0xf7, 0xf5, 0xf0, 0x69, 0xae, 0xf8, 0x3e, 0xbb, 0x69, 0xf9, 0x0b, 0x71, 0xbf, 0x90, - 0x79, 0x34, 0x47, 0xbd, 0x80, 0x36, 0x23, 0x14, 0xbd, 0x42, 0x5a, 0x06, 0x02, 0x96, 0xb2, 0x97, - 0x11, 0x46, 0xde, 0x87, 0x31, 0x7e, 0x45, 0x12, 0xce, 0xe6, 0x70, 0xec, 0x27, 0xc4, 0x17, 0x39, - 0x54, 0xdc, 0x53, 0x73, 0x0c, 0xb5, 0x57, 0x05, 0x91, 0x79, 0x17, 0x46, 0xc5, 0x15, 0xcb, 0xf1, - 0xeb, 0xa2, 0x0a, 0x23, 0x5b, 0x49, 0xcf, 0xe0, 0xb1, 0x38, 0x6f, 0x84, 0xc5, 0xe1, 0xe6, 0xaf, - 0x19, 0x30, 0xa9, 0xb7, 0x92, 0xdc, 0x80, 0x51, 0x71, 0x07, 0x68, 0xe0, 0x1d, 0x20, 0x6b, 0xcd, - 0x28, 0xbf, 0xfd, 0xd3, 0xee, 0xfc, 0x04, 0x16, 0x13, 0xfd, 0x82, 0x03, 0xb6, 0x45, 0x88, 0x7e, - 0x31, 0x49, 0x2d, 0x59, 0xc6, 0x4c, 0x2e, 0x8b, 0x86, 0xbd, 0x56, 0xa4, 0x9a, 0x5c, 0x01, 0x42, - 0x2c, 0x51, 0x62, 0x1e, 0x1a, 0x00, 0x8d, 0xc6, 0xbd, 0xfb, 0xf4, 0x60, 0xdd, 0xf1, 0x02, 0x34, - 0x5b, 0x71, 0x35, 0xde, 0x17, 0xa3, 0x55, 0x16, 0x66, 0x2b, 0x5f, 0xb9, 0xfb, 0xf4, 0x40, 0x33, - 0x5b, 0x25, 0x2a, 0x2e, 0xf9, 0xc0, 0x7b, 0xe4, 0x44, 0x94, 0x11, 0xe6, 0x90, 0x90, 0x2f, 0x79, - 0x0e, 0x4d, 0x51, 0x2a, 0xc8, 0xe4, 0x1b, 0x30, 0x99, 0xfc, 0x42, 0xc7, 0x83, 0x3c, 0xda, 0x74, - 0x72, 0x46, 0xe8, 0x85, 0xf5, 0x97, 0x8e, 0x0e, 0xab, 0x97, 0x14, 0xae, 0x36, 0xc3, 0x52, 0x58, - 0xa7, 0x98, 0x99, 0x7f, 0x60, 0x00, 0x6c, 0xac, 0x34, 0x64, 0x03, 0x5f, 0x83, 0x42, 0x7c, 0x1a, - 0x54, 0xe6, 0xb6, 0x71, 0xca, 0xf8, 0xc3, 0x72, 0xf2, 0x32, 0xe4, 0x93, 0x96, 0x4c, 0x1f, 0x1d, - 0x56, 0x27, 0xf4, 0x16, 0xb0, 0x52, 0x72, 0x17, 0xc6, 0x86, 0xaa, 0x33, 0xce, 0xce, 0x8c, 0xba, - 0x4a, 0x6a, 0x1c, 0x85, 0x0f, 0xb7, 0x37, 0x9e, 0xdf, 0x51, 0xf8, 0x56, 0x0e, 0xa6, 0x58, 0xbf, - 0xd6, 0x7a, 0xd1, 0x9e, 0x1f, 0x78, 0xd1, 0xc1, 0x33, 0x6b, 0x15, 0xbf, 0xab, 0x29, 0x44, 0x97, - 0xa4, 0xd8, 0x52, 0xdb, 0x36, 0x94, 0x71, 0xfc, 0x57, 0x63, 0x30, 0x93, 0x41, 0x45, 0xde, 0x10, - 0xde, 0x37, 0xc9, 0x99, 0x11, 0x7a, 0xd7, 0xfc, 0xe8, 0xb0, 0x5a, 0x96, 0xe8, 0x1b, 0x89, 0xb7, - 0xcd, 0x3c, 0x8c, 0x0b, 0xd3, 0x67, 0x35, 0xd1, 0xa8, 0xd1, 0x6d, 0x43, 0x9e, 0x89, 0xa1, 0x68, - 0x52, 0x91, 0x48, 0x0d, 0xca, 0x0b, 0x7b, 0xb4, 0xb9, 0xef, 0x75, 0x76, 0xef, 0xd3, 0x03, 0xae, - 0x2f, 0x95, 0xeb, 0x2f, 0x32, 0x4b, 0xab, 0x29, 0xe0, 0x6c, 0x48, 0x75, 0x23, 0x4e, 0x23, 0x21, - 0xef, 0xc3, 0x78, 0xc3, 0xdb, 0xed, 0x48, 0x0e, 0x05, 0xe4, 0x70, 0xf9, 0xe8, 0xb0, 0x7a, 0x3e, - 0xe4, 0xe0, 0x7e, 0x06, 0x2a, 0x01, 0xb9, 0x06, 0x23, 0x96, 0xdf, 0xa2, 0x7c, 0x1b, 0x16, 0xfe, - 0x1c, 0x01, 0x03, 0xa8, 0x67, 0xd3, 0x88, 0x41, 0xee, 0xc1, 0x18, 0xfb, 0xe7, 0x81, 0xd3, 0x9d, - 0x1d, 0x45, 0xb9, 0x4d, 0x62, 0x05, 0x1f, 0xa1, 0x5d, 0xaf, 0xb3, 0xab, 0xea, 0xf8, 0x2d, 0x6a, - 0xb7, 0x9d, 0xae, 0xb6, 0x2f, 0x72, 0x44, 0xb2, 0x05, 0xe3, 0x89, 0x20, 0x08, 0x67, 0xc7, 0xb4, - 0xbb, 0xa0, 0xa4, 0xa4, 0xfe, 0x39, 0xc1, 0xec, 0x42, 0xd4, 0x0a, 0x71, 0x6e, 0x77, 0x19, 0xbe, - 0xde, 0x18, 0x85, 0x91, 0x66, 0x83, 0x14, 0x07, 0xdb, 0x20, 0xc6, 0x89, 0x36, 0x88, 0x0b, 0x20, - 0x3a, 0xa9, 0xd6, 0xda, 0x15, 0xee, 0x57, 0xd7, 0x06, 0x4f, 0xb0, 0x1b, 0x09, 0x32, 0xae, 0x49, - 0x7e, 0x32, 0x25, 0xfa, 0xdf, 0x69, 0xed, 0x6a, 0x27, 0x53, 0x31, 0x2a, 0xeb, 0x86, 0x44, 0xd4, - 0x48, 0x0b, 0x5c, 0x76, 0x43, 0x52, 0x92, 0x74, 0xc3, 0xc7, 0x8f, 0xa3, 0x41, 0xdd, 0xa0, 0x30, - 0x22, 0xab, 0x00, 0xb5, 0x66, 0xe4, 0x3d, 0xa2, 0x38, 0x25, 0xc6, 0xb5, 0x8e, 0x58, 0xa8, 0xdd, - 0xa7, 0x07, 0x0d, 0x1a, 0xc5, 0x9e, 0x0d, 0xe7, 0x1c, 0x44, 0x4d, 0x4d, 0x13, 0x4b, 0xe1, 0x40, - 0xba, 0x70, 0xae, 0xe6, 0xba, 0x1e, 0x77, 0xc9, 0xdb, 0x08, 0xd8, 0xfc, 0x75, 0x91, 0x75, 0x39, - 0x9b, 0xf5, 0x35, 0xc1, 0xfa, 0x73, 0x4e, 0x4c, 0x65, 0x47, 0x9c, 0x2c, 0xfd, 0x99, 0x6c, 0xc6, - 0xe6, 0x1a, 0x4c, 0xea, 0x5d, 0xaa, 0x3b, 0xa3, 0x95, 0xa1, 0x68, 0x35, 0x6a, 0x76, 0xe3, 0x5e, - 0xed, 0x66, 0xc5, 0x20, 0x15, 0x28, 0x8b, 0x5f, 0xf3, 0xf6, 0xfc, 0x5b, 0xb7, 0x2b, 0x39, 0x0d, - 0xf2, 0xd6, 0xcd, 0xf9, 0x4a, 0xde, 0xfc, 0x13, 0x03, 0x8a, 0xb2, 0x7e, 0xe4, 0x36, 0xe4, 0x1b, - 0x8d, 0x7b, 0xa9, 0x2b, 0xc8, 0x64, 0xeb, 0xe5, 0x9b, 0x4c, 0x18, 0xee, 0xa9, 0x9b, 0x4c, 0xa3, - 0x71, 0x8f, 0xd1, 0x6d, 0xac, 0x34, 0x84, 0xd2, 0x92, 0x31, 0x5d, 0xa7, 0x07, 0xdc, 0xcb, 0xdc, - 0x86, 0xfc, 0x87, 0xdb, 0x1b, 0xc2, 0x1a, 0xca, 0x18, 0x5f, 0xa4, 0xfb, 0xf8, 0xb1, 0xba, 0xf5, - 0x31, 0x02, 0xd3, 0x82, 0x71, 0x65, 0x69, 0x71, 0x25, 0xa2, 0xed, 0xc7, 0x6e, 0x5a, 0x42, 0x89, - 0x60, 0x10, 0x4b, 0x94, 0x30, 0x9d, 0x67, 0xc5, 0x6f, 0x3a, 0x2d, 0xa1, 0x8d, 0xa0, 0xce, 0xd3, - 0x62, 0x00, 0x8b, 0xc3, 0xcd, 0x3f, 0x35, 0xa0, 0xb2, 0x1e, 0xf8, 0x8f, 0x3c, 0x26, 0x81, 0x37, - 0xfc, 0x7d, 0xda, 0xd9, 0xba, 0x49, 0xde, 0x94, 0x42, 0x80, 0xab, 0x70, 0x17, 0x18, 0x15, 0x0a, - 0x81, 0x1f, 0x1d, 0x56, 0xa1, 0x71, 0x10, 0x46, 0xb4, 0xcd, 0xca, 0xa5, 0x20, 0x50, 0xbc, 0xdd, - 0x72, 0xc3, 0x7b, 0xd0, 0x9c, 0xe0, 0xed, 0x56, 0x85, 0x11, 0xac, 0x8e, 0xe2, 0xc4, 0x30, 0x12, - 0x31, 0x80, 0xc5, 0xe1, 0x8a, 0xc0, 0xfe, 0x4e, 0xae, 0xaf, 0x0d, 0xf3, 0xcf, 0x95, 0x17, 0x8a, - 0xde, 0xb8, 0xa1, 0x36, 0xb1, 0xaf, 0xc2, 0xd9, 0x74, 0x97, 0xe0, 0xb9, 0x48, 0x0d, 0xa6, 0x74, - 0xb8, 0x3c, 0x22, 0xb9, 0x90, 0xf9, 0xad, 0xad, 0x79, 0x2b, 0x8d, 0x6f, 0xfe, 0xc0, 0x80, 0x12, - 0xfe, 0x6b, 0xf5, 0x5a, 0x94, 0x69, 0x36, 0xb5, 0xed, 0x86, 0xb8, 0x90, 0x52, 0x2f, 0x8d, 0x9c, - 0xc7, 0xa1, 0x2d, 0x6e, 0xaf, 0x34, 0x39, 0x12, 0x23, 0x0b, 0x52, 0x7e, 0xfd, 0x16, 0x8a, 0x19, - 0x1a, 0x93, 0xf2, 0x7b, 0xba, 0x30, 0x45, 0x2a, 0x90, 0xd9, 0xf8, 0xb1, 0x5f, 0x7e, 0x4b, 0x1e, - 0x0d, 0xe3, 0xf8, 0x21, 0x9d, 0xaf, 0x5d, 0x73, 0x48, 0x34, 0xf2, 0x26, 0x8c, 0xb2, 0x4f, 0x5b, - 0xf2, 0x12, 0x03, 0xad, 0x0a, 0xac, 0x63, 0xa0, 0xdd, 0x06, 0x72, 0x24, 0xf3, 0x5f, 0xe5, 0xd2, - 0x1d, 0x28, 0xb4, 0x80, 0x53, 0xae, 0x8d, 0x77, 0x60, 0xa4, 0xd6, 0x6a, 0xf9, 0x8f, 0x85, 0x94, - 0x90, 0xc7, 0x34, 0x71, 0xff, 0xf1, 0x1d, 0xd6, 0x61, 0x28, 0xda, 0xed, 0x2f, 0x03, 0x90, 0x05, - 0x28, 0xd5, 0xb6, 0x1b, 0xcb, 0xcb, 0x8b, 0x1b, 0x1b, 0x2b, 0xc2, 0xc9, 0xf8, 0x55, 0xd9, 0x3f, - 0x9e, 0xe7, 0xda, 0x51, 0xd4, 0x1a, 0xe0, 0x83, 0x98, 0xd0, 0x91, 0xf7, 0x00, 0x3e, 0xf4, 0xbd, - 0xce, 0x03, 0x1a, 0xed, 0xf9, 0xae, 0x68, 0x3c, 0x53, 0x29, 0xc6, 0x3f, 0xf6, 0xbd, 0x8e, 0xdd, - 0x46, 0x30, 0xab, 0x7b, 0x82, 0x64, 0x29, 0xff, 0xb3, 0x9e, 0xae, 0xfb, 0x11, 0xea, 0x30, 0x23, - 0x49, 0x4f, 0xef, 0xf8, 0x51, 0xfa, 0x8e, 0x45, 0xa2, 0x99, 0xbf, 0x9e, 0x83, 0x49, 0x6e, 0xa9, - 0xf2, 0x09, 0xf3, 0xcc, 0x2e, 0xc6, 0x77, 0xb4, 0xc5, 0x78, 0x51, 0x6e, 0x0c, 0x4a, 0xd3, 0x86, - 0x5a, 0x8a, 0x7b, 0x40, 0xfa, 0x69, 0x88, 0x25, 0xcf, 0x53, 0x86, 0x59, 0x85, 0x37, 0x93, 0xbb, - 0xe3, 0x10, 0x89, 0x6c, 0x14, 0x85, 0xa1, 0xa5, 0xf1, 0x30, 0x7f, 0x2d, 0x07, 0x13, 0x8a, 0x3e, - 0xf9, 0xcc, 0x76, 0xfc, 0x97, 0xb4, 0x8e, 0x97, 0x77, 0x10, 0x4a, 0xcb, 0x86, 0xea, 0xf7, 0x1e, - 0x4c, 0xf7, 0x91, 0xa4, 0xd5, 0x72, 0x63, 0x18, 0xb5, 0xfc, 0x8d, 0xfe, 0xcb, 0x6d, 0xee, 0x90, - 0x1c, 0x5f, 0x6e, 0xab, 0xb7, 0xe9, 0xdf, 0xca, 0xc1, 0x59, 0xf1, 0xab, 0xd6, 0x73, 0xbd, 0x68, - 0xc1, 0xef, 0x3c, 0xf4, 0x76, 0x9f, 0xd9, 0xb1, 0xa8, 0x69, 0x63, 0x51, 0xd5, 0xc7, 0x42, 0x69, - 0xe0, 0xe0, 0x21, 0x31, 0xff, 0x4d, 0x11, 0x66, 0x07, 0x11, 0x30, 0xb3, 0x5f, 0xb1, 0xaa, 0xd0, - 0xec, 0x4f, 0x59, 0xac, 0xdc, 0x9e, 0x4a, 0x9c, 0x39, 0x72, 0x43, 0x38, 0x73, 0xac, 0x40, 0x05, - 0x3f, 0xd5, 0xa0, 0x21, 0xeb, 0x84, 0x30, 0xf1, 0x86, 0xbc, 0x72, 0x74, 0x58, 0xbd, 0xec, 0xb0, - 0x32, 0x3b, 0x14, 0x85, 0x76, 0x2f, 0xf0, 0x14, 0x1e, 0x7d, 0x94, 0xe4, 0x0f, 0x0c, 0x98, 0x44, - 0xe0, 0xd2, 0x23, 0xda, 0x89, 0x90, 0x59, 0x41, 0x5c, 0xd2, 0xc4, 0x41, 0x27, 0x8d, 0x28, 0xf0, - 0x3a, 0xbb, 0x78, 0x90, 0x14, 0xd6, 0x77, 0x58, 0x2f, 0xfc, 0xe5, 0x61, 0xf5, 0xdd, 0x4f, 0x12, - 0xc8, 0x22, 0x58, 0x85, 0xcc, 0x90, 0xe7, 0x15, 0xa5, 0xf8, 0xd9, 0x54, 0x35, 0x53, 0x35, 0x22, - 0x3f, 0x05, 0x17, 0x96, 0x3a, 0xce, 0x4e, 0x8b, 0x2e, 0xf8, 0x9d, 0xc8, 0xeb, 0xf4, 0xfc, 0x5e, - 0x58, 0x77, 0x9a, 0xfb, 0xbd, 0x6e, 0x28, 0x0e, 0x3b, 0xb1, 0xe5, 0xcd, 0xb8, 0xd0, 0xde, 0xe1, - 0xa5, 0x0a, 0xcb, 0x41, 0x0c, 0xc8, 0x3d, 0x98, 0xe6, 0x45, 0xb5, 0x5e, 0xe4, 0x37, 0x9a, 0x4e, - 0xcb, 0xeb, 0xec, 0xe2, 0x19, 0x68, 0xb1, 0x7e, 0x89, 0xd9, 0x96, 0x4e, 0x2f, 0xf2, 0xed, 0x90, - 0xc3, 0x15, 0x7e, 0xfd, 0x44, 0x64, 0x19, 0xa6, 0x2c, 0xea, 0xb8, 0x0f, 0x9c, 0x27, 0x0b, 0x4e, - 0xd7, 0x69, 0x7a, 0xd1, 0x01, 0x5a, 0x66, 0xf9, 0x7a, 0xf5, 0xe8, 0xb0, 0xfa, 0x42, 0x40, 0x1d, - 0xd7, 0x6e, 0x3b, 0x4f, 0xec, 0xa6, 0x28, 0x54, 0x98, 0xa5, 0xe9, 0x62, 0x56, 0x5e, 0x27, 0x66, - 0x55, 0x4a, 0xb3, 0xf2, 0x3a, 0x83, 0x59, 0x25, 0x74, 0x92, 0xd5, 0x86, 0x13, 0xec, 0xd2, 0x88, - 0x1f, 0x12, 0xc2, 0x15, 0xe3, 0xaa, 0xa1, 0xb0, 0x8a, 0xb0, 0xcc, 0xc6, 0x03, 0xc3, 0x34, 0x2b, - 0x85, 0x8e, 0xcd, 0xbc, 0xed, 0xc0, 0x8b, 0xa8, 0xda, 0xc2, 0x71, 0xac, 0x16, 0xf6, 0x3f, 0x1e, - 0x93, 0x0e, 0x6a, 0x62, 0x1f, 0x65, 0xc2, 0x4d, 0x69, 0x64, 0xb9, 0x8f, 0x5b, 0x76, 0x2b, 0xfb, - 0x28, 0x63, 0x6e, 0x6a, 0x3b, 0x27, 0xb0, 0x9d, 0x0a, 0xb7, 0x01, 0x0d, 0xed, 0xa3, 0x24, 0xab, - 0xac, 0xd3, 0x22, 0xda, 0x61, 0x33, 0x5a, 0x1c, 0x92, 0x4e, 0x62, 0xd5, 0x5e, 0x11, 0x36, 0x75, - 0x25, 0x90, 0xc5, 0x76, 0xc6, 0x91, 0x69, 0x9a, 0xf8, 0xc3, 0x42, 0x71, 0xa4, 0x32, 0x6a, 0x55, - 0xf8, 0x94, 0x8f, 0xd8, 0xc4, 0x41, 0x59, 0x6c, 0xfe, 0x4e, 0x0e, 0x2e, 0x4a, 0x71, 0x4c, 0xa3, - 0xc7, 0x7e, 0xb0, 0xef, 0x75, 0x76, 0x9f, 0x71, 0xa9, 0x7a, 0x47, 0x93, 0xaa, 0xaf, 0xa4, 0x76, - 0xb8, 0x54, 0x2b, 0x8f, 0x11, 0xad, 0x7f, 0x31, 0x02, 0x2f, 0x1e, 0x4b, 0x45, 0x3e, 0x62, 0xbb, - 0xa0, 0x47, 0x3b, 0xd1, 0xb2, 0xdb, 0xa2, 0xcc, 0x0c, 0xf3, 0x7b, 0x91, 0x38, 0xcc, 0x7e, 0xf9, - 0xe8, 0xb0, 0x3a, 0xc3, 0x63, 0x31, 0x6c, 0xcf, 0x6d, 0x51, 0x3b, 0xe2, 0xc5, 0xda, 0x30, 0xf5, - 0x53, 0x33, 0x96, 0x71, 0x64, 0xd8, 0x72, 0x27, 0xa2, 0xc1, 0x23, 0x87, 0xbb, 0xa4, 0x0b, 0x96, - 0xfb, 0x94, 0x76, 0x6d, 0x87, 0x95, 0xda, 0x9e, 0x28, 0xd6, 0x59, 0xf6, 0x51, 0x93, 0x3b, 0x0a, - 0xcb, 0x05, 0x66, 0x1c, 0x3c, 0x70, 0x9e, 0x08, 0x8d, 0x17, 0xcf, 0x57, 0x15, 0x96, 0xdc, 0x1f, - 0xae, 0xed, 0x3c, 0xb1, 0xfa, 0x49, 0xc8, 0x37, 0xe0, 0x9c, 0x10, 0xdc, 0x4c, 0x88, 0x05, 0x7e, - 0x4b, 0xb6, 0xb8, 0x80, 0xbc, 0x5e, 0x3f, 0x3a, 0xac, 0x5e, 0x10, 0x62, 0xdf, 0x6e, 0x72, 0x8c, - 0xcc, 0x56, 0x67, 0x73, 0x21, 0x1b, 0x6c, 0x23, 0x4b, 0x75, 0xc7, 0x03, 0x1a, 0x86, 0xce, 0xae, - 0xd4, 0x8e, 0xf9, 0x8d, 0x92, 0xd2, 0x99, 0x76, 0x9b, 0x97, 0x5b, 0x03, 0x29, 0xc9, 0x3d, 0x98, - 0xdc, 0xa6, 0x3b, 0xea, 0xf8, 0x8c, 0xc6, 0x4b, 0xbc, 0xf2, 0x98, 0xee, 0x0c, 0x1e, 0x9c, 0x14, - 0x1d, 0xf1, 0x60, 0x7a, 0x3d, 0xf0, 0x9f, 0x1c, 0x30, 0x53, 0x8f, 0x76, 0x68, 0x80, 0x8e, 0x58, - 0x63, 0x78, 0x5c, 0x35, 0x9b, 0x68, 0x96, 0x7a, 0x79, 0xfd, 0x73, 0x47, 0x87, 0xd5, 0x17, 0xbb, - 0x0c, 0x6c, 0xb7, 0x04, 0xdc, 0x4e, 0x05, 0x66, 0xf5, 0x73, 0x25, 0x3f, 0x03, 0x53, 0x96, 0xdf, - 0x8b, 0xbc, 0xce, 0x6e, 0x23, 0x0a, 0x9c, 0x88, 0xee, 0x72, 0x41, 0x9e, 0x78, 0x7c, 0xa5, 0x4a, - 0xf9, 0xc1, 0x74, 0xc0, 0x81, 0x76, 0x28, 0xa0, 0x9a, 0x24, 0xd5, 0x09, 0xcc, 0xdf, 0xca, 0xc1, - 0xac, 0x18, 0x06, 0x8b, 0x36, 0xfd, 0xc0, 0x7d, 0xf6, 0x97, 0xfd, 0x92, 0xb6, 0xec, 0x5f, 0x8e, - 0x7d, 0x94, 0xb2, 0x1a, 0x79, 0xcc, 0xaa, 0xff, 0x63, 0x03, 0x2e, 0x1f, 0x47, 0xc4, 0x7a, 0x27, - 0xf6, 0xc1, 0x2b, 0xf5, 0xf9, 0xda, 0x75, 0x61, 0x06, 0xc7, 0x13, 0x0f, 0x8e, 0xc3, 0x7b, 0x7e, - 0x18, 0xe1, 0xe9, 0x5d, 0x4e, 0x73, 0x24, 0xa8, 0xfb, 0x7e, 0x0b, 0xe5, 0x7c, 0xfd, 0x0d, 0x26, - 0xce, 0xff, 0xf2, 0xb0, 0x0a, 0x0c, 0xb4, 0x86, 0x97, 0x91, 0x6c, 0xcf, 0xe7, 0x33, 0x06, 0xcf, - 0xa5, 0x43, 0x1b, 0xbd, 0x3f, 0xf6, 0xe9, 0x41, 0x68, 0x65, 0xb1, 0xc6, 0x13, 0x9a, 0x5a, 0x2f, - 0xda, 0x5b, 0x0f, 0xe8, 0x43, 0x1a, 0xd0, 0x4e, 0x93, 0x3e, 0x67, 0x27, 0x34, 0x7a, 0xe3, 0x86, - 0x32, 0x4f, 0xfe, 0x7a, 0x0c, 0xce, 0x66, 0x91, 0xb1, 0x7e, 0x51, 0x34, 0xe2, 0x74, 0x14, 0xef, - 0xdf, 0x31, 0xa0, 0xdc, 0xa0, 0x4d, 0xbf, 0xe3, 0xde, 0x71, 0x9a, 0x91, 0x2f, 0x5d, 0x32, 0x6c, - 0x2e, 0xd9, 0x18, 0xdc, 0x7e, 0x88, 0x05, 0xda, 0xc9, 0xc0, 0x97, 0x87, 0x53, 0x44, 0x9b, 0x3e, - 0x3a, 0xad, 0x46, 0x6c, 0x4e, 0x26, 0x9f, 0xc0, 0x5b, 0x0d, 0xed, 0xa3, 0xa4, 0x0e, 0x13, 0x0b, - 0x7e, 0xa7, 0x43, 0xd9, 0x0f, 0xc5, 0x05, 0xf3, 0xf2, 0xd1, 0x61, 0x75, 0xb6, 0x29, 0x0b, 0xd2, - 0x27, 0x04, 0x3a, 0x09, 0xb9, 0x05, 0xf9, 0xcd, 0xf9, 0x3b, 0x62, 0x0c, 0xa4, 0xb3, 0xda, 0xe6, - 0xfc, 0x1d, 0xb4, 0x75, 0x99, 0xfe, 0x30, 0xd1, 0x9b, 0x7f, 0xa8, 0x9e, 0x81, 0x6e, 0xce, 0xdf, - 0x21, 0x6b, 0x30, 0x6d, 0xd1, 0x9f, 0xed, 0x79, 0x01, 0x15, 0x0b, 0xe0, 0xc1, 0x9d, 0x1a, 0x8e, - 0x45, 0x91, 0xcb, 0xb1, 0x80, 0x17, 0x4a, 0xdd, 0xde, 0x6e, 0x3f, 0x54, 0x23, 0xd7, 0xfa, 0x69, - 0xc9, 0x2f, 0xc2, 0xb9, 0x45, 0x2f, 0x14, 0x75, 0xe6, 0x87, 0x8f, 0x2e, 0xde, 0x43, 0x8e, 0x0e, - 0x58, 0x0e, 0x3f, 0x91, 0xb9, 0x1c, 0x3e, 0xe7, 0xc6, 0x4c, 0x6c, 0x7e, 0xb2, 0xe9, 0xa6, 0x7d, - 0x57, 0xb3, 0xbf, 0x43, 0x3e, 0x86, 0x49, 0x3c, 0xed, 0xc1, 0xf3, 0x58, 0x74, 0x67, 0x1e, 0x1b, - 0xf0, 0xe5, 0x2f, 0x64, 0x7e, 0xf9, 0x12, 0x1e, 0x1e, 0xd9, 0x78, 0xaa, 0x8b, 0xae, 0xcf, 0x9a, - 0x8d, 0xa0, 0x71, 0x26, 0x1f, 0xc2, 0x94, 0xd8, 0x74, 0xd6, 0x1e, 0x6e, 0xec, 0xd1, 0x45, 0xe7, - 0x40, 0x38, 0x21, 0xa0, 0xfe, 0x27, 0x76, 0x2a, 0xdb, 0x7f, 0x68, 0x47, 0x7b, 0xd4, 0x76, 0x1d, - 0x4d, 0x3c, 0xa7, 0x08, 0xc9, 0xcf, 0xc3, 0xf8, 0x8a, 0x8f, 0x17, 0x4f, 0x28, 0x6a, 0x4a, 0xc8, - 0xe7, 0xab, 0x18, 0xb9, 0xca, 0xc1, 0xa9, 0x4d, 0xe4, 0x47, 0x87, 0xd5, 0x77, 0x4e, 0x3b, 0x0b, - 0x95, 0x0f, 0x58, 0xea, 0xd7, 0xc8, 0x02, 0x14, 0xb7, 0xe9, 0x0e, 0x6b, 0x6d, 0x3a, 0xea, 0x4a, - 0x82, 0xb9, 0xbc, 0x78, 0x2c, 0x7e, 0xa9, 0xb7, 0x3a, 0x12, 0x83, 0x04, 0x30, 0x8d, 0xfd, 0xb3, - 0xee, 0x84, 0xe1, 0x63, 0x3f, 0x70, 0x5b, 0x34, 0x94, 0xd7, 0x23, 0xfd, 0x9d, 0x3f, 0x9f, 0xd9, - 0xf9, 0x97, 0x79, 0xe7, 0x77, 0x15, 0x0e, 0xea, 0x74, 0xeb, 0x63, 0x6f, 0xfe, 0x6b, 0x03, 0x67, - 0x3d, 0xb9, 0x8e, 0xce, 0x67, 0xb1, 0x07, 0x3a, 0x5a, 0xb3, 0x4e, 0xb7, 0xab, 0xfb, 0x90, 0x73, - 0x14, 0x66, 0xfa, 0xde, 0x71, 0x9a, 0x34, 0x92, 0x67, 0xa4, 0x88, 0xfc, 0x10, 0x21, 0xaa, 0xe9, - 0xcb, 0x71, 0xc8, 0x57, 0xe0, 0xec, 0x22, 0x7d, 0xe4, 0x35, 0x69, 0x2d, 0x8a, 0x68, 0xc8, 0x7b, - 0x78, 0xa1, 0xc6, 0x2f, 0x13, 0x4b, 0xf5, 0x57, 0x8e, 0x0e, 0xab, 0x57, 0x5c, 0x2c, 0xb7, 0x9d, - 0x04, 0xc1, 0x6e, 0x3a, 0x2a, 0xaf, 0x4c, 0x0e, 0xe6, 0xff, 0x36, 0x92, 0x5e, 0x27, 0xaf, 0x43, - 0xc1, 0x5a, 0x8f, 0xeb, 0xcf, 0xef, 0x09, 0x53, 0xd5, 0x47, 0x04, 0xf2, 0x35, 0x38, 0xa7, 0xf0, - 0xc1, 0x1e, 0xa1, 0x2e, 0xab, 0x10, 0x6f, 0xcc, 0xab, 0x78, 0x31, 0xa4, 0xd4, 0xc4, 0xe1, 0x18, - 0xa9, 0x1a, 0x65, 0xf3, 0x60, 0x8d, 0x55, 0x0a, 0x16, 0x69, 0xc7, 0xe3, 0xbc, 0x95, 0xc6, 0xaa, - 0xbc, 0x5d, 0x44, 0x48, 0x37, 0x36, 0x8b, 0xc3, 0x87, 0x85, 0x62, 0xa1, 0x32, 0x62, 0xfe, 0x8d, - 0xa1, 0xa4, 0x1d, 0x78, 0x46, 0x77, 0xac, 0xdb, 0xda, 0x8e, 0x75, 0x56, 0x90, 0xc6, 0xad, 0x62, - 0x65, 0x99, 0x5a, 0xc6, 0x14, 0x4c, 0x68, 0x48, 0xe8, 0x66, 0xbb, 0x19, 0xd2, 0x80, 0x9f, 0x49, - 0x3e, 0x5f, 0x6e, 0xb6, 0x71, 0xbb, 0x86, 0xf2, 0x9e, 0xfc, 0x2b, 0x03, 0xa6, 0x52, 0x14, 0xac, - 0x37, 0x18, 0x48, 0xed, 0x8d, 0x5e, 0x48, 0x03, 0x0b, 0xa1, 0xdc, 0x29, 0x6f, 0x45, 0x77, 0xca, - 0x6b, 0x59, 0x0c, 0x46, 0xbe, 0x0c, 0x23, 0x9b, 0x68, 0x41, 0xe8, 0x7e, 0x1d, 0x31, 0x7f, 0x2c, - 0xe4, 0x2b, 0xac, 0xc7, 0xfe, 0x55, 0x05, 0x04, 0x96, 0x91, 0x06, 0x8c, 0x2d, 0x04, 0x14, 0x13, - 0x0c, 0x14, 0x86, 0xbf, 0x80, 0x6b, 0x72, 0x92, 0xf4, 0x05, 0x9c, 0xe0, 0x64, 0xfe, 0x66, 0x0e, - 0x48, 0xd2, 0x46, 0xda, 0x0c, 0x68, 0x14, 0x3e, 0xb3, 0x83, 0xfe, 0x81, 0x36, 0xe8, 0x2f, 0xf6, - 0x0d, 0x3a, 0x6f, 0xde, 0x50, 0x63, 0xff, 0xa7, 0x06, 0x9c, 0xcf, 0x26, 0x24, 0x2f, 0xc3, 0xe8, - 0xda, 0xc6, 0xba, 0x74, 0x0d, 0x12, 0x4d, 0xf1, 0xbb, 0xa8, 0x19, 0x5b, 0xa2, 0x88, 0xbc, 0x09, - 0xa3, 0x1f, 0x59, 0x0b, 0x6c, 0xcb, 0x54, 0x22, 0x5d, 0x7e, 0x36, 0xb0, 0x9b, 0xba, 0xc9, 0x25, - 0x90, 0xd4, 0xb1, 0xcd, 0x3f, 0xb5, 0xb1, 0xfd, 0x56, 0x0e, 0xa6, 0x6a, 0xcd, 0x26, 0x0d, 0x43, - 0xa6, 0x10, 0xd1, 0x30, 0x7a, 0x66, 0x07, 0x36, 0xdb, 0xe9, 0x47, 0x6b, 0xdb, 0x50, 0xa3, 0xfa, - 0x67, 0x06, 0x9c, 0x93, 0x54, 0x8f, 0x3c, 0xfa, 0x78, 0x63, 0x2f, 0xa0, 0xe1, 0x9e, 0xdf, 0x72, - 0x87, 0x8d, 0xd9, 0xc2, 0x5d, 0xda, 0x6b, 0x45, 0x34, 0x50, 0x0f, 0xa8, 0x1f, 0x22, 0x44, 0xdb, - 0xa5, 0x11, 0x42, 0xe6, 0x60, 0xac, 0xd6, 0xed, 0x06, 0xfe, 0x23, 0xbe, 0xec, 0x27, 0xc4, 0x7d, - 0x24, 0x07, 0x69, 0xf7, 0x97, 0x1c, 0xc4, 0xaa, 0xb1, 0x48, 0x3b, 0xdc, 0xa3, 0x79, 0x82, 0x57, - 0xc3, 0xa5, 0x1d, 0x55, 0x43, 0xc3, 0x72, 0xf3, 0x9b, 0x05, 0x28, 0xab, 0x0d, 0x21, 0x26, 0x8c, - 0x72, 0xf7, 0x14, 0xd5, 0x4d, 0xc0, 0x41, 0x88, 0x25, 0x4a, 0x12, 0xaf, 0x9f, 0xdc, 0x89, 0x5e, - 0x3f, 0xdb, 0x30, 0xb1, 0x1e, 0xf8, 0x5d, 0x3f, 0xa4, 0x2e, 0xcf, 0x11, 0xc3, 0xa5, 0xd6, 0x4c, - 0xec, 0x0a, 0xcb, 0xfb, 0x9c, 0x15, 0x71, 0x73, 0xa0, 0x2b, 0xb0, 0xed, 0x74, 0x06, 0x19, 0x9d, - 0x0f, 0x3f, 0xe0, 0x77, 0x42, 0x11, 0x2e, 0x10, 0x1f, 0xf0, 0x33, 0x88, 0x7e, 0xc0, 0xcf, 0x20, - 0xea, 0xb2, 0x18, 0x79, 0x5a, 0xcb, 0x82, 0xfc, 0xa6, 0x01, 0xe3, 0xb5, 0x4e, 0x47, 0x78, 0xfd, - 0xc8, 0x40, 0xeb, 0x73, 0xc9, 0x21, 0x3f, 0x77, 0x0b, 0xe5, 0x67, 0xfc, 0x5f, 0x17, 0x67, 0xfc, - 0xef, 0x7c, 0xa2, 0x33, 0xfe, 0x8d, 0xc0, 0xf1, 0xa2, 0x10, 0x2f, 0x73, 0x93, 0x0f, 0xaa, 0xae, - 0xbf, 0x4a, 0x3d, 0xc8, 0x3b, 0x50, 0x89, 0xe7, 0xe3, 0x72, 0xc7, 0xa5, 0x4f, 0x28, 0x77, 0x92, - 0x9a, 0xe0, 0xd1, 0x80, 0xda, 0xe5, 0x45, 0x1a, 0xd1, 0xfc, 0x96, 0x01, 0xe7, 0xd5, 0x09, 0xd1, - 0xe8, 0xed, 0xb4, 0x3d, 0x34, 0x7f, 0xc8, 0x0d, 0x28, 0x89, 0xf1, 0x8a, 0x15, 0xb9, 0xfe, 0xc4, - 0x42, 0x09, 0x0a, 0x59, 0x62, 0x43, 0xc4, 0x78, 0x88, 0xb3, 0x82, 0x99, 0xd4, 0x72, 0x63, 0x45, - 0xf5, 0x59, 0xd1, 0xd9, 0x95, 0x00, 0x7f, 0xeb, 0x63, 0xc7, 0x20, 0xe6, 0xfb, 0x30, 0xad, 0xd7, - 0xb2, 0x41, 0x31, 0x04, 0x4d, 0x36, 0xcd, 0xc8, 0x6e, 0x9a, 0x2c, 0x37, 0xb7, 0x81, 0xf4, 0xd1, - 0x87, 0x78, 0x51, 0x45, 0x23, 0x79, 0x91, 0x2a, 0x8f, 0xbb, 0xfa, 0x10, 0xe3, 0x14, 0x5b, 0xe3, - 0x6a, 0x77, 0x23, 0xa9, 0xf9, 0xb7, 0x25, 0x98, 0xc9, 0x10, 0x1d, 0x27, 0x6c, 0xed, 0x55, 0x7d, - 0xf1, 0x94, 0x62, 0x8f, 0x00, 0xb9, 0x64, 0xde, 0x97, 0xe9, 0x94, 0x8e, 0x59, 0x2a, 0xc7, 0xe5, - 0x58, 0xfa, 0x2c, 0xb6, 0x77, 0xd5, 0x69, 0x67, 0xe4, 0xa9, 0x39, 0xed, 0xd4, 0x61, 0x42, 0xb4, - 0x4a, 0x2c, 0xe5, 0xd1, 0xe4, 0x58, 0x20, 0xe0, 0x05, 0x76, 0xdf, 0x92, 0xd6, 0x49, 0x38, 0x8f, - 0xd0, 0x6f, 0x3d, 0xa2, 0x82, 0xc7, 0x98, 0xca, 0x03, 0x0b, 0x32, 0x79, 0x28, 0x24, 0xe4, 0x9f, - 0x19, 0x40, 0x04, 0x44, 0x5d, 0xcf, 0xc5, 0xe3, 0xd6, 0xb3, 0xfb, 0x74, 0xd6, 0xf3, 0x8b, 0xb2, - 0x8e, 0xd9, 0xeb, 0x3a, 0xa3, 0x5a, 0xe4, 0x9f, 0x18, 0x30, 0xcd, 0x3d, 0x47, 0xd4, 0xca, 0x96, - 0x8e, 0xab, 0x6c, 0xf3, 0xe9, 0x54, 0xf6, 0x72, 0x88, 0x9f, 0x1d, 0x50, 0xd7, 0xfe, 0x4a, 0x91, - 0x9f, 0x02, 0x88, 0x57, 0x94, 0xf4, 0x50, 0xbc, 0x9c, 0x21, 0x05, 0x62, 0xa4, 0x24, 0xc8, 0x32, - 0x8a, 0xe9, 0x54, 0x9f, 0x9e, 0x84, 0x1b, 0xf9, 0x45, 0x38, 0xcb, 0xd6, 0x4b, 0x0c, 0x11, 0x7e, - 0x6e, 0xb3, 0xe3, 0xf8, 0x95, 0x2f, 0x0e, 0xde, 0xda, 0x6f, 0x64, 0x91, 0xf1, 0x38, 0x91, 0x24, - 0xe4, 0x3e, 0x6a, 0xab, 0x26, 0x5f, 0x16, 0x05, 0x3a, 0xb4, 0x62, 0xed, 0xc3, 0xd9, 0x32, 0x7e, - 0x33, 0x53, 0xbe, 0x5d, 0x94, 0x6b, 0x81, 0xcb, 0xb7, 0x50, 0x0f, 0xf4, 0x40, 0x10, 0xf9, 0x08, - 0x48, 0xa3, 0xb7, 0xbb, 0x4b, 0xc3, 0x88, 0xba, 0x1c, 0x46, 0x83, 0x70, 0x76, 0x02, 0xe5, 0x03, - 0x1e, 0x53, 0x85, 0xb2, 0xd4, 0x0e, 0x64, 0xb1, 0x3a, 0x49, 0xfa, 0x89, 0x2f, 0xed, 0xc0, 0xc5, - 0x81, 0xcd, 0xcc, 0x08, 0xe2, 0x98, 0xd3, 0x83, 0x38, 0x2e, 0x0e, 0x12, 0x87, 0xa1, 0x1a, 0xc8, - 0xf1, 0x7b, 0x46, 0x4a, 0xfe, 0x09, 0x65, 0x85, 0x67, 0x9e, 0x1b, 0xb4, 0x41, 0xe4, 0x30, 0x18, - 0x9f, 0x4b, 0xc8, 0x5c, 0xa2, 0x24, 0x31, 0x09, 0xa9, 0x4a, 0x58, 0x94, 0x95, 0x9f, 0x52, 0x14, - 0x9a, 0xff, 0xc2, 0x00, 0xc2, 0x6b, 0xb8, 0xe0, 0x74, 0x9d, 0x1d, 0xaf, 0xe5, 0x45, 0x1e, 0x0d, - 0xc9, 0x7d, 0xa8, 0x08, 0x16, 0xce, 0x4e, 0x8b, 0xaa, 0xfe, 0x59, 0xe2, 0x02, 0x37, 0x2e, 0xb3, - 0xd3, 0x6a, 0x4d, 0x1f, 0xe1, 0x80, 0xc1, 0xcb, 0x7d, 0x8a, 0xc1, 0x33, 0x7f, 0x68, 0xc0, 0xc5, - 0xfe, 0x6a, 0x8b, 0x2f, 0xc7, 0x9d, 0x67, 0x9c, 0xd0, 0x79, 0x59, 0xad, 0xcc, 0xe1, 0xd1, 0xe7, - 0x53, 0x6b, 0x65, 0x3e, 0x39, 0x49, 0x3d, 0x7d, 0x2b, 0x7f, 0x35, 0x07, 0xe5, 0xf5, 0x56, 0x6f, - 0xd7, 0xeb, 0x2c, 0x3a, 0x91, 0xf3, 0xcc, 0x9a, 0x14, 0x6f, 0x6b, 0x26, 0x45, 0xec, 0x91, 0x15, - 0x37, 0x6c, 0xb8, 0x2c, 0x60, 0x06, 0x4c, 0x25, 0x24, 0x7c, 0x95, 0xde, 0x83, 0x02, 0xfb, 0x21, - 0x34, 0x94, 0x2b, 0x7d, 0x8c, 0x11, 0xeb, 0x46, 0xfc, 0x9f, 0x50, 0xf2, 0xf5, 0xdc, 0x6b, 0xc8, - 0xe1, 0xd2, 0x4f, 0xf0, 0xd4, 0x49, 0xa7, 0x4f, 0xf3, 0xf8, 0xcf, 0x0d, 0xa8, 0xa4, 0x5b, 0x42, - 0xee, 0xc3, 0x18, 0xe3, 0xe4, 0xc5, 0x69, 0x98, 0x5e, 0x19, 0xd0, 0xe6, 0x1b, 0x02, 0x8d, 0x57, - 0x0f, 0x3b, 0x9f, 0x72, 0x88, 0x25, 0x39, 0x5c, 0xb2, 0xa0, 0xac, 0x62, 0x65, 0xd4, 0xee, 0x0d, - 0x5d, 0x34, 0x9d, 0xcf, 0xee, 0x07, 0xb5, 0xd6, 0xbf, 0xab, 0xd5, 0x5a, 0x08, 0xa5, 0x61, 0xf3, - 0xe9, 0x61, 0x48, 0x1a, 0xcf, 0x1a, 0xa2, 0xce, 0x33, 0x99, 0x60, 0x44, 0x0f, 0x49, 0xe3, 0x30, - 0x66, 0x8b, 0xf0, 0xef, 0x89, 0x79, 0x86, 0xb6, 0x48, 0x17, 0x21, 0xaa, 0x3e, 0xcb, 0x71, 0xcc, - 0x7f, 0x90, 0x87, 0xf3, 0x49, 0xf5, 0x78, 0x76, 0xc1, 0x75, 0x27, 0x70, 0xda, 0xe1, 0x09, 0x2b, - 0xe0, 0x6a, 0x5f, 0xd5, 0x30, 0xe4, 0x5a, 0x56, 0x4d, 0xa9, 0x90, 0x99, 0xaa, 0x10, 0x1a, 0x71, - 0xbc, 0x42, 0xb2, 0x1a, 0xe4, 0x3e, 0xe4, 0x1b, 0x34, 0x12, 0x81, 0x99, 0xaf, 0xf5, 0xf5, 0xaa, - 0x5a, 0xaf, 0x1b, 0x0d, 0x1a, 0xf1, 0x41, 0xe4, 0xbe, 0xed, 0x54, 0xf3, 0x35, 0x67, 0xea, 0xf8, - 0x36, 0x8c, 0x2e, 0x3d, 0xe9, 0xd2, 0x66, 0x24, 0xe2, 0x31, 0xaf, 0x1d, 0xcf, 0x8f, 0xe3, 0x2a, - 0x51, 0x9f, 0x14, 0x01, 0x6a, 0x67, 0x71, 0x94, 0x4b, 0xb7, 0xa1, 0x28, 0x3f, 0x7e, 0xaa, 0xe8, - 0xc5, 0xb7, 0x61, 0x5c, 0xf9, 0xc8, 0xa9, 0x26, 0xfd, 0xdf, 0x1a, 0x30, 0xca, 0x84, 0xde, 0xd6, - 0x5b, 0xcf, 0xa8, 0x44, 0xba, 0xa5, 0x49, 0xa4, 0x69, 0x25, 0xcc, 0x06, 0xd7, 0xe5, 0x5b, 0x27, - 0xc8, 0xa2, 0x43, 0x03, 0x20, 0x41, 0x26, 0x77, 0x61, 0x8c, 0xdf, 0x5f, 0xc8, 0xd4, 0x9d, 0x6a, - 0xdc, 0x8e, 0x28, 0x49, 0xb4, 0x1c, 0xbf, 0x9b, 0x56, 0x0b, 0x25, 0x35, 0x59, 0x4c, 0x7c, 0x9b, - 0xd5, 0x40, 0x51, 0xc6, 0x66, 0xc1, 0xef, 0xf0, 0x38, 0x8e, 0x50, 0x49, 0x71, 0x95, 0xed, 0xe4, - 0x5c, 0x13, 0x07, 0x1b, 0xf9, 0xe3, 0x98, 0x9c, 0x17, 0x4c, 0xb2, 0xcf, 0x3c, 0xbe, 0x3d, 0xce, - 0x23, 0x23, 0x64, 0xc5, 0xde, 0x83, 0xf2, 0x1d, 0x3f, 0x78, 0xec, 0x04, 0x6e, 0x6d, 0x97, 0x0a, - 0xaf, 0xf4, 0x22, 0xba, 0x96, 0x4f, 0x3c, 0xe4, 0x70, 0xdb, 0x61, 0x05, 0x3f, 0x3a, 0xac, 0x16, - 0xea, 0xbe, 0xdf, 0xb2, 0x34, 0x74, 0xb2, 0x06, 0x13, 0x0f, 0x9c, 0x27, 0xe2, 0x8e, 0x70, 0x63, - 0x63, 0x45, 0xf8, 0xb6, 0x5c, 0x3b, 0x3a, 0xac, 0x5e, 0x6c, 0x3b, 0x4f, 0xe2, 0xbb, 0xc5, 0xc1, - 0xee, 0xd7, 0x3a, 0x3d, 0xf1, 0x60, 0x72, 0xdd, 0x0f, 0x22, 0xf1, 0x11, 0xa6, 0xd3, 0xe6, 0x07, - 0xdc, 0x32, 0xcd, 0x65, 0xde, 0x32, 0x5d, 0x64, 0x8a, 0xbc, 0xfd, 0x30, 0x26, 0xd7, 0xc2, 0xf9, - 0x34, 0xc6, 0xe4, 0x3d, 0x98, 0x5e, 0xa0, 0x41, 0xe4, 0x3d, 0xf4, 0x9a, 0x4e, 0x44, 0xef, 0xf8, - 0x41, 0xdb, 0x89, 0xc4, 0x81, 0x0a, 0x1a, 0xd4, 0x4d, 0xca, 0x39, 0xb5, 0x9d, 0xc8, 0xea, 0xc7, - 0x24, 0x5f, 0xcb, 0xf2, 0x16, 0x1a, 0xc1, 0xe6, 0xbf, 0xc9, 0x94, 0x82, 0x0c, 0x6f, 0xa1, 0x01, - 0x5d, 0x90, 0xe1, 0x37, 0xb4, 0x7b, 0xdc, 0x55, 0x6b, 0xb1, 0x7e, 0x53, 0x5c, 0xfb, 0x9e, 0x7c, - 0x95, 0x1a, 0x8f, 0xdb, 0x80, 0x2b, 0xd5, 0x79, 0xc8, 0xd7, 0xd7, 0xef, 0xe0, 0x11, 0x89, 0xb8, - 0xda, 0xa4, 0x9d, 0x3d, 0xa7, 0xd3, 0x44, 0x5d, 0x46, 0xf8, 0x4b, 0xa8, 0x02, 0xaf, 0xbe, 0x7e, - 0x87, 0x38, 0x30, 0xb3, 0x4e, 0x83, 0xb6, 0x17, 0x7d, 0xe5, 0xe6, 0x4d, 0x65, 0xa0, 0x8a, 0x58, - 0xb5, 0x39, 0x51, 0xb5, 0x6a, 0x17, 0x51, 0xec, 0x27, 0x37, 0x6f, 0x66, 0x0e, 0x47, 0x5c, 0xb1, - 0x2c, 0x5e, 0x64, 0x09, 0x26, 0x1f, 0x38, 0x4f, 0xc4, 0x25, 0x78, 0x6c, 0xe3, 0xe5, 0xd1, 0x1b, - 0x1f, 0x27, 0x56, 0x33, 0x29, 0x52, 0x87, 0x58, 0x27, 0x22, 0xef, 0xc2, 0x78, 0x32, 0xbd, 0x42, - 0xbc, 0xfe, 0xcc, 0x73, 0x37, 0x4c, 0x65, 0x72, 0x6a, 0x67, 0x49, 0x0a, 0x3a, 0xd9, 0x8c, 0x4d, - 0x74, 0xae, 0x90, 0xe2, 0x85, 0x67, 0xa9, 0x3e, 0xa7, 0x9a, 0xe8, 0x0e, 0x96, 0x68, 0xcd, 0x9a, - 0x8a, 0x55, 0x74, 0xee, 0x9d, 0x63, 0xe9, 0x5c, 0x14, 0xcb, 0x7f, 0x3d, 0xf0, 0xdb, 0xdd, 0x08, - 0xbd, 0x14, 0x53, 0x96, 0x7f, 0x17, 0x4b, 0x32, 0x2c, 0x7f, 0x4e, 0x92, 0x7d, 0xb7, 0x3f, 0xf1, - 0x29, 0xee, 0xf6, 0x29, 0x14, 0x56, 0xfc, 0xe6, 0x3e, 0xba, 0x25, 0x96, 0xea, 0x1f, 0x31, 0xf9, - 0xd1, 0xf2, 0x9b, 0xfb, 0x4f, 0xef, 0x4e, 0x1a, 0xd9, 0x93, 0x55, 0xd6, 0x76, 0x36, 0xad, 0xc4, - 0xa7, 0x67, 0xa7, 0xb4, 0x9b, 0x36, 0xad, 0x8c, 0x2b, 0x2a, 0x7c, 0x16, 0xca, 0x86, 0x58, 0x3a, - 0x39, 0xa1, 0x50, 0x59, 0xa4, 0xe1, 0x7e, 0xe4, 0x77, 0x17, 0x5a, 0x5e, 0x77, 0xc7, 0x77, 0x02, - 0x77, 0xb6, 0x32, 0x40, 0x60, 0xbc, 0x9e, 0x29, 0x30, 0xa6, 0x5d, 0x4e, 0x6f, 0x37, 0x25, 0x03, - 0xab, 0x8f, 0x25, 0xf9, 0x1a, 0x4c, 0xb2, 0xd5, 0xb2, 0xf4, 0x24, 0xa2, 0x1d, 0x3e, 0x95, 0xa6, - 0x71, 0xab, 0x3f, 0xab, 0x04, 0x36, 0xc6, 0x85, 0x7c, 0x92, 0xa2, 0xf4, 0xa0, 0x31, 0x81, 0x3a, - 0x49, 0x75, 0x56, 0xe6, 0x4f, 0xa5, 0xfa, 0x84, 0x2c, 0xc3, 0x98, 0xa8, 0x81, 0xd8, 0x75, 0xfa, - 0xdb, 0xf2, 0x62, 0x66, 0x5b, 0xc6, 0x44, 0x5b, 0x2c, 0x49, 0x6f, 0xfe, 0x5b, 0x03, 0x26, 0xb4, - 0xcf, 0x91, 0xdb, 0x8a, 0xcb, 0x4c, 0xe2, 0xea, 0xa6, 0xe1, 0x64, 0xa6, 0xc4, 0xbf, 0x2d, 0xfc, - 0xa4, 0x72, 0x83, 0xe9, 0x32, 0xb3, 0x95, 0xc9, 0x44, 0x03, 0xf9, 0xe3, 0x13, 0x0d, 0x14, 0x06, - 0x24, 0x1a, 0xf8, 0xf6, 0x04, 0x4c, 0xea, 0x1b, 0x1c, 0xd3, 0x38, 0x57, 0xfc, 0x5d, 0xaf, 0x23, - 0xed, 0x56, 0x9e, 0x3a, 0x03, 0x21, 0x5a, 0x7e, 0x79, 0x84, 0x90, 0x57, 0x01, 0xe2, 0xab, 0x59, - 0x69, 0x9a, 0x8a, 0x6c, 0xf8, 0x4a, 0x01, 0xf9, 0x69, 0x80, 0x55, 0xdf, 0xa5, 0x71, 0xf6, 0x95, - 0x63, 0x0e, 0x94, 0x5e, 0x17, 0x07, 0x4a, 0x22, 0x83, 0xfd, 0xd1, 0x61, 0xf5, 0x5c, 0xc7, 0x77, - 0x69, 0x7f, 0xda, 0x15, 0x85, 0x23, 0xf9, 0x12, 0x8c, 0x58, 0xbd, 0x16, 0x95, 0xc9, 0x40, 0xc6, - 0xe5, 0x84, 0xef, 0xb5, 0x94, 0xcc, 0x96, 0x41, 0x2f, 0x7d, 0x8f, 0xc0, 0x00, 0xe4, 0x03, 0x80, - 0xfb, 0xbd, 0x1d, 0x7a, 0x37, 0xf0, 0x7b, 0x5d, 0x19, 0x6d, 0x8c, 0x66, 0xec, 0x7e, 0x9c, 0x3a, - 0xca, 0xde, 0xc5, 0x42, 0xf5, 0xe3, 0x09, 0x09, 0x59, 0x83, 0x31, 0x21, 0x3e, 0xc4, 0x39, 0xfd, - 0x4b, 0x59, 0x27, 0x44, 0x8a, 0x0e, 0x21, 0xb2, 0x73, 0x20, 0x58, 0x3f, 0xb4, 0xe1, 0x66, 0xf8, - 0xbb, 0x50, 0x62, 0xec, 0x99, 0xa9, 0x1d, 0x8a, 0xbd, 0x03, 0x7d, 0x16, 0x95, 0x0a, 0x31, 0xb3, - 0x5c, 0xcb, 0x11, 0x16, 0x13, 0x90, 0xaf, 0x61, 0x3e, 0x1d, 0xd1, 0xd5, 0xc7, 0x1e, 0x34, 0xbe, - 0xd6, 0xd7, 0xd5, 0x67, 0x9d, 0x6e, 0x37, 0x23, 0x01, 0x59, 0xcc, 0x8f, 0xec, 0xc6, 0x71, 0x3d, - 0x71, 0x7a, 0xe3, 0x63, 0x3e, 0x70, 0xbd, 0xef, 0x03, 0xb3, 0x32, 0x54, 0xa5, 0x3f, 0x8b, 0x8e, - 0xc6, 0x97, 0x74, 0xa1, 0x92, 0xa4, 0xee, 0x12, 0xdf, 0x82, 0xe3, 0xbe, 0xf5, 0x66, 0xdf, 0xb7, - 0xd4, 0x01, 0xec, 0xfb, 0x5c, 0x1f, 0x77, 0xe2, 0x26, 0xa9, 0x68, 0xc5, 0xf7, 0xc6, 0x8f, 0xfb, - 0xde, 0xab, 0x7d, 0xdf, 0x9b, 0x71, 0x77, 0xfa, 0xbf, 0x93, 0xe2, 0x49, 0xde, 0x85, 0x09, 0x09, - 0xc1, 0xf5, 0x81, 0x07, 0x7c, 0x42, 0xbf, 0x77, 0x77, 0xd0, 0x51, 0x4d, 0x4f, 0x21, 0xa3, 0x22, - 0xab, 0xd4, 0x7c, 0x76, 0x4c, 0x68, 0xd4, 0xe9, 0x59, 0xa1, 0x23, 0x93, 0xaf, 0xc2, 0xf8, 0x72, - 0x9b, 0x35, 0xc4, 0xef, 0x38, 0x11, 0xc5, 0xcd, 0x28, 0x39, 0x34, 0x55, 0x4a, 0x94, 0xa9, 0xca, - 0xf3, 0x4a, 0x26, 0x45, 0xea, 0x66, 0xae, 0x50, 0xb0, 0xce, 0xe3, 0xc7, 0x2f, 0x62, 0x0e, 0x87, - 0x62, 0xeb, 0x79, 0x31, 0xe3, 0xe0, 0x52, 0x61, 0x8f, 0xb2, 0x9c, 0x9f, 0xea, 0xd8, 0x62, 0x41, - 0x68, 0x9d, 0xa7, 0xf3, 0x24, 0xef, 0xc1, 0xb8, 0x88, 0xa2, 0xac, 0x59, 0xab, 0xe1, 0x6c, 0x05, - 0x1b, 0x8f, 0xf9, 0xdf, 0x64, 0xc0, 0xa5, 0xed, 0x04, 0xa9, 0xdb, 0xab, 0x04, 0x9f, 0x7c, 0x05, - 0xce, 0x6e, 0x7b, 0x1d, 0xd7, 0x7f, 0x1c, 0x0a, 0x01, 0x2e, 0x04, 0xdd, 0x74, 0xe2, 0xa3, 0xf3, - 0x98, 0x97, 0xdb, 0x72, 0xdb, 0xea, 0x13, 0x7c, 0x99, 0x1c, 0xc8, 0x2f, 0xf4, 0x71, 0xe6, 0x33, - 0x88, 0x1c, 0x37, 0x83, 0xe6, 0xfb, 0x66, 0x50, 0xff, 0xe7, 0xd3, 0xd3, 0x29, 0xf3, 0x33, 0xc4, - 0x07, 0xa2, 0xeb, 0x1c, 0x1f, 0xfa, 0x5e, 0x67, 0x76, 0x46, 0x7b, 0x3c, 0x24, 0x76, 0xd3, 0x45, - 0xbc, 0x75, 0xbf, 0xe5, 0x35, 0x0f, 0xea, 0xe6, 0xd1, 0x61, 0xf5, 0xa5, 0xb4, 0x36, 0xf3, 0xb1, - 0xaf, 0x1d, 0x2e, 0x64, 0xb0, 0x26, 0x5f, 0x85, 0x32, 0xfb, 0x1b, 0xab, 0x7e, 0x67, 0xb5, 0xab, - 0x2e, 0x05, 0x53, 0x7c, 0x07, 0xc7, 0x08, 0xc3, 0x3c, 0x33, 0xb4, 0x42, 0x8d, 0x95, 0xf9, 0x43, - 0x03, 0xce, 0x66, 0xd5, 0xf5, 0x84, 0x9c, 0x3a, 0x66, 0xea, 0xd2, 0x1b, 0xcf, 0x25, 0xf8, 0xa5, - 0x77, 0x7c, 0xd5, 0x5d, 0x85, 0x11, 0x66, 0x2b, 0x4b, 0xa7, 0x2c, 0xdc, 0x0e, 0x99, 0x3d, 0x1d, - 0x5a, 0x1c, 0xce, 0x10, 0xd0, 0x81, 0x1f, 0xf7, 0xcb, 0x11, 0x8e, 0x80, 0x5e, 0xfe, 0x16, 0x87, - 0x33, 0x04, 0xb6, 0xed, 0xca, 0x6d, 0x02, 0x11, 0xd8, 0x6e, 0x1c, 0x5a, 0x1c, 0x4e, 0x5e, 0x83, - 0xb1, 0xb5, 0xce, 0x0a, 0x75, 0x1e, 0x51, 0x71, 0xe3, 0x84, 0xe7, 0x28, 0x7e, 0xc7, 0x6e, 0x31, - 0x98, 0x25, 0x0b, 0xcd, 0xef, 0x1a, 0x30, 0xdd, 0xd7, 0x4d, 0x27, 0xa7, 0x0d, 0x3a, 0xfe, 0x7a, - 0x6f, 0x98, 0xf6, 0xf1, 0xea, 0x17, 0xb2, 0xab, 0x6f, 0xfe, 0x71, 0x01, 0x2e, 0x0c, 0xd8, 0xb5, - 0x92, 0xab, 0x79, 0xe3, 0xc4, 0xab, 0xf9, 0xaf, 0xb3, 0x5d, 0xc2, 0xf1, 0xda, 0xe1, 0x86, 0x9f, - 0xd4, 0x38, 0xb9, 0xc5, 0xc0, 0x32, 0x99, 0x97, 0x43, 0xe6, 0x90, 0xb8, 0xd8, 0x44, 0x0a, 0x3b, - 0xf2, 0xfb, 0xce, 0x8c, 0x75, 0x66, 0x7d, 0x97, 0xe3, 0xf9, 0x1f, 0x93, 0xcb, 0x71, 0xfd, 0x4a, - 0xaa, 0xf0, 0x54, 0xaf, 0xa4, 0xb2, 0x0f, 0xc9, 0x47, 0x3e, 0xc5, 0x55, 0x00, 0x59, 0x80, 0x89, - 0x06, 0x75, 0x82, 0xe6, 0x5e, 0x2d, 0xe4, 0x83, 0x34, 0x8a, 0xdc, 0x50, 0x24, 0x87, 0x58, 0x60, - 0x3b, 0x61, 0xff, 0x58, 0x68, 0x34, 0xe6, 0xbf, 0x4f, 0xdd, 0xe9, 0xff, 0x38, 0xce, 0x97, 0x6b, - 0x30, 0xb2, 0xbd, 0x47, 0x03, 0xa9, 0x24, 0x63, 0x45, 0x1e, 0x33, 0x80, 0x5a, 0x11, 0xc4, 0x30, - 0x7f, 0x1e, 0xca, 0xea, 0xc7, 0x50, 0x20, 0xb0, 0xdf, 0x62, 0x45, 0x72, 0x81, 0xc0, 0x00, 0x16, - 0x87, 0x9f, 0x98, 0xca, 0x2b, 0xe9, 0x85, 0xfc, 0x49, 0xbd, 0x60, 0xfe, 0x3b, 0x03, 0x0a, 0x98, - 0xc9, 0xe0, 0x2d, 0x28, 0xc9, 0xf3, 0x56, 0x35, 0xba, 0x7f, 0x46, 0x1e, 0xc7, 0x86, 0xba, 0x53, - 0x84, 0x00, 0xb2, 0x4f, 0x6d, 0xd1, 0x60, 0x47, 0xf3, 0x9d, 0x79, 0xc4, 0x00, 0xea, 0xa7, 0x10, - 0xe3, 0x14, 0x5d, 0x82, 0xfe, 0x41, 0xe2, 0x90, 0x80, 0x4b, 0x0d, 0xee, 0x1f, 0xd4, 0x77, 0x38, - 0x20, 0xb1, 0xcc, 0xdf, 0x36, 0xe0, 0x5c, 0xa6, 0x32, 0xc1, 0xbe, 0xca, 0xb5, 0x16, 0x65, 0x46, - 0xa4, 0x55, 0x16, 0x8e, 0x71, 0x1a, 0x3f, 0xa0, 0x53, 0x0c, 0xef, 0xe7, 0xa0, 0x14, 0x1b, 0x79, - 0xe4, 0xac, 0x1c, 0x3a, 0x3c, 0x94, 0x93, 0x16, 0xd1, 0xdf, 0x1a, 0x30, 0xca, 0xaa, 0xf0, 0xcc, - 0x86, 0x85, 0x64, 0x1f, 0xd1, 0xb2, 0x26, 0x0d, 0x15, 0x0c, 0xf2, 0x07, 0xa3, 0x00, 0x09, 0x32, - 0xd9, 0x81, 0xc9, 0xb5, 0xe5, 0xc5, 0x85, 0x65, 0x97, 0x76, 0x22, 0xbc, 0x2a, 0x4c, 0xa5, 0x07, - 0x60, 0xd6, 0x69, 0xd0, 0x71, 0x5a, 0x02, 0xe1, 0x20, 0x59, 0x9e, 0xbe, 0xe7, 0x36, 0x6d, 0x2f, - 0xa6, 0x53, 0xb5, 0x3a, 0x9d, 0x23, 0xfb, 0x46, 0xa3, 0xf6, 0x60, 0x45, 0xf9, 0x46, 0x6e, 0xc8, - 0x6f, 0x84, 0x4e, 0xbb, 0x35, 0xe0, 0x1b, 0x3a, 0x47, 0xb2, 0x07, 0x95, 0xbb, 0xb8, 0x01, 0x28, - 0x5f, 0xc9, 0x1f, 0xff, 0x95, 0x97, 0xc5, 0x57, 0x5e, 0xe0, 0x3b, 0x47, 0xf6, 0x77, 0xfa, 0xb8, - 0x26, 0x33, 0xb7, 0x70, 0xe2, 0xcc, 0xfd, 0xbb, 0x06, 0x8c, 0xf2, 0x1d, 0x26, 0x7e, 0x84, 0x23, - 0x73, 0x0f, 0xdb, 0x7e, 0x3a, 0x7b, 0x58, 0x25, 0xc2, 0xff, 0x54, 0x2b, 0x9e, 0x97, 0x91, 0xc5, - 0xd4, 0x8b, 0x1e, 0xf2, 0x1c, 0x1e, 0xb5, 0x5b, 0x5e, 0x92, 0x78, 0x53, 0xf1, 0xc7, 0x3c, 0x54, - 0x2e, 0x1c, 0x43, 0x7d, 0x5f, 0x70, 0xec, 0x53, 0xbe, 0x2f, 0xb8, 0x02, 0x25, 0xe1, 0x1e, 0x54, - 0x3f, 0x10, 0x36, 0xac, 0x3c, 0xa5, 0x89, 0xe1, 0x4a, 0xd6, 0x6c, 0x0e, 0xb2, 0x77, 0xb4, 0x9c, - 0x77, 0x31, 0x22, 0x59, 0x83, 0x52, 0x12, 0xd3, 0x52, 0xd2, 0x2e, 0x53, 0x63, 0xb8, 0xf0, 0x9f, - 0xe5, 0x61, 0x93, 0x99, 0x21, 0x2c, 0x09, 0x0f, 0xf3, 0x9b, 0x06, 0x54, 0xd2, 0xf3, 0x85, 0xbc, - 0x0b, 0xe3, 0x71, 0x58, 0x51, 0xec, 0xa4, 0x80, 0xa7, 0xa1, 0x49, 0x1c, 0x92, 0xe6, 0xae, 0xa0, - 0xa2, 0x93, 0x79, 0x28, 0xb2, 0x65, 0xa7, 0x24, 0x3d, 0x46, 0x79, 0xd2, 0x13, 0x30, 0xf5, 0x72, - 0x50, 0xe2, 0x29, 0xab, 0xf6, 0x3f, 0xe6, 0x61, 0x5c, 0x19, 0x2c, 0x72, 0x0d, 0x8a, 0xcb, 0xe1, - 0x8a, 0xdf, 0xdc, 0xa7, 0xae, 0xb8, 0x73, 0xc0, 0xe7, 0x23, 0xbd, 0xd0, 0x6e, 0x21, 0xd0, 0x8a, - 0x8b, 0x49, 0x1d, 0x26, 0xf8, 0x7f, 0x32, 0x7c, 0x34, 0x97, 0x9c, 0x97, 0x72, 0x64, 0x19, 0x38, - 0xaa, 0xee, 0xb0, 0x1a, 0x09, 0xf9, 0x06, 0x00, 0x07, 0xb0, 0xf1, 0x1d, 0xc2, 0x3b, 0x58, 0x2e, - 0xe0, 0x73, 0xe2, 0x03, 0x91, 0xa7, 0xb6, 0x10, 0xa7, 0x82, 0xc2, 0x10, 0x9f, 0xae, 0xf3, 0x9b, - 0xfb, 0xc3, 0x3f, 0x5e, 0x99, 0x3c, 0x5d, 0xe7, 0x37, 0xf7, 0xed, 0x6c, 0x57, 0x31, 0x95, 0x25, - 0xf9, 0x96, 0x01, 0x97, 0x2c, 0xda, 0xf4, 0x1f, 0xd1, 0xe0, 0xa0, 0x16, 0x21, 0x96, 0xfa, 0xc5, - 0x93, 0xfd, 0xd2, 0x6e, 0x89, 0x2f, 0xbe, 0x1e, 0x08, 0x2e, 0x18, 0xd3, 0xd2, 0xee, 0x46, 0xf6, - 0x31, 0x55, 0x38, 0xe6, 0x93, 0xe6, 0x5f, 0x18, 0xca, 0x12, 0x20, 0xab, 0x50, 0x8a, 0x27, 0x8b, - 0x38, 0xb5, 0x8c, 0x95, 0x23, 0x09, 0xb7, 0xe8, 0xc3, 0xfa, 0x0b, 0xe2, 0x7a, 0x60, 0x26, 0x9e, - 0x72, 0xda, 0x8a, 0x90, 0x40, 0xf2, 0x65, 0x28, 0xe0, 0x50, 0x9d, 0x9c, 0x25, 0x4b, 0x6e, 0x35, - 0x05, 0x36, 0x46, 0x58, 0x6b, 0xa4, 0x24, 0x5f, 0x10, 0xae, 0x22, 0x79, 0x2d, 0xff, 0x2c, 0x03, - 0xb1, 0x7a, 0xc4, 0x7b, 0x4c, 0xe2, 0x9d, 0xa8, 0xcc, 0xd6, 0xbf, 0x97, 0x83, 0x4a, 0x7a, 0xe1, - 0x91, 0x0f, 0xa0, 0x2c, 0xe3, 0x93, 0xee, 0x39, 0xe1, 0x9e, 0xc8, 0x69, 0x89, 0x86, 0xa3, 0x0c, - 0x6a, 0xb2, 0xf7, 0x1c, 0x2d, 0xf7, 0x99, 0x46, 0xc0, 0x36, 0xe4, 0x0d, 0xe1, 0xf4, 0xae, 0x2c, - 0xa0, 0xc8, 0x8f, 0xba, 0xa9, 0x9c, 0x96, 0x12, 0x8d, 0xbc, 0x05, 0x79, 0x1e, 0xb4, 0xa7, 0x26, - 0x44, 0x7a, 0x70, 0xa7, 0xc6, 0x63, 0x8e, 0xf8, 0x8d, 0xb4, 0x7e, 0xb4, 0xcf, 0xf0, 0xc9, 0x8a, - 0x12, 0xf2, 0x35, 0xaa, 0x25, 0x86, 0x91, 0xe0, 0xb8, 0x71, 0x27, 0xc7, 0x7e, 0x7d, 0x58, 0x28, - 0xe6, 0x2b, 0x05, 0x11, 0xe4, 0xf3, 0x47, 0x79, 0x28, 0xc5, 0xdf, 0x27, 0x04, 0x50, 0xdf, 0x10, - 0x57, 0xcb, 0xf8, 0x3f, 0xb9, 0x08, 0x45, 0xa9, 0x62, 0x88, 0xeb, 0xe5, 0xb1, 0x50, 0xa8, 0x17, - 0xb3, 0x20, 0x75, 0x09, 0xae, 0x5e, 0x58, 0xf2, 0x27, 0xb9, 0x09, 0xb1, 0xa2, 0x30, 0x48, 0xa3, - 0x28, 0xb0, 0x01, 0xb3, 0x62, 0x34, 0x32, 0x09, 0x39, 0x8f, 0x3b, 0x34, 0x97, 0xac, 0x9c, 0xe7, - 0x92, 0x0f, 0xa0, 0xe8, 0xb8, 0x2e, 0x75, 0x6d, 0x27, 0x1a, 0xe2, 0x21, 0xd1, 0x22, 0xe3, 0xc6, - 0x25, 0x3a, 0x52, 0xd5, 0x22, 0x52, 0x83, 0x12, 0xbe, 0x23, 0xd9, 0x0b, 0x87, 0x7a, 0x7c, 0x32, - 0xe1, 0x50, 0x64, 0x64, 0x9b, 0x21, 0x75, 0xc9, 0xeb, 0x50, 0x60, 0xa3, 0x29, 0xf6, 0x83, 0x38, - 0xcd, 0xdd, 0xda, 0xc6, 0x3a, 0xef, 0xb0, 0x7b, 0x67, 0x2c, 0x44, 0x20, 0xaf, 0x40, 0xbe, 0x37, - 0xff, 0x50, 0x48, 0xfa, 0x4a, 0x12, 0xcf, 0x19, 0xa3, 0xb1, 0x62, 0x72, 0x0b, 0x8a, 0x8f, 0xf5, - 0xc8, 0xbd, 0x73, 0xa9, 0x61, 0x8c, 0xf1, 0x63, 0xc4, 0x7a, 0x11, 0x46, 0x79, 0xcc, 0x9a, 0xf9, - 0x12, 0x40, 0xf2, 0xe9, 0x7e, 0x2f, 0x00, 0xf3, 0x1b, 0x50, 0x8a, 0x3f, 0x49, 0x5e, 0x04, 0xd8, - 0xa7, 0x07, 0xf6, 0x9e, 0xd3, 0x71, 0xc5, 0xfb, 0x29, 0x65, 0xab, 0xb4, 0x4f, 0x0f, 0xee, 0x21, - 0x80, 0x5c, 0x80, 0xb1, 0x2e, 0x1b, 0x55, 0x99, 0x91, 0xd5, 0x1a, 0xed, 0xf6, 0x76, 0xd8, 0x0c, - 0x9d, 0x85, 0x31, 0x3c, 0x7f, 0x10, 0x0b, 0x6d, 0xc2, 0x92, 0x3f, 0xcd, 0xdf, 0xcb, 0x61, 0xac, - 0xbe, 0x52, 0x4f, 0xf2, 0x32, 0x4c, 0x34, 0x03, 0x8a, 0xdb, 0x91, 0xc3, 0xd4, 0x22, 0xf1, 0x9d, - 0x72, 0x02, 0x5c, 0x76, 0xc9, 0x6b, 0x30, 0x95, 0xa4, 0x88, 0xb5, 0x9b, 0x3b, 0x22, 0x6e, 0xb7, - 0x6c, 0x4d, 0x74, 0x65, 0x8e, 0xd8, 0x85, 0x1d, 0x74, 0xc4, 0xaf, 0xa8, 0xf1, 0x6a, 0x91, 0x4c, - 0xf7, 0x5a, 0xb2, 0xa6, 0x14, 0x38, 0xde, 0x5d, 0x9c, 0x87, 0x51, 0xc7, 0xd9, 0xed, 0x79, 0xdc, - 0x29, 0xb8, 0x6c, 0x89, 0x5f, 0xe4, 0xf3, 0x30, 0x1d, 0x7a, 0xbb, 0x1d, 0x27, 0xea, 0x05, 0x22, - 0x59, 0x02, 0x0d, 0x70, 0x4a, 0x4d, 0x58, 0x95, 0xb8, 0x60, 0x81, 0xc3, 0xc9, 0x9b, 0x40, 0xd4, - 0xef, 0xf9, 0x3b, 0x1f, 0xd3, 0x26, 0x9f, 0x6a, 0x65, 0x6b, 0x5a, 0x29, 0x59, 0xc3, 0x02, 0xf2, - 0x39, 0x28, 0x07, 0x34, 0x44, 0x95, 0x0c, 0xbb, 0x0d, 0x53, 0xc0, 0x58, 0xe3, 0x12, 0x76, 0x9f, - 0x1e, 0x98, 0x75, 0x98, 0xee, 0x5b, 0x8f, 0xe4, 0x4d, 0xae, 0xdd, 0x8b, 0xfd, 0xb9, 0xcc, 0x8d, - 0x19, 0x26, 0xa4, 0x52, 0x4f, 0x0f, 0x73, 0x24, 0xb3, 0x03, 0x65, 0x55, 0xbe, 0x9e, 0x10, 0x11, - 0x7d, 0x1e, 0xbd, 0x13, 0xb9, 0xf0, 0x19, 0x3d, 0x3a, 0xac, 0xe6, 0x3c, 0x17, 0x7d, 0x12, 0xaf, - 0x42, 0x51, 0x6a, 0x09, 0xea, 0xfb, 0x21, 0x42, 0xa1, 0x3c, 0xb0, 0xe2, 0x52, 0xf3, 0x75, 0x18, - 0x13, 0x22, 0xf4, 0xf8, 0xb3, 0x20, 0xf3, 0x97, 0x73, 0x30, 0x65, 0x51, 0xb6, 0xc0, 0xc5, 0xcb, - 0x1c, 0xcf, 0x59, 0xb2, 0x5c, 0xad, 0x6d, 0xc7, 0x24, 0x20, 0xf8, 0x9e, 0x01, 0x33, 0x19, 0xb8, - 0x9f, 0x28, 0xbb, 0xd6, 0x6d, 0x28, 0x2d, 0x7a, 0x4e, 0xab, 0xe6, 0xba, 0xb1, 0x97, 0x25, 0x6a, - 0x83, 0x2e, 0x5b, 0x4e, 0x0e, 0x83, 0xaa, 0x9b, 0x69, 0x8c, 0x4a, 0xae, 0x8b, 0x49, 0x91, 0xe4, - 0xff, 0x93, 0xe9, 0x78, 0x81, 0xd7, 0x29, 0x49, 0xc6, 0x8b, 0xb1, 0x6c, 0x1c, 0x98, 0x5c, 0xa4, - 0x3f, 0xb3, 0x43, 0x97, 0x1d, 0xcb, 0x96, 0x6e, 0xde, 0x50, 0x66, 0xe7, 0x37, 0x73, 0x70, 0x3e, - 0x9b, 0xf0, 0x93, 0x26, 0x4a, 0xc3, 0xec, 0x0f, 0x4a, 0xc6, 0x63, 0x4c, 0x94, 0xc6, 0x53, 0x45, - 0x20, 0x7e, 0x82, 0x40, 0x1e, 0xc2, 0xc4, 0x8a, 0x13, 0x46, 0xf7, 0xa8, 0x13, 0x44, 0x3b, 0xd4, - 0x89, 0x86, 0xd0, 0x60, 0xe3, 0x07, 0x7e, 0x71, 0x53, 0xdb, 0x93, 0x94, 0xe9, 0x07, 0x7e, 0x35, - 0xb6, 0xf1, 0x44, 0x29, 0x0c, 0x31, 0x51, 0x7e, 0x16, 0xa6, 0x1a, 0xb4, 0xed, 0x74, 0xf7, 0xfc, - 0x80, 0x8a, 0xe3, 0xeb, 0x1b, 0x30, 0x11, 0x83, 0x32, 0x67, 0x8b, 0x5e, 0xac, 0xe1, 0x2b, 0x1d, - 0x91, 0x88, 0x12, 0xbd, 0xd8, 0xfc, 0x9d, 0x1c, 0x5c, 0xa8, 0x35, 0xc5, 0x59, 0xbf, 0x28, 0x90, - 0x57, 0x92, 0x9f, 0xf1, 0xb7, 0xc9, 0x1c, 0x94, 0x1e, 0x38, 0x4f, 0xf0, 0xa5, 0xfa, 0x50, 0xa4, - 0xdb, 0xe1, 0xea, 0x97, 0xf3, 0xc4, 0x8e, 0x8f, 0xbd, 0xac, 0x04, 0xe7, 0x69, 0x3e, 0x66, 0x6f, - 0xc2, 0xe8, 0x3d, 0xbf, 0xe5, 0x8a, 0xcd, 0x49, 0x5c, 0x1d, 0xec, 0x21, 0xc4, 0x12, 0x25, 0xe6, - 0x0f, 0x0d, 0x98, 0x8c, 0x6b, 0x8c, 0x55, 0xf8, 0xcc, 0xbb, 0x24, 0xf5, 0xac, 0x7f, 0x69, 0x88, - 0x67, 0xfd, 0x47, 0x3e, 0x5d, 0x4f, 0x98, 0xff, 0x14, 0x6f, 0x25, 0xd4, 0x56, 0xb2, 0x9d, 0x48, - 0xa9, 0x88, 0x31, 0x64, 0x45, 0x72, 0x4f, 0x6d, 0x48, 0xf2, 0x03, 0x87, 0xe4, 0x57, 0x72, 0x30, - 0x1e, 0x57, 0xf6, 0x39, 0x0b, 0x02, 0x8f, 0xdb, 0x35, 0x94, 0x8b, 0x77, 0x43, 0x91, 0x15, 0xc2, - 0x93, 0xfa, 0xcb, 0x30, 0x2a, 0x16, 0x93, 0x91, 0xba, 0x9a, 0x4b, 0x8d, 0x6e, 0xf2, 0x48, 0x2b, - 0x0e, 0x68, 0x68, 0x09, 0x3a, 0xf4, 0xa1, 0xdf, 0xa6, 0x3b, 0xe2, 0x92, 0xea, 0x99, 0xdd, 0xa3, - 0xb2, 0x7d, 0xe8, 0x93, 0x86, 0x0d, 0xb5, 0x3b, 0xfd, 0xa3, 0x02, 0x54, 0xd2, 0x24, 0x27, 0x87, - 0xd9, 0xaf, 0xf7, 0x76, 0xc4, 0x03, 0x0b, 0x18, 0x66, 0xdf, 0xed, 0xed, 0x58, 0x0c, 0x46, 0x5e, - 0x83, 0xc2, 0x7a, 0xe0, 0x3d, 0xc2, 0x56, 0x8b, 0xf7, 0x25, 0xba, 0x81, 0xf7, 0x48, 0x75, 0x26, - 0x65, 0xe5, 0x68, 0xd0, 0xae, 0x34, 0x94, 0xf7, 0xb1, 0xb9, 0x41, 0xdb, 0x0a, 0xd3, 0xf9, 0x5c, - 0x24, 0x1a, 0xdb, 0x2a, 0xeb, 0xd4, 0x09, 0x44, 0x48, 0xb8, 0x10, 0x67, 0xb8, 0x55, 0xee, 0x20, - 0x98, 0x27, 0x6b, 0xb5, 0x54, 0x24, 0xd2, 0x02, 0xa2, 0xfc, 0x94, 0x0b, 0xf8, 0x64, 0x1b, 0x4f, - 0xbe, 0x8b, 0x74, 0x56, 0x65, 0x6d, 0xab, 0xab, 0x39, 0x83, 0xef, 0xd3, 0x3c, 0x23, 0x5c, 0x87, - 0x12, 0x1e, 0x79, 0xe1, 0x41, 0x46, 0xf1, 0x44, 0x66, 0xd2, 0x71, 0x17, 0xf0, 0x4a, 0xdf, 0x8e, - 0x8f, 0x33, 0x12, 0x26, 0xe4, 0x7d, 0x18, 0x57, 0xbd, 0x4d, 0xb9, 0x4f, 0xe4, 0x65, 0x1e, 0x66, - 0x34, 0x20, 0xef, 0x99, 0x4a, 0x60, 0x7e, 0x41, 0x9d, 0x25, 0x62, 0xd3, 0x3e, 0x76, 0x96, 0x98, - 0xbf, 0x85, 0x6a, 0x7c, 0xdb, 0x8f, 0xa8, 0xd0, 0x5e, 0x9e, 0x59, 0x39, 0x96, 0x1c, 0x21, 0x8f, - 0x68, 0x6e, 0x25, 0x5a, 0xeb, 0x4e, 0xf1, 0x32, 0xf4, 0x1f, 0x1a, 0x70, 0x2e, 0x93, 0x96, 0xdc, - 0x00, 0x48, 0x74, 0x44, 0xd1, 0x4b, 0x3c, 0x0b, 0x6e, 0x0c, 0xb5, 0x14, 0x0c, 0xf2, 0xf5, 0xb4, - 0x76, 0x77, 0xf2, 0xe6, 0x24, 0xdf, 0x8a, 0x98, 0xd4, 0xb5, 0xbb, 0x0c, 0x9d, 0xce, 0xfc, 0x5e, - 0x1e, 0xa6, 0xfb, 0xde, 0x18, 0x3c, 0xe1, 0x22, 0x7f, 0x3f, 0xf5, 0x82, 0x15, 0xbf, 0xee, 0xb8, - 0x3e, 0xe8, 0x85, 0xc3, 0x8c, 0xf7, 0xac, 0xf0, 0x58, 0x4c, 0x24, 0x60, 0x3e, 0xe1, 0x59, 0xab, - 0x30, 0xfb, 0xed, 0xb3, 0xcf, 0x0f, 0xfc, 0xda, 0x53, 0x78, 0x03, 0xed, 0xc7, 0xf8, 0x89, 0xa8, - 0xdf, 0xca, 0xc1, 0x4c, 0x5f, 0x9b, 0x9f, 0xd9, 0x55, 0xf7, 0x65, 0x6d, 0x77, 0x7b, 0x69, 0xd0, - 0x98, 0x0e, 0xa5, 0x45, 0xfc, 0x4f, 0x03, 0x2e, 0x0c, 0xa0, 0x24, 0x07, 0xe9, 0x49, 0xc4, 0xb5, - 0x8a, 0x9b, 0xc7, 0x7f, 0xf0, 0xa9, 0x4c, 0xa5, 0xcf, 0x6c, 0x26, 0xfc, 0x72, 0x0e, 0x60, 0x9b, - 0xee, 0x3c, 0xdb, 0x39, 0x84, 0xb2, 0x1f, 0xf1, 0x97, 0xcd, 0x1a, 0x6a, 0xdc, 0xd7, 0xf0, 0x20, - 0x71, 0xf8, 0x04, 0x42, 0xf1, 0x7b, 0x18, 0xb9, 0xec, 0xf7, 0x30, 0xcc, 0x1d, 0x38, 0x7b, 0x97, - 0x46, 0xc9, 0x4e, 0x28, 0x6d, 0xc8, 0xe3, 0xd9, 0xbe, 0x01, 0x25, 0x81, 0xaf, 0xe7, 0x36, 0x97, - 0x5e, 0x69, 0x9e, 0x6b, 0x25, 0x08, 0x26, 0x85, 0x0b, 0x8b, 0xb4, 0x45, 0x23, 0xfa, 0xd9, 0x7e, - 0xa6, 0x01, 0x84, 0x37, 0x85, 0x3f, 0x93, 0x30, 0xd4, 0x17, 0x4e, 0xec, 0x9f, 0x2d, 0x38, 0x17, - 0xd7, 0xfd, 0x69, 0xf2, 0x9d, 0x63, 0xba, 0x84, 0x08, 0xd8, 0x4b, 0x38, 0x1e, 0x73, 0x88, 0xf8, - 0x04, 0x2e, 0x49, 0x82, 0x6d, 0x2f, 0xbe, 0x89, 0x19, 0x8a, 0x96, 0xbc, 0x0b, 0xe3, 0x0a, 0x8d, - 0x88, 0xfe, 0xc5, 0xdb, 0xce, 0xc7, 0x5e, 0xb4, 0x67, 0x87, 0x1c, 0xae, 0xde, 0x76, 0x2a, 0xe8, - 0xe6, 0xd7, 0xe0, 0x85, 0xd8, 0x6f, 0x25, 0xe3, 0xd3, 0x29, 0xe6, 0xc6, 0xe9, 0x98, 0xaf, 0x26, - 0xcd, 0x5a, 0xee, 0xc4, 0x4e, 0xe8, 0x92, 0x37, 0x51, 0x9b, 0x25, 0x1a, 0x73, 0x59, 0xc9, 0xad, - 0x26, 0xf6, 0xa2, 0x04, 0x60, 0xbe, 0xa3, 0x54, 0x36, 0x83, 0xa1, 0x46, 0x6c, 0xa4, 0x89, 0x7f, - 0x39, 0x07, 0x53, 0x6b, 0xcb, 0x8b, 0x0b, 0xf1, 0x31, 0xf2, 0x73, 0x96, 0xe0, 0x48, 0x6b, 0xdb, - 0x60, 0x79, 0x63, 0x6e, 0xc2, 0x4c, 0xaa, 0x1b, 0xf0, 0x15, 0x98, 0xf7, 0xb9, 0x7f, 0x49, 0x0c, - 0x96, 0x3b, 0xcb, 0xf9, 0x2c, 0xf6, 0x5b, 0xb7, 0xac, 0x14, 0xb6, 0xf9, 0xbd, 0xd1, 0x14, 0x5f, - 0x21, 0xc2, 0xde, 0x80, 0xd2, 0x72, 0x18, 0xf6, 0x68, 0xb0, 0x69, 0xad, 0xa8, 0x3a, 0xa2, 0x87, - 0x40, 0xbb, 0x17, 0xb4, 0xac, 0x04, 0x81, 0x5c, 0x83, 0xa2, 0x08, 0x12, 0x93, 0x32, 0x01, 0xaf, - 0xcb, 0xe3, 0x18, 0x33, 0x2b, 0x2e, 0x26, 0x6f, 0x41, 0x99, 0xff, 0xcf, 0x67, 0x9b, 0xe8, 0x70, - 0x3c, 0xab, 0x12, 0xe8, 0x7c, 0x76, 0x5a, 0x1a, 0x1a, 0xb3, 0xcc, 0xe4, 0x33, 0x93, 0xac, 0x46, - 0x85, 0xc4, 0x32, 0x93, 0x2f, 0x52, 0x62, 0x9d, 0x54, 0x24, 0x72, 0x1d, 0xf2, 0xb5, 0x05, 0x4b, - 0x4d, 0xe7, 0xec, 0x34, 0x03, 0x9e, 0x0e, 0x5d, 0x7b, 0xc9, 0xa9, 0xb6, 0x60, 0x91, 0x79, 0x28, - 0xe2, 0x4b, 0x1d, 0x2e, 0x0d, 0x84, 0xe3, 0x29, 0xce, 0x9a, 0xae, 0x80, 0xa9, 0x37, 0x8f, 0x12, - 0x8f, 0xcc, 0xc1, 0xd8, 0xa2, 0x17, 0x76, 0x5b, 0xce, 0x81, 0xc8, 0x6c, 0x82, 0x97, 0x21, 0x2e, - 0x07, 0xa9, 0xf3, 0x4c, 0x60, 0x91, 0x6b, 0x30, 0xd2, 0x68, 0xfa, 0x5d, 0x66, 0x6d, 0xc5, 0xae, - 0x2d, 0x21, 0x03, 0x68, 0xe9, 0x11, 0x18, 0x00, 0xe3, 0x96, 0x79, 0xf8, 0x55, 0x49, 0x89, 0x5b, - 0x4e, 0x87, 0x5d, 0x09, 0x9c, 0x7e, 0xff, 0x3f, 0x78, 0x9a, 0xfe, 0x7f, 0x3b, 0x70, 0xe1, 0x2e, - 0xaa, 0xfa, 0x0d, 0x1a, 0x60, 0x32, 0x49, 0xfe, 0xea, 0xcf, 0xa6, 0xb5, 0x2c, 0x42, 0xce, 0xae, - 0x1e, 0x1d, 0x56, 0x5f, 0xe1, 0xd6, 0x80, 0x1d, 0x72, 0x1c, 0xf9, 0x60, 0x50, 0xea, 0xa9, 0x83, - 0x41, 0x8c, 0xc8, 0x57, 0xe0, 0x6c, 0x56, 0x91, 0x08, 0x3e, 0x43, 0xd7, 0xf2, 0xec, 0x0f, 0xa8, - 0xbe, 0xdd, 0x59, 0x1c, 0xc8, 0x0a, 0x54, 0x38, 0xbc, 0xe6, 0xb6, 0xbd, 0xce, 0x52, 0xdb, 0xf1, - 0x5a, 0x18, 0x8a, 0x26, 0xe2, 0x09, 0x05, 0x57, 0x87, 0x15, 0xda, 0x94, 0x95, 0x6a, 0xde, 0x49, - 0x29, 0x4a, 0x14, 0x47, 0x8d, 0xda, 0x83, 0x95, 0x64, 0x4d, 0x3d, 0x5f, 0xf7, 0x46, 0x5a, 0xdb, - 0x8e, 0xb9, 0x37, 0xda, 0x84, 0x99, 0x54, 0x37, 0x48, 0x71, 0xa4, 0x81, 0xd3, 0xe2, 0x28, 0x45, - 0x63, 0xa5, 0xb0, 0xcd, 0xff, 0x34, 0x9a, 0xe2, 0x2b, 0xce, 0x8a, 0x4c, 0x18, 0xe5, 0xd2, 0x46, - 0x4d, 0x7d, 0xc6, 0x65, 0x91, 0x25, 0x4a, 0xc8, 0x45, 0xc8, 0x37, 0x1a, 0x6b, 0x6a, 0x62, 0xc6, - 0x30, 0xf4, 0x2d, 0x06, 0x63, 0x23, 0x84, 0xc7, 0x40, 0x4a, 0x94, 0x57, 0x93, 0x06, 0x91, 0x78, - 0x87, 0xf4, 0xd5, 0x64, 0x1d, 0x17, 0x92, 0xfe, 0x16, 0xeb, 0x38, 0x59, 0xbd, 0x0b, 0x30, 0x5b, - 0x0b, 0x43, 0x1a, 0x44, 0x3c, 0x9b, 0x7c, 0xd8, 0x6b, 0xd3, 0x40, 0xcc, 0x35, 0x21, 0x63, 0xf8, - 0x2b, 0xe6, 0xcd, 0xd0, 0x1a, 0x88, 0x48, 0xae, 0x42, 0xb1, 0xd6, 0x73, 0x3d, 0xda, 0x69, 0x6a, - 0x0e, 0xee, 0x8e, 0x80, 0x59, 0x71, 0x29, 0xf9, 0x08, 0xce, 0x09, 0x22, 0x29, 0x70, 0x44, 0x0f, - 0x70, 0x59, 0xc3, 0x2d, 0x58, 0xb1, 0x16, 0xa4, 0x98, 0xb2, 0x45, 0x97, 0x64, 0x53, 0x92, 0x1a, - 0x54, 0x96, 0xf0, 0x9e, 0x54, 0xbe, 0x46, 0xec, 0x07, 0x22, 0x6b, 0x30, 0x4a, 0x2e, 0x7e, 0x87, - 0x6a, 0xbb, 0x71, 0xa1, 0xd5, 0x87, 0x4e, 0xee, 0xc3, 0x4c, 0x1a, 0xc6, 0xe4, 0x71, 0x29, 0x79, - 0x2d, 0xac, 0x8f, 0x0b, 0x0a, 0xe6, 0x2c, 0x2a, 0xb2, 0x03, 0xd3, 0xb5, 0x28, 0x0a, 0xbc, 0x9d, - 0x5e, 0x44, 0x53, 0xa2, 0x4b, 0x1e, 0x34, 0xc6, 0xe5, 0x52, 0x7c, 0xbd, 0x20, 0x26, 0xe3, 0x8c, - 0x13, 0x53, 0xc6, 0x22, 0xcc, 0xea, 0x67, 0x47, 0xdc, 0xf8, 0xc1, 0x41, 0xf1, 0x28, 0x9f, 0x88, - 0x4a, 0x92, 0x07, 0xba, 0xb5, 0xf0, 0xa0, 0xdd, 0xa6, 0x51, 0x80, 0x37, 0xf7, 0xf8, 0x68, 0x9f, - 0x29, 0x7c, 0x80, 0x2e, 0x29, 0xef, 0x6c, 0xe2, 0xc3, 0x8c, 0x9a, 0x7b, 0xa4, 0xc6, 0x53, 0xdb, - 0x3e, 0xca, 0x43, 0x6e, 0x1f, 0x2d, 0x98, 0x5e, 0xea, 0x34, 0x83, 0x03, 0x0c, 0x8f, 0x94, 0x95, - 0x9b, 0x38, 0xa1, 0x72, 0xf2, 0x45, 0x8e, 0xcb, 0x8e, 0x9c, 0x61, 0x59, 0xd5, 0xeb, 0x67, 0x6c, - 0xfe, 0x7f, 0x50, 0x49, 0xf7, 0xe5, 0xa7, 0x7c, 0x65, 0xf9, 0x34, 0xae, 0xd9, 0x6c, 0xa4, 0xd3, - 0x6d, 0x21, 0x73, 0xda, 0x53, 0xba, 0x46, 0x12, 0xda, 0xae, 0x3c, 0x7a, 0xab, 0x3d, 0xa0, 0x2b, - 0x97, 0x71, 0x2e, 0x6b, 0x19, 0x9b, 0xbf, 0x9a, 0x83, 0x69, 0xee, 0x4d, 0xfa, 0xec, 0xeb, 0x8a, - 0xef, 0x6b, 0xc2, 0x59, 0x9e, 0x05, 0xa6, 0x5a, 0x77, 0x8c, 0xb6, 0xf8, 0x0d, 0x38, 0xd7, 0xd7, - 0x15, 0x28, 0xa0, 0x17, 0xa5, 0x1f, 0x6f, 0x9f, 0x88, 0x9e, 0xcd, 0xfe, 0xc8, 0xd6, 0x2d, 0xab, - 0x8f, 0xc2, 0xfc, 0xc7, 0xb9, 0x3e, 0xfe, 0x42, 0x6f, 0x54, 0x35, 0x41, 0xe3, 0x74, 0x9a, 0x60, - 0xee, 0x13, 0x69, 0x82, 0xf9, 0x61, 0x34, 0xc1, 0x8f, 0x60, 0x62, 0x83, 0x3a, 0x4c, 0xa3, 0x11, - 0x11, 0x6b, 0x05, 0xed, 0x99, 0x5b, 0x56, 0x26, 0xe5, 0x4b, 0x1c, 0xed, 0x1a, 0x31, 0x02, 0x26, - 0x5a, 0x78, 0x08, 0x9b, 0xa5, 0x73, 0x50, 0x37, 0x8d, 0x91, 0xc1, 0x9b, 0x86, 0xf9, 0xcd, 0x1c, - 0x8c, 0x2b, 0xec, 0xc9, 0x17, 0xa1, 0xbc, 0x16, 0xec, 0x3a, 0x1d, 0xef, 0xe7, 0x1c, 0xe5, 0xf8, - 0x15, 0xab, 0xef, 0x2b, 0x70, 0x4b, 0xc3, 0x42, 0xb7, 0x19, 0xea, 0xb4, 0xd5, 0x89, 0xcf, 0xaa, - 0x67, 0x21, 0x54, 0x89, 0x38, 0xce, 0x0f, 0x11, 0x71, 0xac, 0x87, 0xeb, 0x16, 0x4e, 0x1f, 0xae, - 0xab, 0x45, 0xd7, 0x8e, 0x9c, 0x32, 0xba, 0xd6, 0xfc, 0xf5, 0x1c, 0x54, 0xc4, 0x83, 0xb0, 0xf2, - 0xf0, 0xf0, 0xf9, 0x7a, 0x40, 0x42, 0x6f, 0xdc, 0x31, 0xd7, 0x63, 0x85, 0xdf, 0xfe, 0xfd, 0x2a, - 0x3e, 0xef, 0x99, 0xee, 0x0e, 0xf9, 0xbc, 0xa7, 0x0e, 0x4f, 0x47, 0x0e, 0xa4, 0xa9, 0xac, 0x34, - 0xbe, 0xf9, 0xe7, 0xb9, 0x34, 0x6f, 0xa1, 0x4d, 0xbd, 0x0a, 0x63, 0xfc, 0x3d, 0x2f, 0xe9, 0xdc, - 0x2c, 0x12, 0x40, 0x21, 0xc8, 0x92, 0x65, 0xa7, 0x89, 0x21, 0x39, 0xe9, 0x8d, 0x57, 0x72, 0x1b, - 0xca, 0xe8, 0x2f, 0x52, 0x73, 0xdd, 0x80, 0x86, 0xa1, 0x50, 0xb4, 0xf0, 0xee, 0xee, 0x31, 0xdd, - 0xb1, 0xb9, 0x5f, 0x89, 0xe3, 0xba, 0x81, 0xa5, 0xe1, 0x91, 0x05, 0x38, 0xab, 0xb9, 0x27, 0x49, - 0xfa, 0x91, 0x64, 0xb7, 0x88, 0xb0, 0x80, 0x13, 0x67, 0x22, 0x3f, 0xbd, 0xf7, 0xad, 0xcd, 0xbf, - 0x36, 0xd8, 0x5a, 0x6b, 0xee, 0x3f, 0x67, 0xd1, 0x2d, 0xac, 0x49, 0xc7, 0x28, 0xfb, 0xff, 0xc1, - 0xe0, 0xfe, 0xe9, 0x62, 0xfa, 0xbc, 0x0d, 0xa3, 0xfc, 0xf5, 0x30, 0xe1, 0x49, 0xad, 0x72, 0xe1, - 0x05, 0xc9, 0xfd, 0x14, 0x7f, 0x83, 0xcc, 0x12, 0x04, 0xcc, 0x64, 0xd6, 0xdd, 0xe4, 0x51, 0xf1, - 0xec, 0xf7, 0x8f, 0x97, 0x58, 0x6a, 0x72, 0xd3, 0xe1, 0x92, 0x66, 0x1b, 0x27, 0x27, 0x37, 0x35, - 0xff, 0x6f, 0x8e, 0xb7, 0x47, 0x54, 0x6a, 0xd8, 0xac, 0x7d, 0xaf, 0x41, 0x01, 0xdf, 0xa9, 0x55, - 0x52, 0x23, 0xa6, 0xde, 0xa8, 0xc5, 0x72, 0xb6, 0x6e, 0x50, 0xd6, 0xaa, 0x01, 0x55, 0x28, 0x8e, - 0xd5, 0x75, 0x83, 0x18, 0x98, 0x92, 0xda, 0x77, 0xa9, 0xba, 0x1c, 0x3a, 0x7a, 0xf6, 0x70, 0x2c, - 0x27, 0xb7, 0x15, 0xbf, 0x66, 0xf5, 0x40, 0xa3, 0xfd, 0xd0, 0xb1, 0xb9, 0x3f, 0xad, 0x2a, 0x6d, - 0x13, 0x17, 0xe8, 0x25, 0x98, 0xd4, 0x03, 0x9e, 0x85, 0xd1, 0x81, 0x41, 0x8a, 0xa9, 0x60, 0x69, - 0x55, 0xbd, 0xd5, 0x89, 0x48, 0x1d, 0x26, 0xb4, 0xa8, 0x56, 0x35, 0x93, 0x2b, 0x4f, 0x31, 0x63, - 0xf7, 0xa7, 0x63, 0xd0, 0x49, 0x94, 0x03, 0xf3, 0x2f, 0x40, 0x45, 0xac, 0xcc, 0x38, 0xb6, 0x0d, - 0x55, 0xbb, 0xe5, 0x45, 0x4b, 0x5d, 0x4d, 0x4d, 0xcf, 0x0d, 0x2c, 0x84, 0x9a, 0xdf, 0x35, 0xe0, - 0xa2, 0x78, 0x15, 0xcd, 0xa2, 0x21, 0xd3, 0x21, 0x31, 0x20, 0x0e, 0xe7, 0xe3, 0x17, 0xc9, 0xbb, - 0x32, 0x7b, 0x95, 0x2e, 0x20, 0xd3, 0xdf, 0xa8, 0x4f, 0x88, 0x49, 0x39, 0x82, 0xf9, 0xab, 0x64, - 0xd6, 0xaa, 0xb7, 0x45, 0xd6, 0xaa, 0xdc, 0xf1, 0xc4, 0xf1, 0xba, 0x70, 0x69, 0x47, 0x66, 0xab, - 0xfa, 0x4e, 0x0e, 0xce, 0x65, 0x54, 0x6b, 0xeb, 0x8b, 0xcf, 0xa8, 0x70, 0xa8, 0x6b, 0xc2, 0x41, - 0xa6, 0x35, 0x1c, 0xd8, 0xf1, 0x99, 0xb2, 0xe2, 0x77, 0x0d, 0xb8, 0xa0, 0xcf, 0x1e, 0x61, 0x8b, - 0x6e, 0xdd, 0x22, 0xef, 0xc0, 0xe8, 0x3d, 0xea, 0xb8, 0x54, 0x86, 0x60, 0xc4, 0x29, 0xc2, 0xc4, - 0xe9, 0x30, 0x2f, 0xe4, 0x6c, 0xff, 0x9c, 0x2f, 0xe5, 0x33, 0x96, 0x20, 0x21, 0x8b, 0xa2, 0x72, - 0xfc, 0x7a, 0xca, 0x94, 0x37, 0x35, 0x59, 0x9f, 0x3a, 0x46, 0x31, 0xfe, 0x43, 0x03, 0x5e, 0x38, - 0x86, 0x86, 0x0d, 0x1c, 0x1b, 0x7a, 0x75, 0xe0, 0x70, 0x63, 0x41, 0x28, 0x79, 0x1f, 0xa6, 0x36, - 0x44, 0xa4, 0x98, 0x1c, 0x0e, 0x25, 0x45, 0xbc, 0x0c, 0x22, 0xb3, 0xe5, 0xb8, 0xa4, 0x91, 0x99, - 0xf5, 0x7f, 0xcf, 0x0f, 0xa3, 0x4e, 0x92, 0x71, 0x06, 0xad, 0xff, 0x3d, 0x01, 0xb3, 0xe2, 0x52, - 0xa6, 0x16, 0xe8, 0xd5, 0x14, 0xee, 0x10, 0x2f, 0xc3, 0x28, 0xc3, 0x89, 0xb5, 0x6b, 0x9c, 0x07, - 0xf8, 0x66, 0x97, 0xe7, 0x5a, 0xa2, 0x28, 0xb6, 0xeb, 0x72, 0x99, 0xb7, 0x16, 0xdf, 0x34, 0xa0, - 0xa2, 0xf3, 0xfe, 0xb4, 0x43, 0xf3, 0x9e, 0x36, 0x34, 0x2f, 0x64, 0x0f, 0xcd, 0xe0, 0x31, 0xe9, - 0x4b, 0xfe, 0x30, 0xd4, 0x58, 0x98, 0x30, 0xba, 0xe8, 0xb7, 0x1d, 0xaf, 0xa3, 0x26, 0x2c, 0x70, - 0x11, 0x62, 0x89, 0x12, 0xa5, 0xb7, 0xf2, 0x03, 0x7b, 0xcb, 0xfc, 0x76, 0x01, 0x2e, 0x5a, 0x74, - 0xd7, 0x63, 0x0a, 0xd2, 0x66, 0xe8, 0x75, 0x76, 0xb5, 0x3b, 0x25, 0x33, 0xd5, 0xe1, 0xc2, 0x93, - 0x8e, 0x41, 0xe2, 0xfe, 0xbe, 0x06, 0x45, 0x26, 0xa5, 0x95, 0x3e, 0x47, 0xa3, 0x07, 0xd3, 0xee, - 0xf0, 0x71, 0x95, 0xc5, 0xe4, 0xba, 0xd8, 0x43, 0x14, 0x5f, 0x67, 0xb6, 0x87, 0xa4, 0x9e, 0x1c, - 0xe7, 0xfb, 0x48, 0xac, 0x54, 0x15, 0x06, 0x28, 0x55, 0x0f, 0xe0, 0x6c, 0xcd, 0xe5, 0xf2, 0xc9, - 0x69, 0xad, 0x07, 0x5e, 0xa7, 0xe9, 0x75, 0x9d, 0x96, 0x54, 0xca, 0xf9, 0x03, 0xec, 0x71, 0xb9, - 0xdd, 0x8d, 0x11, 0xac, 0x4c, 0x32, 0xd6, 0x8c, 0xc5, 0xd5, 0x06, 0xcf, 0xaa, 0xc2, 0x63, 0xd9, - 0xb1, 0x19, 0x6e, 0x27, 0xe4, 0x69, 0x55, 0xac, 0xb8, 0x18, 0xd5, 0x39, 0x0c, 0x77, 0xd8, 0x58, - 0x69, 0xdc, 0x17, 0xe1, 0x03, 0xd2, 0x15, 0x8b, 0x47, 0x47, 0x44, 0xad, 0x10, 0xed, 0x77, 0x0d, - 0x2f, 0xa1, 0x6b, 0x34, 0xee, 0x31, 0xba, 0x62, 0x1f, 0x5d, 0x18, 0xee, 0xa9, 0x74, 0x1c, 0x8f, - 0xcc, 0x01, 0x70, 0x67, 0x16, 0x9c, 0x10, 0xa5, 0x44, 0xf9, 0x0b, 0x10, 0xca, 0x95, 0x3f, 0x05, - 0x85, 0xbc, 0x0b, 0x33, 0x4b, 0x0b, 0xf3, 0x32, 0x2e, 0x60, 0xd1, 0x6f, 0xf6, 0xda, 0xb4, 0x13, - 0x61, 0x9c, 0x4a, 0x99, 0x8f, 0x21, 0x6d, 0xce, 0xb3, 0x59, 0x90, 0x85, 0x26, 0xa2, 0x03, 0x78, - 0x6c, 0xd9, 0x82, 0xef, 0xd2, 0x70, 0xeb, 0xe6, 0x73, 0x16, 0x1d, 0xa0, 0xb4, 0x0d, 0x57, 0xdb, - 0xcd, 0xcc, 0x95, 0xf9, 0xf7, 0x31, 0x3a, 0xa0, 0x0f, 0x97, 0xfc, 0x24, 0x8c, 0xe0, 0x4f, 0xb1, - 0xe3, 0xce, 0x64, 0xb0, 0x4d, 0x76, 0xdb, 0x26, 0x4f, 0x90, 0x81, 0x04, 0x64, 0x39, 0xc9, 0x80, - 0x7f, 0x0a, 0x1f, 0x57, 0x11, 0xa0, 0xaa, 0x3f, 0x7d, 0xe2, 0x42, 0x59, 0xfd, 0x20, 0x9b, 0x23, - 0xf7, 0x9c, 0x70, 0x8f, 0xba, 0x0b, 0xf2, 0xc1, 0xc4, 0x32, 0x9f, 0x23, 0x7b, 0x08, 0xc5, 0x67, - 0x59, 0x2c, 0x05, 0x85, 0x49, 0x87, 0xe5, 0x70, 0x33, 0x14, 0x55, 0x11, 0x56, 0x90, 0x87, 0xd6, - 0xab, 0x6b, 0x89, 0x22, 0x94, 0x96, 0x32, 0x01, 0x64, 0xe0, 0x34, 0xf7, 0x69, 0xb0, 0x75, 0xf3, - 0xb3, 0x90, 0x96, 0xfa, 0x37, 0x8e, 0x19, 0x93, 0xdf, 0x28, 0xc6, 0xf9, 0x5d, 0x34, 0x64, 0xa6, - 0x23, 0x26, 0x37, 0xf3, 0x46, 0xa2, 0x23, 0x26, 0x37, 0xf3, 0xaa, 0x8e, 0x18, 0xa3, 0xc6, 0xe9, - 0x77, 0x73, 0x27, 0xa4, 0xdf, 0x1d, 0x90, 0xf1, 0x5b, 0x3a, 0x75, 0x3e, 0x47, 0x8f, 0x1f, 0x7c, - 0x09, 0xca, 0xb5, 0x28, 0x72, 0x9a, 0x7b, 0xd4, 0xc5, 0x34, 0xcf, 0xca, 0x85, 0xa0, 0x23, 0xe0, - 0xaa, 0xbb, 0x98, 0x8a, 0xab, 0x3c, 0x7e, 0x32, 0x36, 0xc4, 0xe3, 0x27, 0x73, 0x30, 0xb6, 0xdc, - 0x79, 0xe4, 0xb1, 0x3e, 0x29, 0x26, 0xc9, 0x21, 0x3c, 0x0e, 0xd2, 0x5f, 0xcc, 0x40, 0x10, 0x79, - 0x5b, 0xd1, 0x20, 0x4a, 0x89, 0x2a, 0x2f, 0x9e, 0x7a, 0x96, 0x8a, 0x84, 0x7a, 0xde, 0x2c, 0xd1, - 0xc9, 0x6d, 0x18, 0x93, 0xd6, 0x33, 0x24, 0xea, 0xbb, 0xa0, 0x74, 0x78, 0x89, 0x96, 0x8f, 0x42, - 0x58, 0xcf, 0xef, 0xea, 0xf1, 0x23, 0xe3, 0x4a, 0x5c, 0xb6, 0x12, 0x3f, 0xa2, 0xc5, 0x65, 0x2b, - 0x91, 0x24, 0xb1, 0x31, 0x54, 0x3e, 0xd1, 0x18, 0xda, 0x82, 0xf2, 0xba, 0x13, 0x44, 0x1e, 0xdb, - 0x8e, 0x3a, 0x11, 0xcf, 0xcd, 0x95, 0xd8, 0xea, 0x4a, 0x51, 0xfd, 0x25, 0x19, 0x9f, 0xdc, 0x55, - 0xf0, 0xf5, 0xc0, 0xd6, 0x04, 0x4e, 0x56, 0x33, 0x3c, 0x0c, 0x45, 0x26, 0x49, 0xbc, 0x02, 0x54, - 0x0e, 0xae, 0x44, 0x8b, 0xd4, 0xa3, 0xf4, 0x7e, 0xe7, 0xc4, 0x5b, 0x7c, 0x0c, 0xd0, 0x66, 0x9c, - 0x42, 0x36, 0x98, 0x5d, 0x04, 0xf5, 0x8a, 0x94, 0xe1, 0x18, 0x23, 0x92, 0xaf, 0x43, 0x99, 0xfd, - 0x8f, 0x89, 0x8a, 0x3c, 0xca, 0x73, 0x6f, 0x25, 0x1e, 0x67, 0xfa, 0x82, 0xe6, 0xd9, 0x8c, 0x1a, - 0x34, 0xe2, 0x0b, 0x18, 0x19, 0xa7, 0x0f, 0x5e, 0x34, 0x6e, 0xe6, 0x0f, 0x0d, 0xb8, 0x30, 0x80, - 0xc7, 0xd0, 0xcf, 0x1e, 0xcd, 0x25, 0x1b, 0x92, 0x62, 0x9b, 0x8b, 0x0d, 0x49, 0x9d, 0x18, 0x72, - 0x6b, 0xca, 0xce, 0x9a, 0x95, 0xff, 0xcc, 0xb2, 0x66, 0x99, 0x87, 0x06, 0x8c, 0x2b, 0x23, 0xfb, - 0x14, 0x5f, 0x33, 0x78, 0x4d, 0xa4, 0x8f, 0xcc, 0x27, 0x78, 0xa9, 0x87, 0x93, 0x79, 0xba, 0xc8, - 0x6f, 0x00, 0xac, 0x38, 0x61, 0x54, 0x6b, 0x46, 0xde, 0x23, 0x3a, 0x84, 0x18, 0x4b, 0x02, 0xf5, - 0x1d, 0xcc, 0xc6, 0xca, 0xc8, 0xfa, 0x02, 0xf5, 0x63, 0x86, 0xe6, 0x2a, 0x8c, 0x36, 0xfc, 0x20, - 0xaa, 0x1f, 0xf0, 0xbd, 0x69, 0x91, 0x86, 0x4d, 0xf5, 0x84, 0xce, 0x43, 0x5b, 0xbd, 0x69, 0x89, - 0x22, 0xa6, 0x20, 0xde, 0xf1, 0x68, 0xcb, 0x55, 0x6f, 0x68, 0x1e, 0x32, 0x80, 0xc5, 0xe1, 0xd7, - 0x3f, 0x80, 0x29, 0x99, 0xc1, 0x6e, 0x63, 0xa5, 0x81, 0x2d, 0x98, 0x82, 0xf1, 0xad, 0x25, 0x6b, - 0xf9, 0xce, 0x57, 0xed, 0x3b, 0x9b, 0x2b, 0x2b, 0x95, 0x33, 0x64, 0x02, 0x4a, 0x02, 0xb0, 0x50, - 0xab, 0x18, 0xa4, 0x0c, 0xc5, 0xe5, 0xd5, 0xc6, 0xd2, 0xc2, 0xa6, 0xb5, 0x54, 0xc9, 0x5d, 0x7f, - 0x15, 0x26, 0x93, 0xfb, 0x17, 0x8c, 0xd1, 0x1c, 0x83, 0xbc, 0x55, 0xdb, 0xae, 0x9c, 0x21, 0x00, - 0xa3, 0xeb, 0xf7, 0x17, 0x1a, 0x37, 0x6f, 0x56, 0x8c, 0xeb, 0x5f, 0xc8, 0x78, 0xad, 0x9a, 0x71, - 0x6a, 0xd0, 0xae, 0x13, 0x38, 0x11, 0xe5, 0x9f, 0x79, 0xd0, 0x6b, 0x45, 0x5e, 0xb7, 0x45, 0x9f, - 0x54, 0x8c, 0xeb, 0x6f, 0xf7, 0x3d, 0x3a, 0x4d, 0xce, 0xc1, 0xf4, 0xe6, 0x6a, 0xed, 0x41, 0x7d, - 0xf9, 0xee, 0xe6, 0xda, 0x66, 0xc3, 0x7e, 0x50, 0xdb, 0x58, 0xb8, 0x57, 0x39, 0xc3, 0x2a, 0xfc, - 0x60, 0xad, 0xb1, 0x61, 0x5b, 0x4b, 0x0b, 0x4b, 0xab, 0x1b, 0x15, 0xe3, 0xfa, 0xaf, 0x19, 0x30, - 0xa9, 0x3f, 0xa9, 0x47, 0xae, 0xc0, 0xe5, 0xcd, 0xc6, 0x92, 0x65, 0x6f, 0xac, 0xdd, 0x5f, 0x5a, - 0xb5, 0x37, 0x1b, 0xb5, 0xbb, 0x4b, 0xf6, 0xe6, 0x6a, 0x63, 0x7d, 0x69, 0x61, 0xf9, 0xce, 0xf2, - 0xd2, 0x62, 0xe5, 0x0c, 0xa9, 0xc2, 0x0b, 0x0a, 0x86, 0xb5, 0xb4, 0xb0, 0xb6, 0xb5, 0x64, 0xd9, - 0xeb, 0xb5, 0x46, 0x63, 0x7b, 0xcd, 0x5a, 0xac, 0x18, 0xe4, 0x12, 0x9c, 0xcf, 0x40, 0x78, 0x70, - 0xa7, 0x56, 0xc9, 0xf5, 0x95, 0xad, 0x2e, 0x6d, 0xd7, 0x56, 0xec, 0xfa, 0xda, 0x46, 0x25, 0x7f, - 0xfd, 0x03, 0xa6, 0x85, 0x24, 0x6f, 0x5e, 0x90, 0x22, 0x14, 0x56, 0xd7, 0x56, 0x97, 0x2a, 0x67, - 0xc8, 0x38, 0x8c, 0xad, 0x2f, 0xad, 0x2e, 0x2e, 0xaf, 0xde, 0xe5, 0xdd, 0x5a, 0x5b, 0x5f, 0xb7, - 0xd6, 0xb6, 0x96, 0x16, 0x2b, 0x39, 0xd6, 0x77, 0x8b, 0x4b, 0xab, 0xac, 0x66, 0xf9, 0xeb, 0x26, - 0xcf, 0xf3, 0xac, 0xa5, 0x29, 0x65, 0xbd, 0xb5, 0xf4, 0x95, 0x8d, 0xa5, 0xd5, 0xc6, 0xf2, 0xda, - 0x6a, 0xe5, 0xcc, 0xf5, 0xcb, 0x29, 0x1c, 0x39, 0x12, 0x8d, 0xc6, 0xbd, 0xca, 0x99, 0xeb, 0x5f, - 0x87, 0xb2, 0xba, 0x09, 0x93, 0x0b, 0x30, 0xa3, 0xfe, 0x5e, 0xa7, 0x1d, 0xd7, 0xeb, 0xec, 0x56, - 0xce, 0xa4, 0x0b, 0xac, 0x5e, 0xa7, 0xc3, 0x0a, 0xb0, 0xf1, 0x6a, 0xc1, 0x06, 0x0d, 0xda, 0x5e, - 0x87, 0xed, 0xaf, 0x95, 0x5c, 0xbd, 0xf2, 0xfd, 0xbf, 0x7a, 0xe9, 0xcc, 0xf7, 0x7f, 0xf0, 0x92, - 0xf1, 0xe7, 0x3f, 0x78, 0xc9, 0xf8, 0x6f, 0x3f, 0x78, 0xc9, 0xd8, 0x19, 0xc5, 0x89, 0x7e, 0xeb, - 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x94, 0x04, 0xac, 0xd9, 0x28, 0xb6, 0x00, 0x00, + // 11800 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x6f, 0x6c, 0x1c, 0x49, + 0x76, 0x18, 0xae, 0x9e, 0x19, 0x0e, 0x67, 0x1e, 0x87, 0xe4, 0xb0, 0xf4, 0x8f, 0xd2, 0x6a, 0x77, + 0xb4, 0xbd, 0xbb, 0x5a, 0x49, 0xb7, 0x2b, 0x9e, 0xa8, 0x5b, 0x9d, 0xf7, 0xf6, 0xdf, 0xcd, 0x90, + 0x94, 0xc8, 0x15, 0x45, 0x72, 0x7b, 0xf8, 0xe7, 0xce, 0x77, 0xeb, 0x76, 0x73, 0xba, 0x44, 0xf6, + 0x72, 0x38, 0x3d, 0xee, 0xee, 0x91, 0x44, 0xfb, 0x67, 0xd8, 0x3f, 0x04, 0x8e, 0x61, 0x18, 0xbe, + 0x3b, 0x1b, 0xe7, 0xd8, 0x0e, 0x1c, 0xd8, 0x31, 0x62, 0x24, 0x4e, 0x70, 0xfe, 0xe0, 0x04, 0x48, + 0x0c, 0x04, 0x01, 0x0c, 0x04, 0xc6, 0x7d, 0x48, 0x10, 0x7f, 0x0b, 0xe2, 0x04, 0x4c, 0x7c, 0x97, + 0x2f, 0x21, 0x90, 0x20, 0x80, 0x3f, 0xf9, 0x12, 0x03, 0x41, 0xbd, 0xaa, 0xea, 0xae, 0xea, 0xe9, + 0x21, 0x47, 0x2b, 0x2d, 0x70, 0xda, 0x4f, 0xe4, 0xbc, 0x7a, 0xef, 0x75, 0xfd, 0x7d, 0xf5, 0x5e, + 0xd5, 0x7b, 0xaf, 0x60, 0x2c, 0x3a, 0xe8, 0xd2, 0xf0, 0x46, 0x37, 0xf0, 0x23, 0x9f, 0x8c, 0xe0, + 0x8f, 0x8b, 0x67, 0x76, 0xfc, 0x1d, 0x1f, 0x21, 0x33, 0xec, 0x3f, 0x5e, 0x78, 0xb1, 0xb6, 0xe3, + 0xfb, 0x3b, 0x6d, 0x3a, 0x83, 0xbf, 0xb6, 0x7b, 0x0f, 0x66, 0x22, 0x6f, 0x9f, 0x86, 0x91, 0xb3, + 0xdf, 0x15, 0x08, 0x73, 0x3b, 0x5e, 0xb4, 0xdb, 0xdb, 0xbe, 0xd1, 0xf2, 0xf7, 0x67, 0x76, 0x02, + 0xe7, 0xa1, 0x17, 0x39, 0x91, 0xe7, 0x77, 0x9c, 0xf6, 0x4c, 0x44, 0xdb, 0xb4, 0xeb, 0x07, 0xd1, + 0x8c, 0xd3, 0xf5, 0x66, 0xf0, 0x1b, 0x33, 0x8f, 0x02, 0xa7, 0xdb, 0xa5, 0x41, 0xf2, 0x0f, 0x67, + 0x62, 0xfe, 0xc3, 0x3c, 0x94, 0xef, 0x51, 0xda, 0xad, 0xb7, 0xbd, 0x87, 0x94, 0xbc, 0x02, 0x85, + 0x15, 0x67, 0x9f, 0x4e, 0x1b, 0x97, 0x8d, 0xab, 0xe5, 0xc6, 0xe4, 0xd1, 0x61, 0x6d, 0x2c, 0xa4, + 0xc1, 0x43, 0x1a, 0xd8, 0x1d, 0x67, 0x9f, 0x5a, 0x58, 0x48, 0xbe, 0x00, 0x65, 0xf6, 0x37, 0xec, + 0x3a, 0x2d, 0x3a, 0x9d, 0x43, 0xcc, 0xf1, 0xa3, 0xc3, 0x5a, 0xb9, 0x23, 0x81, 0x56, 0x52, 0x4e, + 0xae, 0xc0, 0xe8, 0x32, 0x75, 0x42, 0xba, 0x34, 0x3f, 0x9d, 0xbf, 0x6c, 0x5c, 0xcd, 0x37, 0x2a, + 0x47, 0x87, 0xb5, 0x52, 0x9b, 0x81, 0x6c, 0xcf, 0xb5, 0x64, 0x21, 0x59, 0x82, 0xd1, 0x85, 0xc7, + 0x5d, 0x2f, 0xa0, 0xe1, 0x74, 0xe1, 0xb2, 0x71, 0x75, 0x6c, 0xf6, 0xe2, 0x0d, 0xde, 0xfe, 0x1b, + 0xb2, 0xfd, 0x37, 0xd6, 0x65, 0xfb, 0x1b, 0xa7, 0xbf, 0x7f, 0x58, 0x3b, 0x75, 0x74, 0x58, 0x1b, + 0xa5, 0x9c, 0xe4, 0x3b, 0xff, 0xb5, 0x66, 0x58, 0x92, 0x9e, 0xbc, 0x0b, 0x85, 0xf5, 0x83, 0x2e, + 0x9d, 0x2e, 0x5f, 0x36, 0xae, 0x4e, 0xcc, 0xbe, 0x74, 0x83, 0xf7, 0x78, 0xdc, 0xc8, 0xe4, 0x3f, + 0x86, 0xd5, 0x28, 0x1d, 0x1d, 0xd6, 0x0a, 0x0c, 0xc5, 0x42, 0x2a, 0xf2, 0x26, 0x14, 0x17, 0xfd, + 0x30, 0x5a, 0x9a, 0x9f, 0x06, 0x6c, 0xda, 0xd9, 0xa3, 0xc3, 0xda, 0xd4, 0xae, 0x1f, 0x46, 0xb6, + 0xe7, 0xbe, 0xe1, 0xef, 0x7b, 0x11, 0xdd, 0xef, 0x46, 0x07, 0x96, 0x40, 0x32, 0xb7, 0x61, 0x5c, + 0xe3, 0x47, 0xc6, 0x60, 0x74, 0x63, 0xe5, 0xde, 0xca, 0xea, 0xd6, 0x4a, 0xf5, 0x14, 0x29, 0x41, + 0x61, 0x65, 0x75, 0x7e, 0xa1, 0x6a, 0x90, 0x51, 0xc8, 0xd7, 0xd7, 0xd6, 0xaa, 0x39, 0x52, 0x81, + 0xd2, 0x7c, 0x7d, 0xbd, 0xde, 0xa8, 0x37, 0x17, 0xaa, 0x79, 0x72, 0x1a, 0x26, 0xb7, 0x96, 0x56, + 0xe6, 0x57, 0xb7, 0x9a, 0xf6, 0xfc, 0x42, 0xf3, 0xde, 0xfa, 0xea, 0x5a, 0xb5, 0x40, 0x26, 0x00, + 0xee, 0x6d, 0x34, 0x16, 0xac, 0x95, 0x85, 0xf5, 0x85, 0x66, 0x75, 0xc4, 0xfc, 0xe5, 0x3c, 0x94, + 0xee, 0xd3, 0xc8, 0x71, 0x9d, 0xc8, 0x21, 0x97, 0xb4, 0x21, 0xc2, 0xda, 0x2b, 0x63, 0xf3, 0x4a, + 0xff, 0xd8, 0x8c, 0x1c, 0x1d, 0xd6, 0x8c, 0x37, 0xd5, 0x31, 0x79, 0x07, 0xc6, 0xe6, 0x69, 0xd8, + 0x0a, 0xbc, 0x2e, 0x9b, 0x2f, 0x38, 0x2e, 0xe5, 0xc6, 0x85, 0xa3, 0xc3, 0xda, 0x59, 0x37, 0x01, + 0x2b, 0x6d, 0x55, 0xb1, 0xc9, 0x12, 0x14, 0x97, 0x9d, 0x6d, 0xda, 0x0e, 0xa7, 0x47, 0x2e, 0xe7, + 0xaf, 0x8e, 0xcd, 0xbe, 0x20, 0xfa, 0x57, 0x56, 0xf0, 0x06, 0x2f, 0x5d, 0xe8, 0x44, 0xc1, 0x41, + 0xe3, 0xcc, 0xd1, 0x61, 0xad, 0xda, 0x46, 0x80, 0xda, 0x77, 0x1c, 0x85, 0x34, 0x93, 0x31, 0x2f, + 0x9e, 0x38, 0xe6, 0x2f, 0x7e, 0xff, 0xb0, 0x66, 0xb0, 0xb1, 0x10, 0x63, 0x9e, 0xf0, 0xd3, 0x47, + 0xff, 0x32, 0xe4, 0x96, 0xe6, 0xa7, 0x47, 0x71, 0xae, 0x55, 0x8f, 0x0e, 0x6b, 0x15, 0x6d, 0xd8, + 0x72, 0x4b, 0xf3, 0x17, 0xdf, 0x86, 0x31, 0xa5, 0x8e, 0xa4, 0x0a, 0xf9, 0x3d, 0x7a, 0xc0, 0xfb, + 0xd3, 0x62, 0xff, 0x92, 0x33, 0x30, 0xf2, 0xd0, 0x69, 0xf7, 0x44, 0x07, 0x5a, 0xfc, 0xc7, 0x57, + 0x72, 0x3f, 0x61, 0x98, 0xbf, 0x51, 0x80, 0x92, 0xe5, 0xf3, 0x75, 0x46, 0xae, 0xc1, 0x48, 0x33, + 0x72, 0x22, 0x39, 0x14, 0xa7, 0x8f, 0x0e, 0x6b, 0x93, 0x21, 0x03, 0x28, 0xdf, 0xe3, 0x18, 0x0c, + 0x75, 0x6d, 0xd7, 0x09, 0xe5, 0x90, 0x20, 0x6a, 0x97, 0x01, 0x54, 0x54, 0xc4, 0x20, 0x57, 0xa0, + 0x70, 0xdf, 0x77, 0xa9, 0x18, 0x15, 0x72, 0x74, 0x58, 0x9b, 0xd8, 0xf7, 0x5d, 0x15, 0x11, 0xcb, + 0xc9, 0x1b, 0x50, 0x9e, 0xeb, 0x05, 0x01, 0xed, 0xb0, 0xa9, 0x5a, 0x40, 0xe4, 0x89, 0xa3, 0xc3, + 0x1a, 0xb4, 0x38, 0x90, 0x2d, 0xae, 0x04, 0x81, 0x75, 0x75, 0x33, 0x72, 0x82, 0x88, 0xba, 0xd3, + 0x23, 0x43, 0x75, 0x35, 0x5b, 0x5e, 0x53, 0x21, 0x27, 0x49, 0x77, 0xb5, 0xe0, 0x44, 0x16, 0x61, + 0xec, 0x6e, 0xe0, 0xb4, 0xe8, 0x1a, 0x0d, 0x3c, 0xdf, 0xc5, 0x31, 0xcc, 0x37, 0xae, 0x1c, 0x1d, + 0xd6, 0xce, 0xed, 0x30, 0xb0, 0xdd, 0x45, 0x78, 0x42, 0xfd, 0xa3, 0xc3, 0x5a, 0x69, 0xbe, 0x17, + 0x60, 0xef, 0x59, 0x2a, 0x29, 0xf9, 0x69, 0x36, 0x24, 0x61, 0x84, 0x5d, 0x4b, 0x5d, 0x1c, 0xbd, + 0xe3, 0xab, 0x68, 0x8a, 0x2a, 0x9e, 0x6b, 0x3b, 0x61, 0x64, 0x07, 0x9c, 0x2e, 0x55, 0x4f, 0x95, + 0x25, 0x59, 0x85, 0x52, 0xb3, 0xb5, 0x4b, 0xdd, 0x5e, 0x9b, 0x4e, 0x97, 0x90, 0xfd, 0x79, 0x31, + 0x71, 0xe5, 0x78, 0xca, 0xe2, 0xc6, 0x45, 0xc1, 0x9b, 0x84, 0x02, 0xa2, 0xf4, 0x7d, 0xcc, 0xe4, + 0x2b, 0xa5, 0xdf, 0xfe, 0xfd, 0xda, 0xa9, 0x5f, 0xfc, 0x2f, 0x97, 0x4f, 0x99, 0xff, 0x32, 0x07, + 0xd5, 0x34, 0x13, 0xf2, 0x00, 0xc6, 0x37, 0xba, 0xae, 0x13, 0xd1, 0xb9, 0xb6, 0x47, 0x3b, 0x51, + 0x88, 0x93, 0xe4, 0xf8, 0x36, 0xbd, 0x2a, 0xbe, 0x3b, 0xdd, 0x43, 0x42, 0xbb, 0xc5, 0x29, 0x53, + 0xad, 0xd2, 0xd9, 0x26, 0xdf, 0x69, 0xa2, 0x9c, 0x0e, 0x71, 0x86, 0x3d, 0xd9, 0x77, 0xb8, 0x84, + 0x1f, 0xf0, 0x1d, 0xc1, 0x56, 0x4c, 0xa0, 0x8e, 0xbb, 0x7d, 0x80, 0x33, 0x73, 0xf8, 0x09, 0xc4, + 0x48, 0x32, 0x26, 0x10, 0x03, 0x9b, 0xff, 0xdd, 0x80, 0x09, 0x8b, 0x86, 0x7e, 0x2f, 0x68, 0xd1, + 0x45, 0xea, 0xb8, 0x34, 0x60, 0xd3, 0xff, 0x9e, 0xd7, 0x71, 0xc5, 0x9a, 0xc2, 0xe9, 0xbf, 0xe7, + 0x75, 0xd4, 0x25, 0x8c, 0xe5, 0xe4, 0x8b, 0x30, 0xda, 0xec, 0x6d, 0x23, 0x2a, 0x5f, 0x53, 0xe7, + 0x70, 0xc4, 0x7a, 0xdb, 0x76, 0x0a, 0x5d, 0xa2, 0x91, 0x19, 0x18, 0xdd, 0xa4, 0x41, 0x98, 0x48, + 0x3c, 0x94, 0xec, 0x0f, 0x39, 0x48, 0x25, 0x10, 0x58, 0xe4, 0x6e, 0x22, 0x75, 0xc5, 0x9e, 0x34, + 0x99, 0x92, 0x75, 0xc9, 0x54, 0xd9, 0x17, 0x10, 0x75, 0xaa, 0x48, 0x2c, 0xf3, 0xd7, 0x73, 0x50, + 0x9d, 0x77, 0x22, 0x67, 0xdb, 0x09, 0x45, 0x7f, 0x6e, 0xde, 0x62, 0x72, 0x5c, 0x69, 0x28, 0xca, + 0x71, 0x56, 0xf3, 0x4f, 0xdd, 0xbc, 0xd7, 0xd2, 0xcd, 0x1b, 0x63, 0x1b, 0xa4, 0x68, 0x5e, 0xd2, + 0xa8, 0xf7, 0x4e, 0x6e, 0x54, 0x55, 0x34, 0xaa, 0x24, 0x1b, 0x95, 0x34, 0x85, 0xbc, 0x07, 0x85, + 0x66, 0x97, 0xb6, 0x84, 0x10, 0x91, 0xb2, 0x5f, 0x6f, 0x1c, 0x43, 0xd8, 0xbc, 0xd5, 0xa8, 0x08, + 0x36, 0x85, 0xb0, 0x4b, 0x5b, 0x16, 0x92, 0x29, 0x8b, 0xe6, 0xbb, 0x45, 0x38, 0x93, 0x45, 0x46, + 0xde, 0xd3, 0x37, 0x27, 0xde, 0x3d, 0x2f, 0x0c, 0xdc, 0x9c, 0xa6, 0x0d, 0x7d, 0x7b, 0xba, 0x0e, + 0xa5, 0x35, 0x36, 0x21, 0x5b, 0x7e, 0x5b, 0xf4, 0x1c, 0x93, 0x8a, 0xa5, 0xae, 0x84, 0x19, 0x56, + 0x5c, 0x4e, 0x5e, 0x80, 0xfc, 0x86, 0xb5, 0x24, 0xba, 0xab, 0x7c, 0x74, 0x58, 0xcb, 0xf7, 0x02, + 0x6f, 0xda, 0xb0, 0x18, 0x94, 0xcc, 0x40, 0x71, 0xae, 0x3e, 0x47, 0x83, 0x08, 0xbb, 0xa9, 0xd2, + 0x38, 0xcf, 0x66, 0x4b, 0xcb, 0xb1, 0x5b, 0x34, 0x88, 0xb4, 0xcf, 0x0b, 0x34, 0xf2, 0x05, 0xc8, + 0xd7, 0xb7, 0x9a, 0xa2, 0x67, 0x40, 0xf4, 0x4c, 0x7d, 0xab, 0xd9, 0x18, 0x17, 0x1d, 0x91, 0x77, + 0x1e, 0x85, 0x8c, 0x7b, 0x7d, 0xab, 0xa9, 0x8e, 0x56, 0xf1, 0x98, 0xd1, 0xba, 0x0a, 0x25, 0xa6, + 0x67, 0xb0, 0x0d, 0x1e, 0x85, 0x62, 0x99, 0xab, 0x4f, 0xbb, 0x02, 0x66, 0xc5, 0xa5, 0xe4, 0x95, + 0x58, 0x6d, 0x29, 0x25, 0xfc, 0x84, 0xda, 0x22, 0x95, 0x15, 0xf2, 0x18, 0xc6, 0xe7, 0x0f, 0x3a, + 0xce, 0xbe, 0xd7, 0x12, 0x5b, 0x78, 0x19, 0xb7, 0xf0, 0x1b, 0xc7, 0x0c, 0xe3, 0x0d, 0x8d, 0x80, + 0xef, 0xea, 0x52, 0xf8, 0x4e, 0xbb, 0xbc, 0xcc, 0x4e, 0xef, 0xf0, 0xd3, 0x86, 0xa5, 0x7f, 0x88, + 0xad, 0x25, 0x29, 0x22, 0x51, 0xaf, 0x4a, 0xa6, 0x9d, 0x04, 0x27, 0x6b, 0x29, 0x10, 0x10, 0x75, + 0x2d, 0xc5, 0x9b, 0xee, 0x7b, 0x90, 0xbf, 0x3b, 0xb7, 0x36, 0x3d, 0x86, 0x3c, 0x88, 0xe0, 0x71, + 0x77, 0x6e, 0x6d, 0xae, 0xed, 0xf7, 0xdc, 0xe6, 0x47, 0xcb, 0x8d, 0xf3, 0x82, 0xcd, 0xf8, 0x4e, + 0xab, 0xab, 0xd5, 0x88, 0xd1, 0x91, 0x05, 0x28, 0xc9, 0x56, 0x4e, 0x57, 0x90, 0xc7, 0x54, 0xaa, + 0xf1, 0x9b, 0xb7, 0xf8, 0x5a, 0x73, 0xc5, 0x6f, 0xb5, 0x16, 0x12, 0xe7, 0xe2, 0x16, 0x90, 0xfe, + 0x7e, 0xc9, 0xd0, 0x24, 0xbe, 0xa0, 0x6a, 0x12, 0x63, 0xb3, 0x67, 0xc5, 0xb7, 0xe6, 0xfc, 0xfd, + 0x7d, 0xa7, 0xe3, 0x22, 0xed, 0xe6, 0xac, 0xaa, 0x60, 0xd4, 0x61, 0x22, 0xa9, 0xc8, 0xb2, 0x17, + 0x46, 0x64, 0x06, 0xca, 0x12, 0xc2, 0x36, 0x91, 0x7c, 0x66, 0x95, 0xad, 0x04, 0xc7, 0xfc, 0xf3, + 0x1c, 0x40, 0x52, 0xf2, 0x9c, 0xca, 0x99, 0x2f, 0x6b, 0x72, 0xe6, 0x6c, 0x7a, 0x82, 0x0e, 0x94, + 0x30, 0xe4, 0x03, 0x28, 0x32, 0x95, 0xab, 0x27, 0x55, 0xca, 0xf3, 0x69, 0x52, 0x2c, 0xdc, 0xbc, + 0xd5, 0x98, 0x10, 0xc4, 0xc5, 0x10, 0x21, 0x96, 0x20, 0x53, 0x44, 0xd4, 0xff, 0x2a, 0x24, 0x83, + 0x21, 0x84, 0xd3, 0x55, 0x45, 0xba, 0x18, 0xc9, 0x7a, 0x94, 0xd2, 0x45, 0x91, 0x2d, 0x17, 0xb8, + 0x6c, 0xe1, 0x9d, 0x3a, 0x2a, 0x64, 0x4b, 0x5a, 0xb2, 0xf0, 0x0e, 0x3c, 0x51, 0xb2, 0x74, 0xd3, + 0xcb, 0xb6, 0x80, 0xd3, 0xe0, 0x6a, 0x66, 0xaf, 0x64, 0x2d, 0xd8, 0xcb, 0x27, 0x2d, 0xd8, 0xf4, + 0x72, 0xbd, 0x35, 0x48, 0x96, 0x9d, 0x95, 0xab, 0xcb, 0x79, 0xa4, 0x92, 0xa3, 0x4c, 0x7b, 0x87, + 0x2f, 0xcd, 0xe2, 0xc0, 0xa5, 0x79, 0x36, 0x73, 0x69, 0xf2, 0x85, 0xf9, 0x0e, 0x8c, 0xd4, 0x7f, + 0xb6, 0x17, 0x50, 0xa1, 0xfb, 0x55, 0xe4, 0x37, 0x19, 0x2c, 0x5e, 0xd3, 0x93, 0x0e, 0xfb, 0xa9, + 0xea, 0xcc, 0x58, 0xce, 0xbe, 0xbc, 0xbe, 0xdc, 0x14, 0x7a, 0x1d, 0x49, 0x75, 0xcb, 0xfa, 0xb2, + 0x52, 0xed, 0x48, 0x6b, 0x35, 0xa3, 0x22, 0x33, 0x90, 0xab, 0xcf, 0xa3, 0xb1, 0x38, 0x36, 0x5b, + 0x96, 0x9f, 0x9d, 0x6f, 0x9c, 0x11, 0x24, 0x15, 0x47, 0xb3, 0x1f, 0xea, 0xf3, 0x9f, 0xdd, 0xe2, + 0x6f, 0x2b, 0x6a, 0x82, 0x98, 0xa6, 0xcc, 0x1c, 0x15, 0x93, 0xc5, 0x48, 0x94, 0x96, 0xbe, 0xc9, + 0x12, 0x4f, 0x95, 0x6b, 0x7c, 0xe0, 0x72, 0x7d, 0x03, 0x37, 0xa6, 0x6c, 0x42, 0x38, 0x5c, 0xe6, + 0xff, 0x30, 0x10, 0x97, 0xbc, 0x01, 0x45, 0x8b, 0xee, 0x24, 0x7b, 0x2d, 0xda, 0x6c, 0x01, 0x42, + 0xd4, 0x0f, 0x70, 0x1c, 0x14, 0xe4, 0xd4, 0x0d, 0x77, 0xbd, 0x07, 0x91, 0xf8, 0x4a, 0x2c, 0xc8, + 0x05, 0x58, 0x11, 0xe4, 0x02, 0xa2, 0x09, 0x72, 0x01, 0x63, 0x53, 0xcc, 0x9a, 0x6f, 0x0a, 0x65, + 0x52, 0xd6, 0xd4, 0x9a, 0x57, 0xc6, 0x2a, 0x70, 0xb5, 0xb1, 0xb2, 0xe6, 0x9b, 0xe4, 0x36, 0x94, + 0xeb, 0xad, 0x96, 0xdf, 0x53, 0x8c, 0x9e, 0xe9, 0xa3, 0xc3, 0xda, 0x19, 0x87, 0x03, 0x75, 0x13, + 0x3d, 0x41, 0x35, 0x1b, 0x49, 0xad, 0x19, 0x8f, 0xb9, 0x76, 0x2f, 0x8c, 0x68, 0xb0, 0x34, 0x2f, + 0x9a, 0x8c, 0x3c, 0x5a, 0x1c, 0x98, 0xe2, 0x11, 0xa3, 0x9a, 0xff, 0xd9, 0xc0, 0x1a, 0x93, 0xb7, + 0x01, 0x96, 0x3a, 0x4c, 0xb1, 0x6d, 0xd1, 0x98, 0x01, 0x1a, 0xcf, 0x9e, 0x80, 0xea, 0x1c, 0x14, + 0x64, 0xfd, 0xd3, 0xb9, 0xa1, 0x3f, 0xcd, 0x3e, 0x29, 0xd5, 0x64, 0x71, 0x8e, 0x22, 0x3e, 0x19, + 0x08, 0x68, 0xea, 0x93, 0x09, 0x32, 0xb9, 0x02, 0xa3, 0x4b, 0xf5, 0xfb, 0xf5, 0x5e, 0xb4, 0x8b, + 0xfd, 0x55, 0xe2, 0x02, 0xcb, 0x73, 0xf6, 0x6d, 0xa7, 0x17, 0xed, 0x5a, 0xb2, 0xd0, 0xfc, 0x45, + 0x03, 0xc6, 0x94, 0xb5, 0xca, 0xaa, 0xba, 0x16, 0xf8, 0x9f, 0xd0, 0x56, 0xa4, 0xf7, 0x52, 0x97, + 0x03, 0x53, 0x55, 0x8d, 0x51, 0x53, 0xbd, 0x93, 0x7b, 0x82, 0xde, 0x31, 0x67, 0x84, 0x08, 0x60, + 0x36, 0x80, 0x72, 0xc4, 0x81, 0x36, 0x00, 0xd3, 0x71, 0x54, 0x1b, 0x80, 0x95, 0x9b, 0x7f, 0x64, + 0xb0, 0xa5, 0x4b, 0x66, 0x00, 0xee, 0xd1, 0x83, 0xc8, 0xd9, 0xbe, 0xe3, 0xb5, 0xb5, 0xa3, 0xab, + 0x3d, 0x84, 0xda, 0x0f, 0xbc, 0x36, 0xb5, 0x14, 0x14, 0x72, 0x0b, 0x4a, 0xf7, 0x82, 0xed, 0xb7, + 0x10, 0x3d, 0x17, 0x8b, 0xe0, 0xd3, 0x7b, 0xc1, 0xf6, 0x5b, 0x88, 0xac, 0xce, 0x57, 0x89, 0x48, + 0x4c, 0x28, 0xce, 0xfb, 0xfb, 0x8e, 0x27, 0xb7, 0x3d, 0x60, 0x7b, 0x87, 0x8b, 0x10, 0x4b, 0x94, + 0x30, 0xa1, 0xdf, 0x5c, 0x5b, 0x11, 0x13, 0x13, 0x85, 0x7e, 0xd8, 0xed, 0x58, 0x0c, 0x66, 0x7e, + 0xcf, 0x80, 0x31, 0x45, 0x22, 0x91, 0x2f, 0x09, 0x33, 0xdf, 0xc0, 0x43, 0xaa, 0x73, 0xfd, 0x32, + 0x8b, 0x95, 0xf2, 0xed, 0x9a, 0x99, 0xff, 0xc2, 0xe8, 0x4f, 0xa4, 0x41, 0x6e, 0x18, 0x69, 0xf0, + 0x36, 0x00, 0xd7, 0xe5, 0xb0, 0x3b, 0x95, 0x79, 0xa3, 0x1c, 0xea, 0xa9, 0x83, 0x91, 0x20, 0x9b, + 0xff, 0x7f, 0x0e, 0x4a, 0xc2, 0x56, 0x99, 0x7d, 0x4e, 0x75, 0x88, 0xb7, 0x34, 0x1d, 0xe2, 0xb4, + 0x20, 0x55, 0x94, 0xdb, 0xd9, 0x13, 0x6c, 0x94, 0xb7, 0xa1, 0x22, 0xbb, 0x00, 0x55, 0xb1, 0x6b, + 0x30, 0x2a, 0xad, 0x6c, 0xae, 0x88, 0x4d, 0x6a, 0x3c, 0x37, 0x67, 0x2d, 0x59, 0x6e, 0xfe, 0xf9, + 0x88, 0xa4, 0xe5, 0x5f, 0x62, 0x5d, 0x58, 0x77, 0xdd, 0x40, 0xed, 0x42, 0xc7, 0x75, 0x03, 0x0b, + 0xa1, 0x6c, 0xa0, 0xd6, 0x7a, 0xdb, 0x6d, 0xaf, 0x85, 0x38, 0xca, 0xaa, 0xe9, 0x22, 0xd4, 0x66, + 0xa8, 0xea, 0x40, 0x25, 0xc8, 0x9a, 0x89, 0x90, 0x3f, 0xd6, 0x44, 0xf8, 0x29, 0x28, 0xcf, 0xed, + 0xbb, 0x9a, 0x0a, 0x61, 0x66, 0x74, 0xca, 0x8d, 0x18, 0x89, 0x2b, 0x0f, 0x97, 0x44, 0x1f, 0x9d, + 0x69, 0xed, 0xbb, 0xfd, 0x8a, 0x43, 0xc2, 0x52, 0xd3, 0xf1, 0x47, 0x9e, 0x46, 0xc7, 0xbf, 0x0d, + 0xe5, 0x8d, 0x90, 0xae, 0xf7, 0x3a, 0x1d, 0xda, 0x46, 0x75, 0xa2, 0xc4, 0x65, 0x4f, 0x2f, 0xa4, + 0x76, 0x84, 0x50, 0xb5, 0x02, 0x31, 0xaa, 0x3a, 0xad, 0x46, 0x8f, 0x99, 0x56, 0x5f, 0x82, 0x42, + 0xbd, 0xdb, 0x95, 0xc6, 0x4f, 0xbc, 0x49, 0x76, 0xbb, 0xb8, 0xf5, 0x4d, 0x38, 0xdd, 0xae, 0x6e, + 0xca, 0x20, 0x36, 0xa1, 0x40, 0xee, 0xf5, 0xb6, 0x69, 0xd0, 0xa1, 0x11, 0x0d, 0x85, 0x68, 0x0e, + 0xa7, 0x01, 0x79, 0x4c, 0xcb, 0x33, 0xe6, 0x34, 0x02, 0x1a, 0xae, 0xe7, 0xf7, 0x7a, 0xdb, 0xd4, + 0x16, 0x32, 0x5e, 0xed, 0xbb, 0x0c, 0x86, 0x4c, 0x36, 0xad, 0x51, 0x1a, 0xe0, 0x3c, 0x18, 0x4b, + 0x64, 0x53, 0x97, 0xd2, 0x20, 0x3d, 0x0b, 0x62, 0xc4, 0x8b, 0x4d, 0x98, 0xd0, 0x07, 0xed, 0x19, + 0x68, 0x23, 0x1f, 0x16, 0x4a, 0xa5, 0x6a, 0xd9, 0xfc, 0xe5, 0x1c, 0x8c, 0xd5, 0xbb, 0xdd, 0xe7, + 0xfc, 0xd8, 0xe2, 0x27, 0x34, 0x51, 0x70, 0x2e, 0x19, 0xf2, 0x27, 0x38, 0xb1, 0xf8, 0x1b, 0x03, + 0x26, 0x53, 0x14, 0x6a, 0xed, 0x8d, 0x21, 0xcd, 0xf8, 0xdc, 0x90, 0x66, 0x7c, 0x7e, 0xb0, 0x19, + 0xaf, 0x2e, 0xb4, 0xc2, 0xd3, 0x2c, 0xb4, 0xd7, 0x21, 0x5f, 0xef, 0x76, 0x45, 0xaf, 0x54, 0x92, + 0x5e, 0xd9, 0xbc, 0xc5, 0x77, 0x2f, 0xa7, 0xdb, 0xb5, 0x18, 0x86, 0xf9, 0x26, 0x94, 0x11, 0x8c, + 0x62, 0xf0, 0xb2, 0x58, 0x3f, 0x5c, 0x06, 0x6a, 0x64, 0x7c, 0xad, 0x98, 0xff, 0xc7, 0x80, 0x11, + 0xfc, 0xfd, 0x9c, 0x4e, 0x97, 0x59, 0x6d, 0xba, 0x54, 0x95, 0xe9, 0x32, 0xcc, 0x44, 0xf9, 0x93, + 0x3c, 0xf6, 0x96, 0x98, 0x22, 0xc2, 0x10, 0x34, 0x32, 0x0c, 0xc1, 0xa7, 0x90, 0xfa, 0x7b, 0x69, + 0x93, 0x30, 0x8f, 0x83, 0xf1, 0x4a, 0xba, 0xaa, 0xcf, 0xc4, 0x1a, 0x5c, 0x04, 0xb2, 0xd4, 0x09, + 0x69, 0xab, 0x17, 0xd0, 0xe6, 0x9e, 0xd7, 0xdd, 0xa4, 0x81, 0xf7, 0xe0, 0x40, 0xa8, 0x93, 0x28, + 0x98, 0x3d, 0x51, 0x6a, 0x87, 0x7b, 0x5e, 0xd7, 0x7e, 0x88, 0xe5, 0x56, 0x06, 0x0d, 0xf9, 0x00, + 0x46, 0x2d, 0xfa, 0x28, 0xf0, 0x22, 0x2a, 0xfa, 0x76, 0x22, 0x36, 0x1e, 0x10, 0xca, 0x15, 0x9a, + 0x80, 0xff, 0x50, 0xc7, 0x5f, 0x94, 0x7f, 0x76, 0xb6, 0xd7, 0x77, 0x47, 0x70, 0x2d, 0x9c, 0x70, + 0xbd, 0x76, 0x8c, 0x55, 0xaf, 0x0f, 0x66, 0xfe, 0x49, 0x06, 0x73, 0x13, 0x2a, 0xcc, 0xde, 0x4b, + 0x99, 0xf7, 0x97, 0x92, 0xb1, 0xbc, 0xa1, 0x16, 0x1f, 0x77, 0xb3, 0xa6, 0xf1, 0x21, 0x76, 0x7a, + 0x92, 0xf0, 0x1b, 0xbb, 0x17, 0x15, 0xc6, 0x19, 0xd3, 0x23, 0x16, 0x1d, 0x2d, 0xde, 0x59, 0x4f, + 0x3c, 0x31, 0x8a, 0x4f, 0x37, 0x31, 0x46, 0x3f, 0xcd, 0xc4, 0x48, 0xdf, 0x69, 0x96, 0x9e, 0xe4, + 0x4e, 0xf3, 0xe2, 0x07, 0x30, 0xd5, 0xd7, 0xc3, 0x4f, 0x72, 0x2f, 0xf8, 0xd9, 0x4d, 0xcb, 0x9f, + 0x8f, 0xfb, 0x85, 0xcc, 0xa2, 0x0d, 0xeb, 0x05, 0xb4, 0x15, 0xa1, 0xe8, 0x15, 0xd2, 0x32, 0x10, + 0xb0, 0x94, 0x91, 0x8d, 0x30, 0xf2, 0x3e, 0x8c, 0xf2, 0x7b, 0x95, 0x70, 0x3a, 0x87, 0x63, 0x3f, + 0x2e, 0xbe, 0xc8, 0xa1, 0xe2, 0x72, 0x9b, 0x63, 0xa8, 0xbd, 0x2a, 0x88, 0xcc, 0xbb, 0x50, 0x14, + 0xf7, 0x32, 0xc7, 0xaf, 0x8b, 0x1a, 0x8c, 0x6c, 0x26, 0x3d, 0x83, 0x67, 0xe9, 0xbc, 0x11, 0x16, + 0x87, 0x9b, 0xbf, 0x6a, 0xc0, 0x84, 0xde, 0x4a, 0x72, 0x03, 0x8a, 0xe2, 0xe2, 0xd0, 0xc0, 0x8b, + 0x43, 0xd6, 0x9a, 0x22, 0xbf, 0x32, 0xd4, 0x2e, 0x0a, 0x05, 0x16, 0x13, 0xfd, 0x82, 0x03, 0xb6, + 0x45, 0x88, 0x7e, 0x31, 0x49, 0x2d, 0x59, 0xc6, 0xec, 0x34, 0x8b, 0x86, 0xbd, 0x76, 0xa4, 0xda, + 0x69, 0x01, 0x42, 0x2c, 0x51, 0x62, 0x1e, 0x1a, 0x00, 0xcd, 0xe6, 0xe2, 0x3d, 0x7a, 0xb0, 0xe6, + 0x78, 0x01, 0xda, 0xba, 0xb8, 0x1a, 0xef, 0x89, 0xd1, 0xaa, 0x08, 0x5b, 0x97, 0xaf, 0xdc, 0x3d, + 0x7a, 0xa0, 0xd9, 0xba, 0x12, 0x15, 0x97, 0x7c, 0xe0, 0x3d, 0x74, 0x22, 0xca, 0x08, 0x73, 0x48, + 0xc8, 0x97, 0x3c, 0x87, 0xa6, 0x28, 0x15, 0x64, 0xf2, 0x31, 0x4c, 0x24, 0xbf, 0xd0, 0x5b, 0x21, + 0x8f, 0x86, 0xa0, 0x9c, 0x11, 0x7a, 0x61, 0xe3, 0xa5, 0xa3, 0xc3, 0xda, 0x45, 0x85, 0xab, 0xcd, + 0xb0, 0x14, 0xd6, 0x29, 0x66, 0xe6, 0x1f, 0x18, 0x00, 0xeb, 0xcb, 0x4d, 0xd9, 0xc0, 0x2b, 0x50, + 0x88, 0x8f, 0x90, 0x2a, 0xdc, 0xa0, 0x4e, 0x59, 0x8c, 0x58, 0x4e, 0x5e, 0x81, 0x7c, 0xd2, 0x92, + 0xa9, 0xa3, 0xc3, 0xda, 0xb8, 0xde, 0x02, 0x56, 0x4a, 0xee, 0xc2, 0xe8, 0x50, 0x75, 0xc6, 0xd9, + 0x99, 0x51, 0x57, 0x49, 0x8d, 0xa3, 0xf0, 0xe1, 0xd6, 0xfa, 0xe7, 0x77, 0x14, 0xbe, 0x9d, 0x83, + 0x49, 0xd6, 0xaf, 0xf5, 0x5e, 0xb4, 0xeb, 0x07, 0x5e, 0x74, 0xf0, 0xdc, 0x9a, 0xd2, 0xef, 0x6a, + 0x0a, 0xd1, 0x45, 0x29, 0xb6, 0xd4, 0xb6, 0x0d, 0x65, 0x51, 0xff, 0xd5, 0x28, 0x9c, 0xce, 0xa0, + 0x22, 0x6f, 0x08, 0x97, 0x9d, 0xe4, 0xa0, 0x09, 0x5d, 0x72, 0x7e, 0x74, 0x58, 0xab, 0x48, 0xf4, + 0xf5, 0xc4, 0x45, 0x67, 0x16, 0xc6, 0x84, 0xbd, 0xb4, 0x92, 0x68, 0xd4, 0xe8, 0xeb, 0x21, 0x0f, + 0xd2, 0x50, 0x34, 0xa9, 0x48, 0xa4, 0x0e, 0x95, 0xb9, 0x5d, 0xda, 0xda, 0xf3, 0x3a, 0x3b, 0xf7, + 0xe8, 0x01, 0xd7, 0x97, 0x2a, 0x8d, 0x17, 0x99, 0x79, 0xd6, 0x12, 0x70, 0x36, 0xa4, 0xba, 0xe5, + 0xa7, 0x91, 0x90, 0xf7, 0x61, 0xac, 0xe9, 0xed, 0x74, 0x24, 0x87, 0x02, 0x72, 0xb8, 0x74, 0x74, + 0x58, 0x3b, 0x17, 0x72, 0x70, 0x3f, 0x03, 0x95, 0x80, 0x5c, 0x83, 0x11, 0xcb, 0x6f, 0x53, 0xbe, + 0x0d, 0x0b, 0x27, 0x90, 0x80, 0x01, 0xd4, 0x03, 0x6d, 0xc4, 0x20, 0x8b, 0x30, 0xca, 0xfe, 0xb9, + 0xef, 0x74, 0xa7, 0x8b, 0x28, 0xb7, 0x49, 0xac, 0xe0, 0x23, 0xb4, 0xeb, 0x75, 0x76, 0x54, 0x1d, + 0xbf, 0x4d, 0xed, 0x7d, 0xa7, 0xab, 0xed, 0x8b, 0x1c, 0x91, 0x6c, 0xc2, 0x58, 0x22, 0x08, 0xc2, + 0xe9, 0x51, 0xed, 0x02, 0x29, 0x29, 0x69, 0xbc, 0x2c, 0x98, 0x9d, 0x8f, 0xda, 0x21, 0xce, 0xed, + 0x2e, 0xc3, 0xd7, 0x1b, 0xa3, 0x30, 0xd2, 0x6c, 0x90, 0xd2, 0x60, 0x1b, 0xc4, 0x38, 0xd1, 0x06, + 0x71, 0x01, 0x44, 0x27, 0xd5, 0xdb, 0x3b, 0xc2, 0x67, 0xeb, 0xda, 0xe0, 0x09, 0x76, 0x23, 0x41, + 0xc6, 0x35, 0xc9, 0x8f, 0xb3, 0x44, 0xff, 0x3b, 0xed, 0x1d, 0xed, 0x38, 0x2b, 0x46, 0x65, 0xdd, + 0x90, 0x88, 0x1a, 0x69, 0xb6, 0xcb, 0x6e, 0x48, 0x4a, 0x92, 0x6e, 0xf8, 0xe4, 0x51, 0x34, 0xa8, + 0x1b, 0x14, 0x46, 0x64, 0x05, 0xa0, 0xde, 0x8a, 0xbc, 0x87, 0x14, 0xa7, 0xc4, 0x98, 0xd6, 0x11, + 0x73, 0xf5, 0x7b, 0xf4, 0xa0, 0x49, 0xa3, 0xd8, 0x1d, 0xe2, 0xac, 0x83, 0xa8, 0xa9, 0x69, 0x62, + 0x29, 0x1c, 0x48, 0x17, 0xce, 0xd6, 0x5d, 0xd7, 0xe3, 0x7e, 0x7c, 0xeb, 0x01, 0x9b, 0xbf, 0x2e, + 0xb2, 0xae, 0x64, 0xb3, 0xbe, 0x26, 0x58, 0xbf, 0xec, 0xc4, 0x54, 0x76, 0xc4, 0xc9, 0xd2, 0x9f, + 0xc9, 0x66, 0x6c, 0xae, 0xc2, 0x84, 0xde, 0xa5, 0xba, 0x07, 0x5b, 0x05, 0x4a, 0x56, 0xb3, 0x6e, + 0x37, 0x17, 0xeb, 0x37, 0xab, 0x06, 0xa9, 0x42, 0x45, 0xfc, 0x9a, 0xb5, 0x67, 0xdf, 0xba, 0x5d, + 0xcd, 0x69, 0x90, 0xb7, 0x6e, 0xce, 0x56, 0xf3, 0xe6, 0x9f, 0x18, 0x50, 0x92, 0xf5, 0x23, 0xb7, + 0x21, 0xdf, 0x6c, 0x2e, 0xa6, 0xee, 0x2d, 0x93, 0xad, 0x97, 0x6f, 0x32, 0x61, 0xb8, 0xab, 0x6e, + 0x32, 0xcd, 0xe6, 0x22, 0xa3, 0x5b, 0x5f, 0x6e, 0x0a, 0xa5, 0x25, 0x63, 0xba, 0x4e, 0x0d, 0xb8, + 0xcc, 0xb9, 0x0d, 0xf9, 0x0f, 0xb7, 0xd6, 0x85, 0x35, 0x94, 0x31, 0xbe, 0x48, 0xf7, 0xc9, 0x23, + 0x75, 0xeb, 0x63, 0x04, 0xa6, 0x05, 0x63, 0xca, 0xd2, 0xe2, 0x4a, 0xc4, 0xbe, 0x1f, 0xfb, 0x76, + 0x09, 0x25, 0x82, 0x41, 0x2c, 0x51, 0xc2, 0x74, 0x9e, 0x65, 0xbf, 0xe5, 0xb4, 0x85, 0x36, 0x82, + 0x3a, 0x4f, 0x9b, 0x01, 0x2c, 0x0e, 0x37, 0xff, 0xcc, 0x80, 0xea, 0x5a, 0xe0, 0x3f, 0xf4, 0x98, + 0x04, 0x5e, 0xf7, 0xf7, 0x68, 0x67, 0xf3, 0x26, 0x79, 0x53, 0x0a, 0x01, 0xae, 0xc2, 0x9d, 0x67, + 0x54, 0x28, 0x04, 0x7e, 0x74, 0x58, 0x83, 0xe6, 0x41, 0x18, 0xd1, 0x7d, 0x56, 0x2e, 0x05, 0x81, + 0xe2, 0x22, 0x97, 0x1b, 0xde, 0xed, 0xe6, 0x04, 0x17, 0xb9, 0x1a, 0x8c, 0x60, 0x75, 0x14, 0xcf, + 0x87, 0x91, 0x88, 0x01, 0x2c, 0x0e, 0x57, 0x04, 0xf6, 0xaf, 0xe7, 0xfa, 0xda, 0x30, 0xfb, 0xb9, + 0x72, 0x5d, 0xd1, 0x1b, 0x37, 0xd4, 0x26, 0xf6, 0x75, 0x38, 0x93, 0xee, 0x12, 0x3c, 0x17, 0xa9, + 0xc3, 0xa4, 0x0e, 0x97, 0x47, 0x24, 0xe7, 0x33, 0xbf, 0xb5, 0x39, 0x6b, 0xa5, 0xf1, 0xcd, 0x1f, + 0x18, 0x50, 0xc6, 0x7f, 0xad, 0x5e, 0x9b, 0x32, 0xcd, 0xa6, 0xbe, 0xd5, 0x14, 0xb7, 0x58, 0xea, + 0x4d, 0x93, 0xf3, 0x28, 0xb4, 0xc5, 0x95, 0x97, 0x26, 0x47, 0x62, 0x64, 0x41, 0xca, 0xef, 0xec, + 0x42, 0x31, 0x43, 0x63, 0x52, 0x7e, 0xb9, 0x17, 0xa6, 0x48, 0x05, 0x32, 0x1b, 0x3f, 0xf6, 0xcb, + 0x6f, 0xcb, 0xf3, 0x64, 0x1c, 0x3f, 0xa4, 0xf3, 0xb5, 0xbb, 0x11, 0x89, 0x46, 0xde, 0x84, 0x22, + 0xfb, 0xb4, 0x25, 0x6f, 0x3e, 0xd0, 0xaa, 0xc0, 0x3a, 0x06, 0xda, 0x15, 0x22, 0x47, 0x32, 0xff, + 0x55, 0x2e, 0xdd, 0x81, 0x42, 0x0b, 0x78, 0xc2, 0xb5, 0xf1, 0x0e, 0x8c, 0xd4, 0xdb, 0x6d, 0xff, + 0x91, 0x90, 0x12, 0xf2, 0x98, 0x26, 0xee, 0x3f, 0xbe, 0xc3, 0x3a, 0x0c, 0x45, 0xbb, 0x32, 0x66, + 0x00, 0x32, 0x07, 0xe5, 0xfa, 0x56, 0x73, 0x69, 0x69, 0x7e, 0x7d, 0x7d, 0x59, 0x78, 0x26, 0xbf, + 0x26, 0xfb, 0xc7, 0xf3, 0x5c, 0x3b, 0x8a, 0xda, 0x03, 0x1c, 0x17, 0x13, 0x3a, 0xf2, 0x1e, 0xc0, + 0x87, 0xbe, 0xd7, 0xb9, 0x4f, 0xa3, 0x5d, 0xdf, 0x15, 0x8d, 0x67, 0x2a, 0xc5, 0xd8, 0x27, 0xbe, + 0xd7, 0xb1, 0xf7, 0x11, 0xcc, 0xea, 0x9e, 0x20, 0x59, 0xca, 0xff, 0xac, 0xa7, 0x1b, 0x7e, 0x84, + 0x3a, 0xcc, 0x48, 0xd2, 0xd3, 0xdb, 0x7e, 0x94, 0xbe, 0x98, 0x91, 0x68, 0xe6, 0xaf, 0xe5, 0x60, + 0x82, 0x5b, 0xaa, 0x7c, 0xc2, 0x3c, 0xb7, 0x8b, 0xf1, 0x1d, 0x6d, 0x31, 0x5e, 0x90, 0x1b, 0x83, + 0xd2, 0xb4, 0xa1, 0x96, 0xe2, 0x2e, 0x90, 0x7e, 0x1a, 0x62, 0xc9, 0xf3, 0x94, 0x61, 0x56, 0xe1, + 0xcd, 0xe4, 0xc2, 0x39, 0x44, 0x22, 0x1b, 0x45, 0x61, 0x68, 0x69, 0x3c, 0xcc, 0x5f, 0xcd, 0xc1, + 0xb8, 0xa2, 0x4f, 0x3e, 0xb7, 0x1d, 0xff, 0x15, 0xad, 0xe3, 0xe5, 0xc5, 0x85, 0xd2, 0xb2, 0xa1, + 0xfa, 0xbd, 0x07, 0x53, 0x7d, 0x24, 0x69, 0xb5, 0xdc, 0x18, 0x46, 0x2d, 0x7f, 0xa3, 0xff, 0x46, + 0x9c, 0x7b, 0x31, 0xc7, 0x37, 0xe2, 0xea, 0x15, 0xfc, 0xb7, 0x73, 0x70, 0x46, 0xfc, 0xaa, 0xf7, + 0x5c, 0x2f, 0x9a, 0xf3, 0x3b, 0x0f, 0xbc, 0x9d, 0xe7, 0x76, 0x2c, 0xea, 0xda, 0x58, 0xd4, 0xf4, + 0xb1, 0x50, 0x1a, 0x38, 0x78, 0x48, 0xcc, 0x7f, 0x5d, 0x82, 0xe9, 0x41, 0x04, 0xcc, 0xec, 0x57, + 0xac, 0x2a, 0x34, 0xfb, 0x53, 0x16, 0x2b, 0xb7, 0xa7, 0x12, 0x0f, 0x90, 0xdc, 0x10, 0x1e, 0x20, + 0xcb, 0x50, 0xc5, 0x4f, 0x35, 0x69, 0xc8, 0x3a, 0x21, 0x4c, 0x5c, 0x28, 0x2f, 0x1f, 0x1d, 0xd6, + 0x2e, 0x39, 0xac, 0xcc, 0x0e, 0x45, 0xa1, 0xdd, 0x0b, 0x3c, 0x85, 0x47, 0x1f, 0x25, 0xf9, 0x03, + 0x03, 0x26, 0x10, 0xb8, 0xf0, 0x90, 0x76, 0x22, 0x64, 0x56, 0x10, 0x97, 0x34, 0x71, 0xa4, 0x4a, + 0x33, 0x0a, 0xbc, 0xce, 0x0e, 0x1e, 0x24, 0x85, 0x8d, 0x6d, 0xd6, 0x0b, 0x7f, 0x79, 0x58, 0x7b, + 0xf7, 0xd3, 0x44, 0xbf, 0x08, 0x56, 0x21, 0x33, 0xe4, 0x79, 0x45, 0x29, 0x7e, 0x36, 0x55, 0xcd, + 0x54, 0x8d, 0xc8, 0x4f, 0xc2, 0xf9, 0x85, 0x8e, 0xb3, 0xdd, 0xa6, 0x73, 0x7e, 0x27, 0xf2, 0x3a, + 0x3d, 0xbf, 0x17, 0x36, 0x9c, 0xd6, 0x5e, 0xaf, 0x1b, 0x8a, 0xc3, 0x4e, 0x6c, 0x79, 0x2b, 0x2e, + 0xb4, 0xb7, 0x79, 0xa9, 0xc2, 0x72, 0x10, 0x03, 0xb2, 0x08, 0x53, 0xbc, 0xa8, 0xde, 0x8b, 0xfc, + 0x66, 0xcb, 0x69, 0x7b, 0x9d, 0x1d, 0x3c, 0x03, 0x2d, 0x35, 0x2e, 0x32, 0xdb, 0xd2, 0xe9, 0x45, + 0xbe, 0x1d, 0x72, 0xb8, 0xc2, 0xaf, 0x9f, 0x88, 0x2c, 0xc1, 0xa4, 0x45, 0x1d, 0xf7, 0xbe, 0xf3, + 0x78, 0xce, 0xe9, 0x3a, 0x2d, 0x2f, 0x3a, 0x40, 0xcb, 0x2c, 0xdf, 0xa8, 0x1d, 0x1d, 0xd6, 0x5e, + 0x08, 0xa8, 0xe3, 0xda, 0xfb, 0xce, 0x63, 0xbb, 0x25, 0x0a, 0x15, 0x66, 0x69, 0xba, 0x98, 0x95, + 0xd7, 0x89, 0x59, 0x95, 0xd3, 0xac, 0xbc, 0xce, 0x60, 0x56, 0x09, 0x9d, 0x64, 0xb5, 0xee, 0x04, + 0x3b, 0x34, 0xe2, 0x87, 0x84, 0x70, 0xd9, 0xb8, 0x6a, 0x28, 0xac, 0x22, 0x2c, 0xb3, 0xf1, 0xc0, + 0x30, 0xcd, 0x4a, 0xa1, 0x63, 0x33, 0x6f, 0x2b, 0xf0, 0x22, 0xaa, 0xb6, 0x70, 0x0c, 0xab, 0x85, + 0xfd, 0x8f, 0xc7, 0xa4, 0x83, 0x9a, 0xd8, 0x47, 0x99, 0x70, 0x53, 0x1a, 0x59, 0xe9, 0xe3, 0x96, + 0xdd, 0xca, 0x3e, 0xca, 0x98, 0x9b, 0xda, 0xce, 0x71, 0x6c, 0xa7, 0xc2, 0x6d, 0x40, 0x43, 0xfb, + 0x28, 0xc9, 0x0a, 0xeb, 0xb4, 0x88, 0x76, 0xd8, 0x8c, 0x16, 0x87, 0xa4, 0x13, 0x58, 0xb5, 0x57, + 0x85, 0x4d, 0x5d, 0x0d, 0x64, 0xb1, 0x9d, 0x71, 0x64, 0x9a, 0x26, 0xfe, 0xb0, 0x50, 0x1a, 0xa9, + 0x16, 0xad, 0x2a, 0x9f, 0xf2, 0x11, 0x9b, 0x38, 0x28, 0x8b, 0xcd, 0xdf, 0xc9, 0xc1, 0x05, 0x29, + 0x8e, 0x69, 0xf4, 0xc8, 0x0f, 0xf6, 0xbc, 0xce, 0xce, 0x73, 0x2e, 0x55, 0xef, 0x68, 0x52, 0xf5, + 0xd5, 0xd4, 0x0e, 0x97, 0x6a, 0xe5, 0x31, 0xa2, 0xf5, 0x4f, 0x8b, 0xf0, 0xe2, 0xb1, 0x54, 0xe4, + 0x23, 0xb6, 0x0b, 0x7a, 0xb4, 0x13, 0x2d, 0xb9, 0x6d, 0xca, 0xcc, 0x30, 0xbf, 0x17, 0x89, 0xc3, + 0xec, 0x57, 0x8e, 0x0e, 0x6b, 0xa7, 0x79, 0x00, 0x87, 0xed, 0xb9, 0x6d, 0x6a, 0x47, 0xbc, 0x58, + 0x1b, 0xa6, 0x7e, 0x6a, 0xc6, 0x32, 0x0e, 0x27, 0x5b, 0xea, 0x44, 0x34, 0x78, 0xe8, 0x70, 0x3f, + 0x76, 0xc1, 0x72, 0x8f, 0xd2, 0xae, 0xed, 0xb0, 0x52, 0xdb, 0x13, 0xc5, 0x3a, 0xcb, 0x3e, 0x6a, + 0x72, 0x47, 0x61, 0x39, 0xc7, 0x8c, 0x83, 0xfb, 0xce, 0x63, 0xa1, 0xf1, 0xe2, 0xf9, 0xaa, 0xc2, + 0x92, 0x3b, 0xd1, 0xed, 0x3b, 0x8f, 0xad, 0x7e, 0x12, 0xf2, 0x31, 0x9c, 0x15, 0x82, 0x9b, 0x09, + 0xb1, 0xc0, 0x6f, 0xcb, 0x16, 0x17, 0x90, 0xd7, 0xeb, 0x47, 0x87, 0xb5, 0xf3, 0x42, 0xec, 0xdb, + 0x2d, 0x8e, 0x91, 0xd9, 0xea, 0x6c, 0x2e, 0x64, 0x9d, 0x6d, 0x64, 0xa9, 0xee, 0xb8, 0x4f, 0xc3, + 0xd0, 0xd9, 0x91, 0xda, 0x31, 0xbf, 0x51, 0x52, 0x3a, 0xd3, 0xde, 0xe7, 0xe5, 0xd6, 0x40, 0x4a, + 0xb2, 0x08, 0x13, 0x5b, 0x74, 0x5b, 0x1d, 0x9f, 0x62, 0xbc, 0xc4, 0xab, 0x8f, 0xe8, 0xf6, 0xe0, + 0xc1, 0x49, 0xd1, 0x11, 0x0f, 0xa6, 0xd6, 0x02, 0xff, 0xf1, 0x01, 0x33, 0xf5, 0x68, 0x87, 0x06, + 0xe8, 0xbd, 0x35, 0x8a, 0xc7, 0x55, 0xd3, 0x89, 0x66, 0xa9, 0x97, 0x37, 0x5e, 0x3e, 0x3a, 0xac, + 0xbd, 0xd8, 0x65, 0x60, 0xbb, 0x2d, 0xe0, 0x76, 0x2a, 0x9a, 0xab, 0x9f, 0x2b, 0xf9, 0x69, 0x98, + 0xb4, 0xfc, 0x5e, 0xe4, 0x75, 0x76, 0x9a, 0x51, 0xe0, 0x44, 0x74, 0x87, 0x0b, 0xf2, 0xc4, 0x4d, + 0x2c, 0x55, 0xca, 0x0f, 0xa6, 0x03, 0x0e, 0xb4, 0x43, 0x01, 0xd5, 0x24, 0xa9, 0x4e, 0x40, 0x7e, + 0x0a, 0x26, 0xb8, 0xcf, 0x4c, 0xfc, 0x81, 0xb2, 0xe6, 0x2d, 0xad, 0x17, 0x6e, 0xde, 0x44, 0xab, + 0xe6, 0x02, 0xf7, 0xbd, 0xc9, 0xfa, 0x40, 0x8a, 0x9b, 0x79, 0x68, 0x40, 0x35, 0xcd, 0x83, 0x7c, + 0x0d, 0xca, 0xf5, 0x1d, 0xda, 0x61, 0x63, 0xb3, 0x2b, 0xc2, 0xa1, 0x64, 0x70, 0x66, 0x0c, 0xd7, + 0x89, 0x84, 0x73, 0x27, 0x2b, 0x64, 0x63, 0xad, 0x9c, 0x12, 0x2d, 0x9e, 0xb2, 0x12, 0x66, 0xc4, + 0x85, 0x0a, 0xf6, 0xe2, 0x1a, 0xa5, 0x6c, 0x7b, 0x17, 0x47, 0x25, 0x2f, 0xab, 0xc3, 0x22, 0x8a, + 0x52, 0xfc, 0xd1, 0x3d, 0x87, 0x8f, 0x4f, 0x97, 0x23, 0x68, 0x9f, 0xd0, 0xb8, 0x36, 0x00, 0x4a, + 0x71, 0x03, 0x2f, 0xc0, 0xf9, 0x01, 0x75, 0x36, 0x1f, 0xc2, 0xc5, 0xc1, 0x5f, 0x24, 0x5f, 0x83, + 0x33, 0x48, 0x38, 0xe7, 0x77, 0x3a, 0xb4, 0x15, 0xe1, 0x3a, 0x90, 0xd6, 0x7d, 0xbe, 0xf1, 0xea, + 0xd1, 0x61, 0xed, 0x32, 0x6f, 0x6f, 0x2b, 0x46, 0xb0, 0xd3, 0x86, 0x7e, 0x26, 0x07, 0xf3, 0xb7, + 0x72, 0x30, 0x2d, 0x96, 0x96, 0x45, 0x5b, 0x7e, 0xe0, 0x3e, 0xff, 0xa2, 0x7c, 0x41, 0x13, 0xe5, + 0xaf, 0xc4, 0xce, 0x6a, 0x59, 0x8d, 0x3c, 0x46, 0x92, 0xff, 0xb1, 0x01, 0x97, 0x8e, 0x23, 0x62, + 0xbd, 0x13, 0x3b, 0x63, 0x96, 0xfb, 0x9c, 0x2e, 0xbb, 0x70, 0x1a, 0x07, 0x14, 0x2f, 0x03, 0xc2, + 0x45, 0x3f, 0x8c, 0xf0, 0x44, 0x36, 0xa7, 0x39, 0x87, 0x34, 0x7c, 0xbf, 0x8d, 0x7b, 0x77, 0xe3, + 0x0d, 0xb6, 0x45, 0xff, 0xe5, 0x61, 0x0d, 0x18, 0x68, 0x15, 0x2f, 0x98, 0x99, 0x1e, 0xc7, 0x67, + 0x19, 0xde, 0x35, 0x84, 0x36, 0x7a, 0xf4, 0xec, 0xd1, 0x83, 0xd0, 0xca, 0x62, 0x8d, 0xa7, 0x6e, + 0xf5, 0x5e, 0xb4, 0xbb, 0x16, 0xd0, 0x07, 0x34, 0xa0, 0x9d, 0x16, 0xfd, 0x9c, 0x9d, 0xba, 0xe9, + 0x8d, 0x1b, 0xca, 0xe4, 0xfc, 0xeb, 0x51, 0x38, 0x93, 0x45, 0xc6, 0xfa, 0x45, 0xb1, 0x72, 0xd2, + 0xe1, 0xdc, 0x7f, 0xc7, 0x80, 0x4a, 0x93, 0xb6, 0xfc, 0x8e, 0x7b, 0xc7, 0x69, 0x45, 0xbe, 0x74, + 0xb3, 0xb1, 0xf9, 0x6e, 0xc5, 0xe0, 0xf6, 0x03, 0x2c, 0xd0, 0x4e, 0x7b, 0xbe, 0x3a, 0x9c, 0x71, + 0xd1, 0xf2, 0xd1, 0x7b, 0x39, 0x62, 0x73, 0x32, 0xf9, 0x04, 0xde, 0x54, 0x69, 0x1f, 0x25, 0x0d, + 0x18, 0x17, 0xcb, 0xd5, 0x57, 0x7d, 0x71, 0x2f, 0x1d, 0x1d, 0xd6, 0xa6, 0x5b, 0xb2, 0x20, 0x7d, + 0xea, 0xa3, 0x93, 0x90, 0x5b, 0x90, 0xdf, 0x98, 0xbd, 0x23, 0xc6, 0x40, 0x7a, 0x2d, 0x6e, 0xcc, + 0xde, 0xc1, 0xf3, 0x0b, 0xa6, 0x13, 0x8e, 0xf7, 0x66, 0x1f, 0xa8, 0xe7, 0xda, 0x1b, 0xb3, 0x77, + 0xc8, 0x2a, 0x4c, 0x59, 0xf4, 0x67, 0x7a, 0x5e, 0x40, 0xc5, 0x02, 0xb8, 0x7f, 0xa7, 0x8e, 0x63, + 0x51, 0xe2, 0x7b, 0x53, 0xc0, 0x0b, 0xa5, 0xbd, 0x66, 0xef, 0x3f, 0x50, 0x43, 0x18, 0xfb, 0x69, + 0xc9, 0x2f, 0xc0, 0xd9, 0x79, 0x2f, 0x14, 0x75, 0xe6, 0x07, 0xca, 0x2e, 0xde, 0x2d, 0x17, 0x07, + 0x2c, 0x87, 0x2f, 0x67, 0x2e, 0x87, 0x97, 0xdd, 0x98, 0x89, 0xcd, 0x4f, 0xab, 0xdd, 0xb4, 0x13, + 0x73, 0xf6, 0x77, 0xc8, 0x27, 0x30, 0x81, 0x27, 0x78, 0x78, 0xc6, 0x8e, 0x7e, 0xed, 0xa3, 0x03, + 0xbe, 0xfc, 0xc5, 0xcc, 0x2f, 0x5f, 0xc4, 0x03, 0x41, 0x1b, 0x4f, 0xea, 0xd1, 0x07, 0x5e, 0xb3, + 0xfb, 0x34, 0xce, 0xe4, 0x43, 0x98, 0x14, 0x8a, 0xc4, 0xea, 0x83, 0xf5, 0x5d, 0x3a, 0xef, 0x1c, + 0x08, 0xc7, 0x12, 0xd4, 0xe9, 0x85, 0xf6, 0x61, 0xfb, 0x0f, 0xec, 0x68, 0x97, 0xda, 0xae, 0xa3, + 0x6d, 0xb9, 0x29, 0x42, 0xf2, 0x73, 0x30, 0xb6, 0xec, 0xe3, 0x65, 0x22, 0x8a, 0x9a, 0x32, 0xf2, + 0xf9, 0x3a, 0x86, 0x30, 0x73, 0x70, 0x4a, 0x31, 0xf8, 0xd1, 0x61, 0xed, 0x9d, 0x27, 0x9d, 0x85, + 0xca, 0x07, 0x2c, 0xf5, 0x6b, 0x64, 0x0e, 0x4a, 0x5b, 0x74, 0x9b, 0xb5, 0x36, 0x1d, 0x7e, 0x27, + 0xc1, 0x5c, 0x5e, 0x3c, 0x12, 0xbf, 0xd4, 0x9b, 0x3a, 0x89, 0x41, 0x02, 0x98, 0xc2, 0xfe, 0x59, + 0x73, 0xc2, 0xf0, 0x91, 0x1f, 0xb8, 0x6d, 0x1a, 0xca, 0x2b, 0xaf, 0xfe, 0xce, 0x9f, 0xcd, 0xec, + 0xfc, 0x4b, 0xbc, 0xf3, 0xbb, 0x0a, 0x07, 0x75, 0xba, 0xf5, 0xb1, 0x37, 0xff, 0xd4, 0xc0, 0x59, + 0x4f, 0xae, 0xa3, 0x43, 0x61, 0x1c, 0x8a, 0x80, 0x27, 0x14, 0x4e, 0xb7, 0xab, 0x07, 0x13, 0x70, + 0x14, 0xf2, 0x06, 0x14, 0xef, 0x38, 0x2d, 0x1a, 0xc9, 0x73, 0x6f, 0x44, 0x7e, 0x80, 0x10, 0xf5, + 0x38, 0x83, 0xe3, 0xb0, 0x0d, 0x79, 0x9e, 0x3e, 0xf4, 0x5a, 0xb4, 0x1e, 0x45, 0x34, 0xe4, 0x3d, + 0x3c, 0x57, 0xe7, 0x17, 0xc4, 0x65, 0xbe, 0x21, 0xbb, 0x58, 0x6e, 0x3b, 0x09, 0x82, 0xdd, 0x72, + 0x54, 0x5e, 0x99, 0x1c, 0xcc, 0xff, 0x6d, 0x24, 0xbd, 0x4e, 0x5e, 0x87, 0x82, 0xb5, 0x16, 0xd7, + 0x9f, 0xdf, 0xfd, 0xa6, 0xaa, 0x8f, 0x08, 0xe4, 0x1b, 0x70, 0x56, 0xe1, 0x83, 0x3d, 0x42, 0x5d, + 0x56, 0x21, 0xde, 0x98, 0xd7, 0xf0, 0xb2, 0x4f, 0xa9, 0x89, 0xc3, 0x31, 0x52, 0x35, 0xca, 0xe6, + 0x81, 0xda, 0x47, 0x52, 0x30, 0x4f, 0x3b, 0x1e, 0xe7, 0xad, 0x34, 0x56, 0xe5, 0xed, 0x22, 0x42, + 0xba, 0xb1, 0x59, 0x1c, 0x3e, 0x2c, 0x94, 0x0a, 0xd5, 0x11, 0xf3, 0x6f, 0x0c, 0x25, 0xff, 0xc4, + 0x73, 0xba, 0x63, 0xdd, 0xd6, 0x76, 0xac, 0x33, 0x82, 0x34, 0x6e, 0x15, 0x2b, 0xcb, 0xd4, 0x32, + 0x26, 0x61, 0x5c, 0x43, 0x42, 0xd7, 0xe9, 0x8d, 0x90, 0x06, 0xfc, 0x9c, 0xf9, 0xf3, 0xe5, 0x3a, + 0x1d, 0xb7, 0x6b, 0x28, 0x8f, 0xd8, 0xbf, 0x32, 0x60, 0x32, 0x45, 0xc1, 0x7a, 0x83, 0x81, 0xd4, + 0xde, 0xe8, 0x85, 0x34, 0xb0, 0x10, 0xca, 0x1d, 0x2d, 0x97, 0x75, 0x47, 0xcb, 0xb6, 0xc5, 0x60, + 0xe4, 0xab, 0x30, 0xb2, 0x81, 0x56, 0xa1, 0xee, 0xab, 0x13, 0xf3, 0xc7, 0x42, 0xbe, 0xc2, 0x7a, + 0xec, 0x5f, 0x55, 0x40, 0x60, 0x19, 0x69, 0xc2, 0xe8, 0x5c, 0x40, 0x31, 0xd3, 0x44, 0x61, 0xf8, + 0x4b, 0xd5, 0x16, 0x27, 0x49, 0x5f, 0xaa, 0x0a, 0x4e, 0xe6, 0x6f, 0xe6, 0x80, 0x24, 0x6d, 0xa4, + 0xad, 0x80, 0x46, 0xe1, 0x73, 0x3b, 0xe8, 0x1f, 0x68, 0x83, 0xfe, 0x62, 0xdf, 0xa0, 0xf3, 0xe6, + 0x0d, 0x35, 0xf6, 0x7f, 0x66, 0xc0, 0xb9, 0x6c, 0x42, 0xf2, 0x0a, 0x14, 0x57, 0xd7, 0xd7, 0xa4, + 0xbb, 0x97, 0x68, 0x8a, 0xdf, 0x45, 0xcd, 0xd8, 0x12, 0x45, 0xe4, 0x4d, 0x28, 0x7e, 0x64, 0xcd, + 0xb1, 0x2d, 0x53, 0x09, 0x79, 0xfa, 0x99, 0xc0, 0x6e, 0xe9, 0x66, 0xb4, 0x40, 0x52, 0xc7, 0x36, + 0xff, 0xcc, 0xc6, 0xf6, 0xdb, 0x39, 0x98, 0xac, 0xb7, 0x5a, 0x34, 0x0c, 0x99, 0x42, 0x44, 0xc3, + 0xe8, 0xb9, 0x1d, 0xd8, 0x6c, 0x47, 0x2e, 0xad, 0x6d, 0x43, 0x8d, 0xea, 0x9f, 0x1b, 0x70, 0x56, + 0x52, 0x3d, 0xf4, 0xe8, 0xa3, 0xf5, 0xdd, 0x80, 0x86, 0xbb, 0x7e, 0xdb, 0x1d, 0x36, 0x78, 0x0f, + 0x77, 0x69, 0xaf, 0x1d, 0xd1, 0x40, 0xbd, 0x74, 0x78, 0x80, 0x10, 0x6d, 0x97, 0x46, 0x08, 0x99, + 0x81, 0xd1, 0x7a, 0xb7, 0x1b, 0xf8, 0x0f, 0xf9, 0xb2, 0x1f, 0x17, 0x77, 0xcc, 0x1c, 0xa4, 0xdd, + 0x49, 0x73, 0x10, 0xab, 0xc6, 0x3c, 0xed, 0x70, 0x2f, 0xf5, 0x71, 0x5e, 0x0d, 0x97, 0x76, 0x54, + 0x0d, 0x0d, 0xcb, 0xcd, 0x6f, 0x15, 0xa0, 0xa2, 0x36, 0x84, 0x98, 0x50, 0xe4, 0x2e, 0x47, 0xaa, + 0xeb, 0x87, 0x83, 0x10, 0x4b, 0x94, 0x24, 0x9e, 0x5c, 0xb9, 0x13, 0x3d, 0xb9, 0xb6, 0x60, 0x7c, + 0x2d, 0xf0, 0xbb, 0x7e, 0x48, 0x5d, 0x9e, 0x2c, 0x88, 0x4b, 0xad, 0xd3, 0xb1, 0x7b, 0x33, 0xef, + 0x73, 0x56, 0xc4, 0xcd, 0x81, 0xae, 0xc0, 0xb6, 0xd3, 0xa9, 0x84, 0x74, 0x3e, 0xfc, 0xd2, 0xc6, + 0x09, 0x45, 0x08, 0x48, 0x7c, 0x69, 0xc3, 0x20, 0xfa, 0xa5, 0x0d, 0x83, 0xa8, 0xcb, 0x62, 0xe4, + 0x59, 0x2d, 0x0b, 0xf2, 0x9b, 0x06, 0x8c, 0xd5, 0x3b, 0x1d, 0xe1, 0xc9, 0x25, 0x23, 0xee, 0xcf, + 0x26, 0x17, 0x37, 0xdc, 0xd5, 0x97, 0xdf, 0xdb, 0x7c, 0x53, 0xdc, 0xdb, 0xbc, 0xf3, 0xa9, 0xee, + 0x6d, 0xd6, 0x03, 0xc7, 0x8b, 0x42, 0xbc, 0xa0, 0x4f, 0x3e, 0xa8, 0xba, 0x73, 0x2b, 0xf5, 0x20, + 0xef, 0x40, 0x35, 0x9e, 0x8f, 0x4b, 0x1d, 0x97, 0x3e, 0xa6, 0xdc, 0xf1, 0x6d, 0x9c, 0x87, 0x85, + 0x6a, 0x17, 0x52, 0x69, 0x44, 0xf3, 0xdb, 0x06, 0x9c, 0x53, 0x27, 0x44, 0xb3, 0xb7, 0xbd, 0xef, + 0xa1, 0xf9, 0x43, 0x6e, 0x40, 0x59, 0x8c, 0x57, 0xac, 0xc8, 0xf5, 0x67, 0x98, 0x4a, 0x50, 0xc8, + 0x02, 0x1b, 0x22, 0xc6, 0x43, 0x9c, 0x15, 0x9c, 0x4e, 0x2d, 0x37, 0x56, 0xd4, 0x98, 0x16, 0x9d, + 0x5d, 0x0d, 0xf0, 0xb7, 0x3e, 0x76, 0x0c, 0x62, 0xbe, 0x0f, 0x53, 0x7a, 0x2d, 0x9b, 0x14, 0x63, + 0x11, 0x65, 0xd3, 0x8c, 0xec, 0xa6, 0xc9, 0x72, 0x73, 0x0b, 0x48, 0x1f, 0x7d, 0x88, 0x97, 0x8f, + 0x34, 0x92, 0x97, 0xe3, 0xf2, 0x08, 0xb3, 0x0f, 0x31, 0xce, 0xb5, 0x36, 0xa6, 0x76, 0x37, 0x92, + 0x9a, 0x7f, 0x5b, 0x86, 0xd3, 0x19, 0xa2, 0xe3, 0x84, 0xad, 0xbd, 0xa6, 0x2f, 0x9e, 0x72, 0xec, + 0xe5, 0x21, 0x97, 0xcc, 0xfb, 0x32, 0xaf, 0xd6, 0x31, 0x4b, 0xe5, 0xb8, 0x64, 0x5b, 0x9f, 0xc5, + 0xf6, 0xae, 0x3a, 0x62, 0x8d, 0x3c, 0x33, 0x47, 0xac, 0x06, 0x8c, 0x8b, 0x56, 0x89, 0xa5, 0x5c, + 0x4c, 0x8e, 0x05, 0x02, 0x5e, 0x60, 0xf7, 0x2d, 0x69, 0x9d, 0x84, 0xf3, 0x08, 0xfd, 0xf6, 0x43, + 0x2a, 0x78, 0x8c, 0xaa, 0x3c, 0xb0, 0x20, 0x93, 0x87, 0x42, 0x42, 0xfe, 0x99, 0x01, 0x44, 0x40, + 0xd4, 0xf5, 0x5c, 0x3a, 0x6e, 0x3d, 0xbb, 0xcf, 0x66, 0x3d, 0xbf, 0x28, 0xeb, 0x98, 0xbd, 0xae, + 0x33, 0xaa, 0x45, 0xfe, 0x89, 0x01, 0x53, 0xdc, 0x1b, 0x48, 0xad, 0x6c, 0xf9, 0xb8, 0xca, 0xb6, + 0x9e, 0x4d, 0x65, 0x2f, 0x85, 0xf8, 0xd9, 0x01, 0x75, 0xed, 0xaf, 0x14, 0xf9, 0x49, 0x80, 0x78, + 0x45, 0x49, 0xaf, 0xd3, 0x4b, 0x19, 0x52, 0x20, 0x46, 0x4a, 0xa2, 0x6d, 0xa3, 0x98, 0x4e, 0xf5, + 0xd3, 0x4a, 0xb8, 0x91, 0x5f, 0x80, 0x33, 0x6c, 0xbd, 0xc4, 0x10, 0xe1, 0xbb, 0x38, 0x3d, 0x86, + 0x5f, 0xf9, 0xd2, 0xe0, 0xad, 0xfd, 0x46, 0x16, 0x19, 0x8f, 0xfd, 0x49, 0x72, 0x2f, 0x44, 0xfb, + 0xaa, 0xc9, 0x97, 0x45, 0x81, 0x4e, 0xca, 0x58, 0xfb, 0x70, 0xba, 0x82, 0xdf, 0xcc, 0x94, 0x6f, + 0x17, 0xe4, 0x5a, 0xe0, 0xf2, 0x2d, 0xd4, 0x83, 0x77, 0x10, 0x44, 0x3e, 0x02, 0xd2, 0xec, 0xed, + 0xec, 0xd0, 0x30, 0xa2, 0x2e, 0x87, 0xd1, 0x20, 0x9c, 0x1e, 0x47, 0xf9, 0x80, 0xc7, 0x54, 0xa1, + 0x2c, 0xb5, 0x03, 0x59, 0xac, 0x4e, 0x92, 0x7e, 0xe2, 0x8b, 0xdb, 0x70, 0x61, 0x60, 0x33, 0x33, + 0x02, 0x73, 0x66, 0xf4, 0xc0, 0x9c, 0x0b, 0x83, 0xc4, 0x61, 0xa8, 0x06, 0xe7, 0xfc, 0x9e, 0x91, + 0x92, 0x7f, 0x42, 0x59, 0xe1, 0x29, 0x08, 0x07, 0x6d, 0x10, 0x39, 0xcc, 0xca, 0xc0, 0x25, 0x64, + 0x2e, 0x51, 0x92, 0x98, 0x84, 0x54, 0x25, 0x2c, 0xca, 0xca, 0xa7, 0x14, 0x85, 0xe6, 0xbf, 0x30, + 0x80, 0xf0, 0x1a, 0xce, 0x39, 0x5d, 0x67, 0xdb, 0x6b, 0x7b, 0x91, 0x47, 0x43, 0x72, 0x0f, 0xaa, + 0x82, 0x85, 0xb3, 0xdd, 0xa6, 0xaa, 0xcf, 0x9d, 0xb8, 0x94, 0x8f, 0xcb, 0xec, 0xb4, 0x5a, 0xd3, + 0x47, 0x38, 0x60, 0xf0, 0x72, 0x4f, 0x31, 0x78, 0xe6, 0x0f, 0x0d, 0xb8, 0xd0, 0x5f, 0x6d, 0xf1, + 0xe5, 0xb8, 0xf3, 0x8c, 0x13, 0x3a, 0x2f, 0xab, 0x95, 0x39, 0x3c, 0xfa, 0x7c, 0x66, 0xad, 0xcc, + 0x27, 0x27, 0xa9, 0x4f, 0xde, 0xca, 0x5f, 0xc9, 0x41, 0x65, 0xad, 0xdd, 0xdb, 0xf1, 0x3a, 0xf3, + 0x4e, 0xe4, 0x3c, 0xb7, 0x26, 0xc5, 0xdb, 0x9a, 0x49, 0x11, 0x7b, 0xd9, 0xc5, 0x0d, 0x1b, 0x2e, + 0x1d, 0x9c, 0x01, 0x93, 0x09, 0x09, 0x5f, 0xa5, 0x8b, 0x50, 0x60, 0x3f, 0x84, 0x86, 0x72, 0xb9, + 0x8f, 0x31, 0x62, 0xdd, 0x88, 0xff, 0x13, 0x4a, 0xbe, 0x9e, 0x84, 0x0f, 0x39, 0x5c, 0xfc, 0x32, + 0xcf, 0xa1, 0xf5, 0xe4, 0xf9, 0x3e, 0xff, 0xb9, 0x01, 0xd5, 0x74, 0x4b, 0xc8, 0x3d, 0x18, 0x65, + 0x9c, 0xbc, 0x38, 0x1f, 0xd7, 0xab, 0x03, 0xda, 0x7c, 0x43, 0xa0, 0xf1, 0xea, 0x61, 0xe7, 0x53, + 0x0e, 0xb1, 0x24, 0x87, 0x8b, 0x16, 0x54, 0x54, 0xac, 0x8c, 0xda, 0xbd, 0xa1, 0x8b, 0xa6, 0x73, + 0xd9, 0xfd, 0xa0, 0xd6, 0xfa, 0x77, 0xb5, 0x5a, 0x0b, 0xa1, 0x34, 0x6c, 0x62, 0x45, 0x0c, 0x33, + 0xe4, 0xe9, 0x63, 0xd4, 0x79, 0x26, 0x33, 0xcd, 0xe8, 0x61, 0x86, 0x1c, 0xc6, 0x6c, 0x11, 0xfe, + 0x3d, 0x31, 0xcf, 0xd0, 0x16, 0xe9, 0x22, 0x44, 0xd5, 0x67, 0x39, 0x8e, 0xf9, 0x0f, 0xf2, 0x70, + 0x2e, 0xa9, 0x1e, 0x4f, 0x33, 0xb9, 0xe6, 0x04, 0xce, 0x7e, 0x78, 0xc2, 0x0a, 0xb8, 0xda, 0x57, + 0x35, 0x0c, 0xa3, 0x97, 0x55, 0x53, 0x2a, 0x64, 0xa6, 0x2a, 0x84, 0x46, 0x1c, 0xaf, 0x90, 0xac, + 0x06, 0xb9, 0x07, 0xf9, 0x26, 0x8d, 0x44, 0xb0, 0xed, 0x95, 0xbe, 0x5e, 0x55, 0xeb, 0x75, 0xa3, + 0x49, 0x23, 0x3e, 0x88, 0x3c, 0x5e, 0x81, 0x6a, 0xf1, 0x03, 0x4c, 0x1d, 0xdf, 0x82, 0xe2, 0xc2, + 0xe3, 0x2e, 0x6d, 0x45, 0x22, 0xc6, 0xf6, 0xda, 0xf1, 0xfc, 0x38, 0xae, 0x12, 0xc9, 0x4b, 0x11, + 0xa0, 0x76, 0x16, 0x47, 0xb9, 0x78, 0x1b, 0x4a, 0xf2, 0xe3, 0x4f, 0x14, 0x91, 0xfa, 0x36, 0x8c, + 0x29, 0x1f, 0x79, 0xa2, 0x49, 0xff, 0xb7, 0x06, 0x14, 0x99, 0xd0, 0xdb, 0x7c, 0xeb, 0x39, 0x95, + 0x48, 0xb7, 0x34, 0x89, 0x34, 0xa5, 0x84, 0x4e, 0xe1, 0xba, 0x7c, 0xeb, 0x04, 0x59, 0x74, 0x68, + 0x00, 0x24, 0xc8, 0xe4, 0x2e, 0x8c, 0xf2, 0xfb, 0x0b, 0x99, 0xc3, 0x55, 0x8d, 0xc5, 0x12, 0x25, + 0x89, 0x96, 0xe3, 0x77, 0xd3, 0x6a, 0xa1, 0xa4, 0x26, 0xf3, 0x89, 0xbf, 0xba, 0x1a, 0xfc, 0xcb, + 0xd8, 0xcc, 0xf9, 0x1d, 0x1e, 0x9b, 0x13, 0x2a, 0xb9, 0xce, 0xb2, 0x1d, 0xd7, 0xeb, 0xe2, 0x60, + 0x23, 0x7f, 0x1c, 0x93, 0x73, 0x82, 0x49, 0xf6, 0x99, 0xc7, 0x77, 0xc6, 0x78, 0xb4, 0x8b, 0xac, + 0xd8, 0x7b, 0x50, 0xb9, 0xe3, 0x07, 0x8f, 0x9c, 0xc0, 0x45, 0xc7, 0x02, 0x6c, 0x66, 0x09, 0xc3, + 0x05, 0xc6, 0x1f, 0x70, 0xb8, 0x8d, 0x3e, 0x09, 0x3f, 0x3a, 0xac, 0x15, 0x1a, 0xbe, 0xdf, 0xb6, + 0x34, 0x74, 0xb2, 0x0a, 0xe3, 0xf7, 0x9d, 0xc7, 0xe2, 0x8e, 0x70, 0x7d, 0x7d, 0x59, 0xf8, 0x2b, + 0x5d, 0x3b, 0x3a, 0xac, 0x5d, 0xd8, 0x77, 0x1e, 0xc7, 0x77, 0x8b, 0x83, 0x5d, 0xea, 0x75, 0x7a, + 0xe2, 0xc1, 0xc4, 0x9a, 0x1f, 0x44, 0xe2, 0x23, 0x4c, 0xa7, 0xcd, 0x0f, 0xb8, 0x65, 0x9a, 0xc9, + 0xbc, 0x65, 0xba, 0xc0, 0x14, 0x79, 0xfb, 0x41, 0x4c, 0xae, 0x85, 0x68, 0x6a, 0x8c, 0xc9, 0x7b, + 0x30, 0x35, 0x47, 0x83, 0xc8, 0x7b, 0xe0, 0xb5, 0x9c, 0x88, 0xde, 0xf1, 0x83, 0x7d, 0x27, 0x12, + 0x07, 0x2a, 0x68, 0x50, 0xb7, 0x28, 0xe7, 0xb4, 0xef, 0x44, 0x56, 0x3f, 0x26, 0xf9, 0x46, 0x96, + 0x07, 0xd8, 0x08, 0x36, 0xff, 0x4d, 0xa6, 0x14, 0x64, 0x78, 0x80, 0x0d, 0xe8, 0x82, 0x0c, 0x5f, + 0xb0, 0x9d, 0xe3, 0xae, 0x5a, 0x4b, 0x8d, 0x9b, 0xe2, 0xda, 0xf7, 0xe4, 0xab, 0xd4, 0x78, 0xdc, + 0x06, 0x5c, 0xa9, 0xce, 0x42, 0xbe, 0xb1, 0x76, 0x07, 0x8f, 0x48, 0xc4, 0xd5, 0x26, 0xed, 0xec, + 0x3a, 0x9d, 0x16, 0xea, 0x32, 0xc2, 0x5f, 0x42, 0x15, 0x78, 0x8d, 0xb5, 0x3b, 0xc4, 0x81, 0xd3, + 0x6b, 0x34, 0xd8, 0xf7, 0xa2, 0xaf, 0xdd, 0xbc, 0xa9, 0x0c, 0x54, 0x09, 0xab, 0x36, 0x23, 0xaa, + 0x56, 0xeb, 0x22, 0x8a, 0xfd, 0xf8, 0xe6, 0xcd, 0xcc, 0xe1, 0x88, 0x2b, 0x96, 0xc5, 0x8b, 0x2c, + 0xc0, 0xc4, 0x7d, 0xe7, 0x71, 0xe2, 0xe6, 0x12, 0x0a, 0x1f, 0xd4, 0x17, 0xe5, 0xc4, 0x4a, 0x5c, + 0x64, 0xd4, 0xf5, 0x96, 0x22, 0x22, 0xef, 0xc2, 0x58, 0x32, 0xbd, 0x42, 0xbc, 0xfe, 0xcc, 0x73, + 0xd7, 0x5a, 0x65, 0x72, 0x6a, 0x67, 0x49, 0x0a, 0x3a, 0xd9, 0x88, 0x4d, 0x74, 0xae, 0x90, 0x8a, + 0xa4, 0x3c, 0x33, 0xaa, 0x89, 0xee, 0x60, 0x89, 0xd6, 0xac, 0xc9, 0x58, 0x45, 0xe7, 0x7e, 0x3f, + 0x96, 0xce, 0x45, 0xb1, 0xfc, 0xd7, 0x02, 0x7f, 0xbf, 0x1b, 0xa1, 0xe7, 0x69, 0xca, 0xf2, 0xef, + 0x62, 0x49, 0x86, 0xe5, 0xcf, 0x49, 0xb2, 0xef, 0xf6, 0xc7, 0x9f, 0xe2, 0x6e, 0x9f, 0x42, 0x61, + 0xd9, 0x6f, 0xed, 0xa1, 0xab, 0x69, 0xb9, 0xf1, 0x11, 0x93, 0x1f, 0x6d, 0xbf, 0xb5, 0xf7, 0xec, + 0xee, 0xa4, 0x91, 0x3d, 0x59, 0x61, 0x6d, 0x67, 0xd3, 0x4a, 0x7c, 0x7a, 0x7a, 0x52, 0xbb, 0x69, + 0xd3, 0xca, 0xb8, 0xa2, 0xc2, 0x67, 0xa1, 0x6c, 0x88, 0xa5, 0x93, 0x13, 0x0a, 0xd5, 0x79, 0x1a, + 0xee, 0x45, 0x7e, 0x77, 0xae, 0xed, 0x75, 0xb7, 0x7d, 0x27, 0x70, 0xa7, 0xab, 0x03, 0x04, 0xc6, + 0xeb, 0x99, 0x02, 0x63, 0xca, 0xe5, 0xf4, 0x76, 0x4b, 0x32, 0xb0, 0xfa, 0x58, 0x92, 0x6f, 0xc0, + 0x04, 0x5b, 0x2d, 0x0b, 0x8f, 0x23, 0xda, 0xe1, 0x53, 0x69, 0x0a, 0xb7, 0xfa, 0x33, 0x4a, 0xb0, + 0x6a, 0x5c, 0xc8, 0x27, 0x29, 0x4a, 0x0f, 0x1a, 0x13, 0xa8, 0x93, 0x54, 0x67, 0x65, 0xfe, 0x64, + 0xaa, 0x4f, 0xc8, 0x12, 0x8c, 0x8a, 0x1a, 0x88, 0x5d, 0xa7, 0xbf, 0x2d, 0x2f, 0x66, 0xb6, 0x65, + 0x54, 0xb4, 0xc5, 0x92, 0xf4, 0xe6, 0xbf, 0x31, 0x60, 0x5c, 0xfb, 0x1c, 0xb9, 0xad, 0xb8, 0xcc, + 0x24, 0xee, 0x8b, 0x1a, 0x4e, 0xe6, 0xdb, 0x08, 0xb7, 0x85, 0x9f, 0x54, 0x6e, 0x30, 0x5d, 0x66, + 0xda, 0x3a, 0x99, 0x3c, 0x22, 0x7f, 0x7c, 0xf2, 0x88, 0xc2, 0x80, 0xe4, 0x11, 0xdf, 0x19, 0x87, + 0x09, 0x7d, 0x83, 0x63, 0x1a, 0xe7, 0xb2, 0xbf, 0xe3, 0x75, 0xa4, 0xdd, 0xca, 0xd3, 0xa1, 0x20, + 0x44, 0x7b, 0x68, 0x00, 0x21, 0xe4, 0x35, 0x80, 0xf8, 0x6a, 0x56, 0x9a, 0xa6, 0xe2, 0x59, 0x04, + 0xa5, 0x80, 0xfc, 0x14, 0xc0, 0x8a, 0xef, 0xd2, 0x38, 0xa3, 0xce, 0x31, 0x07, 0x4a, 0xaf, 0x8b, + 0x03, 0x25, 0xf1, 0x94, 0xc1, 0xd1, 0x61, 0xed, 0x6c, 0xc7, 0x77, 0x69, 0x7f, 0x2a, 0x1d, 0x85, + 0x23, 0xf9, 0x0a, 0x8c, 0x58, 0xbd, 0x36, 0x95, 0x09, 0x5e, 0xc6, 0xe4, 0x84, 0xef, 0xb5, 0x95, + 0x14, 0xa7, 0x41, 0x2f, 0x7d, 0x8f, 0xc0, 0x00, 0xe4, 0x03, 0x80, 0x7b, 0xbd, 0x6d, 0x7a, 0x37, + 0xf0, 0x7b, 0x5d, 0x19, 0x41, 0x8e, 0x66, 0xec, 0x5e, 0x9c, 0x43, 0xcc, 0xde, 0xc1, 0x42, 0xf5, + 0xe3, 0x09, 0x09, 0x59, 0x85, 0x51, 0x21, 0x3e, 0xc4, 0x39, 0xfd, 0x4b, 0x59, 0x27, 0x44, 0x8a, + 0x0e, 0x21, 0x32, 0xae, 0x20, 0x58, 0x3f, 0xb4, 0xe1, 0x66, 0xf8, 0xbb, 0x50, 0x66, 0xec, 0x99, + 0xa9, 0x1d, 0x8a, 0xbd, 0x03, 0xfd, 0x50, 0x95, 0x0a, 0x31, 0xb3, 0x5c, 0x4b, 0x16, 0x17, 0x13, + 0x90, 0x6f, 0x60, 0x8e, 0x24, 0xd1, 0xd5, 0xc7, 0x1e, 0x34, 0x5e, 0xe9, 0xeb, 0xea, 0x33, 0x4e, + 0xb7, 0x9b, 0x91, 0x89, 0x2e, 0xe6, 0x47, 0x76, 0xe2, 0x58, 0xad, 0x38, 0xcf, 0xf5, 0x31, 0x1f, + 0xb8, 0xde, 0xf7, 0x81, 0x69, 0x19, 0x7e, 0xd4, 0x9f, 0x19, 0x49, 0xe3, 0x4b, 0xba, 0x50, 0x4d, + 0x72, 0xb8, 0x89, 0x6f, 0xc1, 0x71, 0xdf, 0x7a, 0xb3, 0xef, 0x5b, 0xea, 0x00, 0xf6, 0x7d, 0xae, + 0x8f, 0x3b, 0x71, 0x93, 0x9c, 0xc4, 0xe2, 0x7b, 0x63, 0xc7, 0x7d, 0xef, 0xb5, 0xbe, 0xef, 0x9d, + 0x76, 0xb7, 0xfb, 0xbf, 0x93, 0xe2, 0x49, 0xde, 0x85, 0x71, 0x09, 0xc1, 0xf5, 0x81, 0x07, 0x7c, + 0x42, 0xbf, 0x77, 0xb7, 0xd1, 0x51, 0x4d, 0x4f, 0x0b, 0xa4, 0x22, 0xab, 0xd4, 0x7c, 0x76, 0x8c, + 0x6b, 0xd4, 0xe9, 0x59, 0xa1, 0x23, 0x93, 0xaf, 0xc3, 0xd8, 0xd2, 0x3e, 0x6b, 0x88, 0xdf, 0x71, + 0x22, 0x8a, 0x9b, 0x51, 0x72, 0x68, 0xaa, 0x94, 0x28, 0x53, 0x95, 0x27, 0x18, 0x4d, 0x8a, 0xd4, + 0xcd, 0x5c, 0xa1, 0x60, 0x9d, 0xc7, 0x8f, 0x5f, 0xc4, 0x1c, 0x0e, 0xc5, 0xd6, 0xf3, 0x62, 0xc6, + 0xc1, 0xa5, 0xc2, 0x1e, 0x65, 0x39, 0x3f, 0xd5, 0xb1, 0xc5, 0x82, 0xd0, 0x3a, 0x4f, 0xe7, 0x49, + 0xde, 0x83, 0x31, 0x11, 0x19, 0x5b, 0xb7, 0x56, 0xc2, 0xe9, 0x2a, 0x36, 0x1e, 0x3d, 0x8d, 0x65, + 0x10, 0xad, 0xed, 0x04, 0xa9, 0xdb, 0xab, 0x04, 0x9f, 0x7c, 0x0d, 0xce, 0x6c, 0x79, 0x1d, 0xd7, + 0x7f, 0x14, 0x0a, 0x01, 0x2e, 0x04, 0xdd, 0x54, 0xe2, 0xa3, 0xf3, 0x88, 0x97, 0xdb, 0x72, 0xdb, + 0xea, 0x13, 0x7c, 0x99, 0x1c, 0xc8, 0xcf, 0xf7, 0x71, 0xe6, 0x33, 0x88, 0x1c, 0x37, 0x83, 0x66, + 0xfb, 0x66, 0x50, 0xff, 0xe7, 0xd3, 0xd3, 0x29, 0xf3, 0x33, 0xc4, 0x07, 0xa2, 0xeb, 0x1c, 0x1f, + 0xfa, 0x5e, 0x67, 0xfa, 0xb4, 0xf6, 0x8a, 0x4c, 0xec, 0xa6, 0x8b, 0x78, 0x6b, 0x7e, 0xdb, 0x6b, + 0x1d, 0x34, 0xcc, 0xa3, 0xc3, 0xda, 0x4b, 0x69, 0x6d, 0xe6, 0x13, 0x5f, 0x3b, 0x5c, 0xc8, 0x60, + 0x4d, 0xbe, 0x0e, 0x15, 0xf6, 0x37, 0x56, 0xfd, 0xce, 0x68, 0x57, 0x5d, 0x0a, 0xa6, 0xf8, 0x0e, + 0x8e, 0x11, 0x86, 0xee, 0x66, 0x68, 0x85, 0x1a, 0x2b, 0xf3, 0x87, 0x06, 0x9c, 0xc9, 0xaa, 0xeb, + 0x09, 0x79, 0x92, 0xcc, 0xd4, 0xa5, 0x37, 0x9e, 0x4b, 0xf0, 0x4b, 0xef, 0xf8, 0xaa, 0xbb, 0x06, + 0x23, 0xcc, 0x56, 0x96, 0x4e, 0x59, 0xb8, 0x1d, 0x32, 0x7b, 0x3a, 0xb4, 0x38, 0x9c, 0x21, 0x70, + 0x9f, 0x71, 0xb6, 0x5f, 0x8e, 0x70, 0x04, 0x74, 0x11, 0xb7, 0x38, 0x9c, 0x21, 0xb0, 0x6d, 0x57, + 0x6e, 0x13, 0x88, 0xc0, 0x76, 0xe3, 0xd0, 0xe2, 0x70, 0x72, 0x05, 0x46, 0x57, 0x3b, 0xcb, 0xd4, + 0x79, 0x48, 0xc5, 0x8d, 0x13, 0x9e, 0xa3, 0xf8, 0x1d, 0xbb, 0xcd, 0x60, 0x96, 0x2c, 0x34, 0xbf, + 0x6b, 0xc0, 0x54, 0x5f, 0x37, 0x9d, 0x9c, 0x0a, 0xea, 0xf8, 0xeb, 0xbd, 0x61, 0xda, 0xc7, 0xab, + 0x5f, 0xc8, 0xae, 0xbe, 0xf9, 0xc7, 0x05, 0x38, 0x3f, 0x60, 0xd7, 0x4a, 0xae, 0xe6, 0x8d, 0x13, + 0xaf, 0xe6, 0xbf, 0xc9, 0x76, 0x09, 0xc7, 0xdb, 0x0f, 0xd7, 0xfd, 0xa4, 0xc6, 0xc9, 0x2d, 0x06, + 0x96, 0xc9, 0x5c, 0x2b, 0x32, 0x2f, 0xc8, 0x85, 0x16, 0x52, 0xd8, 0x91, 0xdf, 0x77, 0x66, 0xac, + 0x33, 0xeb, 0xbb, 0x1c, 0xcf, 0xff, 0x98, 0x5c, 0x8e, 0xeb, 0x57, 0x52, 0x85, 0x67, 0x7a, 0x25, + 0x95, 0x7d, 0x48, 0x3e, 0xf2, 0x14, 0x57, 0x01, 0x64, 0x0e, 0xc6, 0x9b, 0xd4, 0x09, 0x5a, 0xbb, + 0xf5, 0x90, 0x0f, 0x52, 0x11, 0xb9, 0xa1, 0x48, 0x0e, 0xb1, 0xc0, 0x76, 0xc2, 0xfe, 0xb1, 0xd0, + 0x68, 0xcc, 0x7f, 0x97, 0xba, 0xd3, 0xff, 0x71, 0x9c, 0x2f, 0xd7, 0x60, 0x64, 0x6b, 0x97, 0x06, + 0x52, 0x49, 0xc6, 0x8a, 0x3c, 0x62, 0x00, 0xb5, 0x22, 0x88, 0x61, 0xfe, 0x1c, 0x54, 0xd4, 0x8f, + 0xa1, 0x40, 0x60, 0xbf, 0xc5, 0x8a, 0xe4, 0x02, 0x81, 0x01, 0x2c, 0x0e, 0x3f, 0x31, 0x3d, 0x5b, + 0xd2, 0x0b, 0xf9, 0x93, 0x7a, 0xc1, 0xfc, 0xb7, 0x06, 0x14, 0x30, 0x3b, 0xc5, 0x5b, 0x50, 0x96, + 0xe7, 0xad, 0x6a, 0xc6, 0x86, 0xd3, 0xf2, 0x38, 0x36, 0xd4, 0x9d, 0x22, 0x04, 0x90, 0x7d, 0x6a, + 0x93, 0x06, 0xdb, 0x9a, 0xef, 0xcc, 0x43, 0x06, 0x50, 0x3f, 0x85, 0x18, 0x4f, 0xd0, 0x25, 0xe8, + 0x1f, 0x24, 0x0e, 0x09, 0xb8, 0xd4, 0xe0, 0xfe, 0x41, 0x7d, 0x87, 0x03, 0x12, 0xcb, 0xfc, 0x6d, + 0x03, 0xce, 0x66, 0x2a, 0x13, 0xec, 0xab, 0x5c, 0x6b, 0x51, 0x66, 0x44, 0x5a, 0x65, 0xe1, 0x18, + 0x4f, 0xe2, 0x07, 0xf4, 0x04, 0xc3, 0xfb, 0x32, 0x94, 0x63, 0x23, 0x8f, 0x9c, 0x91, 0x43, 0x87, + 0x87, 0x72, 0xd2, 0x22, 0xfa, 0x5b, 0x03, 0x8a, 0xac, 0x0a, 0xcf, 0x6d, 0x58, 0x48, 0xf6, 0x11, + 0x2d, 0x6b, 0xd2, 0x50, 0xc1, 0x20, 0x7f, 0x50, 0x04, 0x48, 0x90, 0xc9, 0x36, 0x4c, 0xac, 0x2e, + 0xcd, 0xcf, 0x2d, 0xb9, 0xb4, 0x13, 0xe1, 0x55, 0x61, 0x2a, 0xe5, 0x03, 0xb3, 0x4e, 0x83, 0x8e, + 0xd3, 0x16, 0x08, 0x07, 0xc9, 0xf2, 0xf4, 0x3d, 0xb7, 0x65, 0x7b, 0x31, 0x9d, 0xaa, 0xd5, 0xe9, + 0x1c, 0xd9, 0x37, 0x9a, 0xf5, 0xfb, 0xcb, 0xca, 0x37, 0x72, 0x43, 0x7e, 0x23, 0x74, 0xf6, 0xdb, + 0x03, 0xbe, 0xa1, 0x73, 0x24, 0xbb, 0x50, 0xbd, 0x8b, 0x1b, 0x80, 0xf2, 0x95, 0xfc, 0xf1, 0x5f, + 0x79, 0x45, 0x7c, 0xe5, 0x05, 0xbe, 0x73, 0x64, 0x7f, 0xa7, 0x8f, 0x6b, 0x32, 0x73, 0x0b, 0x27, + 0xce, 0xdc, 0xbf, 0x6b, 0x40, 0x91, 0xef, 0x30, 0xf1, 0x6b, 0x2c, 0x99, 0x7b, 0xd8, 0xd6, 0xb3, + 0xd9, 0xc3, 0xaa, 0x11, 0xfe, 0xa7, 0x5a, 0xf1, 0xbc, 0x8c, 0xcc, 0xa7, 0x9e, 0x76, 0x91, 0xe7, + 0xf0, 0xa8, 0xdd, 0xf2, 0x92, 0xc4, 0x9b, 0x8a, 0xbf, 0xea, 0xa2, 0x72, 0xe1, 0x18, 0xea, 0x43, + 0x93, 0xa3, 0x4f, 0xf9, 0xd0, 0xe4, 0x32, 0x94, 0x85, 0x7b, 0x50, 0xe3, 0x40, 0xd8, 0xb0, 0xf2, + 0x94, 0x26, 0x86, 0x2b, 0xe9, 0xd3, 0x39, 0xc8, 0xde, 0xd6, 0xf2, 0x18, 0xc6, 0x88, 0x64, 0x15, + 0xca, 0x49, 0x4c, 0x8b, 0x1e, 0x8e, 0x19, 0xc3, 0x85, 0xff, 0x2c, 0x8f, 0x8b, 0xcc, 0x0c, 0x61, + 0x49, 0x78, 0x98, 0xdf, 0x32, 0xa0, 0x9a, 0x9e, 0x2f, 0xe4, 0x5d, 0x18, 0x8b, 0xc3, 0x8a, 0x62, + 0x27, 0x05, 0x3c, 0x0d, 0x4d, 0xe2, 0x90, 0x34, 0x77, 0x05, 0x15, 0x9d, 0xcc, 0x42, 0x89, 0x2d, + 0x3b, 0x25, 0x91, 0x35, 0xca, 0x93, 0x9e, 0x80, 0xa9, 0x97, 0x83, 0x12, 0x4f, 0x59, 0xb5, 0xff, + 0x21, 0x0f, 0x63, 0xca, 0x60, 0x91, 0x6b, 0x50, 0x5a, 0x0a, 0x97, 0xfd, 0xd6, 0x1e, 0x75, 0xc5, + 0x9d, 0x03, 0xbe, 0x23, 0xea, 0x85, 0x76, 0x1b, 0x81, 0x56, 0x5c, 0x4c, 0x1a, 0x30, 0xce, 0xff, + 0x93, 0x21, 0xc1, 0xb9, 0xe4, 0xbc, 0x94, 0x23, 0xcb, 0x60, 0x60, 0x75, 0x87, 0xd5, 0x48, 0xc8, + 0xc7, 0x00, 0x1c, 0xc0, 0xc6, 0x77, 0x08, 0xef, 0x60, 0xb9, 0x80, 0xcf, 0x8a, 0x0f, 0x44, 0x9e, + 0xda, 0x42, 0x9c, 0x0a, 0x0a, 0x43, 0x7c, 0xc3, 0xd0, 0x6f, 0xed, 0x0d, 0xff, 0x8a, 0x69, 0xf2, + 0x86, 0xa1, 0xdf, 0xda, 0xb3, 0xb3, 0x5d, 0xc5, 0x54, 0x96, 0xe4, 0xdb, 0x06, 0x5c, 0xb4, 0x68, + 0xcb, 0x7f, 0x48, 0x83, 0x83, 0x7a, 0x84, 0x58, 0xea, 0x17, 0x4f, 0xf6, 0x4b, 0xbb, 0x25, 0xbe, + 0xf8, 0x7a, 0x20, 0xb8, 0x60, 0x4c, 0xcb, 0x7e, 0x37, 0xb2, 0x8f, 0xa9, 0xc2, 0x31, 0x9f, 0x34, + 0xff, 0x93, 0xa1, 0x2c, 0x01, 0xb2, 0x02, 0xe5, 0x78, 0xb2, 0x88, 0x53, 0xcb, 0x58, 0x39, 0x92, + 0x70, 0x8b, 0x3e, 0x68, 0xbc, 0x20, 0xae, 0x07, 0x4e, 0xc7, 0x53, 0x4e, 0x5b, 0x11, 0x12, 0x48, + 0xbe, 0x0a, 0x05, 0x1c, 0xaa, 0x93, 0x33, 0x9f, 0xc9, 0xad, 0xa6, 0xc0, 0xc6, 0x08, 0x6b, 0x8d, + 0x94, 0xe4, 0x8b, 0xc2, 0x55, 0x24, 0xaf, 0xe5, 0x14, 0x66, 0x20, 0x56, 0x8f, 0x78, 0x8f, 0x49, + 0xbc, 0x13, 0x95, 0xd9, 0xfa, 0xf7, 0x72, 0x50, 0x4d, 0x2f, 0x3c, 0xf2, 0x01, 0x54, 0x64, 0x7c, + 0xd2, 0xa2, 0x23, 0xc2, 0x98, 0x2b, 0x22, 0x8c, 0x58, 0xc0, 0xed, 0x5d, 0x47, 0xcb, 0x67, 0xa7, + 0x11, 0xb0, 0x0d, 0x79, 0x5d, 0x38, 0xbd, 0x2b, 0x0b, 0x28, 0xf2, 0xa3, 0x6e, 0x2a, 0x4f, 0xa9, + 0x44, 0x23, 0x6f, 0x41, 0x9e, 0x07, 0xed, 0xa9, 0x49, 0xae, 0xee, 0xdf, 0xa9, 0xf3, 0x98, 0x23, + 0x7e, 0x23, 0xad, 0x1f, 0xed, 0x33, 0x7c, 0xb2, 0xac, 0x84, 0x7c, 0x15, 0xb5, 0x64, 0x3f, 0x12, + 0x1c, 0x37, 0xee, 0xe4, 0xd8, 0xaf, 0x0f, 0x0b, 0xa5, 0x7c, 0xb5, 0x20, 0x82, 0x7c, 0xfe, 0x28, + 0x0f, 0xe5, 0xf8, 0xfb, 0x84, 0x00, 0xea, 0x1b, 0xe2, 0x6a, 0x19, 0xff, 0x27, 0x17, 0xa0, 0x24, + 0x55, 0x0c, 0x71, 0xbd, 0x3c, 0x1a, 0x0a, 0xf5, 0x62, 0x1a, 0xa4, 0x2e, 0xc1, 0xd5, 0x0b, 0x4b, + 0xfe, 0x24, 0x37, 0x21, 0x56, 0x14, 0x06, 0x69, 0x14, 0x05, 0x36, 0x60, 0x56, 0x8c, 0x46, 0x26, + 0x20, 0xe7, 0x71, 0x87, 0xe6, 0xb2, 0x95, 0xf3, 0x5c, 0xf2, 0x01, 0x94, 0x1c, 0xd7, 0xa5, 0xae, + 0xed, 0x44, 0x43, 0xbc, 0x28, 0x5b, 0x62, 0xdc, 0xb8, 0x44, 0x47, 0xaa, 0x7a, 0x44, 0xea, 0x50, + 0xc6, 0x07, 0x45, 0x7b, 0xe1, 0x50, 0xaf, 0x90, 0x26, 0x1c, 0x4a, 0x8c, 0x6c, 0x23, 0xa4, 0x2e, + 0x79, 0x1d, 0x0a, 0x6c, 0x34, 0xc5, 0x7e, 0x10, 0xa7, 0x2e, 0x5c, 0x5d, 0x5f, 0xe3, 0x1d, 0xb6, + 0x78, 0xca, 0x42, 0x04, 0xf2, 0x2a, 0xe4, 0x7b, 0xb3, 0x0f, 0x84, 0xa4, 0xaf, 0x26, 0xf1, 0x9c, + 0x31, 0x1a, 0x2b, 0x26, 0xb7, 0xa0, 0xf4, 0x48, 0x8f, 0xdc, 0x3b, 0x9b, 0x1a, 0xc6, 0x18, 0x3f, + 0x46, 0x6c, 0x94, 0xa0, 0xc8, 0x63, 0xd6, 0xcc, 0x97, 0x00, 0x92, 0x4f, 0xf7, 0x7b, 0x01, 0x98, + 0x1f, 0x43, 0x39, 0xfe, 0x24, 0x79, 0x11, 0x60, 0x8f, 0x1e, 0xd8, 0xbb, 0x4e, 0xc7, 0x15, 0x0f, + 0xe9, 0x54, 0xac, 0xf2, 0x1e, 0x3d, 0x58, 0x44, 0x00, 0x39, 0x0f, 0xa3, 0x5d, 0x36, 0xaa, 0x32, + 0xcb, 0xae, 0x55, 0xec, 0xf6, 0xb6, 0xd9, 0x0c, 0x9d, 0x86, 0x51, 0x3c, 0x7f, 0x10, 0x0b, 0x6d, + 0xdc, 0x92, 0x3f, 0xcd, 0xdf, 0xcb, 0x61, 0xfe, 0x05, 0xa5, 0x9e, 0xe4, 0x15, 0x18, 0x6f, 0x05, + 0x14, 0xb7, 0x23, 0x87, 0xa9, 0x45, 0xe2, 0x3b, 0x95, 0x04, 0xb8, 0xe4, 0x92, 0x2b, 0x30, 0x99, + 0xa4, 0xfd, 0xb5, 0x5b, 0xdb, 0x22, 0x6e, 0xb7, 0x62, 0x8d, 0x77, 0x65, 0xde, 0xdf, 0xb9, 0x6d, + 0x74, 0xc4, 0xaf, 0xaa, 0xf1, 0x6a, 0x91, 0x4c, 0xe1, 0x5b, 0xb6, 0x26, 0x15, 0x38, 0xde, 0x5d, + 0x9c, 0x83, 0xa2, 0xe3, 0xec, 0xf4, 0x3c, 0xee, 0x14, 0x5c, 0xb1, 0xc4, 0x2f, 0xf2, 0x05, 0x98, + 0x0a, 0xbd, 0x9d, 0x8e, 0x13, 0xf5, 0x02, 0x91, 0x00, 0x83, 0x06, 0x38, 0xa5, 0xc6, 0xad, 0x6a, + 0x5c, 0x30, 0xc7, 0xe1, 0xe4, 0x4d, 0x20, 0xea, 0xf7, 0xfc, 0xed, 0x4f, 0x68, 0x8b, 0x4f, 0xb5, + 0x8a, 0x35, 0xa5, 0x94, 0xac, 0x62, 0x01, 0x79, 0x19, 0x2a, 0x01, 0x0d, 0x51, 0x25, 0xc3, 0x6e, + 0xc3, 0xb4, 0x3e, 0xd6, 0x98, 0x84, 0xdd, 0xa3, 0x07, 0x66, 0x03, 0xa6, 0xfa, 0xd6, 0x23, 0x79, + 0x93, 0x6b, 0xf7, 0x62, 0x7f, 0xae, 0x70, 0x63, 0x86, 0x09, 0xa9, 0xd4, 0x1b, 0xd4, 0x1c, 0xc9, + 0xec, 0x40, 0x45, 0x95, 0xaf, 0x27, 0x44, 0x44, 0x9f, 0x43, 0xef, 0x44, 0x2e, 0x7c, 0x8a, 0x47, + 0x87, 0xb5, 0x9c, 0xe7, 0xa2, 0x4f, 0xe2, 0x55, 0x28, 0x49, 0x2d, 0x41, 0x7d, 0x48, 0x46, 0x28, + 0x94, 0x07, 0x56, 0x5c, 0x6a, 0xbe, 0x0e, 0xa3, 0x42, 0x84, 0x1e, 0x7f, 0x16, 0x64, 0xfe, 0x52, + 0x0e, 0x26, 0x2d, 0xca, 0x16, 0xb8, 0x78, 0xa2, 0xe5, 0x73, 0x96, 0x00, 0x59, 0x6b, 0xdb, 0x31, + 0x09, 0x08, 0xbe, 0x67, 0xc0, 0xe9, 0x0c, 0xdc, 0x4f, 0x95, 0x31, 0xed, 0x36, 0x94, 0xe7, 0x3d, + 0xa7, 0x5d, 0x77, 0xdd, 0xd8, 0xcb, 0x12, 0xb5, 0x41, 0x97, 0x2d, 0x27, 0x87, 0x41, 0xd5, 0xcd, + 0x34, 0x46, 0x25, 0xd7, 0xc5, 0xa4, 0x48, 0x72, 0x3a, 0xca, 0x14, 0xcb, 0xc0, 0xeb, 0x94, 0x24, + 0x58, 0xc6, 0x58, 0x36, 0x0e, 0x4c, 0x2e, 0xd2, 0x9f, 0xdb, 0xa1, 0xcb, 0x8e, 0x65, 0x4b, 0x37, + 0x6f, 0x28, 0xb3, 0xf3, 0x5b, 0x39, 0x38, 0x97, 0x4d, 0xf8, 0x69, 0x93, 0xdf, 0x61, 0xf6, 0x07, + 0x25, 0x8b, 0x35, 0x26, 0xbf, 0xe3, 0xa9, 0x22, 0x10, 0x3f, 0x41, 0x20, 0x0f, 0x60, 0x7c, 0xd9, + 0x09, 0xa3, 0x45, 0xea, 0x04, 0xd1, 0x36, 0x75, 0xa2, 0x21, 0x34, 0xd8, 0xf8, 0xa5, 0x67, 0xdc, + 0xd4, 0x76, 0x25, 0x65, 0xfa, 0xa5, 0x67, 0x8d, 0x6d, 0x3c, 0x51, 0x0a, 0x43, 0x4c, 0x94, 0x9f, + 0x81, 0xc9, 0x26, 0xdd, 0x77, 0xba, 0xbb, 0x7e, 0x40, 0xc5, 0xf1, 0xf5, 0x0d, 0x18, 0x8f, 0x41, + 0x99, 0xb3, 0x45, 0x2f, 0xd6, 0xf0, 0x95, 0x8e, 0x48, 0x44, 0x89, 0x5e, 0x6c, 0xfe, 0x4e, 0x0e, + 0xce, 0xd7, 0x5b, 0xe2, 0xac, 0x5f, 0x14, 0xc8, 0x2b, 0xc9, 0xcf, 0xf8, 0xdb, 0x64, 0x06, 0xca, + 0xf7, 0x9d, 0xc7, 0xcb, 0x14, 0xdf, 0x62, 0xe5, 0x29, 0x94, 0xb8, 0xfa, 0xe5, 0x3c, 0xb6, 0xe3, + 0x63, 0x2f, 0x2b, 0xc1, 0x51, 0x8d, 0xcd, 0xc2, 0x53, 0x1a, 0x9b, 0x26, 0x14, 0x17, 0xfd, 0xb6, + 0x2b, 0x36, 0x27, 0x71, 0x75, 0xb0, 0x8b, 0x10, 0x4b, 0x94, 0x98, 0x3f, 0x34, 0x60, 0x22, 0xae, + 0x31, 0x56, 0xe1, 0x33, 0xef, 0x92, 0x2b, 0x30, 0x8a, 0x1f, 0x8a, 0x5f, 0x2c, 0xc2, 0x4d, 0xa3, + 0xcd, 0x40, 0xb6, 0xe7, 0x5a, 0xb2, 0x50, 0xed, 0x89, 0x91, 0xa7, 0xeb, 0x09, 0xf3, 0x9f, 0xe2, + 0xad, 0x84, 0xda, 0x4a, 0xb6, 0x13, 0x29, 0x15, 0x31, 0x86, 0xac, 0x48, 0xee, 0x99, 0x0d, 0x49, + 0x7e, 0xe0, 0x90, 0xfc, 0x72, 0x0e, 0xc6, 0xe2, 0xca, 0x7e, 0xce, 0x82, 0xc0, 0xe3, 0x76, 0x0d, + 0xe5, 0xe2, 0xdd, 0x54, 0x64, 0x85, 0xf0, 0xa4, 0xfe, 0x2a, 0x14, 0xc5, 0x62, 0x32, 0x52, 0x57, + 0x73, 0xa9, 0xd1, 0x4d, 0x5e, 0xeb, 0xc5, 0x01, 0x0d, 0x2d, 0x41, 0x87, 0x3e, 0xf4, 0x5b, 0x74, + 0x5b, 0x5c, 0x52, 0x3d, 0xb7, 0x7b, 0x54, 0xb6, 0x0f, 0x7d, 0xd2, 0xb0, 0xa1, 0x76, 0xa7, 0x7f, + 0x54, 0x80, 0x6a, 0x9a, 0xe4, 0xe4, 0x30, 0xfb, 0xb5, 0xde, 0xb6, 0x78, 0x34, 0x03, 0xc3, 0xec, + 0xbb, 0xbd, 0x6d, 0x8b, 0xc1, 0xc8, 0x15, 0x28, 0xac, 0x05, 0xde, 0x43, 0x6c, 0xb5, 0x78, 0x33, + 0xa4, 0x1b, 0x78, 0x0f, 0x55, 0x67, 0x52, 0x56, 0x8e, 0x06, 0xed, 0x72, 0x53, 0x79, 0x28, 0x9d, + 0x1b, 0xb4, 0xed, 0x30, 0x9d, 0xcf, 0x45, 0xa2, 0xb1, 0xad, 0xb2, 0x41, 0x9d, 0x40, 0x84, 0x84, + 0x0b, 0x71, 0x86, 0x5b, 0xe5, 0x36, 0x82, 0x79, 0x02, 0x5e, 0x4b, 0x45, 0x22, 0x6d, 0x20, 0xca, + 0x4f, 0xb9, 0x80, 0x4f, 0xb6, 0xf1, 0xe4, 0x5b, 0x57, 0x67, 0x54, 0xd6, 0xb6, 0xba, 0x9a, 0x33, + 0xf8, 0x3e, 0xcb, 0x33, 0xc2, 0x35, 0x28, 0xe3, 0x91, 0x17, 0x1e, 0x64, 0x94, 0x4e, 0x64, 0x26, + 0x1d, 0x77, 0x01, 0xaf, 0xf4, 0xed, 0xf8, 0x38, 0x23, 0x61, 0x42, 0xde, 0x87, 0x31, 0xd5, 0xdb, + 0x94, 0xfb, 0x44, 0x5e, 0xe2, 0x61, 0x46, 0x03, 0x72, 0xd9, 0xa9, 0x04, 0xe6, 0x17, 0xd5, 0x59, + 0x22, 0x36, 0xed, 0x63, 0x67, 0x89, 0xf9, 0x5b, 0xa8, 0xc6, 0xef, 0xfb, 0x11, 0x15, 0xda, 0xcb, + 0x73, 0x2b, 0xc7, 0x92, 0x23, 0xe4, 0x11, 0xcd, 0xad, 0x44, 0x6b, 0xdd, 0x13, 0x3c, 0x11, 0xfe, + 0x87, 0x06, 0x9c, 0xcd, 0xa4, 0x25, 0x37, 0x00, 0x12, 0x1d, 0x51, 0xf4, 0x12, 0xcf, 0x6c, 0x1c, + 0x43, 0x2d, 0x05, 0x83, 0x7c, 0x33, 0xad, 0xdd, 0x9d, 0xbc, 0x39, 0xc9, 0xf7, 0x3f, 0x26, 0x74, + 0xed, 0x2e, 0x43, 0xa7, 0x33, 0xbf, 0x97, 0x87, 0xa9, 0xbe, 0xc7, 0x26, 0x4f, 0xb8, 0xc8, 0xdf, + 0x4b, 0xbd, 0x4a, 0xc6, 0xaf, 0x3b, 0xae, 0x0f, 0x7a, 0xea, 0x32, 0xe3, 0x8d, 0x32, 0x3c, 0x16, + 0x13, 0x49, 0xb5, 0x4f, 0x78, 0xaa, 0x2c, 0xcc, 0x7e, 0xcf, 0xee, 0x0b, 0x03, 0xbf, 0xf6, 0x0c, + 0xde, 0xb5, 0xfb, 0x31, 0x7e, 0xf6, 0xeb, 0xb7, 0x72, 0x70, 0xba, 0xaf, 0xcd, 0xcf, 0xed, 0xaa, + 0xfb, 0xaa, 0xb6, 0xbb, 0xbd, 0x34, 0x68, 0x4c, 0x87, 0xd2, 0x22, 0xfe, 0xa7, 0x01, 0xe7, 0x07, + 0x50, 0x92, 0x83, 0xf4, 0x24, 0xe2, 0x5a, 0xc5, 0xcd, 0xe3, 0x3f, 0xf8, 0x4c, 0xa6, 0xd2, 0x67, + 0x36, 0x13, 0x7e, 0x29, 0x07, 0xb0, 0x45, 0xb7, 0x9f, 0xef, 0x1c, 0x42, 0x5f, 0xd6, 0x26, 0x80, + 0x72, 0x80, 0x39, 0x7c, 0x0a, 0xa1, 0x55, 0x3c, 0x48, 0x1c, 0x3e, 0x81, 0x50, 0xfc, 0xc6, 0x49, + 0x2e, 0xfb, 0x8d, 0x13, 0x73, 0x1b, 0xce, 0xdc, 0xa5, 0x51, 0xb2, 0x13, 0x4a, 0x1b, 0xf2, 0x78, + 0xb6, 0x6f, 0x40, 0x59, 0xe0, 0xeb, 0xf9, 0xea, 0xa5, 0x57, 0x9a, 0xe7, 0x5a, 0x09, 0x82, 0x49, + 0xe1, 0xfc, 0x3c, 0x6d, 0xd3, 0x88, 0x7e, 0xb6, 0x9f, 0x69, 0x02, 0xe1, 0x4d, 0xe1, 0x4f, 0x5f, + 0x0c, 0xf5, 0x85, 0x13, 0xfb, 0x67, 0x13, 0xce, 0xc6, 0x75, 0x7f, 0x96, 0x7c, 0x67, 0x98, 0x2e, + 0x21, 0x02, 0xf6, 0x12, 0x8e, 0xc7, 0x1c, 0x22, 0x3e, 0x86, 0x8b, 0x92, 0x60, 0xcb, 0x8b, 0x6f, + 0x62, 0x86, 0xa2, 0x25, 0xef, 0xc2, 0x98, 0x42, 0x23, 0xa2, 0x7f, 0xf1, 0xb6, 0xf3, 0x91, 0x17, + 0xed, 0xda, 0x21, 0x87, 0xab, 0xb7, 0x9d, 0x0a, 0xba, 0xf9, 0x0d, 0x78, 0x21, 0xf6, 0x5b, 0xc9, + 0xf8, 0x74, 0x8a, 0xb9, 0xf1, 0x64, 0xcc, 0x57, 0x92, 0x66, 0x2d, 0x75, 0x62, 0x27, 0x74, 0xc9, + 0x9b, 0xa8, 0xcd, 0x12, 0x8d, 0xb9, 0xa4, 0xe4, 0x56, 0x13, 0x7b, 0x51, 0x02, 0x30, 0xdf, 0x51, + 0x2a, 0x9b, 0xc1, 0x50, 0x23, 0x36, 0xd2, 0xc4, 0xbf, 0x94, 0x83, 0xc9, 0xd5, 0xa5, 0xf9, 0xb9, + 0xf8, 0x18, 0xf9, 0x73, 0x96, 0xe0, 0x48, 0x6b, 0xdb, 0x60, 0x79, 0x63, 0x6e, 0xc0, 0xe9, 0x54, + 0x37, 0xe0, 0xcb, 0x3e, 0xef, 0x73, 0xff, 0x92, 0x18, 0x2c, 0x77, 0x96, 0x73, 0x59, 0xec, 0x37, + 0x6f, 0x59, 0x29, 0x6c, 0xf3, 0x7b, 0xc5, 0x14, 0x5f, 0x21, 0xc2, 0xde, 0x80, 0xf2, 0x52, 0x18, + 0xf6, 0x68, 0xb0, 0x61, 0x2d, 0xab, 0x3a, 0xa2, 0x87, 0x40, 0xbb, 0x17, 0xb4, 0xad, 0x04, 0x81, + 0x5c, 0x83, 0x92, 0x08, 0x12, 0x93, 0x32, 0x01, 0xaf, 0xcb, 0xe3, 0x18, 0x33, 0x2b, 0x2e, 0x26, + 0x6f, 0x41, 0x85, 0xff, 0xcf, 0x67, 0x9b, 0xe8, 0x70, 0x3c, 0xab, 0x12, 0xe8, 0x7c, 0x76, 0x5a, + 0x1a, 0x1a, 0xb3, 0xcc, 0xe4, 0xd3, 0xa1, 0xac, 0x46, 0x85, 0xc4, 0x32, 0x93, 0xaf, 0x8c, 0x62, + 0x9d, 0x54, 0x24, 0x72, 0x1d, 0xf2, 0xf5, 0x39, 0x4b, 0x4d, 0xd1, 0xed, 0xb4, 0x02, 0x9e, 0xe2, + 0x5e, 0x7b, 0x9d, 0xab, 0x3e, 0x67, 0x91, 0x59, 0x28, 0xe1, 0xeb, 0x2b, 0x2e, 0x0d, 0x84, 0xe3, + 0x29, 0xce, 0x9a, 0xae, 0x80, 0x69, 0x6f, 0x9b, 0x0b, 0x18, 0x99, 0x81, 0xd1, 0x79, 0x2f, 0xec, + 0xb6, 0x9d, 0x03, 0x91, 0xd9, 0x04, 0x2f, 0x43, 0x5c, 0x0e, 0x52, 0xe7, 0x99, 0xc0, 0x22, 0xd7, + 0x60, 0xa4, 0xd9, 0xf2, 0xbb, 0xcc, 0xda, 0x8a, 0x5d, 0x5b, 0x42, 0x06, 0xd0, 0xd2, 0x23, 0x30, + 0x00, 0xc6, 0x2d, 0xf3, 0xf0, 0xab, 0xb2, 0x12, 0xb7, 0x9c, 0x0e, 0xbb, 0x12, 0x38, 0xfd, 0xfe, + 0x7f, 0xf0, 0x2c, 0xfd, 0xff, 0xb6, 0xe1, 0xfc, 0x5d, 0x54, 0xf5, 0x9b, 0x34, 0xc0, 0x64, 0x92, + 0xfc, 0x25, 0xa7, 0x0d, 0x6b, 0x49, 0x84, 0x9c, 0x5d, 0x3d, 0x3a, 0xac, 0xbd, 0xca, 0xad, 0x01, + 0x3b, 0xe4, 0x38, 0xf2, 0x11, 0xa8, 0xd4, 0xf3, 0x15, 0x83, 0x18, 0x91, 0xaf, 0xc1, 0x99, 0xac, + 0x22, 0x11, 0x7c, 0x86, 0xae, 0xe5, 0xd9, 0x1f, 0x50, 0x7d, 0xbb, 0xb3, 0x38, 0x90, 0x65, 0xa8, + 0x72, 0x78, 0xdd, 0xdd, 0xf7, 0x3a, 0x0b, 0xfb, 0x8e, 0xd7, 0xc6, 0x50, 0x34, 0x11, 0x4f, 0x28, + 0xb8, 0x3a, 0xac, 0xd0, 0xa6, 0xac, 0x54, 0xf3, 0x4e, 0x4a, 0x51, 0xa2, 0x38, 0x6a, 0xd6, 0xef, + 0x2f, 0x27, 0x6b, 0xea, 0xf3, 0x75, 0x6f, 0xa4, 0xb5, 0xed, 0x98, 0x7b, 0xa3, 0x0d, 0x38, 0x9d, + 0xea, 0x06, 0x29, 0x8e, 0x34, 0x70, 0x5a, 0x1c, 0xa5, 0x68, 0xac, 0x14, 0xb6, 0xf9, 0x1f, 0x8b, + 0x29, 0xbe, 0xe2, 0xac, 0xc8, 0x84, 0x22, 0x97, 0x36, 0x6a, 0xea, 0x33, 0x2e, 0x8b, 0x2c, 0x51, + 0x42, 0x2e, 0x40, 0xbe, 0xd9, 0x5c, 0x55, 0x13, 0x33, 0x86, 0xa1, 0x6f, 0x31, 0x18, 0x1b, 0x21, + 0x3c, 0x06, 0x52, 0xa2, 0xbc, 0x5a, 0x34, 0x88, 0xc4, 0xdb, 0xb2, 0xaf, 0x25, 0xeb, 0xb8, 0x90, + 0xf4, 0xb7, 0x58, 0xc7, 0xc9, 0xea, 0x9d, 0x83, 0xe9, 0x7a, 0x18, 0xd2, 0x80, 0xe7, 0x35, 0xef, + 0x84, 0xbd, 0x7d, 0x1a, 0x88, 0xb9, 0x26, 0x64, 0x0c, 0x7f, 0x99, 0xbe, 0x15, 0x5a, 0x03, 0x11, + 0xc9, 0x55, 0x28, 0xd5, 0x7b, 0xae, 0x47, 0x3b, 0x2d, 0xcd, 0xc1, 0xdd, 0x11, 0x30, 0x2b, 0x2e, + 0x25, 0x1f, 0xc1, 0x59, 0x41, 0x24, 0x05, 0x8e, 0xe8, 0x01, 0x2e, 0x6b, 0xb8, 0x05, 0x2b, 0xd6, + 0x82, 0x14, 0x53, 0xb6, 0xe8, 0x92, 0x6c, 0x4a, 0x52, 0x87, 0xea, 0x02, 0xde, 0x93, 0xca, 0x17, + 0xa6, 0xfd, 0x40, 0x64, 0x0d, 0x46, 0xc9, 0xc5, 0xef, 0x50, 0x6d, 0x37, 0x2e, 0xb4, 0xfa, 0xd0, + 0xc9, 0x3d, 0x38, 0x9d, 0x86, 0x31, 0x79, 0x5c, 0x4e, 0x5e, 0x80, 0xeb, 0xe3, 0x82, 0x82, 0x39, + 0x8b, 0x8a, 0x6c, 0xc3, 0x54, 0x3d, 0x8a, 0x02, 0x6f, 0xbb, 0x17, 0xd1, 0x94, 0xe8, 0x92, 0x07, + 0x8d, 0x71, 0xb9, 0x14, 0x5f, 0x2f, 0x88, 0xc9, 0x78, 0xda, 0x89, 0x29, 0x63, 0x11, 0x66, 0xf5, + 0xb3, 0x23, 0x6e, 0xfc, 0x88, 0xa4, 0x78, 0x68, 0x51, 0x44, 0x25, 0xc9, 0x03, 0xdd, 0x7a, 0x78, + 0xb0, 0xbf, 0x4f, 0xa3, 0x00, 0x6f, 0xee, 0xf1, 0x21, 0x46, 0x53, 0xf8, 0x00, 0x5d, 0x54, 0xde, + 0x4e, 0xc5, 0xc7, 0x36, 0x35, 0xf7, 0x48, 0x8d, 0xa7, 0xb6, 0x7d, 0x54, 0x86, 0xdc, 0x3e, 0xda, + 0x30, 0xb5, 0xd0, 0x69, 0x05, 0x07, 0x18, 0x1e, 0x29, 0x2b, 0x37, 0x7e, 0x42, 0xe5, 0xe4, 0x2b, + 0x2b, 0x97, 0x1c, 0x39, 0xc3, 0xb2, 0xaa, 0xd7, 0xcf, 0xd8, 0xfc, 0xff, 0xa0, 0x9a, 0xee, 0xcb, + 0xa7, 0x7c, 0x39, 0xfb, 0x49, 0x5c, 0xb3, 0xd9, 0x48, 0xa7, 0xdb, 0x42, 0x66, 0xb4, 0xe7, 0x91, + 0x8d, 0x24, 0xb4, 0x5d, 0x79, 0xc8, 0x58, 0x7b, 0x14, 0x59, 0x2e, 0xe3, 0x5c, 0xd6, 0x32, 0x36, + 0x7f, 0x25, 0x07, 0x53, 0xdc, 0x9b, 0xf4, 0xf9, 0xd7, 0x15, 0xdf, 0xd7, 0x84, 0xb3, 0x3c, 0x0b, + 0x4c, 0xb5, 0xee, 0x18, 0x6d, 0xf1, 0x63, 0x38, 0xdb, 0xd7, 0x15, 0x28, 0xa0, 0xe7, 0xa5, 0x1f, + 0x6f, 0x9f, 0x88, 0x9e, 0xce, 0xfe, 0xc8, 0xe6, 0x2d, 0xab, 0x8f, 0xc2, 0xfc, 0xc7, 0xb9, 0x3e, + 0xfe, 0x42, 0x6f, 0x54, 0x35, 0x41, 0xe3, 0xc9, 0x34, 0xc1, 0xdc, 0xa7, 0xd2, 0x04, 0xf3, 0xc3, + 0x68, 0x82, 0x1f, 0xc1, 0xf8, 0x3a, 0x75, 0x98, 0x46, 0x23, 0x22, 0xd6, 0x0a, 0xda, 0xd3, 0xc5, + 0xac, 0x4c, 0xca, 0x97, 0x38, 0xda, 0x35, 0x62, 0x04, 0x4c, 0xb4, 0xf0, 0x10, 0x36, 0x4b, 0xe7, + 0xa0, 0x6e, 0x1a, 0x23, 0x83, 0x37, 0x0d, 0xf3, 0x5b, 0x39, 0x18, 0x53, 0xd8, 0x93, 0x2f, 0x41, + 0x65, 0x35, 0xd8, 0x71, 0x3a, 0xde, 0xcf, 0x3a, 0xca, 0xf1, 0x2b, 0x56, 0xdf, 0x57, 0xe0, 0x96, + 0x86, 0x85, 0x6e, 0x33, 0xd4, 0xd9, 0x57, 0x27, 0x3e, 0xab, 0x9e, 0x85, 0x50, 0x25, 0xe2, 0x38, + 0x3f, 0x44, 0xc4, 0xb1, 0x1e, 0xae, 0x5b, 0x78, 0xf2, 0x70, 0x5d, 0x2d, 0xba, 0x76, 0xe4, 0x09, + 0xa3, 0x6b, 0xcd, 0x5f, 0xcb, 0x41, 0x55, 0x3c, 0xf2, 0x2b, 0x0f, 0x0f, 0x3f, 0x5f, 0x0f, 0x48, + 0xe8, 0x8d, 0x3b, 0xe6, 0x7a, 0xac, 0xf0, 0xdb, 0xbf, 0x5f, 0xc3, 0x27, 0x5b, 0xd3, 0xdd, 0x21, + 0x9f, 0x6c, 0xd5, 0xe1, 0xe9, 0xc8, 0x81, 0x34, 0x95, 0x95, 0xc6, 0x37, 0xff, 0x22, 0x97, 0xe6, + 0x2d, 0xb4, 0xa9, 0xd7, 0x60, 0x94, 0xbf, 0xd1, 0x26, 0x9d, 0x9b, 0x45, 0x02, 0x28, 0x04, 0x59, + 0xb2, 0xec, 0x49, 0x62, 0x48, 0x4e, 0x7a, 0xb7, 0x97, 0xdc, 0x16, 0xef, 0xe0, 0xd4, 0x5d, 0x37, + 0xa0, 0x61, 0x28, 0x14, 0x2d, 0xbc, 0xbb, 0x7b, 0x44, 0xb7, 0x6d, 0xee, 0x57, 0xe2, 0xb8, 0x6e, + 0x60, 0x69, 0x78, 0x64, 0x0e, 0xce, 0x68, 0xee, 0x49, 0x92, 0x7e, 0x24, 0xd9, 0x2d, 0xc4, 0xdb, + 0x3f, 0x48, 0x9c, 0x89, 0xfc, 0xec, 0xde, 0x2c, 0x37, 0xff, 0xda, 0x60, 0x6b, 0xad, 0xb5, 0xf7, + 0x39, 0x8b, 0x6e, 0x61, 0x4d, 0x3a, 0x46, 0xd9, 0xff, 0xf7, 0x06, 0xf7, 0x4f, 0x17, 0xd3, 0xe7, + 0x6d, 0x28, 0xf2, 0x17, 0xe1, 0x84, 0x27, 0xb5, 0xca, 0x85, 0x17, 0x24, 0xf7, 0x53, 0xfc, 0x5d, + 0x39, 0x4b, 0x10, 0x30, 0x93, 0x59, 0x77, 0x93, 0x47, 0xc5, 0xb3, 0xdf, 0x3f, 0x5e, 0x62, 0xa9, + 0xc9, 0x4d, 0x87, 0x4b, 0x9a, 0x6d, 0x9c, 0x9c, 0xdc, 0xd4, 0xfc, 0xbf, 0x39, 0xde, 0x1e, 0x51, + 0xa9, 0x61, 0xb3, 0xf6, 0x5d, 0x81, 0x02, 0xbe, 0x3d, 0xac, 0xa4, 0x46, 0x4c, 0xbd, 0x3b, 0x8c, + 0xe5, 0x6c, 0xdd, 0xa0, 0xac, 0x55, 0x03, 0xaa, 0x50, 0x1c, 0xab, 0xeb, 0x06, 0x31, 0x30, 0x25, + 0xb5, 0xef, 0x52, 0x75, 0x39, 0x74, 0xf4, 0xec, 0xe1, 0x58, 0x4e, 0x6e, 0x2b, 0x7e, 0xcd, 0xea, + 0x81, 0xc6, 0xfe, 0x03, 0xc7, 0xe6, 0xfe, 0xb4, 0xaa, 0xb4, 0x4d, 0x5c, 0xa0, 0x17, 0x60, 0x42, + 0x0f, 0x78, 0x16, 0x46, 0x07, 0x06, 0x29, 0xa6, 0x82, 0xa5, 0x55, 0xf5, 0x56, 0x27, 0x22, 0x0d, + 0x18, 0xd7, 0xa2, 0x5a, 0xd5, 0x4c, 0xae, 0x3c, 0xc5, 0x8c, 0xdd, 0x9f, 0x8e, 0x41, 0x27, 0x51, + 0x0e, 0xcc, 0xbf, 0x08, 0x55, 0xb1, 0x32, 0xe3, 0xd8, 0x36, 0x54, 0xed, 0x96, 0xe6, 0x2d, 0x75, + 0x35, 0xb5, 0x3c, 0x37, 0xb0, 0x10, 0x6a, 0x7e, 0xd7, 0x80, 0x0b, 0xe2, 0xa5, 0x3b, 0x8b, 0x86, + 0x4c, 0x87, 0xc4, 0x80, 0x38, 0x9c, 0x8f, 0x5f, 0x22, 0xef, 0xca, 0xec, 0x55, 0xba, 0x80, 0x4c, + 0x7f, 0xa3, 0x31, 0x2e, 0x26, 0xe5, 0x08, 0xe6, 0xaf, 0x92, 0x59, 0xab, 0xde, 0x16, 0x59, 0xab, + 0x72, 0xc7, 0x13, 0xc7, 0xeb, 0xc2, 0xa5, 0x1d, 0x99, 0xad, 0xea, 0xd7, 0x73, 0x70, 0x36, 0xa3, + 0x5a, 0x9b, 0x5f, 0x7a, 0x4e, 0x85, 0x43, 0x43, 0x13, 0x0e, 0x32, 0xad, 0xe1, 0xc0, 0x8e, 0xcf, + 0x94, 0x15, 0xbf, 0x6b, 0xc0, 0x79, 0x7d, 0xf6, 0x08, 0x5b, 0x74, 0xf3, 0x16, 0x79, 0x07, 0x8a, + 0x8b, 0xd4, 0x71, 0xa9, 0x0c, 0xc1, 0x88, 0x53, 0x84, 0x89, 0xd3, 0x61, 0x5e, 0xc8, 0xd9, 0xfe, + 0x05, 0x5f, 0xca, 0xa7, 0x2c, 0x41, 0x42, 0xe6, 0x45, 0xe5, 0xf8, 0xf5, 0x94, 0x29, 0x6f, 0x6a, + 0xb2, 0x3e, 0x75, 0x8c, 0x62, 0xfc, 0x87, 0x06, 0xbc, 0x70, 0x0c, 0x0d, 0x1b, 0x38, 0x36, 0xf4, + 0xea, 0xc0, 0xe1, 0xc6, 0x82, 0x50, 0xf2, 0x3e, 0x4c, 0xae, 0x8b, 0x48, 0x31, 0x39, 0x1c, 0x4a, + 0x8a, 0x78, 0x19, 0x44, 0x66, 0xcb, 0x71, 0x49, 0x23, 0x33, 0xeb, 0x7f, 0xd1, 0x0f, 0xa3, 0x4e, + 0x92, 0x71, 0x06, 0xad, 0xff, 0x5d, 0x01, 0xb3, 0xe2, 0x52, 0xa6, 0x16, 0xe8, 0xd5, 0x14, 0xee, + 0x10, 0xaf, 0x40, 0x91, 0xe1, 0xc4, 0xda, 0x35, 0xce, 0x03, 0x7c, 0xb3, 0xcb, 0x73, 0x2d, 0x51, + 0x14, 0xdb, 0x75, 0xb9, 0xcc, 0x5b, 0x8b, 0x6f, 0x19, 0x50, 0xd5, 0x79, 0x3f, 0xed, 0xd0, 0xbc, + 0xa7, 0x0d, 0xcd, 0x0b, 0xd9, 0x43, 0x33, 0x78, 0x4c, 0xfa, 0x92, 0x3f, 0x0c, 0x35, 0x16, 0x26, + 0x14, 0xe7, 0xfd, 0x7d, 0xc7, 0xeb, 0xa8, 0x09, 0x0b, 0x5c, 0x84, 0x58, 0xa2, 0x44, 0xe9, 0xad, + 0xfc, 0xc0, 0xde, 0x32, 0xbf, 0x53, 0x80, 0x0b, 0x16, 0xdd, 0xf1, 0x98, 0x82, 0xb4, 0x11, 0x7a, + 0x9d, 0x1d, 0xed, 0x4e, 0xc9, 0x4c, 0x75, 0xb8, 0xf0, 0xa4, 0x63, 0x90, 0xb8, 0xbf, 0xaf, 0x41, + 0x89, 0x49, 0x69, 0xa5, 0xcf, 0xd1, 0xe8, 0xc1, 0xb4, 0x3b, 0x7c, 0x5c, 0x65, 0x31, 0xb9, 0x2e, + 0xf6, 0x10, 0xc5, 0xd7, 0x99, 0xed, 0x21, 0xa9, 0x67, 0xe4, 0xf9, 0x3e, 0x12, 0x2b, 0x55, 0x85, + 0x01, 0x4a, 0xd5, 0x7d, 0x38, 0x53, 0x77, 0xb9, 0x7c, 0x72, 0xda, 0x6b, 0x81, 0xd7, 0x69, 0x79, + 0x5d, 0xa7, 0x2d, 0x95, 0x72, 0xfe, 0xa8, 0x7e, 0x5c, 0x6e, 0x77, 0x63, 0x04, 0x2b, 0x93, 0x8c, + 0x35, 0x63, 0x7e, 0xa5, 0xc9, 0xb3, 0xaa, 0xf0, 0x58, 0x76, 0x6c, 0x86, 0xdb, 0x09, 0x79, 0x5a, + 0x15, 0x2b, 0x2e, 0x46, 0x75, 0x0e, 0xc3, 0x1d, 0xd6, 0x97, 0x9b, 0xf7, 0x44, 0xf8, 0x80, 0x74, + 0xc5, 0xe2, 0xd1, 0x11, 0x51, 0x3b, 0x44, 0xfb, 0x5d, 0xc3, 0x4b, 0xe8, 0x9a, 0xcd, 0x45, 0x46, + 0x57, 0xea, 0xa3, 0x0b, 0xc3, 0x5d, 0x95, 0x8e, 0xe3, 0x91, 0x19, 0x00, 0xee, 0xcc, 0x82, 0x13, + 0xa2, 0x9c, 0x28, 0x7f, 0x01, 0x42, 0xb9, 0xf2, 0xa7, 0xa0, 0x90, 0x77, 0xe1, 0xf4, 0xc2, 0xdc, + 0xac, 0x8c, 0x0b, 0x98, 0xf7, 0x5b, 0xbd, 0x7d, 0xda, 0x89, 0x30, 0x4e, 0xa5, 0xc2, 0xc7, 0x90, + 0xb6, 0x66, 0xd9, 0x2c, 0xc8, 0x42, 0x13, 0xd1, 0x01, 0x3c, 0xb6, 0x6c, 0xce, 0x77, 0x69, 0xb8, + 0x79, 0xf3, 0x73, 0x16, 0x1d, 0xa0, 0xb4, 0x0d, 0x57, 0xdb, 0xcd, 0xcc, 0x95, 0xf9, 0xf7, 0x31, + 0x3a, 0xa0, 0x0f, 0x97, 0xfc, 0x04, 0x8c, 0xe0, 0x4f, 0xb1, 0xe3, 0x9e, 0xce, 0x60, 0x9b, 0xec, + 0xb6, 0x2d, 0x9e, 0x20, 0x03, 0x09, 0xc8, 0x52, 0x92, 0x01, 0xff, 0x09, 0x7c, 0x5c, 0x45, 0x80, + 0xaa, 0xfe, 0xf4, 0x89, 0x0b, 0x15, 0xf5, 0x83, 0x6c, 0x8e, 0x2c, 0x3a, 0xe1, 0x2e, 0x75, 0xe7, + 0xe4, 0x83, 0x89, 0x15, 0x3e, 0x47, 0x76, 0x11, 0x8a, 0xcf, 0xb2, 0x58, 0x0a, 0x0a, 0x93, 0x0e, + 0x4b, 0xe1, 0x46, 0x28, 0xaa, 0x22, 0xac, 0x20, 0x0f, 0xad, 0x57, 0xd7, 0x12, 0x45, 0x28, 0x2d, + 0x65, 0x02, 0xc8, 0xc0, 0x69, 0xed, 0xd1, 0x60, 0xf3, 0xe6, 0x67, 0x21, 0x2d, 0xf5, 0x6f, 0x1c, + 0x33, 0x26, 0xbf, 0x51, 0x8a, 0xf3, 0xbb, 0x68, 0xc8, 0x4c, 0x47, 0x4c, 0x6e, 0xe6, 0x8d, 0x44, + 0x47, 0x4c, 0x6e, 0xe6, 0x55, 0x1d, 0x31, 0x46, 0x8d, 0xd3, 0xef, 0xe6, 0x4e, 0x48, 0xbf, 0x3b, + 0x20, 0xe3, 0xb7, 0x74, 0xea, 0xfc, 0x1c, 0x3d, 0x7e, 0xf0, 0x15, 0xa8, 0xd4, 0xa3, 0xc8, 0x69, + 0xed, 0x52, 0x17, 0xd3, 0x3c, 0x2b, 0x17, 0x82, 0x8e, 0x80, 0xab, 0xee, 0x62, 0x2a, 0xae, 0xf2, + 0xf8, 0xc9, 0xe8, 0x10, 0x8f, 0x9f, 0xcc, 0xc0, 0xe8, 0x52, 0xe7, 0xa1, 0xc7, 0xfa, 0xa4, 0x94, + 0x24, 0x87, 0xf0, 0x38, 0x48, 0x7f, 0x31, 0x03, 0x41, 0xe4, 0x6d, 0x45, 0x83, 0x28, 0x27, 0xaa, + 0xbc, 0x78, 0xbe, 0x5b, 0x2a, 0x12, 0xea, 0x79, 0xb3, 0x44, 0x27, 0xb7, 0x61, 0x54, 0x5a, 0xcf, + 0x90, 0xa8, 0xef, 0x82, 0xd2, 0xe1, 0x25, 0x5a, 0x3e, 0x0a, 0x61, 0x3d, 0xbf, 0xab, 0xc7, 0x8f, + 0x8c, 0x29, 0x71, 0xd9, 0x4a, 0xfc, 0x88, 0x16, 0x97, 0xad, 0x44, 0x92, 0xc4, 0xc6, 0x50, 0xe5, + 0x44, 0x63, 0x68, 0x13, 0x2a, 0x6b, 0x4e, 0x10, 0x79, 0x6c, 0x3b, 0xea, 0x44, 0x3c, 0x37, 0x57, + 0x62, 0xab, 0x2b, 0x45, 0x8d, 0x97, 0x64, 0x7c, 0x72, 0x57, 0xc1, 0xd7, 0x03, 0x5b, 0x13, 0x38, + 0x59, 0xc9, 0xf0, 0x30, 0x14, 0x99, 0x24, 0xf1, 0x0a, 0x50, 0x39, 0xb8, 0x12, 0x2d, 0x52, 0x8f, + 0xd2, 0xfb, 0x9d, 0x13, 0x6f, 0xf1, 0x31, 0x40, 0x9b, 0x71, 0x12, 0xd9, 0x60, 0x76, 0x11, 0xd4, + 0x2b, 0x52, 0x86, 0x63, 0x8c, 0x48, 0xbe, 0x09, 0x15, 0xf6, 0x3f, 0x26, 0x2a, 0xf2, 0x28, 0xcf, + 0xbd, 0x95, 0x78, 0x9c, 0xe9, 0x0b, 0x9a, 0x67, 0x33, 0x6a, 0xd2, 0x88, 0x2f, 0x60, 0x64, 0x9c, + 0x3e, 0x78, 0xd1, 0xb8, 0x99, 0x3f, 0x34, 0xe0, 0xfc, 0x00, 0x1e, 0x43, 0x3f, 0x7b, 0x34, 0x93, + 0x6c, 0x48, 0x8a, 0x6d, 0x2e, 0x36, 0x24, 0x75, 0x62, 0xc8, 0xad, 0x29, 0x3b, 0x6b, 0x56, 0xfe, + 0x33, 0xcb, 0x9a, 0x65, 0x1e, 0x1a, 0x30, 0xa6, 0x8c, 0xec, 0x33, 0x7c, 0xcd, 0xe0, 0x8a, 0x48, + 0x1f, 0x99, 0x4f, 0xf0, 0x52, 0x8f, 0x61, 0xf3, 0x74, 0x91, 0x1f, 0x03, 0x2c, 0x3b, 0x61, 0x54, + 0x6f, 0x45, 0xde, 0x43, 0x3a, 0x84, 0x18, 0x4b, 0x02, 0xf5, 0x1d, 0xcc, 0xc6, 0xca, 0xc8, 0xfa, + 0x02, 0xf5, 0x63, 0x86, 0xe6, 0x0a, 0x14, 0x9b, 0x7e, 0x10, 0x35, 0x0e, 0xf8, 0xde, 0x34, 0x4f, + 0xc3, 0x96, 0x7a, 0x42, 0xe7, 0xa1, 0xad, 0xde, 0xb2, 0x44, 0x11, 0x53, 0x10, 0xef, 0x78, 0xb4, + 0xed, 0xaa, 0x37, 0x34, 0x0f, 0x18, 0xc0, 0xe2, 0xf0, 0xeb, 0x1f, 0xc0, 0xa4, 0xcc, 0x60, 0xb7, + 0xbe, 0xdc, 0xc4, 0x16, 0x4c, 0xc2, 0xd8, 0xe6, 0x82, 0xb5, 0x74, 0xe7, 0xeb, 0xf6, 0x9d, 0x8d, + 0xe5, 0xe5, 0xea, 0x29, 0x32, 0x0e, 0x65, 0x01, 0x98, 0xab, 0x57, 0x0d, 0x52, 0x81, 0xd2, 0xd2, + 0x4a, 0x73, 0x61, 0x6e, 0xc3, 0x5a, 0xa8, 0xe6, 0xae, 0xbf, 0x06, 0x13, 0xc9, 0xfd, 0x0b, 0xc6, + 0x68, 0x8e, 0x42, 0xde, 0xaa, 0x6f, 0x55, 0x4f, 0x11, 0x80, 0xe2, 0xda, 0xbd, 0xb9, 0xe6, 0xcd, + 0x9b, 0x55, 0xe3, 0xfa, 0x17, 0x33, 0x5e, 0x20, 0x67, 0x9c, 0x9a, 0xb4, 0xeb, 0x04, 0x4e, 0x44, + 0xf9, 0x67, 0xee, 0xf7, 0xda, 0x91, 0xd7, 0x6d, 0xd3, 0xc7, 0x55, 0xe3, 0xfa, 0xdb, 0x7d, 0x0f, + 0x89, 0x93, 0xb3, 0x30, 0xb5, 0xb1, 0x52, 0xbf, 0xdf, 0x58, 0xba, 0xbb, 0xb1, 0xba, 0xd1, 0xb4, + 0xef, 0xd7, 0xd7, 0xe7, 0x16, 0xab, 0xa7, 0x58, 0x85, 0xef, 0xaf, 0x36, 0xd7, 0x6d, 0x6b, 0x61, + 0x6e, 0x61, 0x65, 0xbd, 0x6a, 0x5c, 0xff, 0x55, 0x03, 0x26, 0xf4, 0x27, 0xf5, 0xc8, 0x65, 0xb8, + 0xb4, 0xd1, 0x5c, 0xb0, 0xec, 0xf5, 0xd5, 0x7b, 0x0b, 0x2b, 0xf6, 0x46, 0xb3, 0x7e, 0x77, 0xc1, + 0xde, 0x58, 0x69, 0xae, 0x2d, 0xcc, 0x2d, 0xdd, 0x59, 0x5a, 0x98, 0xaf, 0x9e, 0x22, 0x35, 0x78, + 0x41, 0xc1, 0xb0, 0x16, 0xe6, 0x56, 0x37, 0x17, 0x2c, 0x7b, 0xad, 0xde, 0x6c, 0x6e, 0xad, 0x5a, + 0xf3, 0x55, 0x83, 0x5c, 0x84, 0x73, 0x19, 0x08, 0xf7, 0xef, 0xd4, 0xab, 0xb9, 0xbe, 0xb2, 0x95, + 0x85, 0xad, 0xfa, 0xb2, 0xdd, 0x58, 0x5d, 0xaf, 0xe6, 0xaf, 0x7f, 0xc0, 0xb4, 0x90, 0xe4, 0xcd, + 0x0b, 0x52, 0x82, 0xc2, 0xca, 0xea, 0xca, 0x42, 0xf5, 0x14, 0x19, 0x83, 0xd1, 0xb5, 0x85, 0x95, + 0xf9, 0xa5, 0x95, 0xbb, 0xbc, 0x5b, 0xeb, 0x6b, 0x6b, 0xd6, 0xea, 0xe6, 0xc2, 0x7c, 0x35, 0xc7, + 0xfa, 0x6e, 0x7e, 0x61, 0x85, 0xd5, 0x2c, 0x7f, 0xdd, 0xe4, 0x79, 0x9e, 0xb5, 0x34, 0xa5, 0xac, + 0xb7, 0x16, 0xbe, 0xb6, 0xbe, 0xb0, 0xd2, 0x5c, 0x5a, 0x5d, 0xa9, 0x9e, 0xba, 0x7e, 0x29, 0x85, + 0x23, 0x47, 0xa2, 0xd9, 0x5c, 0xac, 0x9e, 0xba, 0xfe, 0x4d, 0xa8, 0xa8, 0x9b, 0x30, 0x39, 0x0f, + 0xa7, 0xd5, 0xdf, 0x6b, 0xb4, 0xe3, 0x7a, 0x9d, 0x9d, 0xea, 0xa9, 0x74, 0x81, 0xd5, 0xeb, 0x74, + 0x58, 0x01, 0x36, 0x5e, 0x2d, 0x58, 0xa7, 0xc1, 0xbe, 0xd7, 0x61, 0xfb, 0x6b, 0x35, 0xd7, 0xa8, + 0x7e, 0xff, 0xaf, 0x5e, 0x3a, 0xf5, 0xfd, 0x1f, 0xbc, 0x64, 0xfc, 0xc5, 0x0f, 0x5e, 0x32, 0xfe, + 0xdb, 0x0f, 0x5e, 0x32, 0xb6, 0x8b, 0x38, 0xd1, 0x6f, 0xfd, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x7c, 0x79, 0xfa, 0x21, 0x31, 0xb8, 0x00, 0x00, } func (m *KeepAlive) Marshal() (dAtA []byte, err error) { @@ -11044,6 +11232,13 @@ func (m *ServerSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.PeerAddr) > 0 { + i -= len(m.PeerAddr) + copy(dAtA[i:], m.PeerAddr) + i = encodeVarintTypes(dAtA, i, uint64(len(m.PeerAddr))) + i-- + dAtA[i] = 0x5a + } if len(m.KubernetesClusters) > 0 { for iNdEx := len(m.KubernetesClusters) - 1; iNdEx >= 0; iNdEx-- { { @@ -12984,6 +13179,18 @@ func (m *ClusterNetworkingConfigSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.TunnelStrategy != nil { + { + size, err := m.TunnelStrategy.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } if m.RoutingStrategy != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.RoutingStrategy)) i-- @@ -13029,6 +13236,143 @@ func (m *ClusterNetworkingConfigSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } +func (m *TunnelStrategyV1) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TunnelStrategyV1) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TunnelStrategyV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Strategy != nil { + { + size := m.Strategy.Size() + i -= size + if _, err := m.Strategy.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *TunnelStrategyV1_AgentMesh) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TunnelStrategyV1_AgentMesh) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.AgentMesh != nil { + { + size, err := m.AgentMesh.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *TunnelStrategyV1_ProxyPeering) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TunnelStrategyV1_ProxyPeering) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ProxyPeering != nil { + { + size, err := m.ProxyPeering.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *AgentMeshTunnelStrategy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AgentMeshTunnelStrategy) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AgentMeshTunnelStrategy) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func (m *ProxyPeeringTunnelStrategy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ProxyPeeringTunnelStrategy) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ProxyPeeringTunnelStrategy) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.AgentConnectionCount != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.AgentConnectionCount)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *SessionRecordingConfigV2) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -13634,12 +13978,12 @@ func (m *UserTokenSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n74, err74 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err74 != nil { - return 0, err74 + n77, err77 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err77 != nil { + return 0, err77 } - i -= n74 - i = encodeVarintTypes(dAtA, i, uint64(n74)) + i -= n77 + i = encodeVarintTypes(dAtA, i, uint64(n77)) i-- dAtA[i] = 0x22 if m.Usage != 0 { @@ -13756,12 +14100,12 @@ func (m *UserTokenSecretsSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n77, err77 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err77 != nil { - return 0, err77 + n80, err80 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err80 != nil { + return 0, err80 } - i -= n77 - i = encodeVarintTypes(dAtA, i, uint64(n77)) + i -= n80 + i = encodeVarintTypes(dAtA, i, uint64(n80)) i-- dAtA[i] = 0x1a if len(m.QRCode) > 0 { @@ -13925,20 +14269,20 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.ThresholdIndexes) > 0 { - dAtA81 := make([]byte, len(m.ThresholdIndexes)*10) - var j80 int + dAtA84 := make([]byte, len(m.ThresholdIndexes)*10) + var j83 int for _, num := range m.ThresholdIndexes { for num >= 1<<7 { - dAtA81[j80] = uint8(uint64(num)&0x7f | 0x80) + dAtA84[j83] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j80++ + j83++ } - dAtA81[j80] = uint8(num) - j80++ + dAtA84[j83] = uint8(num) + j83++ } - i -= j80 - copy(dAtA[i:], dAtA81[:j80]) - i = encodeVarintTypes(dAtA, i, uint64(j80)) + i -= j83 + copy(dAtA[i:], dAtA84[:j83]) + i = encodeVarintTypes(dAtA, i, uint64(j83)) i-- dAtA[i] = 0x3a } @@ -13952,12 +14296,12 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x32 - n83, err83 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err83 != nil { - return 0, err83 + n86, err86 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err86 != nil { + return 0, err86 } - i -= n83 - i = encodeVarintTypes(dAtA, i, uint64(n83)) + i -= n86 + i = encodeVarintTypes(dAtA, i, uint64(n86)) i-- dAtA[i] = 0x2a if len(m.Reason) > 0 { @@ -14060,20 +14404,20 @@ func (m *ThresholdIndexSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Indexes) > 0 { - dAtA86 := make([]byte, len(m.Indexes)*10) - var j85 int + dAtA89 := make([]byte, len(m.Indexes)*10) + var j88 int for _, num := range m.Indexes { for num >= 1<<7 { - dAtA86[j85] = uint8(uint64(num)&0x7f | 0x80) + dAtA89[j88] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j85++ + j88++ } - dAtA86[j85] = uint8(num) - j85++ + dAtA89[j88] = uint8(num) + j88++ } - i -= j85 - copy(dAtA[i:], dAtA86[:j85]) - i = encodeVarintTypes(dAtA, i, uint64(j85)) + i -= j88 + copy(dAtA[i:], dAtA89[:j88]) + i = encodeVarintTypes(dAtA, i, uint64(j88)) i-- dAtA[i] = 0xa } @@ -14240,20 +14584,20 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n90, err90 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err90 != nil { - return 0, err90 + n93, err93 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err93 != nil { + return 0, err93 } - i -= n90 - i = encodeVarintTypes(dAtA, i, uint64(n90)) + i -= n93 + i = encodeVarintTypes(dAtA, i, uint64(n93)) i-- dAtA[i] = 0x2a - n91, err91 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err91 != nil { - return 0, err91 + n94, err94 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err94 != nil { + return 0, err94 } - i -= n91 - i = encodeVarintTypes(dAtA, i, uint64(n91)) + i -= n94 + i = encodeVarintTypes(dAtA, i, uint64(n94)) i-- dAtA[i] = 0x22 if m.State != 0 { @@ -15961,12 +16305,12 @@ func (m *UserSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x42 - n118, err118 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err118 != nil { - return 0, err118 + n121, err121 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err121 != nil { + return 0, err121 } - i -= n118 - i = encodeVarintTypes(dAtA, i, uint64(n118)) + i -= n121 + i = encodeVarintTypes(dAtA, i, uint64(n121)) i-- dAtA[i] = 0x3a { @@ -16108,28 +16452,28 @@ func (m *LoginStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n121, err121 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.RecoveryAttemptLockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.RecoveryAttemptLockExpires):]) - if err121 != nil { - return 0, err121 + n124, err124 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.RecoveryAttemptLockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.RecoveryAttemptLockExpires):]) + if err124 != nil { + return 0, err124 } - i -= n121 - i = encodeVarintTypes(dAtA, i, uint64(n121)) + i -= n124 + i = encodeVarintTypes(dAtA, i, uint64(n124)) i-- dAtA[i] = 0x2a - n122, err122 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) - if err122 != nil { - return 0, err122 + n125, err125 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) + if err125 != nil { + return 0, err125 } - i -= n122 - i = encodeVarintTypes(dAtA, i, uint64(n122)) + i -= n125 + i = encodeVarintTypes(dAtA, i, uint64(n125)) i-- dAtA[i] = 0x22 - n123, err123 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) - if err123 != nil { - return 0, err123 + n126, err126 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + if err126 != nil { + return 0, err126 } - i -= n123 - i = encodeVarintTypes(dAtA, i, uint64(n123)) + i -= n126 + i = encodeVarintTypes(dAtA, i, uint64(n126)) i-- dAtA[i] = 0x1a if len(m.LockedMessage) > 0 { @@ -16186,12 +16530,12 @@ func (m *CreatedBy) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n125, err125 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err125 != nil { - return 0, err125 + n128, err128 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err128 != nil { + return 0, err128 } - i -= n125 - i = encodeVarintTypes(dAtA, i, uint64(n125)) + i -= n128 + i = encodeVarintTypes(dAtA, i, uint64(n128)) i-- dAtA[i] = 0x12 if m.Connector != nil { @@ -16309,20 +16653,20 @@ func (m *MFADevice) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } } - n128, err128 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) - if err128 != nil { - return 0, err128 + n131, err131 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) + if err131 != nil { + return 0, err131 } - i -= n128 - i = encodeVarintTypes(dAtA, i, uint64(n128)) + i -= n131 + i = encodeVarintTypes(dAtA, i, uint64(n131)) i-- dAtA[i] = 0x3a - n129, err129 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) - if err129 != nil { - return 0, err129 + n132, err132 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + if err132 != nil { + return 0, err132 } - i -= n129 - i = encodeVarintTypes(dAtA, i, uint64(n129)) + i -= n132 + i = encodeVarintTypes(dAtA, i, uint64(n132)) i-- dAtA[i] = 0x32 if len(m.Id) > 0 { @@ -16919,12 +17263,12 @@ func (m *TunnelConnectionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x22 } - n138, err138 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err138 != nil { - return 0, err138 + n141, err141 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err141 != nil { + return 0, err141 } - i -= n138 - i = encodeVarintTypes(dAtA, i, uint64(n138)) + i -= n141 + i = encodeVarintTypes(dAtA, i, uint64(n141)) i-- dAtA[i] = 0x1a if len(m.ProxyName) > 0 { @@ -17016,12 +17360,12 @@ func (m *AcquireSemaphoreRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x2a } - n139, err139 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err139 != nil { - return 0, err139 + n142, err142 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err142 != nil { + return 0, err142 } - i -= n139 - i = encodeVarintTypes(dAtA, i, uint64(n139)) + i -= n142 + i = encodeVarintTypes(dAtA, i, uint64(n142)) i-- dAtA[i] = 0x22 if m.MaxLeases != 0 { @@ -17070,12 +17414,12 @@ func (m *SemaphoreLease) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n140, err140 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err140 != nil { - return 0, err140 + n143, err143 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err143 != nil { + return 0, err143 } - i -= n140 - i = encodeVarintTypes(dAtA, i, uint64(n140)) + i -= n143 + i = encodeVarintTypes(dAtA, i, uint64(n143)) i-- dAtA[i] = 0x2a if len(m.LeaseID) > 0 { @@ -17133,12 +17477,12 @@ func (m *SemaphoreLeaseRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n141, err141 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err141 != nil { - return 0, err141 + n144, err144 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err144 != nil { + return 0, err144 } - i -= n141 - i = encodeVarintTypes(dAtA, i, uint64(n141)) + i -= n144 + i = encodeVarintTypes(dAtA, i, uint64(n144)) i-- dAtA[i] = 0x12 if len(m.LeaseID) > 0 { @@ -17357,28 +17701,28 @@ func (m *WebSessionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x48 } - n146, err146 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) - if err146 != nil { - return 0, err146 + n149, err149 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) + if err149 != nil { + return 0, err149 } - i -= n146 - i = encodeVarintTypes(dAtA, i, uint64(n146)) + i -= n149 + i = encodeVarintTypes(dAtA, i, uint64(n149)) i-- dAtA[i] = 0x42 - n147, err147 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err147 != nil { - return 0, err147 + n150, err150 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err150 != nil { + return 0, err150 } - i -= n147 - i = encodeVarintTypes(dAtA, i, uint64(n147)) + i -= n150 + i = encodeVarintTypes(dAtA, i, uint64(n150)) i-- dAtA[i] = 0x3a - n148, err148 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) - if err148 != nil { - return 0, err148 + n151, err151 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + if err151 != nil { + return 0, err151 } - i -= n148 - i = encodeVarintTypes(dAtA, i, uint64(n148)) + i -= n151 + i = encodeVarintTypes(dAtA, i, uint64(n151)) i-- dAtA[i] = 0x32 if len(m.BearerToken) > 0 { @@ -17545,12 +17889,12 @@ func (m *RemoteClusterStatusV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n151, err151 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err151 != nil { - return 0, err151 + n154, err154 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err154 != nil { + return 0, err154 } - i -= n151 - i = encodeVarintTypes(dAtA, i, uint64(n151)) + i -= n154 + i = encodeVarintTypes(dAtA, i, uint64(n154)) i-- dAtA[i] = 0x12 if len(m.Connection) > 0 { @@ -19322,12 +19666,12 @@ func (m *LockSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.Expires != nil { - n170, err170 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err170 != nil { - return 0, err170 + n173, err173 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err173 != nil { + return 0, err173 } - i -= n170 - i = encodeVarintTypes(dAtA, i, uint64(n170)) + i -= n173 + i = encodeVarintTypes(dAtA, i, uint64(n173)) i-- dAtA[i] = 0x1a } @@ -20008,12 +20352,12 @@ func (m *RecoveryCodesSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n180, err180 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err180 != nil { - return 0, err180 + n183, err183 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err183 != nil { + return 0, err183 } - i -= n180 - i = encodeVarintTypes(dAtA, i, uint64(n180)) + i -= n183 + i = encodeVarintTypes(dAtA, i, uint64(n183)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -20243,20 +20587,20 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n183, err183 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err183 != nil { - return 0, err183 + n186, err186 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err186 != nil { + return 0, err186 } - i -= n183 - i = encodeVarintTypes(dAtA, i, uint64(n183)) + i -= n186 + i = encodeVarintTypes(dAtA, i, uint64(n186)) i-- dAtA[i] = 0x2a - n184, err184 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err184 != nil { - return 0, err184 + n187, err187 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err187 != nil { + return 0, err187 } - i -= n184 - i = encodeVarintTypes(dAtA, i, uint64(n184)) + i -= n187 + i = encodeVarintTypes(dAtA, i, uint64(n187)) i-- dAtA[i] = 0x22 if m.State != 0 { @@ -20360,12 +20704,12 @@ func (m *Participant) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n185, err185 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) - if err185 != nil { - return 0, err185 + n188, err188 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) + if err188 != nil { + return 0, err188 } - i -= n185 - i = encodeVarintTypes(dAtA, i, uint64(n185)) + i -= n188 + i = encodeVarintTypes(dAtA, i, uint64(n188)) i-- dAtA[i] = 0x22 if len(m.Mode) > 0 { @@ -21043,6 +21387,10 @@ func (m *ServerSpecV2) Size() (n int) { n += 1 + l + sovTypes(uint64(l)) } } + l = len(m.PeerAddr) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -21895,6 +22243,76 @@ func (m *ClusterNetworkingConfigSpecV2) Size() (n int) { if m.RoutingStrategy != 0 { n += 1 + sovTypes(uint64(m.RoutingStrategy)) } + if m.TunnelStrategy != nil { + l = m.TunnelStrategy.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TunnelStrategyV1) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Strategy != nil { + n += m.Strategy.Size() + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TunnelStrategyV1_AgentMesh) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AgentMesh != nil { + l = m.AgentMesh.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *TunnelStrategyV1_ProxyPeering) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ProxyPeering != nil { + l = m.ProxyPeering.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} +func (m *AgentMeshTunnelStrategy) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ProxyPeeringTunnelStrategy) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AgentConnectionCount != 0 { + n += 1 + sovTypes(uint64(m.AgentConnectionCount)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -29712,6 +30130,38 @@ func (m *ServerSpecV2) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PeerAddr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PeerAddr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -35355,6 +35805,284 @@ func (m *ClusterNetworkingConfigSpecV2) Unmarshal(dAtA []byte) error { break } } + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TunnelStrategy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TunnelStrategy == nil { + m.TunnelStrategy = &TunnelStrategyV1{} + } + if err := m.TunnelStrategy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TunnelStrategyV1) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TunnelStrategyV1: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TunnelStrategyV1: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AgentMesh", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &AgentMeshTunnelStrategy{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Strategy = &TunnelStrategyV1_AgentMesh{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProxyPeering", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ProxyPeeringTunnelStrategy{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Strategy = &TunnelStrategyV1_ProxyPeering{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AgentMeshTunnelStrategy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AgentMeshTunnelStrategy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AgentMeshTunnelStrategy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ProxyPeeringTunnelStrategy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ProxyPeeringTunnelStrategy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ProxyPeeringTunnelStrategy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AgentConnectionCount", wireType) + } + m.AgentConnectionCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AgentConnectionCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/api/types/types.proto b/api/types/types.proto index 7df42fc9fe632..4b5280257e786 100644 --- a/api/types/types.proto +++ b/api/types/types.proto @@ -408,6 +408,8 @@ message ServerSpecV2 { // https://github.com/gravitational/teleport/issues/4862 repeated KubernetesCluster KubernetesClusters = 10 [ (gogoproto.jsontag) = "kube_clusters,omitempty" ]; + // PeerAddr is the address a proxy server is reachable at by its peer proxies. + string PeerAddr = 11 [ (gogoproto.jsontag) = "peer_addr,omitempty" ]; } // AppServerV3 represents a single proxied web app. @@ -920,6 +922,26 @@ message ClusterNetworkingConfigSpecV2 { // RoutingStrategy determines the strategy used to route to nodes. RoutingStrategy RoutingStrategy = 8 [ (gogoproto.jsontag) = "routing_strategy,omitempty" ]; + + // TunnelStrategyV1 determines the tunnel strategy used in the cluster. + TunnelStrategyV1 TunnelStrategy = 9 [ (gogoproto.jsontag) = "tunnel_strategy,omitempty" ]; +} + +// TunnelStrategyV1 defines possible tunnel strategy types. +message TunnelStrategyV1 { + oneof Strategy { + AgentMeshTunnelStrategy AgentMesh = 1 [ (gogoproto.jsontag) = "agent_mesh,omitempty" ]; + ProxyPeeringTunnelStrategy ProxyPeering = 2 + [ (gogoproto.jsontag) = "proxy_peering,omitempty" ]; + } +} + +// AgentMeshTunnelStrategy requires reverse tunnels to dial every proxy. +message AgentMeshTunnelStrategy {} + +// ProxyPeeringTunnelStrategy requires reverse tunnels to dial a fixed number of proxies. +message ProxyPeeringTunnelStrategy { + int64 AgentConnectionCount = 1 [ (gogoproto.jsontag) = "agent_connection_count,omitempty" ]; } // ProxyListenerMode represents the cluster proxy listener mode. diff --git a/api/utils/conv.go b/api/utils/conv.go index 4d9678e27abac..3952b31ab39f1 100644 --- a/api/utils/conv.go +++ b/api/utils/conv.go @@ -18,6 +18,7 @@ limitations under the License. package utils import ( + "bytes" "encoding/json" "github.com/gravitational/trace" @@ -59,3 +60,20 @@ func ObjectToStruct(in interface{}, out interface{}) error { } return nil } + +// StrictObjectToStruct converts any structure into JSON and then unmarshalls +// it into another structure using a strict decoder. +func StrictObjectToStruct(in interface{}, out interface{}) error { + data, err := json.Marshal(in) + if err != nil { + return trace.Wrap(err, "failed to marshal %v, %v", in, err) + } + + dec := json.NewDecoder(bytes.NewReader(data)) + dec.DisallowUnknownFields() + + if err := dec.Decode(out); err != nil { + return trace.Wrap(err, "failed to unmarshal %v into %T, %v", in, out, err) + } + return nil +} diff --git a/lib/config/configuration.go b/lib/config/configuration.go index ffeb748c37947..9903848df619c 100644 --- a/lib/config/configuration.go +++ b/lib/config/configuration.go @@ -600,6 +600,7 @@ func applyAuthConfig(fc *FileConfig, cfg *service.Config) error { SessionControlTimeout: fc.Auth.SessionControlTimeout, ProxyListenerMode: fc.Auth.ProxyListenerMode, RoutingStrategy: fc.Auth.RoutingStrategy, + TunnelStrategy: fc.Auth.TunnelStrategy, }) if err != nil { return trace.Wrap(err) @@ -703,6 +704,13 @@ func applyProxyConfig(fc *FileConfig, cfg *service.Config) error { } cfg.Proxy.MongoAddr = *addr } + if fc.Proxy.PeerAddr != "" { + addr, err := utils.ParseHostPortAddr(fc.Proxy.PeerAddr, int(defaults.ProxyPeeringListenPort)) + if err != nil { + return trace.Wrap(err) + } + cfg.Proxy.PeerAddr = *addr + } // This is the legacy format. Continue to support it forever, but ideally // users now use the list format below. diff --git a/lib/config/configuration_test.go b/lib/config/configuration_test.go index 6f913c9688ac7..d6e64ef52c879 100644 --- a/lib/config/configuration_test.go +++ b/lib/config/configuration_test.go @@ -25,6 +25,7 @@ import ( "path" "path/filepath" "strconv" + "strings" "testing" "time" @@ -654,6 +655,10 @@ func TestApplyConfig(t *testing.T) { require.Equal(t, "magadan", cfg.Auth.ClusterName.GetClusterName()) require.True(t, cfg.Auth.Preference.GetAllowLocalAuth()) require.Equal(t, "10.10.10.1", cfg.AdvertiseIP) + tunnelStrategyType, err := cfg.Auth.NetworkingConfig.GetTunnelStrategyType() + require.NoError(t, err) + require.Equal(t, types.AgentMesh, tunnelStrategyType) + require.Equal(t, types.DefaultAgentMeshTunnelStrategy(), cfg.Auth.NetworkingConfig.GetAgentMeshTunnelStrategy()) require.True(t, cfg.Proxy.Enabled) require.Equal(t, "tcp://webhost:3080", cfg.Proxy.WebAddr.FullAddress()) @@ -666,6 +671,7 @@ func TestApplyConfig(t *testing.T) { require.Equal(t, "tcp://mysql.example:3306", cfg.Proxy.MySQLPublicAddrs[0].FullAddress()) require.Len(t, cfg.Proxy.MongoPublicAddrs, 1) require.Equal(t, "tcp://mongo.example:27017", cfg.Proxy.MongoPublicAddrs[0].FullAddress()) + require.Equal(t, "tcp://peerhost:1234", cfg.Proxy.PeerAddr.FullAddress()) require.Equal(t, "tcp://127.0.0.1:3000", cfg.DiagnosticAddr.FullAddress()) @@ -876,6 +882,87 @@ func TestBackendDefaults(t *testing.T) { require.False(t, cfg.Proxy.Kube.Enabled) } +func TestTunnelStrategy(t *testing.T) { + tests := []struct { + desc string + config string + readErr require.ErrorAssertionFunc + applyErr require.ErrorAssertionFunc + tunnelStrategy interface{} + }{ + { + desc: "Ensure default is used when no tunnel strategy is given", + config: strings.Join([]string{ + "auth_service:", + " enabled: yes", + }, "\n"), + readErr: require.NoError, + applyErr: require.NoError, + tunnelStrategy: types.DefaultAgentMeshTunnelStrategy(), + }, + { + desc: "Ensure default parameters are used for proxy peering strategy", + config: strings.Join([]string{ + "auth_service:", + " enabled: yes", + " tunnel_strategy:", + " type: proxy_peering", + }, "\n"), + readErr: require.NoError, + applyErr: require.NoError, + tunnelStrategy: types.DefaultProxyPeeringTunnelStrategy(), + }, + { + desc: "Ensure proxy peering strategy parameters are set", + config: strings.Join([]string{ + "auth_service:", + " enabled: yes", + " tunnel_strategy:", + " type: proxy_peering", + " agent_connection_count: 2", + }, "\n"), + readErr: require.NoError, + applyErr: require.NoError, + tunnelStrategy: &types.ProxyPeeringTunnelStrategy{ + AgentConnectionCount: 2, + }, + }, + { + desc: "Ensure tunnel strategy cannot take unknown parameters", + config: strings.Join([]string{ + "auth_service:", + " enabled: yes", + " tunnel_strategy:", + " type: agent_mesh", + " agent_connection_count: 2", + }, "\n"), + readErr: require.Error, + applyErr: require.NoError, + tunnelStrategy: types.DefaultAgentMeshTunnelStrategy(), + }, + } + + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + conf, err := ReadConfig(bytes.NewBufferString(tc.config)) + tc.readErr(t, err) + + cfg := service.MakeDefaultConfig() + err = ApplyFileConfig(conf, cfg) + tc.applyErr(t, err) + + var actualStrategy interface{} + if cfg.Auth.NetworkingConfig == nil { + } else if s := cfg.Auth.NetworkingConfig.GetAgentMeshTunnelStrategy(); s != nil { + actualStrategy = s + } else if s := cfg.Auth.NetworkingConfig.GetProxyPeeringTunnelStrategy(); s != nil { + actualStrategy = s + } + require.Equal(t, tc.tunnelStrategy, actualStrategy) + }) + } +} + // TestParseKey ensures that keys are parsed correctly if they are in // authorized_keys format or known_hosts format. func TestParseKey(t *testing.T) { diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go index beeb73173bd93..1d4def12826ca 100644 --- a/lib/config/fileconf.go +++ b/lib/config/fileconf.go @@ -703,6 +703,9 @@ type Auth struct { // RoutingStrategy configures the routing strategy to nodes. RoutingStrategy types.RoutingStrategy `yaml:"routing_strategy,omitempty"` + + // TunnelStrategy configures the tunnel strategy used by the cluster. + TunnelStrategy *types.TunnelStrategyV1 `yaml:"tunnel_strategy,omitempty"` } // CAKeyParams configures how CA private keys will be created and stored. @@ -1306,6 +1309,8 @@ type Proxy struct { WebAddr string `yaml:"web_listen_addr,omitempty"` // TunAddr is a reverse tunnel address TunAddr string `yaml:"tunnel_listen_addr,omitempty"` + // PeerAddr is the address this proxy will be dialed at by its peers. + PeerAddr string `yaml:"peer_listen_addr,omitempty"` // KeyFile is a TLS key file KeyFile string `yaml:"https_key_file,omitempty"` // CertFile is a TLS Certificate file diff --git a/lib/config/testdata_test.go b/lib/config/testdata_test.go index e613396e233cb..a03b0b120d18a 100644 --- a/lib/config/testdata_test.go +++ b/lib/config/testdata_test.go @@ -155,6 +155,7 @@ proxy_service: enabled: yes web_listen_addr: webhost tunnel_listen_addr: tunnelhost:1001 + peer_listen_addr: peerhost:1234 public_addr: web3:443 postgres_public_addr: postgres.example:5432 mysql_listen_addr: webhost:3336 diff --git a/lib/defaults/defaults.go b/lib/defaults/defaults.go index 7e218b7f6f133..af5669dfdc075 100644 --- a/lib/defaults/defaults.go +++ b/lib/defaults/defaults.go @@ -79,6 +79,10 @@ const ( // implemented. WindowsDesktopListenPort = 3028 + // ProxyPeeringListenPort is the default port proxies will listen on when + // proxy peering is enabled. + ProxyPeeringListenPort = 3021 + // RDPListenPort is the standard port for RDP servers. RDPListenPort = 3389 @@ -631,6 +635,10 @@ func MetricsServiceListenAddr() *utils.NetAddr { return makeAddr(BindIP, MetricsListenPort) } +func ProxyPeeringListenAddr() *utils.NetAddr { + return makeAddr(BindIP, ProxyPeeringListenPort) +} + func makeAddr(host string, port int16) *utils.NetAddr { addrSpec := fmt.Sprintf("tcp://%s:%d", host, port) retval, err := utils.ParseAddr(addrSpec) diff --git a/lib/proxy/auth.go b/lib/proxy/auth.go new file mode 100644 index 0000000000000..3ae2408538566 --- /dev/null +++ b/lib/proxy/auth.go @@ -0,0 +1,119 @@ +// Copyright 2022 Gravitational, 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. + +package proxy + +import ( + "context" + "crypto/tls" + "net" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/auth" + "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/trace" + "github.com/sirupsen/logrus" + "google.golang.org/grpc/credentials" +) + +// newProxyCredentials creates new proxyCredentials from the given transport credentials. +func newProxyCredentials(creds credentials.TransportCredentials) credentials.TransportCredentials { + return &proxyCredentials{ + creds, + } +} + +// proxyCredentials wraps TransportCredentials server and client handshakes +// to ensure the credentials contain the proxy system role. +type proxyCredentials struct { + credentials.TransportCredentials +} + +// ServerHandshake wraps a server handshake with an additional check for the +// proxy role. +func (c *proxyCredentials) ServerHandshake(conn net.Conn) (net.Conn, credentials.AuthInfo, error) { + conn, authInfo, err := c.TransportCredentials.ServerHandshake(conn) + if err != nil { + return nil, nil, trace.Wrap(err) + } + + err = checkProxyRole(authInfo) + if err != nil { + return nil, nil, trace.Wrap(err) + } + return conn, authInfo, nil +} + +// ClientHandshake wraps a client handshake with an additional check for the +// proxy role. +func (c *proxyCredentials) ClientHandshake(ctx context.Context, laddr string, conn net.Conn) (net.Conn, credentials.AuthInfo, error) { + conn, authInfo, err := c.TransportCredentials.ClientHandshake(ctx, laddr, conn) + if err != nil { + return nil, nil, trace.Wrap(err) + } + + err = checkProxyRole(authInfo) + if err != nil { + return nil, nil, trace.Wrap(err) + } + return conn, authInfo, nil +} + +// checkProxyRole checks the authInfo for a certificate with the role types.RoleProxy. +func checkProxyRole(authInfo credentials.AuthInfo) error { + tlsInfo, ok := authInfo.(credentials.TLSInfo) + if !ok { + return trace.AccessDenied("missing authentication") + } + + certs := tlsInfo.State.PeerCertificates + if len(certs) == 0 { + return trace.AccessDenied("missing authentication") + } + + clientCert := certs[0] + identity, err := tlsca.FromSubject(clientCert.Subject, clientCert.NotAfter) + if err != nil { + return trace.Wrap(err) + } + + // Ensure the proxy system role is present. + for _, role := range identity.Groups { + if types.SystemRole(role) == types.RoleProxy { + return nil + } + } + + return trace.AccessDenied("proxy system role required") +} + +func getConfigForClient(tlsConfig *tls.Config, ap auth.AccessCache, log logrus.FieldLogger) func(*tls.ClientHelloInfo) (*tls.Config, error) { + return func(info *tls.ClientHelloInfo) (*tls.Config, error) { + clusterName, err := ap.GetClusterName() + if err != nil { + log.WithError(err).Error("Failed to retrieve cluster name.") + return nil, nil + } + + pool, _, err := auth.ClientCertPool(ap, clusterName.GetClusterName()) + if err != nil { + log.WithError(err).Error("Failed to retrieve client CA pool.") + return nil, nil + } + + tlsCopy := tlsConfig.Clone() + tlsCopy.ClientCAs = pool + return tlsCopy, nil + } +} diff --git a/lib/proxy/conn.go b/lib/proxy/conn.go new file mode 100644 index 0000000000000..f2e7a87f7419d --- /dev/null +++ b/lib/proxy/conn.go @@ -0,0 +1,210 @@ +// Copyright 2022 Gravitational, 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. + +package proxy + +import ( + "context" + "io" + "net" + "sync" + "time" + + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/trace" + "google.golang.org/grpc" +) + +const ( + // maxChunkSize is the maximum number of bytes to send in a single data message. + // According to https://github.com/grpc/grpc.github.io/issues/371 the optimal + // size is between 16KiB to 64KiB. + maxChunkSize int = 1024 * 16 +) + +// Stream is a common interface for grpc client and server streams. +type Stream interface { + Context() context.Context + Send(*proto.Frame) error + Recv() (*proto.Frame, error) +} + +// streamConn wraps a grpc stream with a net.Conn interface. +type streamConn struct { + stream Stream + + wLock sync.Mutex + rLock sync.Mutex + rBytes []byte + + src net.Addr + dst net.Addr +} + +// newStreamConn creates a new streamConn. +func newStreamConn(stream Stream, src net.Addr, dst net.Addr) *streamConn { + return &streamConn{ + stream: stream, + src: src, + dst: dst, + } +} + +// Read reads data received over the grpc stream. +func (c *streamConn) Read(b []byte) (n int, err error) { + c.rLock.Lock() + defer c.rLock.Unlock() + + if len(c.rBytes) == 0 { + frame, err := c.stream.Recv() + if err == io.EOF { + return 0, io.EOF + } + if err != nil { + return 0, trace.ConnectionProblem(err, "failed to receive on stream") + } + + data := frame.GetData() + if data == nil { + return 0, trace.BadParameter("received invalid data frame") + } + + c.rBytes = data.Bytes + } + + n = copy(b, c.rBytes) + c.rBytes = c.rBytes[n:] + + // Stop holding onto buffer immediately + if len(c.rBytes) == 0 { + c.rBytes = nil + } + + return n, nil +} + +// Write sends data over the grpc stream. +func (c *streamConn) Write(b []byte) (int, error) { + c.wLock.Lock() + defer c.wLock.Unlock() + + var sent int + for len(b) > 0 { + chunk := b + if len(chunk) > maxChunkSize { + chunk = chunk[:maxChunkSize] + } + + err := c.stream.Send(&proto.Frame{Message: &proto.Frame_Data{Data: &proto.Data{ + Bytes: chunk, + }}}) + if err != nil { + return sent, trace.ConnectionProblem(err, "failed to send on stream") + } + + sent += len(chunk) + b = b[len(chunk):] + } + + return sent, nil +} + +// Close cleans up resources used by the connection. +func (c *streamConn) Close() error { + var err error + if cstream, ok := c.stream.(grpc.ClientStream); ok { + c.wLock.Lock() + defer c.wLock.Unlock() + err = cstream.CloseSend() + } + + return trace.Wrap(err) +} + +// LocalAddr is the original source address of the client. +func (c *streamConn) LocalAddr() net.Addr { + return c.src +} + +// RemoteAddr is the address of the reverse tunnel node. +func (c *streamConn) RemoteAddr() net.Addr { + return c.dst +} + +func (c *streamConn) SetDeadline(t time.Time) error { + return nil +} + +func (c *streamConn) SetReadDeadline(t time.Time) error { + return nil +} + +func (c *streamConn) SetWriteDeadline(t time.Time) error { + return nil +} + +// pipeConn copies between two net.Conns and closes them when done. +func pipeConn(ctx context.Context, src net.Conn, dst net.Conn) (int64, int64, error) { + var ( + sent, received int64 + wg sync.WaitGroup + o sync.Once + ) + + errC := make(chan error, 1) + cleanup := func(err error) { + o.Do(func() { + srcErr := src.Close() + dstErr := dst.Close() + errC <- trace.NewAggregate(err, srcErr, dstErr) + close(errC) + }) + } + + wg.Add(2) + + go func() { + var err error + sent, err = io.Copy(src, dst) + cleanup(trace.ConnectionProblem( + err, "failed copy to source %s", src.RemoteAddr().String(), + )) + wg.Done() + }() + + go func() { + var err error + received, err = io.Copy(dst, src) + cleanup(trace.ConnectionProblem( + err, "failed copy to destination %s", dst.RemoteAddr().String(), + )) + wg.Done() + }() + + wait := make(chan struct{}) + go func() { + wg.Wait() + close(wait) + }() + + select { + case <-ctx.Done(): + cleanup(nil) + case <-wait: + } + + <-wait + err := <-errC + return sent, received, trace.Wrap(err) +} diff --git a/lib/proxy/conn_test.go b/lib/proxy/conn_test.go new file mode 100644 index 0000000000000..0ffec8a853bb4 --- /dev/null +++ b/lib/proxy/conn_test.go @@ -0,0 +1,205 @@ +// Copyright 2022 Gravitational, 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. + +package proxy + +import ( + "context" + "net" + "sync" + "testing" + "time" + + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/lib/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type mockStream struct { + ctx context.Context + conn net.Conn +} + +func newMockStream(ctx context.Context, conn net.Conn) *mockStream { + return &mockStream{ + ctx: ctx, + conn: conn, + } +} + +func (m *mockStream) Context() context.Context { + return m.ctx +} + +func (m *mockStream) Send(f *proto.Frame) error { + _, err := m.conn.Write(f.GetData().Bytes) + return err +} + +func (m *mockStream) Recv() (*proto.Frame, error) { + b := make([]byte, 2*maxChunkSize) + n, err := m.conn.Read(b) + return &proto.Frame{Message: &proto.Frame_Data{Data: &proto.Data{ + Bytes: b[:n], + }}}, err +} + +func newStreamPipe() (*streamConn, net.Conn) { + local, remote := net.Pipe() + stream := newMockStream(context.Background(), remote) + + timeout := time.Now().Add(time.Second * 5) + local.SetReadDeadline(timeout) + local.SetWriteDeadline(timeout) + remote.SetReadDeadline(timeout) + remote.SetWriteDeadline(timeout) + + src := &utils.NetAddr{Addr: "src"} + dst := &utils.NetAddr{Addr: "dst"} + streamConn := newStreamConn(stream, src, dst) + + return streamConn, local +} + +func TestStreamConnWrite(t *testing.T) { + streamConn, local := newStreamPipe() + wg := &sync.WaitGroup{} + wg.Add(2) + + data := []byte("hello world!") + go func() { + defer wg.Done() + n, err := streamConn.Write(data) + assert.NoError(t, err) + assert.Equal(t, len(data), n) + }() + go func() { + defer wg.Done() + b := make([]byte, 2*maxChunkSize) + n, err := local.Read(b) + assert.NoError(t, err) + assert.Equal(t, len(data), n) + assert.Equal(t, data, b[:n]) + }() + + wg.Wait() +} + +func TestStreamConnWriteChunk(t *testing.T) { + streamConn, local := newStreamPipe() + wg := &sync.WaitGroup{} + wg.Add(2) + + data := make([]byte, maxChunkSize+1) + go func() { + defer wg.Done() + n, err := streamConn.Write(data) + assert.NoError(t, err) + assert.Equal(t, len(data), n) + }() + go func() { + defer wg.Done() + b := make([]byte, 2*maxChunkSize) + n, err := local.Read(b) + assert.NoError(t, err) + assert.Equal(t, maxChunkSize, n) + assert.Equal(t, data[:n], b[:n]) + + n, err = local.Read(b) + assert.NoError(t, err) + assert.Equal(t, 1, n) + assert.Equal(t, data[:n], b[:n]) + }() + + wg.Wait() +} + +func TestStreamConnRead(t *testing.T) { + streamConn, local := newStreamPipe() + wg := &sync.WaitGroup{} + wg.Add(2) + + data := make([]byte, maxChunkSize+1) + go func() { + b := make([]byte, 2*maxChunkSize) + defer wg.Done() + n, err := streamConn.Read(b) + assert.NoError(t, err) + assert.Equal(t, len(data), n) + assert.Equal(t, data, b[:n]) + }() + go func() { + defer wg.Done() + n, err := local.Write(data) + assert.NoError(t, err) + assert.Equal(t, len(data), n) + }() + + wg.Wait() +} + +func TestPipeConn(t *testing.T) { + local1, remote1 := net.Pipe() + local2, remote2 := net.Pipe() + + timeout := time.Now().Add(time.Second * 5) + local1.SetReadDeadline(timeout) + local1.SetWriteDeadline(timeout) + local2.SetReadDeadline(timeout) + local2.SetWriteDeadline(timeout) + + var ( + sent int64 + recv int64 + err error + ) + + c := make(chan struct{}) + go func() { + sent, recv, err = pipeConn(context.Background(), remote1, remote2) + close(c) + }() + + data1 := []byte("hello world!") + n1, err := local1.Write(data1) + require.NoError(t, err) + require.Equal(t, len(data1), n1) + + data2 := make([]byte, 2*len(data1)) + n2, err := local2.Read(data2) + require.NoError(t, err) + require.Equal(t, data1, data2[:n2]) + + data3 := []byte("goodbye.") + n3, err := local2.Write(data3) + require.NoError(t, err) + require.Equal(t, len(data3), n3) + + data4 := make([]byte, 2*len(data3)) + n4, err := local1.Read(data4) + require.NoError(t, err) + require.Equal(t, data3, data4[:n4]) + + local1.Close() + timer := time.NewTimer(time.Second * 5) + select { + case <-c: + case <-timer.C: + require.FailNow(t, "timeout waiting for pipeConn to return") + } + + require.Equal(t, int64(len(data3)), sent) + require.Equal(t, int64(len(data1)), recv) +} diff --git a/lib/proxy/middleware.go b/lib/proxy/middleware.go new file mode 100644 index 0000000000000..3db35914c9822 --- /dev/null +++ b/lib/proxy/middleware.go @@ -0,0 +1,43 @@ +// Copyright 2022 Gravitational, 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. + +package proxy + +import ( + "github.com/gravitational/trace" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// errorStreamInterceptor is a GPRC stream interceptor that handles converting +// errors to the appropriate grpc status code. +func errorStreamInterceptor(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + err := handler(srv, stream) + return toGRPCError(err) +} + +// errorHandler converts trace errors to grpc errors with appropriate status codes. +func toGRPCError(err error) error { + if err == nil { + return nil + } + if trace.IsNotFound(err) { + return status.Error(codes.NotFound, err.Error()) + } + if trace.IsBadParameter(err) { + return status.Error(codes.InvalidArgument, err.Error()) + } + return status.Error(codes.Internal, err.Error()) +} diff --git a/lib/proxy/server.go b/lib/proxy/server.go new file mode 100644 index 0000000000000..55ca9695b7460 --- /dev/null +++ b/lib/proxy/server.go @@ -0,0 +1,143 @@ +// Copyright 2022 Gravitational, 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. + +package proxy + +import ( + "crypto/tls" + "net" + "time" + + "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/metadata" + "github.com/gravitational/teleport/lib/auth" + "github.com/gravitational/trace" + "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/keepalive" +) + +const ( + peerKeepAlive = time.Second * 10 + peerTimeout = time.Second * 20 +) + +// ServerConfig configures a Server instance. +type ServerConfig struct { + AccessCache auth.AccessCache + Listener net.Listener + TLSConfig *tls.Config + ClusterDialer ClusterDialer + Log logrus.FieldLogger + + // getConfigForClient gets the client tls config. + getConfigForClient func(*tls.ClientHelloInfo) (*tls.Config, error) +} + +// checkAndSetDefaults checks and sets default values +func (c *ServerConfig) checkAndSetDefaults() error { + if c.AccessCache == nil { + return trace.BadParameter("missing access cache") + } + if c.Listener == nil { + return trace.BadParameter("missing listener") + } + if c.ClusterDialer == nil { + return trace.BadParameter("missing cluster dialer server") + } + + if c.TLSConfig == nil { + return trace.BadParameter("missing tls config") + } + if len(c.TLSConfig.Certificates) == 0 { + return trace.BadParameter("missing tls certificate") + } + if c.Log == nil { + c.Log = logrus.New() + } + c.Log = c.Log.WithField( + trace.Component, + teleport.Component(teleport.ComponentProxy, "peer"), + ) + + c.TLSConfig = c.TLSConfig.Clone() + c.TLSConfig.ClientAuth = tls.RequireAndVerifyClientCert + + if c.getConfigForClient == nil { + c.getConfigForClient = getConfigForClient(c.TLSConfig, c.AccessCache, c.Log) + } + + c.TLSConfig.GetConfigForClient = c.getConfigForClient + + return nil +} + +// Server is a proxy service server using grpc and tls. +type Server struct { + server *grpc.Server + config ServerConfig +} + +// NewServer creates a new proxy server instance. +func NewServer(config ServerConfig) (*Server, error) { + err := config.checkAndSetDefaults() + if err != nil { + return nil, trace.Wrap(err) + } + + service := &proxyService{ + config.ClusterDialer, + config.Log, + } + + transportCreds := newProxyCredentials(credentials.NewTLS(config.TLSConfig)) + server := grpc.NewServer( + grpc.Creds(transportCreds), + grpc.ChainStreamInterceptor(metadata.StreamServerInterceptor, errorStreamInterceptor), + grpc.KeepaliveParams(keepalive.ServerParameters{ + Time: peerKeepAlive, + Timeout: peerTimeout, + }), + grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{ + MinTime: peerKeepAlive, + PermitWithoutStream: true, + }), + ) + proto.RegisterProxyServiceServer(server, service) + + return &Server{ + server: server, + config: config, + }, nil +} + +// Serve starts the proxy server. +func (s *Server) Serve() error { + err := s.server.Serve(s.config.Listener) + return trace.Wrap(err) +} + +// Close closes the proxy server immediately. +func (s *Server) Close() error { + s.server.Stop() + return nil +} + +// Shutdown does a graceful shutdown of the proxy server. +func (s *Server) Shutdown() error { + s.server.GracefulStop() + return nil +} diff --git a/lib/proxy/server_test.go b/lib/proxy/server_test.go new file mode 100644 index 0000000000000..e3d83e77d9a34 --- /dev/null +++ b/lib/proxy/server_test.go @@ -0,0 +1,180 @@ +// Copyright 2022 Gravitational, 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. + +package proxy + +import ( + "context" + "crypto/rand" + "crypto/rsa" + "crypto/tls" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "net" + "testing" + "time" + + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/auth" + "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/fixtures" + "github.com/gravitational/teleport/lib/tlsca" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + "golang.org/x/crypto/ssh" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +// newSelfSignedCA creates a new CA for testing. +func newSelfSignedCA(t *testing.T) *tlsca.CertAuthority { + rsaKey, err := ssh.ParseRawPrivateKey(fixtures.PEMBytes["rsa"]) + require.NoError(t, err) + + cert, err := tlsca.GenerateSelfSignedCAWithSigner( + rsaKey.(*rsa.PrivateKey), pkix.Name{}, nil, defaults.CATTL, + ) + require.NoError(t, err) + + ca, err := tlsca.FromCertAndSigner(cert, rsaKey.(*rsa.PrivateKey)) + require.NoError(t, err) + + return ca +} + +// certFromIdentity creates a tls config for a given CA and identity. +func certFromIdentity(t *testing.T, ca *tlsca.CertAuthority, ident tlsca.Identity) *tls.Config { + if ident.Username == "" { + ident.Username = "test-user" + } + + subj, err := ident.Subject() + require.NoError(t, err) + + privateKey, err := rsa.GenerateKey(rand.Reader, 2048) + require.NoError(t, err) + + clock := clockwork.NewRealClock() + + request := tlsca.CertificateRequest{ + Clock: clock, + PublicKey: privateKey.Public(), + Subject: subj, + NotAfter: clock.Now().UTC().Add(time.Minute), + DNSNames: []string{"127.0.0.1"}, + } + certBytes, err := ca.GenerateCertificate(request) + require.NoError(t, err) + + keyPEM := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)}) + cert, err := tls.X509KeyPair(certBytes, keyPEM) + require.NoError(t, err) + + pool := x509.NewCertPool() + pool.AddCert(ca.Cert) + + config := &tls.Config{ + Certificates: []tls.Certificate{cert}, + RootCAs: pool, + } + + return config +} + +type mockAccessCache struct { + auth.AccessCache +} + +// TestServerTLS ensures that only trusted certificates with the proxy role +// are accepted by the server. +func TestServerTLS(t *testing.T) { + ca1 := newSelfSignedCA(t) + ca2 := newSelfSignedCA(t) + + tests := []struct { + desc string + server *tls.Config + client *tls.Config + assertErr require.ErrorAssertionFunc + }{ + { + desc: "trusted certificates with proxy roles", + server: certFromIdentity(t, ca1, tlsca.Identity{ + Groups: []string{string(types.RoleProxy)}, + }), + client: certFromIdentity(t, ca1, tlsca.Identity{ + Groups: []string{string(types.RoleProxy)}, + }), + assertErr: require.NoError, + }, + { + desc: "trusted certificates with incorrect server role", + server: certFromIdentity(t, ca1, tlsca.Identity{ + Groups: []string{string(types.RoleAdmin)}, + }), + client: certFromIdentity(t, ca1, tlsca.Identity{ + Groups: []string{string(types.RoleProxy)}, + }), + assertErr: require.Error, + }, + { + desc: "certificates with correct role from different CAs", + server: certFromIdentity(t, ca1, tlsca.Identity{ + Groups: []string{string(types.RoleProxy)}, + }), + client: certFromIdentity(t, ca2, tlsca.Identity{ + Groups: []string{string(types.RoleProxy)}, + }), + assertErr: require.Error, + }, + } + + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + listener, err := net.Listen("tcp", "localhost:0") + require.NoError(t, err) + + clientCAs := tc.server.RootCAs + tc.server.RootCAs = nil + + server, err := NewServer(ServerConfig{ + AccessCache: &mockAccessCache{}, + Listener: listener, + TLSConfig: tc.server, + ClusterDialer: &mockClusterDialer{}, + getConfigForClient: func(chi *tls.ClientHelloInfo) (*tls.Config, error) { + config := tc.server.Clone() + config.ClientAuth = tls.RequireAndVerifyClientCert + config.ClientCAs = clientCAs + return config, nil + }, + }) + require.NoError(t, err) + go server.Serve() + t.Cleanup(func() { server.Close() }) + + creds := newProxyCredentials(credentials.NewTLS(tc.client)) + conn, err := grpc.Dial(listener.Addr().String(), grpc.WithTransportCredentials(creds)) + require.NoError(t, err) + + defer conn.Close() + + client := proto.NewProxyServiceClient(conn) + _, err = client.DialNode(context.Background()) + tc.assertErr(t, err) + }) + } +} diff --git a/lib/proxy/service.go b/lib/proxy/service.go new file mode 100644 index 0000000000000..7eec84a535d2a --- /dev/null +++ b/lib/proxy/service.go @@ -0,0 +1,134 @@ +// Copyright 2022 Gravitational, 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. + +package proxy + +import ( + "net" + "strings" + + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/lib/reversetunnel" + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/trace" + "github.com/sirupsen/logrus" +) + +// proxyService implements the grpc ProxyService. +type proxyService struct { + clusterDialer ClusterDialer + log logrus.FieldLogger +} + +// DialNode opens a bidirectional stream to the requested node. +func (s *proxyService) DialNode(stream proto.ProxyService_DialNodeServer) error { + frame, err := stream.Recv() + if err != nil { + return trace.Wrap(err) + } + + // The first frame is always expected to be a dial request. + dial := frame.GetDialRequest() + if dial == nil { + return trace.BadParameter("invalid dial request: request must not be nil") + } + + if dial.Source == nil || dial.Destination == nil { + return trace.BadParameter("invalid dial request: source and destinatation must not be nil") + } + + log := s.log.WithFields(logrus.Fields{ + "node": dial.NodeID, + "src": dial.Source.Addr, + "dst": dial.Destination.Addr, + }) + log.Debugf("Dial request from peer.") + + _, clusterName, err := splitServerID(dial.NodeID) + if err != nil { + return trace.Wrap(err) + } + + source := &utils.NetAddr{ + Addr: dial.Source.Addr, + AddrNetwork: dial.Source.Network, + } + destination := &utils.NetAddr{ + Addr: dial.Destination.Addr, + AddrNetwork: dial.Destination.Network, + } + + nodeConn, err := s.clusterDialer.Dial(clusterName, reversetunnel.DialParams{ + From: source, + To: destination, + ServerID: dial.NodeID, + ConnType: dial.TunnelType, + }) + if err != nil { + return trace.Wrap(err) + } + + err = stream.Send(&proto.Frame{ + Message: &proto.Frame_ConnectionEstablished{ + ConnectionEstablished: &proto.ConnectionEstablished{}, + }, + }) + if err != nil { + return trace.Wrap(err) + } + + streamConn := newStreamConn(stream, source, destination) + + sent, received, err := pipeConn(stream.Context(), streamConn, nodeConn) + log.Debugf("Closing dial request from peer. sent: %d reveived %d", sent, received) + return trace.Wrap(err) +} + +// splitServerID splits a server id in to a node id and cluster name. +func splitServerID(address string) (string, string, error) { + split := strings.Split(address, ".") + if len(split) == 0 || split[0] == "" { + return "", "", trace.BadParameter("invalid server id: \"%s\"", address) + } + + return split[0], strings.Join(split[1:], "."), nil +} + +// ClusterDialer dials a node in the given cluster. +type ClusterDialer interface { + Dial(clusterName string, request reversetunnel.DialParams) (net.Conn, error) +} + +// clusterDialerFunc is a function that implements ClusterDialer. +type clusterDialerFunc func(clusterName string, request reversetunnel.DialParams) (net.Conn, error) + +func (f clusterDialerFunc) Dial(clusterName string, request reversetunnel.DialParams) (net.Conn, error) { + return f(clusterName, request) +} + +// NewClusterDialer implements ClusterDialer for a reverse tunnel server. +func NewClusterDialer(server reversetunnel.Server) ClusterDialer { + return clusterDialerFunc(func(clusterName string, request reversetunnel.DialParams) (net.Conn, error) { + site, err := server.GetSite(clusterName) + if err != nil { + return nil, trace.Wrap(err) + } + + conn, err := site.Dial(request) + if err != nil { + return nil, trace.Wrap(err) + } + return conn, nil + }) +} diff --git a/lib/proxy/service_test.go b/lib/proxy/service_test.go new file mode 100644 index 0000000000000..ae34b21417d2d --- /dev/null +++ b/lib/proxy/service_test.go @@ -0,0 +1,171 @@ +// Copyright 2022 Gravitational, 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. + +package proxy + +import ( + "context" + "net" + "testing" + + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/reversetunnel" + "github.com/gravitational/trace" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +type mockClusterDialer struct { + MockDialCluster clusterDialerFunc +} + +func (m *mockClusterDialer) Dial(clusterName string, request reversetunnel.DialParams) (net.Conn, error) { + if m.MockDialCluster == nil { + return nil, trace.NotImplemented("") + } + return m.MockDialCluster(clusterName, request) +} + +func setupService(t *testing.T) (*proxyService, proto.ProxyServiceClient) { + server := grpc.NewServer() + t.Cleanup(server.Stop) + + listener, err := net.Listen("tcp", "localhost:0") + require.NoError(t, err) + + proxyService := &proxyService{ + log: logrus.New(), + } + proto.RegisterProxyServiceServer(server, proxyService) + + go server.Serve(listener) + + conn, err := grpc.Dial(listener.Addr().String(), grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + t.Cleanup(func() { conn.Close() }) + + client := proto.NewProxyServiceClient(conn) + return proxyService, client +} + +func TestInvalidFirstFrame(t *testing.T) { + _, client := setupService(t) + stream, err := client.DialNode(context.Background()) + require.NoError(t, err) + + err = stream.Send(&proto.Frame{ + Message: &proto.Frame_Data{}, + }) + require.NoError(t, err) + + _, err = stream.Recv() + require.Error(t, err, "expected invalid dial request") +} + +func TestSendReceive(t *testing.T) { + service, client := setupService(t) + stream, err := client.DialNode(context.Background()) + require.NoError(t, err) + + dialRequest := &proto.DialRequest{ + NodeID: "test-id.test-cluster", + TunnelType: types.NodeTunnel, + Source: &proto.NetAddr{}, + Destination: &proto.NetAddr{}, + } + + local, remote := net.Pipe() + service.clusterDialer = &mockClusterDialer{ + MockDialCluster: func(clusterName string, request reversetunnel.DialParams) (net.Conn, error) { + require.Equal(t, "test-cluster", clusterName) + require.Equal(t, dialRequest.TunnelType, request.ConnType) + require.Equal(t, dialRequest.NodeID, request.ServerID) + + return remote, nil + }, + } + + send := []byte("ping") + recv := []byte("pong") + + err = stream.Send(&proto.Frame{Message: &proto.Frame_DialRequest{ + DialRequest: dialRequest, + }}) + require.NoError(t, err) + + _, err = stream.Recv() + require.NoError(t, err) + + for i := 0; i < 10; i++ { + send := append(send, byte(i)) + err = stream.Send(&proto.Frame{Message: &proto.Frame_Data{Data: &proto.Data{ + Bytes: send, + }}}) + require.NoError(t, err) + + b := make([]byte, len(send)) + local.Read(b) + require.Equal(t, send, b, "unexpected bytes sent") + + recv := append(recv, byte(i)) + local.Write(recv) + msg, err := stream.Recv() + require.NoError(t, err) + require.Equal(t, recv, msg.GetData().Bytes, "unexpected bytes received") + } +} + +func TestSplitServerID(t *testing.T) { + tests := []struct { + serverID string + expectServerID string + expectClusterName string + assertErr require.ErrorAssertionFunc + }{ + { + "id.localhost", + "id", + "localhost", + require.NoError, + }, + { + "id", + "id", + "", + require.NoError, + }, + { + "id.teleport.example.com", + "id", + "teleport.example.com", + require.NoError, + }, + { + "", + "", + "", + require.Error, + }, + } + + for _, tc := range tests { + id, cluster, err := splitServerID(tc.serverID) + require.Equal(t, tc.expectServerID, id) + require.Equal(t, tc.expectClusterName, cluster) + tc.assertErr(t, err) + } +} diff --git a/lib/service/cfg.go b/lib/service/cfg.go index c740ea8f89c86..58bff13609efd 100644 --- a/lib/service/cfg.go +++ b/lib/service/cfg.go @@ -365,6 +365,9 @@ type ProxyConfig struct { // MongoAddr is address of Mongo proxy. MongoAddr utils.NetAddr + // PeerAddr is the proxy peering address. + PeerAddr utils.NetAddr + Limiter limiter.Config // PublicAddrs is a list of the public addresses the proxy advertises diff --git a/lib/service/listeners.go b/lib/service/listeners.go index eab12a57aa2a2..7abb255239de5 100644 --- a/lib/service/listeners.go +++ b/lib/service/listeners.go @@ -42,6 +42,7 @@ var ( listenerProxyMySQL = listenerType(teleport.Component(teleport.ComponentProxy, "mysql")) listenerProxyPostgres = listenerType(teleport.Component(teleport.ComponentProxy, "postgres")) listenerProxyMongo = listenerType(teleport.Component(teleport.ComponentProxy, "mongo")) + listenerProxyPeer = listenerType(teleport.Component(teleport.ComponentProxy, "peer")) listenerMetrics = listenerType(teleport.ComponentMetrics) listenerWindowsDesktop = listenerType(teleport.ComponentWindowsDesktop) ) @@ -92,6 +93,11 @@ func (process *TeleportProcess) ProxyTunnelAddr() (*utils.NetAddr, error) { return process.registeredListenerAddr(listenerProxyTunnel) } +// ProxyTunnelAddr returns the proxy peer address, if configured and started. +func (process *TeleportProcess) ProxyPeerAddr() (*utils.NetAddr, error) { + return process.registeredListenerAddr(listenerProxyPeer) +} + func (process *TeleportProcess) registeredListenerAddr(typ listenerType) (*utils.NetAddr, error) { process.Lock() defer process.Unlock() diff --git a/lib/service/service.go b/lib/service/service.go index 24a81594a9f5b..7f09bdf1a2c91 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -79,6 +79,7 @@ import ( "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/multiplexer" "github.com/gravitational/teleport/lib/plugin" + "github.com/gravitational/teleport/lib/proxy" restricted "github.com/gravitational/teleport/lib/restrictedsession" "github.com/gravitational/teleport/lib/reversetunnel" "github.com/gravitational/teleport/lib/services" @@ -2485,6 +2486,7 @@ type proxyListeners struct { kube net.Listener db dbListeners alpn net.Listener + proxy net.Listener grpc net.Listener } @@ -2544,10 +2546,13 @@ func (l *proxyListeners) Close() { if l.grpc != nil { l.grpc.Close() } + if l.proxy != nil { + l.proxy.Close() + } } // setupProxyListeners sets up web proxy listeners based on the configuration -func (process *TeleportProcess) setupProxyListeners() (*proxyListeners, error) { +func (process *TeleportProcess) setupProxyListeners(networkingConfig types.ClusterNetworkingConfig) (*proxyListeners, error) { cfg := process.Config process.log.Debugf("Setup Proxy: Web Proxy Address: %v, Reverse Tunnel Proxy Address: %v", cfg.Proxy.WebAddr.Addr, cfg.Proxy.ReverseTunnelListenAddr.Addr) var err error @@ -2587,6 +2592,25 @@ func (process *TeleportProcess) setupProxyListeners() (*proxyListeners, error) { listeners.db.mongo = listener } + tunnelStrategy, err := networkingConfig.GetTunnelStrategyType() + if err != nil { + return nil, trace.Wrap(err) + } + + if !cfg.Proxy.DisableReverseTunnel && tunnelStrategy == types.ProxyPeering { + addr, err := peerAddr(&process.Config.Proxy.PeerAddr) + if err != nil { + return nil, trace.Wrap(err) + } + + listener, err := process.importOrCreateListener(listenerProxyPeer, addr.String()) + if err != nil { + return nil, trace.Wrap(err) + } + + listeners.proxy = listener + } + switch { case cfg.Proxy.DisableWebService && cfg.Proxy.DisableReverseTunnel: process.log.Debugf("Setup Proxy: Reverse tunnel proxy and web proxy are disabled.") @@ -2753,7 +2777,12 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { return trace.Wrap(err) } - listeners, err := process.setupProxyListeners() + clusterNetworkConfig, err := accessPoint.GetClusterNetworkingConfig(process.ExitContext()) + if err != nil { + return trace.Wrap(err) + } + + listeners, err := process.setupProxyListeners(clusterNetworkConfig) if err != nil { return trace.Wrap(err) } @@ -2949,6 +2978,41 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { log.Info("Web UI is disabled.") } + var peerAddr string + var proxyServer *proxy.Server + if listeners.proxy != nil { + peerAddr = listeners.proxy.Addr().String() + proxyServer, err = proxy.NewServer(proxy.ServerConfig{ + AccessCache: accessPoint, + Listener: listeners.proxy, + TLSConfig: serverTLSConfig, + ClusterDialer: proxy.NewClusterDialer(tsrv), + }) + if err != nil { + return trace.Wrap(err) + } + + eventC := make(chan Event) + process.WaitForEvent(process.ExitContext(), ProxyReverseTunnelReady, eventC) + + process.RegisterCriticalFunc("proxy.peer", func() error { + select { + case <-process.ExitContext().Done(): + log.Debugf("Process exiting: failed to start peer proxy service waiting for reverse tunnel server") + return nil + case <-eventC: + } + + log.Infof("Peer proxy service is starting on %s", listeners.proxy.Addr().String()) + err := proxyServer.Serve() + if err != nil { + return trace.Wrap(err) + } + + return nil + }) + } + sshProxy, err := regular.New(cfg.Proxy.SSHAddr, cfg.Hostname, []ssh.Signer{conn.ServerIdentity.KeySigner}, @@ -2958,7 +3022,7 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { process.proxyPublicAddr(), conn.Client, regular.SetLimiter(proxyLimiter), - regular.SetProxyMode(tsrv, accessPoint), + regular.SetProxyMode(peerAddr, tsrv, accessPoint), regular.SetSessionServer(conn.Client), regular.SetCiphers(cfg.Ciphers), regular.SetKEXAlgorithms(cfg.KEXAlgorithms), @@ -2984,11 +3048,6 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { return nil }) - clusterNetworkConfig, err := accessPoint.GetClusterNetworkingConfig(process.ExitContext()) - if err != nil { - return trace.Wrap(err) - } - rcWatchLog := logrus.WithFields(logrus.Fields{ trace.Component: teleport.Component(teleport.ComponentReverseTunnelAgent, process.id), }) @@ -3244,6 +3303,9 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { if tsrv != nil { warnOnErr(tsrv.Close(), log) } + if proxyServer != nil { + warnOnErr(proxyServer.Close(), log) + } if webServer != nil { warnOnErr(webServer.Close(), log) } @@ -3267,6 +3329,9 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { if tsrv != nil { warnOnErr(tsrv.Shutdown(ctx), log) } + if proxyServer != nil { + warnOnErr(proxyServer.Shutdown(), log) + } if webServer != nil { warnOnErr(webServer.Shutdown(ctx), log) } @@ -3304,6 +3369,29 @@ func kubeDialAddr(config ProxyConfig, mode types.ProxyListenerMode) utils.NetAdd return config.Kube.ListenAddr } +func peerAddr(addr *utils.NetAddr) (*utils.NetAddr, error) { + if addr.IsEmpty() { + addr = defaults.ProxyPeeringListenAddr() + } + + if !addr.IsHostUnspecified() { + return addr, nil + } + + ip, err := utils.GuessHostIP() + if err != nil { + return nil, trace.Wrap(err) + } + + port := addr.Port(defaults.ProxyPeeringListenPort) + addr, err = utils.ParseAddr(fmt.Sprintf("%s:%d", ip.String(), port)) + if err != nil { + return nil, trace.Wrap(err) + } + + return addr, nil +} + func (process *TeleportProcess) setupProxyTLSConfig(conn *Connector, tsrv reversetunnel.Server, accessPoint auth.ReadProxyAccessPoint, clusterName string) (*tls.Config, error) { cfg := process.Config var tlsConfig *tls.Config diff --git a/lib/srv/regular/sshserver.go b/lib/srv/regular/sshserver.go index 2b906290feb4f..a3c0548f4a435 100644 --- a/lib/srv/regular/sshserver.go +++ b/lib/srv/regular/sshserver.go @@ -101,6 +101,7 @@ type Server struct { proxyMode bool proxyTun reversetunnel.Tunnel proxyAccessPoint auth.ReadProxyAccessPoint + peerAddr string advertiseAddr *utils.NetAddr proxyPublicAddr utils.NetAddr @@ -391,7 +392,7 @@ func SetSessionServer(sessionServer rsession.Service) ServerOption { } // SetProxyMode starts this server in SSH proxying mode -func SetProxyMode(tsrv reversetunnel.Tunnel, ap auth.ReadProxyAccessPoint) ServerOption { +func SetProxyMode(peerAddr string, tsrv reversetunnel.Tunnel, ap auth.ReadProxyAccessPoint) ServerOption { return func(s *Server) error { // always set proxy mode to true, // because in some tests reverse tunnel is disabled, @@ -399,6 +400,7 @@ func SetProxyMode(tsrv reversetunnel.Tunnel, ap auth.ReadProxyAccessPoint) Serve s.proxyMode = true s.proxyTun = tsrv s.proxyAccessPoint = ap + s.peerAddr = peerAddr return nil } } @@ -842,6 +844,7 @@ func (s *Server) getServerInfo() (types.Resource, error) { } server.SetExpiry(s.clock.Now().UTC().Add(apidefaults.ServerAnnounceTTL)) server.SetPublicAddr(s.proxyPublicAddr.String()) + server.SetPeerAddr(s.peerAddr) return server, nil } diff --git a/lib/srv/regular/sshserver_test.go b/lib/srv/regular/sshserver_test.go index 958097c251d60..818c31681c5ba 100644 --- a/lib/srv/regular/sshserver_test.go +++ b/lib/srv/regular/sshserver_test.go @@ -1280,8 +1280,13 @@ func TestProxyDirectAccess(t *testing.T) { t.TempDir(), "", utils.NetAddr{}, +<<<<<<< HEAD + nil, + SetProxyMode("", reverseTunnelServer, proxyClient), +======= proxyClient, SetProxyMode(reverseTunnelServer, proxyClient), +>>>>>>> david/proxy-peering SetSessionServer(proxyClient), SetEmitter(nodeClient), SetNamespace(apidefaults.Namespace), diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go index ccfbda656ee20..e80b70a46f9b6 100644 --- a/lib/web/apiserver_test.go +++ b/lib/web/apiserver_test.go @@ -309,7 +309,7 @@ func (s *WebSuite) SetUpTest(c *C) { utils.NetAddr{}, s.proxyClient, regular.SetUUID(proxyID), - regular.SetProxyMode(revTunServer, s.proxyClient), + regular.SetProxyMode("", revTunServer, s.proxyClient), regular.SetSessionServer(s.proxyClient), regular.SetEmitter(s.proxyClient), regular.SetNamespace(apidefaults.Namespace), @@ -3664,7 +3664,7 @@ func createProxy(ctx context.Context, t *testing.T, proxyID string, node *regula utils.NetAddr{}, client, regular.SetUUID(proxyID), - regular.SetProxyMode(revTunServer, client), + regular.SetProxyMode("", revTunServer, client), regular.SetSessionServer(client), regular.SetEmitter(client), regular.SetNamespace(apidefaults.Namespace),